xref: /aosp_15_r20/external/cronet/components/metrics/entropy_state_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "components/metrics/entropy_state.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <string>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/command_line.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
12*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_pref_names.h"
13*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_service.h"
14*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_switches.h"
15*6777b538SAndroid Build Coastguard Worker #include "components/prefs/testing_pref_service.h"
16*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace metrics {
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker class EntropyStateTest : public testing::Test {
21*6777b538SAndroid Build Coastguard Worker  public:
EntropyStateTest()22*6777b538SAndroid Build Coastguard Worker   EntropyStateTest() { MetricsService::RegisterPrefs(prefs_.registry()); }
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker   EntropyStateTest(const EntropyStateTest&) = delete;
25*6777b538SAndroid Build Coastguard Worker   EntropyStateTest& operator=(const EntropyStateTest&) = delete;
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker  protected:
28*6777b538SAndroid Build Coastguard Worker   TestingPrefServiceSimple prefs_;
29*6777b538SAndroid Build Coastguard Worker };
30*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,LowEntropySourceNotReset)31*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, LowEntropySourceNotReset) {
32*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
33*6777b538SAndroid Build Coastguard Worker   // Get the low entropy source once, to initialize it.
34*6777b538SAndroid Build Coastguard Worker   entropy_state.GetLowEntropySource();
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker   // Now, set it to 0 and ensure it doesn't get reset.
37*6777b538SAndroid Build Coastguard Worker   entropy_state.low_entropy_source_ = 0;
38*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, entropy_state.GetLowEntropySource());
39*6777b538SAndroid Build Coastguard Worker   // Call it another time, just to make sure.
40*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, entropy_state.GetLowEntropySource());
41*6777b538SAndroid Build Coastguard Worker }
42*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,PseudoLowEntropySourceNotReset)43*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, PseudoLowEntropySourceNotReset) {
44*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
45*6777b538SAndroid Build Coastguard Worker   // Get the pseudo low entropy source once, to initialize it.
46*6777b538SAndroid Build Coastguard Worker   entropy_state.GetPseudoLowEntropySource();
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker   // Now, set it to 0 and ensure it doesn't get reset.
49*6777b538SAndroid Build Coastguard Worker   entropy_state.pseudo_low_entropy_source_ = 0;
50*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, entropy_state.GetPseudoLowEntropySource());
51*6777b538SAndroid Build Coastguard Worker   // Call it another time, just to make sure.
52*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, entropy_state.GetPseudoLowEntropySource());
53*6777b538SAndroid Build Coastguard Worker }
54*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,HaveNoLowEntropySource)55*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, HaveNoLowEntropySource) {
56*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
57*6777b538SAndroid Build Coastguard Worker   // If we have none of the new, old, or pseudo low entropy sources stored in
58*6777b538SAndroid Build Coastguard Worker   // prefs, then the new source should be created...
59*6777b538SAndroid Build Coastguard Worker   int new_low_source = entropy_state.GetLowEntropySource();
60*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(EntropyState::IsValidLowEntropySource(new_low_source))
61*6777b538SAndroid Build Coastguard Worker       << new_low_source;
62*6777b538SAndroid Build Coastguard Worker   int pseudo_low_source = entropy_state.GetPseudoLowEntropySource();
63*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(EntropyState::IsValidLowEntropySource(pseudo_low_source))
64*6777b538SAndroid Build Coastguard Worker       << pseudo_low_source;
65*6777b538SAndroid Build Coastguard Worker   // ...but the old source should not...
66*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(EntropyState::kLowEntropySourceNotSet,
67*6777b538SAndroid Build Coastguard Worker             entropy_state.GetOldLowEntropySource());
68*6777b538SAndroid Build Coastguard Worker   // ...and the high entropy source should include the *new* low entropy source.
69*6777b538SAndroid Build Coastguard Worker   std::string high_source = entropy_state.GetHighEntropySource(
70*6777b538SAndroid Build Coastguard Worker       "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEF");
71*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(base::EndsWith(high_source, base::NumberToString(new_low_source),
72*6777b538SAndroid Build Coastguard Worker                              base::CompareCase::SENSITIVE))
73*6777b538SAndroid Build Coastguard Worker       << high_source;
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,HaveOnlyNewLowEntropySource)76*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, HaveOnlyNewLowEntropySource) {
77*6777b538SAndroid Build Coastguard Worker   // If we have the new low entropy sources stored in prefs, but not the old
78*6777b538SAndroid Build Coastguard Worker   // one...
79*6777b538SAndroid Build Coastguard Worker   const int new_low_source = 1234;
80*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsLowEntropySource, new_low_source);
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
83*6777b538SAndroid Build Coastguard Worker   // ...then the new source should be loaded...
84*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(new_low_source, entropy_state.GetLowEntropySource());
85*6777b538SAndroid Build Coastguard Worker   // ...but the old source should not be created...
86*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(EntropyState::kLowEntropySourceNotSet,
87*6777b538SAndroid Build Coastguard Worker             entropy_state.GetOldLowEntropySource());
88*6777b538SAndroid Build Coastguard Worker   // ...and the high entropy source should include the *new* low entropy source.
89*6777b538SAndroid Build Coastguard Worker   std::string high_source = entropy_state.GetHighEntropySource(
90*6777b538SAndroid Build Coastguard Worker       "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEF");
91*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(base::EndsWith(high_source, base::NumberToString(new_low_source),
92*6777b538SAndroid Build Coastguard Worker                              base::CompareCase::SENSITIVE))
93*6777b538SAndroid Build Coastguard Worker       << high_source;
94*6777b538SAndroid Build Coastguard Worker }
95*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,HaveOnlyOldLowEntropySource)96*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, HaveOnlyOldLowEntropySource) {
97*6777b538SAndroid Build Coastguard Worker   // If we have the old low entropy sources stored in prefs, but not the new
98*6777b538SAndroid Build Coastguard Worker   // one...
99*6777b538SAndroid Build Coastguard Worker   const int old_low_source = 5678;
100*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsOldLowEntropySource, old_low_source);
101*6777b538SAndroid Build Coastguard Worker 
102*6777b538SAndroid Build Coastguard Worker   // ...then the new source should be created...
103*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker   int new_low_source = entropy_state.GetLowEntropySource();
106*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(EntropyState::IsValidLowEntropySource(new_low_source))
107*6777b538SAndroid Build Coastguard Worker       << new_low_source;
108*6777b538SAndroid Build Coastguard Worker   // ...and the old source should be loaded...
109*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(old_low_source, entropy_state.GetOldLowEntropySource());
110*6777b538SAndroid Build Coastguard Worker   // ...and the high entropy source should include the *old* low entropy source.
111*6777b538SAndroid Build Coastguard Worker   std::string high_source = entropy_state.GetHighEntropySource(
112*6777b538SAndroid Build Coastguard Worker       "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEF");
113*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(base::EndsWith(high_source, base::NumberToString(old_low_source),
114*6777b538SAndroid Build Coastguard Worker                              base::CompareCase::SENSITIVE))
115*6777b538SAndroid Build Coastguard Worker       << high_source;
116*6777b538SAndroid Build Coastguard Worker }
117*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,HaveAllLowEntropySources)118*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, HaveAllLowEntropySources) {
119*6777b538SAndroid Build Coastguard Worker   // If we have all three of new, old, and pseudo low entropy sources in
120*6777b538SAndroid Build Coastguard Worker   // prefs...
121*6777b538SAndroid Build Coastguard Worker   const int new_low_source = 1234;
122*6777b538SAndroid Build Coastguard Worker   const int old_low_source = 5678;
123*6777b538SAndroid Build Coastguard Worker   const int pseudo_low_source = 4321;
124*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsLowEntropySource, new_low_source);
125*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsOldLowEntropySource, old_low_source);
126*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsPseudoLowEntropySource, pseudo_low_source);
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker   // ...then all three should be loaded...
129*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(new_low_source, entropy_state.GetLowEntropySource());
132*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(old_low_source, entropy_state.GetOldLowEntropySource());
133*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(pseudo_low_source, entropy_state.GetPseudoLowEntropySource());
134*6777b538SAndroid Build Coastguard Worker   // ...and the high entropy source should include the *old* low entropy source.
135*6777b538SAndroid Build Coastguard Worker   std::string high_source = entropy_state.GetHighEntropySource(
136*6777b538SAndroid Build Coastguard Worker       "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEF");
137*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(base::EndsWith(high_source, base::NumberToString(old_low_source),
138*6777b538SAndroid Build Coastguard Worker                              base::CompareCase::SENSITIVE))
139*6777b538SAndroid Build Coastguard Worker       << high_source;
140*6777b538SAndroid Build Coastguard Worker }
141*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,CorruptNewLowEntropySources)142*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, CorruptNewLowEntropySources) {
143*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
144*6777b538SAndroid Build Coastguard Worker   const int corrupt_sources[] = {-12345, -1, 8000, 12345};
145*6777b538SAndroid Build Coastguard Worker   for (int corrupt_source : corrupt_sources) {
146*6777b538SAndroid Build Coastguard Worker     // If the new low entropy source has been corrupted...
147*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(EntropyState::IsValidLowEntropySource(corrupt_source))
148*6777b538SAndroid Build Coastguard Worker         << corrupt_source;
149*6777b538SAndroid Build Coastguard Worker     prefs_.SetInteger(prefs::kMetricsLowEntropySource, corrupt_source);
150*6777b538SAndroid Build Coastguard Worker     // ...then a new source should be created.
151*6777b538SAndroid Build Coastguard Worker     int loaded_source = entropy_state.GetLowEntropySource();
152*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(EntropyState::IsValidLowEntropySource(loaded_source))
153*6777b538SAndroid Build Coastguard Worker         << loaded_source;
154*6777b538SAndroid Build Coastguard Worker   }
155*6777b538SAndroid Build Coastguard Worker }
156*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,CorruptOldLowEntropySources)157*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, CorruptOldLowEntropySources) {
158*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
159*6777b538SAndroid Build Coastguard Worker   const int corrupt_sources[] = {-12345, -1, 8000, 12345};
160*6777b538SAndroid Build Coastguard Worker   for (int corrupt_source : corrupt_sources) {
161*6777b538SAndroid Build Coastguard Worker     // If the old low entropy source has been corrupted...
162*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(EntropyState::IsValidLowEntropySource(corrupt_source))
163*6777b538SAndroid Build Coastguard Worker         << corrupt_source;
164*6777b538SAndroid Build Coastguard Worker     prefs_.SetInteger(prefs::kMetricsOldLowEntropySource, corrupt_source);
165*6777b538SAndroid Build Coastguard Worker     // ...then it should be ignored.
166*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(EntropyState::kLowEntropySourceNotSet,
167*6777b538SAndroid Build Coastguard Worker               entropy_state.GetOldLowEntropySource());
168*6777b538SAndroid Build Coastguard Worker   }
169*6777b538SAndroid Build Coastguard Worker }
170*6777b538SAndroid Build Coastguard Worker 
171*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS_LACROS)
TEST_F(EntropyStateTest,ClearPrefs)172*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, ClearPrefs) {
173*6777b538SAndroid Build Coastguard Worker   // On Lacros we expect that there will be no clearing of prefs.
174*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsLowEntropySource, 1234);
175*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsOldLowEntropySource, 5678);
176*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsPseudoLowEntropySource, 4321);
177*6777b538SAndroid Build Coastguard Worker   prefs_.SetString(prefs::kMetricsLimitedEntropyRandomizationSource,
178*6777b538SAndroid Build Coastguard Worker                    "00000000000000000000000000000001");
179*6777b538SAndroid Build Coastguard Worker 
180*6777b538SAndroid Build Coastguard Worker   EntropyState::ClearPrefs(&prefs_);
181*6777b538SAndroid Build Coastguard Worker 
182*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(prefs_.HasPrefPath(prefs::kMetricsLowEntropySource));
183*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(prefs_.HasPrefPath(prefs::kMetricsOldLowEntropySource));
184*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(prefs_.HasPrefPath(prefs::kMetricsPseudoLowEntropySource));
185*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
186*6777b538SAndroid Build Coastguard Worker       prefs_.HasPrefPath(prefs::kMetricsLimitedEntropyRandomizationSource));
187*6777b538SAndroid Build Coastguard Worker }
188*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,SetExternalPrefs)189*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, SetExternalPrefs) {
190*6777b538SAndroid Build Coastguard Worker   prefs_.ClearPref(prefs::kMetricsLowEntropySource);
191*6777b538SAndroid Build Coastguard Worker   prefs_.ClearPref(prefs::kMetricsOldLowEntropySource);
192*6777b538SAndroid Build Coastguard Worker   prefs_.ClearPref(prefs::kMetricsPseudoLowEntropySource);
193*6777b538SAndroid Build Coastguard Worker   prefs_.ClearPref(prefs::kMetricsLimitedEntropyRandomizationSource);
194*6777b538SAndroid Build Coastguard Worker 
195*6777b538SAndroid Build Coastguard Worker   std::string limited_entropy_randomization_source =
196*6777b538SAndroid Build Coastguard Worker       "00000000000000000000000000000001";
197*6777b538SAndroid Build Coastguard Worker   EntropyState::SetExternalPrefs(&prefs_, 1234, 4567, 3456,
198*6777b538SAndroid Build Coastguard Worker                                  limited_entropy_randomization_source);
199*6777b538SAndroid Build Coastguard Worker 
200*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(prefs_.GetInteger(prefs::kMetricsLowEntropySource), 1234);
201*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(prefs_.GetInteger(prefs::kMetricsOldLowEntropySource), 4567);
202*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(prefs_.GetInteger(prefs::kMetricsPseudoLowEntropySource), 3456);
203*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(prefs_.GetString(prefs::kMetricsLimitedEntropyRandomizationSource),
204*6777b538SAndroid Build Coastguard Worker             limited_entropy_randomization_source);
205*6777b538SAndroid Build Coastguard Worker }
206*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,SetEmptyStringToLimitedEntropyRandomizationSource)207*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, SetEmptyStringToLimitedEntropyRandomizationSource) {
208*6777b538SAndroid Build Coastguard Worker   prefs_.ClearPref(prefs::kMetricsLimitedEntropyRandomizationSource);
209*6777b538SAndroid Build Coastguard Worker 
210*6777b538SAndroid Build Coastguard Worker   EntropyState::SetExternalPrefs(&prefs_, 1234, 4567, 3456, std::string_view());
211*6777b538SAndroid Build Coastguard Worker 
212*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(
213*6777b538SAndroid Build Coastguard Worker       prefs_.HasPrefPath(prefs::kMetricsLimitedEntropyRandomizationSource));
214*6777b538SAndroid Build Coastguard Worker }
215*6777b538SAndroid Build Coastguard Worker 
216*6777b538SAndroid Build Coastguard Worker #else
217*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,ClearPrefs)218*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, ClearPrefs) {
219*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsLowEntropySource, 1234);
220*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsOldLowEntropySource, 5678);
221*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsPseudoLowEntropySource, 4321);
222*6777b538SAndroid Build Coastguard Worker   prefs_.SetString(prefs::kMetricsLimitedEntropyRandomizationSource,
223*6777b538SAndroid Build Coastguard Worker                    "00000000000000000000000000000001");
224*6777b538SAndroid Build Coastguard Worker 
225*6777b538SAndroid Build Coastguard Worker   EntropyState::ClearPrefs(&prefs_);
226*6777b538SAndroid Build Coastguard Worker 
227*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(prefs_.HasPrefPath(prefs::kMetricsLowEntropySource));
228*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(prefs_.HasPrefPath(prefs::kMetricsOldLowEntropySource));
229*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(prefs_.HasPrefPath(prefs::kMetricsPseudoLowEntropySource));
230*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(
231*6777b538SAndroid Build Coastguard Worker       prefs_.HasPrefPath(prefs::kMetricsLimitedEntropyRandomizationSource));
232*6777b538SAndroid Build Coastguard Worker }
233*6777b538SAndroid Build Coastguard Worker #endif
234*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,ClearingPrefWillNotResetValuesDuringSession)235*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, ClearingPrefWillNotResetValuesDuringSession) {
236*6777b538SAndroid Build Coastguard Worker   // Setting test values in prefs;
237*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsLowEntropySource, 1234);
238*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsOldLowEntropySource, 5678);
239*6777b538SAndroid Build Coastguard Worker   prefs_.SetInteger(prefs::kMetricsPseudoLowEntropySource, 4321);
240*6777b538SAndroid Build Coastguard Worker   prefs_.SetString(prefs::kMetricsLimitedEntropyRandomizationSource,
241*6777b538SAndroid Build Coastguard Worker                    "00000000000000000000000000000001");
242*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
243*6777b538SAndroid Build Coastguard Worker 
244*6777b538SAndroid Build Coastguard Worker   // Generates all managed values. This should load the values from prefs.
245*6777b538SAndroid Build Coastguard Worker   auto low = entropy_state.GetLowEntropySource();
246*6777b538SAndroid Build Coastguard Worker   auto old_low = entropy_state.GetOldLowEntropySource();
247*6777b538SAndroid Build Coastguard Worker   auto pseudo_low = entropy_state.GetPseudoLowEntropySource();
248*6777b538SAndroid Build Coastguard Worker   auto high = entropy_state.GetHighEntropySource(
249*6777b538SAndroid Build Coastguard Worker       "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEF");
250*6777b538SAndroid Build Coastguard Worker   auto limited = entropy_state.GetLimitedEntropyRandomizationSource();
251*6777b538SAndroid Build Coastguard Worker 
252*6777b538SAndroid Build Coastguard Worker   EntropyState::ClearPrefs(&prefs_);
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker   // Clearing values in prefs should not result in returning different values.
255*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(low, entropy_state.GetLowEntropySource());
256*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(old_low, entropy_state.GetOldLowEntropySource());
257*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(pseudo_low, entropy_state.GetPseudoLowEntropySource());
258*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(high, entropy_state.GetHighEntropySource(
259*6777b538SAndroid Build Coastguard Worker                       "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEF"));
260*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(limited, entropy_state.GetLimitedEntropyRandomizationSource());
261*6777b538SAndroid Build Coastguard Worker }
262*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,GenerateLimitedEntropyRandomizationSourceWhenNotAvailable)263*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest,
264*6777b538SAndroid Build Coastguard Worker        GenerateLimitedEntropyRandomizationSourceWhenNotAvailable) {
265*6777b538SAndroid Build Coastguard Worker   // Pref for limited entropy randomization source is unset.
266*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(
267*6777b538SAndroid Build Coastguard Worker       prefs_.HasPrefPath(prefs::kMetricsLimitedEntropyRandomizationSource));
268*6777b538SAndroid Build Coastguard Worker 
269*6777b538SAndroid Build Coastguard Worker   // Generate a new limited entropy randomization source.
270*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
271*6777b538SAndroid Build Coastguard Worker   entropy_state.GetLimitedEntropyRandomizationSource();
272*6777b538SAndroid Build Coastguard Worker 
273*6777b538SAndroid Build Coastguard Worker   // There should be a generated value and it should be stored in prefs.
274*6777b538SAndroid Build Coastguard Worker   auto getter_value = entropy_state.GetLimitedEntropyRandomizationSource();
275*6777b538SAndroid Build Coastguard Worker   auto pref_value =
276*6777b538SAndroid Build Coastguard Worker       prefs_.GetString(prefs::kMetricsLimitedEntropyRandomizationSource);
277*6777b538SAndroid Build Coastguard Worker   EXPECT_NE("", getter_value);
278*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(getter_value, pref_value);
279*6777b538SAndroid Build Coastguard Worker }
280*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,LoadLimitedEntropyRandomizationSourceFromPref)281*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, LoadLimitedEntropyRandomizationSourceFromPref) {
282*6777b538SAndroid Build Coastguard Worker   // There is a previously generated limited entropy randomization source stored
283*6777b538SAndroid Build Coastguard Worker   // in prefs.
284*6777b538SAndroid Build Coastguard Worker   auto* test_value = "00000000000000000000000000000001";
285*6777b538SAndroid Build Coastguard Worker   prefs_.SetString(prefs::kMetricsLimitedEntropyRandomizationSource,
286*6777b538SAndroid Build Coastguard Worker                    test_value);
287*6777b538SAndroid Build Coastguard Worker 
288*6777b538SAndroid Build Coastguard Worker   // This should load the previous value from prefs.
289*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
290*6777b538SAndroid Build Coastguard Worker   entropy_state.GetLimitedEntropyRandomizationSource();
291*6777b538SAndroid Build Coastguard Worker 
292*6777b538SAndroid Build Coastguard Worker   // Verify that the previous value was returned.
293*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(test_value, entropy_state.GetLimitedEntropyRandomizationSource());
294*6777b538SAndroid Build Coastguard Worker   // Verify that the value stored in prefs is not altered.
295*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(test_value,
296*6777b538SAndroid Build Coastguard Worker             prefs_.GetString(prefs::kMetricsLimitedEntropyRandomizationSource));
297*6777b538SAndroid Build Coastguard Worker }
298*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,LimitedEntropyRandomizationSourceNotReset)299*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, LimitedEntropyRandomizationSourceNotReset) {
300*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
301*6777b538SAndroid Build Coastguard Worker 
302*6777b538SAndroid Build Coastguard Worker   // Attempts to generate the limited entropy randomization source twice.
303*6777b538SAndroid Build Coastguard Worker   auto first_call_value = entropy_state.GetLimitedEntropyRandomizationSource();
304*6777b538SAndroid Build Coastguard Worker   auto second_call_value = entropy_state.GetLimitedEntropyRandomizationSource();
305*6777b538SAndroid Build Coastguard Worker 
306*6777b538SAndroid Build Coastguard Worker   // The generated value should not be empty.
307*6777b538SAndroid Build Coastguard Worker   EXPECT_NE("", first_call_value);
308*6777b538SAndroid Build Coastguard Worker   // The values returned from the two calls should be identical.
309*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(first_call_value, second_call_value);
310*6777b538SAndroid Build Coastguard Worker }
311*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,ResetLimitedEntropyRandomizationSourceThroughCmdLine)312*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, ResetLimitedEntropyRandomizationSourceThroughCmdLine) {
313*6777b538SAndroid Build Coastguard Worker   // Setup a command line flag to reset the variations state.
314*6777b538SAndroid Build Coastguard Worker   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
315*6777b538SAndroid Build Coastguard Worker   command_line->AppendSwitch(switches::kResetVariationState);
316*6777b538SAndroid Build Coastguard Worker   // ...and store a previously generated limited entropy randomization source
317*6777b538SAndroid Build Coastguard Worker   // value in prefs.
318*6777b538SAndroid Build Coastguard Worker   auto* test_value = "00000000000000000000000000000001";
319*6777b538SAndroid Build Coastguard Worker   prefs_.SetString(prefs::kMetricsLimitedEntropyRandomizationSource,
320*6777b538SAndroid Build Coastguard Worker                    test_value);
321*6777b538SAndroid Build Coastguard Worker 
322*6777b538SAndroid Build Coastguard Worker   // Attempts to generate a limited entropy randomization source value.
323*6777b538SAndroid Build Coastguard Worker   EntropyState entropy_state(&prefs_);
324*6777b538SAndroid Build Coastguard Worker   entropy_state.GetLimitedEntropyRandomizationSource();
325*6777b538SAndroid Build Coastguard Worker 
326*6777b538SAndroid Build Coastguard Worker   // The generated value should not be the one in prefs initially.
327*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(test_value, entropy_state.GetLimitedEntropyRandomizationSource());
328*6777b538SAndroid Build Coastguard Worker   // There should be a new value, and the new value should overwrite the one in
329*6777b538SAndroid Build Coastguard Worker   // prefs initially.
330*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(entropy_state.GetLimitedEntropyRandomizationSource(),
331*6777b538SAndroid Build Coastguard Worker             prefs_.GetString(prefs::kMetricsLimitedEntropyRandomizationSource));
332*6777b538SAndroid Build Coastguard Worker }
333*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,ValidLimitedEntropyRandomizationSource)334*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, ValidLimitedEntropyRandomizationSource) {
335*6777b538SAndroid Build Coastguard Worker   const char* test_values[] = {
336*6777b538SAndroid Build Coastguard Worker       "00000000000000000000000000000001",
337*6777b538SAndroid Build Coastguard Worker       "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
338*6777b538SAndroid Build Coastguard Worker       "0123456789ABCDEF0123456789ABCDEF",
339*6777b538SAndroid Build Coastguard Worker   };
340*6777b538SAndroid Build Coastguard Worker   for (auto* test_value : test_values) {
341*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(
342*6777b538SAndroid Build Coastguard Worker         EntropyState::IsValidLimitedEntropyRandomizationSource(test_value))
343*6777b538SAndroid Build Coastguard Worker         << "Expect EntropyState::IsValidLimitedEntropyRandomizationSource("
344*6777b538SAndroid Build Coastguard Worker         << test_value << ") to be true.";
345*6777b538SAndroid Build Coastguard Worker   }
346*6777b538SAndroid Build Coastguard Worker }
347*6777b538SAndroid Build Coastguard Worker 
TEST_F(EntropyStateTest,InvalidLimitedEntropyRandomizationSource)348*6777b538SAndroid Build Coastguard Worker TEST_F(EntropyStateTest, InvalidLimitedEntropyRandomizationSource) {
349*6777b538SAndroid Build Coastguard Worker   const char* test_values[] = {
350*6777b538SAndroid Build Coastguard Worker       // The empty string is not a valid limited entropy randomization source.
351*6777b538SAndroid Build Coastguard Worker       "",
352*6777b538SAndroid Build Coastguard Worker       // A value with all zero is a not a valid `base::UnguessableToken`.
353*6777b538SAndroid Build Coastguard Worker       "00000000000000000000000000000000",
354*6777b538SAndroid Build Coastguard Worker       // Not a hex string representing 128 bits.
355*6777b538SAndroid Build Coastguard Worker       "1234",
356*6777b538SAndroid Build Coastguard Worker       // A string with valid length of 128 bits but 'X' is not a hex value.
357*6777b538SAndroid Build Coastguard Worker       "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
358*6777b538SAndroid Build Coastguard Worker       // A invalid hex string because of the lower case letters.
359*6777b538SAndroid Build Coastguard Worker       "0123456789abcdef0123456789abcdef",
360*6777b538SAndroid Build Coastguard Worker   };
361*6777b538SAndroid Build Coastguard Worker   for (auto* test_value : test_values) {
362*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(
363*6777b538SAndroid Build Coastguard Worker         EntropyState::IsValidLimitedEntropyRandomizationSource(test_value))
364*6777b538SAndroid Build Coastguard Worker         << "Expect EntropyState::IsValidLimitedEntropyRandomizationSource("
365*6777b538SAndroid Build Coastguard Worker         << test_value << ") to be false.";
366*6777b538SAndroid Build Coastguard Worker   }
367*6777b538SAndroid Build Coastguard Worker }
368*6777b538SAndroid Build Coastguard Worker 
369*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
370