1 // Copyright 2019 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/memory/discardable_memory.h"
6 #include "base/memory/discardable_memory_internal.h"
7 #include "base/metrics/field_trial.h"
8 #include "base/metrics/field_trial_params.h"
9 #include "base/test/scoped_feature_list.h"
10 #include "build/build_config.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12
13 #if BUILDFLAG(IS_POSIX)
14 #include "base/memory/madv_free_discardable_memory_posix.h"
15 #endif // BUILDFLAG(IS_POSIX)
16
17 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
18 namespace base {
19
20 class DiscardableMemoryBackingFieldTrialTest : public ::testing::Test {
21 protected:
22 DiscardableMemoryBackingFieldTrialTest() = default;
23 ~DiscardableMemoryBackingFieldTrialTest() override = default;
24
25 std::unique_ptr<test::ScopedFeatureList>
GetScopedFeatureListForDiscardableMemoryTrialGroup(DiscardableMemoryTrialGroup group)26 GetScopedFeatureListForDiscardableMemoryTrialGroup(
27 DiscardableMemoryTrialGroup group) {
28 auto feature_list = std::make_unique<test::ScopedFeatureList>();
29 feature_list->InitAndEnableFeatureWithParameters(
30 base::features::kDiscardableMemoryBackingTrial,
31 {{features::kDiscardableMemoryBackingParam.name,
32 features::kDiscardableMemoryBackingParamOptions[group].name}});
33 return feature_list;
34 }
35 };
36
TEST_F(DiscardableMemoryBackingFieldTrialTest,TrialActiveOnlyIfCapable)37 TEST_F(DiscardableMemoryBackingFieldTrialTest, TrialActiveOnlyIfCapable) {
38 std::unique_ptr<test::ScopedFeatureList> scoped_feature =
39 GetScopedFeatureListForDiscardableMemoryTrialGroup(
40 DiscardableMemoryTrialGroup::kEmulatedSharedMemory);
41 FieldTrial* trial =
42 FeatureList::GetFieldTrial(features::kDiscardableMemoryBackingTrial);
43 ASSERT_NE(trial, nullptr);
44
45 // Ensure the trial goes from disabled to enabled after querying state, if and
46 // only if we are capable of running the trial. We have force enabled the
47 // trial feature in the feature list, so |trial_enabled| implies that the
48 // device is capable.
49 EXPECT_FALSE(FieldTrialList::IsTrialActive(trial->trial_name()));
50 bool trial_enabled = DiscardableMemoryBackingFieldTrialIsEnabled();
51 EXPECT_EQ(trial_enabled, FieldTrialList::IsTrialActive(trial->trial_name()));
52 }
53
TEST_F(DiscardableMemoryBackingFieldTrialTest,EmulatedSharedMemoryBackingMatchesTrialGroup)54 TEST_F(DiscardableMemoryBackingFieldTrialTest,
55 EmulatedSharedMemoryBackingMatchesTrialGroup) {
56 std::unique_ptr<test::ScopedFeatureList> scoped_feature =
57 GetScopedFeatureListForDiscardableMemoryTrialGroup(
58 DiscardableMemoryTrialGroup::kEmulatedSharedMemory);
59 if (!DiscardableMemoryBackingFieldTrialIsEnabled())
60 return;
61 DiscardableMemoryBacking backing = GetDiscardableMemoryBacking();
62 EXPECT_EQ(backing, DiscardableMemoryBacking::kSharedMemory);
63 }
64
TEST_F(DiscardableMemoryBackingFieldTrialTest,MadvFreeBackingMatchesTrialGroup)65 TEST_F(DiscardableMemoryBackingFieldTrialTest,
66 MadvFreeBackingMatchesTrialGroup) {
67 std::unique_ptr<test::ScopedFeatureList> scoped_feature =
68 GetScopedFeatureListForDiscardableMemoryTrialGroup(
69 DiscardableMemoryTrialGroup::kMadvFree);
70 if (!DiscardableMemoryBackingFieldTrialIsEnabled())
71 return;
72 DiscardableMemoryBacking backing = GetDiscardableMemoryBacking();
73 EXPECT_EQ(backing, DiscardableMemoryBacking::kMadvFree);
74 }
75
76 #if BUILDFLAG(IS_ANDROID)
TEST_F(DiscardableMemoryBackingFieldTrialTest,AshmemBackingMatchesTrialGroup)77 TEST_F(DiscardableMemoryBackingFieldTrialTest, AshmemBackingMatchesTrialGroup) {
78 std::unique_ptr<test::ScopedFeatureList> scoped_feature =
79 GetScopedFeatureListForDiscardableMemoryTrialGroup(
80 DiscardableMemoryTrialGroup::kAshmem);
81 if (!DiscardableMemoryBackingFieldTrialIsEnabled())
82 return;
83 DiscardableMemoryBacking backing = GetDiscardableMemoryBacking();
84 EXPECT_EQ(backing, DiscardableMemoryBacking::kSharedMemory);
85 }
86 #endif // BUILDFLAG(IS_ANDROID)
87
88 } // namespace base
89
90 #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) ||
91 // BUILDFLAG(IS_CHROMEOS)
92