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