variations_ids_provider_unittest.cc 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. // Copyright 2014 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. #include "components/variations/variations_ids_provider.h"
  5. #include <string>
  6. #include "base/base64.h"
  7. #include "base/containers/contains.h"
  8. #include "base/feature_list.h"
  9. #include "base/metrics/field_trial.h"
  10. #include "base/run_loop.h"
  11. #include "base/test/scoped_feature_list.h"
  12. #include "base/test/task_environment.h"
  13. #include "components/variations/entropy_provider.h"
  14. #include "components/variations/proto/client_variations.pb.h"
  15. #include "components/variations/proto/study.pb.h"
  16. #include "components/variations/variations.mojom.h"
  17. #include "components/variations/variations_associated_data.h"
  18. #include "components/variations/variations_features.h"
  19. #include "components/variations/variations_test_utils.h"
  20. #include "testing/gtest/include/gtest/gtest.h"
  21. namespace variations {
  22. class VariationsIdsProviderTest : public ::testing::Test {
  23. public:
  24. VariationsIdsProviderTest() {}
  25. ~VariationsIdsProviderTest() override {}
  26. void TearDown() override { testing::ClearAllVariationIDs(); }
  27. base::test::SingleThreadTaskEnvironment task_environment_;
  28. };
  29. // Used for testing the kRestrictGoogleWebVisibility feature.
  30. class VariationsIdsProviderTestWithRestrictedVisibility
  31. : public VariationsIdsProviderTest,
  32. public ::testing::WithParamInterface<bool> {
  33. public:
  34. VariationsIdsProviderTestWithRestrictedVisibility() {
  35. if (GetParam()) {
  36. scoped_feature_list_.InitAndEnableFeature(
  37. internal::kRestrictGoogleWebVisibility);
  38. } else {
  39. scoped_feature_list_.InitAndDisableFeature(
  40. internal::kRestrictGoogleWebVisibility);
  41. }
  42. }
  43. private:
  44. base::test::ScopedFeatureList scoped_feature_list_;
  45. };
  46. TEST_F(VariationsIdsProviderTest, ForceVariationIds_Valid) {
  47. VariationsIdsProvider provider(
  48. VariationsIdsProvider::Mode::kUseSignedInState);
  49. // Valid experiment ids.
  50. EXPECT_EQ(VariationsIdsProvider::ForceIdsResult::SUCCESS,
  51. provider.ForceVariationIds({"12", "456", "t789"}, ""));
  52. provider.InitVariationIDsCacheIfNeeded();
  53. variations::mojom::VariationsHeadersPtr headers =
  54. provider.GetClientDataHeaders(/*is_signed_in=*/false);
  55. EXPECT_FALSE(headers->headers_map.empty());
  56. const std::string variations =
  57. headers->headers_map.at(variations::mojom::GoogleWebVisibility::ANY);
  58. std::set<VariationID> variation_ids;
  59. std::set<VariationID> trigger_ids;
  60. ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids));
  61. EXPECT_TRUE(variation_ids.find(12) != variation_ids.end());
  62. EXPECT_TRUE(variation_ids.find(456) != variation_ids.end());
  63. EXPECT_TRUE(trigger_ids.find(789) != trigger_ids.end());
  64. EXPECT_FALSE(variation_ids.find(789) != variation_ids.end());
  65. }
  66. TEST_F(VariationsIdsProviderTest, ForceVariationIds_ValidCommandLine) {
  67. VariationsIdsProvider provider(
  68. VariationsIdsProvider::Mode::kUseSignedInState);
  69. // Valid experiment ids.
  70. EXPECT_EQ(VariationsIdsProvider::ForceIdsResult::SUCCESS,
  71. provider.ForceVariationIds({"12"}, "456,t789"));
  72. provider.InitVariationIDsCacheIfNeeded();
  73. variations::mojom::VariationsHeadersPtr headers =
  74. provider.GetClientDataHeaders(/*is_signed_in=*/false);
  75. EXPECT_FALSE(headers->headers_map.empty());
  76. const std::string variations =
  77. headers->headers_map.at(variations::mojom::GoogleWebVisibility::ANY);
  78. std::set<VariationID> variation_ids;
  79. std::set<VariationID> trigger_ids;
  80. ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids));
  81. EXPECT_TRUE(variation_ids.find(12) != variation_ids.end());
  82. EXPECT_TRUE(variation_ids.find(456) != variation_ids.end());
  83. EXPECT_TRUE(trigger_ids.find(789) != trigger_ids.end());
  84. EXPECT_FALSE(variation_ids.find(789) != variation_ids.end());
  85. }
  86. TEST_F(VariationsIdsProviderTest, ForceVariationIds_Invalid) {
  87. VariationsIdsProvider provider(
  88. VariationsIdsProvider::Mode::kUseSignedInState);
  89. // Invalid experiment ids.
  90. EXPECT_EQ(VariationsIdsProvider::ForceIdsResult::INVALID_VECTOR_ENTRY,
  91. provider.ForceVariationIds({"abcd12", "456"}, ""));
  92. provider.InitVariationIDsCacheIfNeeded();
  93. EXPECT_TRUE(provider.GetClientDataHeaders(/*is_signed_in=*/false).is_null());
  94. // Invalid trigger experiment id
  95. EXPECT_EQ(VariationsIdsProvider::ForceIdsResult::INVALID_VECTOR_ENTRY,
  96. provider.ForceVariationIds({"12", "tabc456"}, ""));
  97. provider.InitVariationIDsCacheIfNeeded();
  98. EXPECT_TRUE(provider.GetClientDataHeaders(/*is_signed_in=*/false).is_null());
  99. // Invalid command-line ids.
  100. EXPECT_EQ(VariationsIdsProvider::ForceIdsResult::INVALID_SWITCH_ENTRY,
  101. provider.ForceVariationIds({"12", "50"}, "tabc456"));
  102. provider.InitVariationIDsCacheIfNeeded();
  103. EXPECT_TRUE(provider.GetClientDataHeaders(/*is_signed_in=*/false).is_null());
  104. // Duplicate experiment ids.
  105. EXPECT_EQ(VariationsIdsProvider::ForceIdsResult::INVALID_VECTOR_ENTRY,
  106. provider.ForceVariationIds({"1", "2", "t1"}, ""));
  107. provider.InitVariationIDsCacheIfNeeded();
  108. EXPECT_TRUE(provider.GetClientDataHeaders(/*is_signed_in=*/false).is_null());
  109. // Duplicate command-line ids.
  110. EXPECT_EQ(VariationsIdsProvider::ForceIdsResult::INVALID_SWITCH_ENTRY,
  111. provider.ForceVariationIds({}, "t10,11,10"));
  112. provider.InitVariationIDsCacheIfNeeded();
  113. EXPECT_TRUE(provider.GetClientDataHeaders(/*is_signed_in=*/false).is_null());
  114. // Duplicate experiment and command-line ids.
  115. EXPECT_EQ(VariationsIdsProvider::ForceIdsResult::INVALID_SWITCH_ENTRY,
  116. provider.ForceVariationIds({"20", "t21"}, "21"));
  117. provider.InitVariationIDsCacheIfNeeded();
  118. EXPECT_TRUE(provider.GetClientDataHeaders(/*is_signed_in=*/false).is_null());
  119. }
  120. TEST_F(VariationsIdsProviderTest, ForceDisableVariationIds_ValidCommandLine) {
  121. VariationsIdsProvider provider(
  122. VariationsIdsProvider::Mode::kUseSignedInState);
  123. // Valid experiment ids.
  124. EXPECT_EQ(VariationsIdsProvider::ForceIdsResult::SUCCESS,
  125. provider.ForceVariationIds({"1", "2", "t3", "t4"}, "5,6,t7,t8"));
  126. EXPECT_TRUE(provider.ForceDisableVariationIds("2,t4,6,t8"));
  127. provider.InitVariationIDsCacheIfNeeded();
  128. variations::mojom::VariationsHeadersPtr headers =
  129. provider.GetClientDataHeaders(/*is_signed_in=*/false);
  130. EXPECT_FALSE(headers->headers_map.empty());
  131. const std::string variations =
  132. headers->headers_map.at(variations::mojom::GoogleWebVisibility::ANY);
  133. std::set<VariationID> variation_ids;
  134. std::set<VariationID> trigger_ids;
  135. ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids));
  136. EXPECT_TRUE(variation_ids.find(1) != variation_ids.end());
  137. EXPECT_FALSE(variation_ids.find(2) != variation_ids.end());
  138. EXPECT_TRUE(trigger_ids.find(3) != trigger_ids.end());
  139. EXPECT_FALSE(trigger_ids.find(4) != trigger_ids.end());
  140. EXPECT_TRUE(variation_ids.find(5) != variation_ids.end());
  141. EXPECT_FALSE(variation_ids.find(6) != variation_ids.end());
  142. EXPECT_TRUE(trigger_ids.find(7) != trigger_ids.end());
  143. EXPECT_FALSE(trigger_ids.find(8) != trigger_ids.end());
  144. }
  145. TEST_F(VariationsIdsProviderTest, ForceDisableVariationIds_Invalid) {
  146. VariationsIdsProvider provider(
  147. VariationsIdsProvider::Mode::kUseSignedInState);
  148. // Invalid command-line ids.
  149. EXPECT_FALSE(provider.ForceDisableVariationIds("abc"));
  150. EXPECT_FALSE(provider.ForceDisableVariationIds("tabc456"));
  151. provider.InitVariationIDsCacheIfNeeded();
  152. EXPECT_TRUE(provider.GetClientDataHeaders(/*is_signed_in=*/false).is_null());
  153. }
  154. INSTANTIATE_TEST_SUITE_P(All,
  155. VariationsIdsProviderTestWithRestrictedVisibility,
  156. ::testing::Bool());
  157. TEST_P(VariationsIdsProviderTestWithRestrictedVisibility,
  158. LowEntropySourceValue_Valid) {
  159. VariationsIdsProvider provider(
  160. VariationsIdsProvider::Mode::kUseSignedInState);
  161. absl::optional<int> valid_low_entropy_source_value = 5;
  162. provider.SetLowEntropySourceValue(valid_low_entropy_source_value);
  163. provider.InitVariationIDsCacheIfNeeded();
  164. variations::mojom::VariationsHeadersPtr headers =
  165. provider.GetClientDataHeaders(/*is_signed_in=*/false);
  166. EXPECT_FALSE(headers->headers_map.empty());
  167. const std::string variations_header_first_party = headers->headers_map.at(
  168. variations::mojom::GoogleWebVisibility::FIRST_PARTY);
  169. const std::string variations_header_any_context =
  170. headers->headers_map.at(variations::mojom::GoogleWebVisibility::ANY);
  171. std::set<VariationID> variation_ids_first_party;
  172. std::set<VariationID> trigger_ids_first_party;
  173. ASSERT_TRUE(ExtractVariationIds(variations_header_first_party,
  174. &variation_ids_first_party,
  175. &trigger_ids_first_party));
  176. std::set<VariationID> variation_ids_any_context;
  177. std::set<VariationID> trigger_ids_any_context;
  178. ASSERT_TRUE(ExtractVariationIds(variations_header_any_context,
  179. &variation_ids_any_context,
  180. &trigger_ids_any_context));
  181. // 3320983 is the offset value of kLowEntropySourceVariationIdRangeMin + 5.
  182. EXPECT_TRUE(base::Contains(variation_ids_first_party, 3320983));
  183. // The value will be omitted from third-party contexts under
  184. // kRestrictGoogleWebVisibility.
  185. bool value_omitted =
  186. base::FeatureList::IsEnabled(internal::kRestrictGoogleWebVisibility);
  187. EXPECT_EQ(value_omitted, !base::Contains(variation_ids_any_context, 3320983));
  188. }
  189. TEST_P(VariationsIdsProviderTestWithRestrictedVisibility,
  190. LowEntropySourceValue_Null) {
  191. VariationsIdsProvider provider(
  192. VariationsIdsProvider::Mode::kUseSignedInState);
  193. absl::optional<int> null_low_entropy_source_value = absl::nullopt;
  194. provider.SetLowEntropySourceValue(null_low_entropy_source_value);
  195. // Valid experiment ids.
  196. CreateTrialAndAssociateId("t1", "g1", GOOGLE_WEB_PROPERTIES_ANY_CONTEXT, 12);
  197. CreateTrialAndAssociateId("t2", "g2", GOOGLE_WEB_PROPERTIES_ANY_CONTEXT, 456);
  198. provider.InitVariationIDsCacheIfNeeded();
  199. variations::mojom::VariationsHeadersPtr headers =
  200. provider.GetClientDataHeaders(/*is_signed_in=*/false);
  201. EXPECT_FALSE(headers->headers_map.empty());
  202. const std::string variations_header_first_party = headers->headers_map.at(
  203. variations::mojom::GoogleWebVisibility::FIRST_PARTY);
  204. const std::string variations_header_any_context =
  205. headers->headers_map.at(variations::mojom::GoogleWebVisibility::ANY);
  206. std::set<VariationID> variation_ids_first_party;
  207. std::set<VariationID> trigger_ids_first_party;
  208. ASSERT_TRUE(ExtractVariationIds(variations_header_first_party,
  209. &variation_ids_first_party,
  210. &trigger_ids_first_party));
  211. std::set<VariationID> variation_ids_any_context;
  212. std::set<VariationID> trigger_ids_any_context;
  213. ASSERT_TRUE(ExtractVariationIds(variations_header_any_context,
  214. &variation_ids_any_context,
  215. &trigger_ids_any_context));
  216. // We test to make sure that only two valid variation IDs are present and that
  217. // the low entropy source value is not added to the sets.
  218. EXPECT_TRUE(base::Contains(variation_ids_first_party, 12));
  219. EXPECT_TRUE(base::Contains(variation_ids_first_party, 456));
  220. EXPECT_FALSE(base::Contains(variation_ids_first_party, 3320983));
  221. EXPECT_TRUE(base::Contains(variation_ids_any_context, 12));
  222. EXPECT_TRUE(base::Contains(variation_ids_any_context, 456));
  223. EXPECT_FALSE(base::Contains(variation_ids_any_context, 3320983));
  224. // Check to make sure that no other variation IDs are present.
  225. EXPECT_EQ(2U, variation_ids_first_party.size());
  226. EXPECT_EQ(2U, variation_ids_any_context.size());
  227. }
  228. TEST_P(VariationsIdsProviderTestWithRestrictedVisibility,
  229. OnFieldTrialGroupFinalized) {
  230. VariationsIdsProvider provider(
  231. VariationsIdsProvider::Mode::kUseSignedInState);
  232. provider.InitVariationIDsCacheIfNeeded();
  233. const std::string default_name = "default";
  234. scoped_refptr<base::FieldTrial> trial_1(CreateTrialAndAssociateId(
  235. "t1", default_name, GOOGLE_WEB_PROPERTIES_ANY_CONTEXT, 11));
  236. ASSERT_EQ(default_name, trial_1->group_name());
  237. scoped_refptr<base::FieldTrial> trial_2(CreateTrialAndAssociateId(
  238. "t2", default_name, GOOGLE_WEB_PROPERTIES_FIRST_PARTY, 22));
  239. ASSERT_EQ(default_name, trial_2->group_name());
  240. scoped_refptr<base::FieldTrial> trial_3(CreateTrialAndAssociateId(
  241. "t3", default_name, GOOGLE_WEB_PROPERTIES_TRIGGER_ANY_CONTEXT, 33));
  242. ASSERT_EQ(default_name, trial_3->group_name());
  243. scoped_refptr<base::FieldTrial> trial_4(CreateTrialAndAssociateId(
  244. "t4", default_name, GOOGLE_WEB_PROPERTIES_TRIGGER_FIRST_PARTY, 44));
  245. ASSERT_EQ(default_name, trial_4->group_name());
  246. scoped_refptr<base::FieldTrial> trial_5(CreateTrialAndAssociateId(
  247. "t5", default_name, GOOGLE_WEB_PROPERTIES_SIGNED_IN, 55));
  248. ASSERT_EQ(default_name, trial_5->group_name());
  249. // Run the message loop to make sure OnFieldTrialGroupFinalized is called for
  250. // the two field trials.
  251. base::RunLoop().RunUntilIdle();
  252. // Get non-signed in ids.
  253. {
  254. variations::mojom::VariationsHeadersPtr headers =
  255. provider.GetClientDataHeaders(/*is_signed_in=*/false);
  256. const std::string variations_header_first_party = headers->headers_map.at(
  257. variations::mojom::GoogleWebVisibility::FIRST_PARTY);
  258. const std::string variations_header_any_context =
  259. headers->headers_map.at(variations::mojom::GoogleWebVisibility::ANY);
  260. std::set<VariationID> ids_first_party;
  261. std::set<VariationID> trigger_ids_first_party;
  262. ASSERT_TRUE(ExtractVariationIds(variations_header_first_party,
  263. &ids_first_party,
  264. &trigger_ids_first_party));
  265. std::set<VariationID> ids_any_context;
  266. std::set<VariationID> trigger_ids_any_context;
  267. ASSERT_TRUE(ExtractVariationIds(variations_header_any_context,
  268. &ids_any_context,
  269. &trigger_ids_any_context));
  270. EXPECT_EQ(2U, ids_first_party.size());
  271. EXPECT_TRUE(base::Contains(ids_first_party, 11));
  272. EXPECT_TRUE(base::Contains(ids_first_party, 22));
  273. EXPECT_EQ(2U, trigger_ids_first_party.size());
  274. EXPECT_TRUE(base::Contains(trigger_ids_first_party, 33));
  275. EXPECT_TRUE(base::Contains(trigger_ids_first_party, 44));
  276. if (base::FeatureList::IsEnabled(internal::kRestrictGoogleWebVisibility)) {
  277. // When the feature is enabled, IDs associated with FIRST_PARTY
  278. // IDCollectionKeys should be excluded from the variations header that may
  279. // be sent in third-party contexts.
  280. EXPECT_EQ(1U, ids_any_context.size());
  281. EXPECT_TRUE(base::Contains(ids_any_context, 11));
  282. EXPECT_EQ(1U, trigger_ids_any_context.size());
  283. EXPECT_TRUE(base::Contains(trigger_ids_any_context, 33));
  284. } else {
  285. // When the feature is disabled, IDs associated with FIRST_PARTY
  286. // IDCollectionKeys should be included in the variations header that may
  287. // be sent in third-party contexts.
  288. EXPECT_EQ(2U, ids_any_context.size());
  289. EXPECT_TRUE(base::Contains(ids_any_context, 11));
  290. EXPECT_TRUE(base::Contains(ids_any_context, 22));
  291. EXPECT_EQ(2U, trigger_ids_any_context.size());
  292. EXPECT_TRUE(base::Contains(trigger_ids_any_context, 33));
  293. EXPECT_TRUE(base::Contains(trigger_ids_any_context, 44));
  294. }
  295. }
  296. // Now, get signed-in ids.
  297. {
  298. variations::mojom::VariationsHeadersPtr headers =
  299. provider.GetClientDataHeaders(/*is_signed_in=*/true);
  300. const std::string variations_header_first_party = headers->headers_map.at(
  301. variations::mojom::GoogleWebVisibility::FIRST_PARTY);
  302. const std::string variations_header_any_context =
  303. headers->headers_map.at(variations::mojom::GoogleWebVisibility::ANY);
  304. std::set<VariationID> ids_first_party;
  305. std::set<VariationID> trigger_ids_first_party;
  306. ASSERT_TRUE(ExtractVariationIds(variations_header_first_party,
  307. &ids_first_party,
  308. &trigger_ids_first_party));
  309. std::set<VariationID> ids_any_context;
  310. std::set<VariationID> trigger_ids_any_context;
  311. ASSERT_TRUE(ExtractVariationIds(variations_header_any_context,
  312. &ids_any_context,
  313. &trigger_ids_any_context));
  314. EXPECT_EQ(3U, ids_first_party.size());
  315. EXPECT_TRUE(base::Contains(ids_first_party, 11));
  316. EXPECT_TRUE(base::Contains(ids_first_party, 22));
  317. EXPECT_TRUE(base::Contains(ids_any_context, 55));
  318. EXPECT_EQ(2U, trigger_ids_first_party.size());
  319. EXPECT_TRUE(base::Contains(trigger_ids_first_party, 33));
  320. EXPECT_TRUE(base::Contains(trigger_ids_first_party, 44));
  321. if (base::FeatureList::IsEnabled(internal::kRestrictGoogleWebVisibility)) {
  322. // When the feature is enabled, IDs associated with FIRST_PARTY
  323. // IDCollectionKeys should be excluded from the variations header that may
  324. // be sent in third-party contexts.
  325. EXPECT_EQ(2U, ids_any_context.size());
  326. EXPECT_TRUE(base::Contains(ids_any_context, 11));
  327. EXPECT_TRUE(base::Contains(ids_any_context, 55));
  328. EXPECT_EQ(1U, trigger_ids_any_context.size());
  329. EXPECT_TRUE(base::Contains(trigger_ids_any_context, 33));
  330. } else {
  331. // When the feature is disabled, IDs associated with FIRST_PARTY
  332. // IDCollectionKeys should be included in the variations header that may
  333. // be sent in third-party contexts.
  334. EXPECT_EQ(3U, ids_any_context.size());
  335. EXPECT_TRUE(base::Contains(ids_any_context, 11));
  336. EXPECT_TRUE(base::Contains(ids_any_context, 22));
  337. EXPECT_TRUE(base::Contains(ids_any_context, 55));
  338. EXPECT_EQ(2U, trigger_ids_any_context.size());
  339. EXPECT_TRUE(base::Contains(trigger_ids_any_context, 33));
  340. EXPECT_TRUE(base::Contains(trigger_ids_any_context, 44));
  341. }
  342. }
  343. }
  344. TEST_F(VariationsIdsProviderTest, GetGoogleAppVariationsString) {
  345. // No GOOGLE_WEB_PROPERTIES(_X) ids should be included.
  346. CreateTrialAndAssociateId("t1", "g1",
  347. GOOGLE_WEB_PROPERTIES_TRIGGER_ANY_CONTEXT, 121);
  348. CreateTrialAndAssociateId("t2", "g2",
  349. GOOGLE_WEB_PROPERTIES_TRIGGER_FIRST_PARTY, 122);
  350. CreateTrialAndAssociateId("t3", "g3", GOOGLE_WEB_PROPERTIES_ANY_CONTEXT, 123);
  351. CreateTrialAndAssociateId("t4", "g4", GOOGLE_WEB_PROPERTIES_FIRST_PARTY, 124);
  352. CreateTrialAndAssociateId("t5", "g5", GOOGLE_WEB_PROPERTIES_SIGNED_IN, 125);
  353. // GOOGLE_APP ids should be included.
  354. CreateTrialAndAssociateId("t6", "g6", GOOGLE_APP, 126);
  355. VariationsIdsProvider provider(
  356. VariationsIdsProvider::Mode::kUseSignedInState);
  357. provider.ForceVariationIds({"100", "200"}, "");
  358. EXPECT_EQ(" 126 ", provider.GetGoogleAppVariationsString());
  359. }
  360. TEST_F(VariationsIdsProviderTest, GetVariationsString) {
  361. // Trigger ids shouldn't be included.
  362. CreateTrialAndAssociateId("t1", "g1",
  363. GOOGLE_WEB_PROPERTIES_TRIGGER_ANY_CONTEXT, 121);
  364. CreateTrialAndAssociateId("t2", "g2",
  365. GOOGLE_WEB_PROPERTIES_TRIGGER_FIRST_PARTY, 122);
  366. // These ids should be included.
  367. CreateTrialAndAssociateId("t3", "g3", GOOGLE_WEB_PROPERTIES_ANY_CONTEXT, 123);
  368. CreateTrialAndAssociateId("t4", "g4", GOOGLE_WEB_PROPERTIES_FIRST_PARTY, 124);
  369. // Signed-in ids shouldn't be included.
  370. CreateTrialAndAssociateId("t5", "g5", GOOGLE_WEB_PROPERTIES_SIGNED_IN, 125);
  371. // GOOGLE_APP ids shouldn't be included.
  372. CreateTrialAndAssociateId("t6", "g6", GOOGLE_APP, 126);
  373. VariationsIdsProvider provider(
  374. VariationsIdsProvider::Mode::kUseSignedInState);
  375. provider.ForceVariationIds({"100", "200"}, "");
  376. EXPECT_EQ(" 100 123 124 200 ", provider.GetVariationsString());
  377. }
  378. TEST_F(VariationsIdsProviderTest, GetVariationsVector) {
  379. CreateTrialAndAssociateId("t1", "g1", GOOGLE_WEB_PROPERTIES_ANY_CONTEXT, 121);
  380. CreateTrialAndAssociateId("t3", "g3", GOOGLE_WEB_PROPERTIES_FIRST_PARTY, 122);
  381. CreateTrialAndAssociateId("t4", "g4",
  382. GOOGLE_WEB_PROPERTIES_TRIGGER_ANY_CONTEXT, 123);
  383. CreateTrialAndAssociateId("t5", "g5",
  384. GOOGLE_WEB_PROPERTIES_TRIGGER_FIRST_PARTY, 124);
  385. CreateTrialAndAssociateId("t6", "g6", GOOGLE_WEB_PROPERTIES_SIGNED_IN, 125);
  386. CreateTrialAndAssociateId("t7", "g7", GOOGLE_APP, 126);
  387. VariationsIdsProvider provider(
  388. VariationsIdsProvider::Mode::kUseSignedInState);
  389. provider.ForceVariationIds({"100", "200", "t101"}, "");
  390. EXPECT_EQ((std::vector<VariationID>{100, 121, 200}),
  391. provider.GetVariationsVector({GOOGLE_WEB_PROPERTIES_ANY_CONTEXT}));
  392. EXPECT_EQ((std::vector<VariationID>{122}),
  393. provider.GetVariationsVector({GOOGLE_WEB_PROPERTIES_FIRST_PARTY}));
  394. EXPECT_EQ((std::vector<VariationID>{101, 123}),
  395. provider.GetVariationsVector(
  396. {GOOGLE_WEB_PROPERTIES_TRIGGER_ANY_CONTEXT}));
  397. EXPECT_EQ((std::vector<VariationID>{124}),
  398. provider.GetVariationsVector(
  399. {GOOGLE_WEB_PROPERTIES_TRIGGER_FIRST_PARTY}));
  400. EXPECT_EQ((std::vector<VariationID>{125}),
  401. provider.GetVariationsVector({GOOGLE_WEB_PROPERTIES_SIGNED_IN}));
  402. EXPECT_EQ((std::vector<VariationID>{126}),
  403. provider.GetVariationsVector({GOOGLE_APP}));
  404. EXPECT_EQ(
  405. (std::vector<VariationID>{100, 101, 121, 122, 123, 124, 125, 126, 200}),
  406. provider.GetVariationsVector(
  407. {GOOGLE_WEB_PROPERTIES_ANY_CONTEXT, GOOGLE_WEB_PROPERTIES_FIRST_PARTY,
  408. GOOGLE_WEB_PROPERTIES_TRIGGER_ANY_CONTEXT,
  409. GOOGLE_WEB_PROPERTIES_TRIGGER_FIRST_PARTY,
  410. GOOGLE_WEB_PROPERTIES_SIGNED_IN, GOOGLE_APP}));
  411. }
  412. TEST_F(VariationsIdsProviderTest, GetVariationsVectorForWebPropertiesKeys) {
  413. CreateTrialAndAssociateId("t1", "g1", GOOGLE_WEB_PROPERTIES_ANY_CONTEXT, 121);
  414. CreateTrialAndAssociateId("t2", "g2", GOOGLE_WEB_PROPERTIES_FIRST_PARTY, 122);
  415. CreateTrialAndAssociateId("t3", "g3",
  416. GOOGLE_WEB_PROPERTIES_TRIGGER_ANY_CONTEXT, 123);
  417. CreateTrialAndAssociateId("t4", "g4",
  418. GOOGLE_WEB_PROPERTIES_TRIGGER_FIRST_PARTY, 124);
  419. CreateTrialAndAssociateId("t5", "g5", GOOGLE_WEB_PROPERTIES_SIGNED_IN, 125);
  420. // GOOGLE_APP ids shouldn't be included.
  421. CreateTrialAndAssociateId("t6", "g6", GOOGLE_APP, 126);
  422. VariationsIdsProvider provider(
  423. VariationsIdsProvider::Mode::kUseSignedInState);
  424. provider.ForceVariationIds({"100", "t101"}, "");
  425. EXPECT_EQ((std::vector<VariationID>{100, 101, 121, 122, 123, 124, 125}),
  426. provider.GetVariationsVectorForWebPropertiesKeys());
  427. }
  428. TEST_F(VariationsIdsProviderTest, GetVariationsVectorImpl) {
  429. CreateTrialAndAssociateId("t1", "g1", GOOGLE_WEB_PROPERTIES_ANY_CONTEXT, 121);
  430. CreateTrialAndAssociateId("t2", "g2", GOOGLE_WEB_PROPERTIES_FIRST_PARTY, 122);
  431. CreateTrialAndAssociateId("t3", "g3",
  432. GOOGLE_WEB_PROPERTIES_TRIGGER_ANY_CONTEXT, 123);
  433. CreateTrialAndAssociateId("t4", "g4",
  434. GOOGLE_WEB_PROPERTIES_TRIGGER_FIRST_PARTY, 124);
  435. CreateTrialAndAssociateId("t5", "g5", GOOGLE_WEB_PROPERTIES_SIGNED_IN, 125);
  436. CreateTrialAndAssociateId("t6", "g6", GOOGLE_APP, 125); // Duplicate.
  437. VariationsIdsProvider provider(
  438. VariationsIdsProvider::Mode::kUseSignedInState);
  439. provider.ForceVariationIds({"100", "200", "t101"}, "");
  440. EXPECT_EQ(
  441. (std::vector<VariationID>{100, 121, 122, 200}),
  442. provider.GetVariationsVectorImpl({GOOGLE_WEB_PROPERTIES_ANY_CONTEXT,
  443. GOOGLE_WEB_PROPERTIES_FIRST_PARTY}));
  444. EXPECT_EQ((std::vector<VariationID>{101, 123, 124}),
  445. provider.GetVariationsVectorImpl(
  446. {GOOGLE_WEB_PROPERTIES_TRIGGER_ANY_CONTEXT,
  447. GOOGLE_WEB_PROPERTIES_TRIGGER_FIRST_PARTY}));
  448. EXPECT_EQ((std::vector<VariationID>{125}),
  449. provider.GetVariationsVectorImpl(
  450. {GOOGLE_WEB_PROPERTIES_SIGNED_IN, GOOGLE_APP}));
  451. }
  452. } // namespace variations