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