Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: base/metrics/field_trial_unittest.cc

Issue 153913009: Make some field trials unforceable via command-line in the official build. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review:asvtikine Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/metrics/field_trial.h" 5 #include "base/metrics/field_trial.h"
6 6
7 #include "base/bind.h"
7 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
8 #include "base/rand_util.h" 9 #include "base/rand_util.h"
9 #include "base/run_loop.h" 10 #include "base/run_loop.h"
10 #include "base/strings/string_number_conversions.h" 11 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/string_util.h"
11 #include "base/strings/stringprintf.h" 13 #include "base/strings/stringprintf.h"
12 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
13 15
14 namespace base { 16 namespace base {
15 17
16 namespace { 18 namespace {
17 19
18 // Default group name used by several tests. 20 // Default group name used by several tests.
19 const char kDefaultGroupName[] = "DefaultGroup"; 21 const char kDefaultGroupName[] = "DefaultGroup";
20 22
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 trial3->group(); 379 trial3->group();
378 380
379 FieldTrialList::StatesToString(&save_string); 381 FieldTrialList::StatesToString(&save_string);
380 EXPECT_EQ("Some name/Winner/xxx/yyyy/zzz/default/", save_string); 382 EXPECT_EQ("Some name/Winner/xxx/yyyy/zzz/default/", save_string);
381 } 383 }
382 384
383 TEST_F(FieldTrialTest, Restore) { 385 TEST_F(FieldTrialTest, Restore) {
384 ASSERT_FALSE(FieldTrialList::TrialExists("Some_name")); 386 ASSERT_FALSE(FieldTrialList::TrialExists("Some_name"));
385 ASSERT_FALSE(FieldTrialList::TrialExists("xxx")); 387 ASSERT_FALSE(FieldTrialList::TrialExists("xxx"));
386 388
387 FieldTrialList::CreateTrialsFromString("Some_name/Winner/xxx/yyyy/", 389 FieldTrialList::CreateTrialsFromString(
388 FieldTrialList::DONT_ACTIVATE_TRIALS); 390 "Some_name/Winner/xxx/yyyy/", FieldTrialList::DONT_ACTIVATE_TRIALS,
391 FieldTrialList::IsAcceptedFieldTrialCallback());
389 392
390 FieldTrial* trial = FieldTrialList::Find("Some_name"); 393 FieldTrial* trial = FieldTrialList::Find("Some_name");
391 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); 394 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial);
392 EXPECT_EQ("Winner", trial->group_name()); 395 EXPECT_EQ("Winner", trial->group_name());
393 EXPECT_EQ("Some_name", trial->trial_name()); 396 EXPECT_EQ("Some_name", trial->trial_name());
394 397
395 trial = FieldTrialList::Find("xxx"); 398 trial = FieldTrialList::Find("xxx");
396 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); 399 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial);
397 EXPECT_EQ("yyyy", trial->group_name()); 400 EXPECT_EQ("yyyy", trial->group_name());
398 EXPECT_EQ("xxx", trial->trial_name()); 401 EXPECT_EQ("xxx", trial->trial_name());
399 } 402 }
400 403
401 TEST_F(FieldTrialTest, BogusRestore) { 404 TEST_F(FieldTrialTest, BogusRestore) {
402 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString( 405 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString(
403 "MissingSlash", FieldTrialList::DONT_ACTIVATE_TRIALS)); 406 "MissingSlash", FieldTrialList::DONT_ACTIVATE_TRIALS,
407 FieldTrialList::IsAcceptedFieldTrialCallback()));
404 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString( 408 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString(
405 "MissingGroupName/", FieldTrialList::DONT_ACTIVATE_TRIALS)); 409 "MissingGroupName/", FieldTrialList::DONT_ACTIVATE_TRIALS,
410 FieldTrialList::IsAcceptedFieldTrialCallback()));
406 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString( 411 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString(
407 "MissingFinalSlash/gname", FieldTrialList::DONT_ACTIVATE_TRIALS)); 412 "MissingFinalSlash/gname", FieldTrialList::DONT_ACTIVATE_TRIALS,
413 FieldTrialList::IsAcceptedFieldTrialCallback()));
408 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString( 414 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString(
409 "noname, only group/", FieldTrialList::DONT_ACTIVATE_TRIALS)); 415 "noname, only group/", FieldTrialList::DONT_ACTIVATE_TRIALS,
416 FieldTrialList::IsAcceptedFieldTrialCallback()));
410 } 417 }
411 418
412 TEST_F(FieldTrialTest, DuplicateRestore) { 419 TEST_F(FieldTrialTest, DuplicateRestore) {
413 FieldTrial* trial = CreateFieldTrial("Some name", 10, "Default", NULL); 420 FieldTrial* trial = CreateFieldTrial("Some name", 10, "Default", NULL);
414 trial->AppendGroup("Winner", 10); 421 trial->AppendGroup("Winner", 10);
415 // Finalize the group selection by accessing the selected group. 422 // Finalize the group selection by accessing the selected group.
416 trial->group(); 423 trial->group();
417 std::string save_string; 424 std::string save_string;
418 FieldTrialList::StatesToString(&save_string); 425 FieldTrialList::StatesToString(&save_string);
419 EXPECT_EQ("Some name/Winner/", save_string); 426 EXPECT_EQ("Some name/Winner/", save_string);
420 427
421 // It is OK if we redundantly specify a winner. 428 // It is OK if we redundantly specify a winner.
422 EXPECT_TRUE(FieldTrialList::CreateTrialsFromString( 429 EXPECT_TRUE(FieldTrialList::CreateTrialsFromString(
423 save_string, FieldTrialList::DONT_ACTIVATE_TRIALS)); 430 save_string, FieldTrialList::DONT_ACTIVATE_TRIALS,
431 FieldTrialList::IsAcceptedFieldTrialCallback()));
424 432
425 // But it is an error to try to change to a different winner. 433 // But it is an error to try to change to a different winner.
426 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString( 434 EXPECT_FALSE(FieldTrialList::CreateTrialsFromString(
427 "Some name/Loser/", FieldTrialList::DONT_ACTIVATE_TRIALS)); 435 "Some name/Loser/", FieldTrialList::DONT_ACTIVATE_TRIALS,
436 FieldTrialList::IsAcceptedFieldTrialCallback()));
437 }
438
439 // Accepts any field trial whose |name| doesn't start with "Unaccepted".
440 // Used in the FieldTrialTest.CreateTrialsFromString* tests below to test the
441 // IsAcceptedFieldTrialCallback functionality.
442 bool IsAcceptedTestFieldTrial(const std::string& name) {
443 return !StartsWithASCII(name, "Unaccepted", true);
428 } 444 }
429 445
430 TEST_F(FieldTrialTest, CreateTrialsFromStringActive) { 446 TEST_F(FieldTrialTest, CreateTrialsFromStringActive) {
431 ASSERT_FALSE(FieldTrialList::TrialExists("Abc")); 447 ASSERT_FALSE(FieldTrialList::TrialExists("Abc"));
432 ASSERT_FALSE(FieldTrialList::TrialExists("Xyz")); 448 ASSERT_FALSE(FieldTrialList::TrialExists("Xyz"));
433 ASSERT_TRUE(FieldTrialList::CreateTrialsFromString( 449 ASSERT_TRUE(FieldTrialList::CreateTrialsFromString(
434 "Abc/def/Xyz/zyx/", FieldTrialList::ACTIVATE_TRIALS)); 450 "Abc/def/Xyz/zyx/", FieldTrialList::ACTIVATE_TRIALS,
451 base::Bind(&IsAcceptedTestFieldTrial)));
435 452
436 FieldTrial::ActiveGroups active_groups; 453 FieldTrial::ActiveGroups active_groups;
437 FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 454 FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
438 ASSERT_EQ(2U, active_groups.size()); 455 ASSERT_EQ(2U, active_groups.size());
439 EXPECT_EQ("Abc", active_groups[0].trial_name); 456 EXPECT_EQ("Abc", active_groups[0].trial_name);
440 EXPECT_EQ("def", active_groups[0].group_name); 457 EXPECT_EQ("def", active_groups[0].group_name);
441 EXPECT_EQ("Xyz", active_groups[1].trial_name); 458 EXPECT_EQ("Xyz", active_groups[1].trial_name);
442 EXPECT_EQ("zyx", active_groups[1].group_name); 459 EXPECT_EQ("zyx", active_groups[1].group_name);
443 } 460 }
444 461
445 TEST_F(FieldTrialTest, CreateTrialsFromStringNotActive) { 462 TEST_F(FieldTrialTest, CreateTrialsFromStringNotActive) {
446 ASSERT_FALSE(FieldTrialList::TrialExists("Abc")); 463 ASSERT_FALSE(FieldTrialList::TrialExists("Abc"));
447 ASSERT_FALSE(FieldTrialList::TrialExists("Xyz")); 464 ASSERT_FALSE(FieldTrialList::TrialExists("Xyz"));
448 ASSERT_TRUE(FieldTrialList::CreateTrialsFromString( 465 ASSERT_TRUE(FieldTrialList::CreateTrialsFromString(
449 "Abc/def/Xyz/zyx/", FieldTrialList::DONT_ACTIVATE_TRIALS)); 466 "Abc/def/Xyz/zyx/", FieldTrialList::DONT_ACTIVATE_TRIALS,
467 base::Bind(&IsAcceptedTestFieldTrial)));
450 468
451 FieldTrial::ActiveGroups active_groups; 469 FieldTrial::ActiveGroups active_groups;
452 FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 470 FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
453 ASSERT_TRUE(active_groups.empty()); 471 ASSERT_TRUE(active_groups.empty());
454 472
455 // Check that the values still get returned and querying them activates them. 473 // Check that the values still get returned and querying them activates them.
456 EXPECT_EQ("def", FieldTrialList::FindFullName("Abc")); 474 EXPECT_EQ("def", FieldTrialList::FindFullName("Abc"));
457 EXPECT_EQ("zyx", FieldTrialList::FindFullName("Xyz")); 475 EXPECT_EQ("zyx", FieldTrialList::FindFullName("Xyz"));
458 476
459 FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 477 FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
460 ASSERT_EQ(2U, active_groups.size()); 478 ASSERT_EQ(2U, active_groups.size());
461 EXPECT_EQ("Abc", active_groups[0].trial_name); 479 EXPECT_EQ("Abc", active_groups[0].trial_name);
462 EXPECT_EQ("def", active_groups[0].group_name); 480 EXPECT_EQ("def", active_groups[0].group_name);
463 EXPECT_EQ("Xyz", active_groups[1].trial_name); 481 EXPECT_EQ("Xyz", active_groups[1].trial_name);
464 EXPECT_EQ("zyx", active_groups[1].group_name); 482 EXPECT_EQ("zyx", active_groups[1].group_name);
465 } 483 }
466 484
467 TEST_F(FieldTrialTest, CreateTrialsFromStringActiveObserver) { 485 TEST_F(FieldTrialTest, CreateTrialsFromStringActiveObserver) {
468 ASSERT_FALSE(FieldTrialList::TrialExists("Abc")); 486 ASSERT_FALSE(FieldTrialList::TrialExists("Abc"));
469 487
470 TestFieldTrialObserver observer; 488 TestFieldTrialObserver observer;
471 ASSERT_TRUE(FieldTrialList::CreateTrialsFromString( 489 ASSERT_TRUE(FieldTrialList::CreateTrialsFromString(
472 "Abc/def/", FieldTrialList::ACTIVATE_TRIALS)); 490 "Abc/def/", FieldTrialList::ACTIVATE_TRIALS,
491 base::Bind(&IsAcceptedTestFieldTrial)));
473 492
474 RunLoop().RunUntilIdle(); 493 RunLoop().RunUntilIdle();
475 EXPECT_EQ("Abc", observer.trial_name()); 494 EXPECT_EQ("Abc", observer.trial_name());
476 EXPECT_EQ("def", observer.group_name()); 495 EXPECT_EQ("def", observer.group_name());
477 } 496 }
478 497
479 TEST_F(FieldTrialTest, CreateTrialsFromStringNotActiveObserver) { 498 TEST_F(FieldTrialTest, CreateTrialsFromStringNotActiveObserver) {
480 ASSERT_FALSE(FieldTrialList::TrialExists("Abc")); 499 ASSERT_FALSE(FieldTrialList::TrialExists("Abc"));
481 500
482 TestFieldTrialObserver observer; 501 TestFieldTrialObserver observer;
483 ASSERT_TRUE(FieldTrialList::CreateTrialsFromString( 502 ASSERT_TRUE(FieldTrialList::CreateTrialsFromString(
484 "Abc/def/", FieldTrialList::DONT_ACTIVATE_TRIALS)); 503 "Abc/def/", FieldTrialList::DONT_ACTIVATE_TRIALS,
504 base::Bind(&IsAcceptedTestFieldTrial)));
485 RunLoop().RunUntilIdle(); 505 RunLoop().RunUntilIdle();
486 // Observer shouldn't be notified. 506 // Observer shouldn't be notified.
487 EXPECT_TRUE(observer.trial_name().empty()); 507 EXPECT_TRUE(observer.trial_name().empty());
488 508
489 // Check that the values still get returned and querying them activates them. 509 // Check that the values still get returned and querying them activates them.
490 EXPECT_EQ("def", FieldTrialList::FindFullName("Abc")); 510 EXPECT_EQ("def", FieldTrialList::FindFullName("Abc"));
491 511
492 RunLoop().RunUntilIdle(); 512 RunLoop().RunUntilIdle();
493 EXPECT_EQ("Abc", observer.trial_name()); 513 EXPECT_EQ("Abc", observer.trial_name());
494 EXPECT_EQ("def", observer.group_name()); 514 EXPECT_EQ("def", observer.group_name());
495 } 515 }
496 516
517 TEST_F(FieldTrialTest, CreateTrialsFromStringWithUnacceptedFieldTrials) {
518 ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted1"));
519 ASSERT_FALSE(FieldTrialList::TrialExists("Foo"));
520 ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted2"));
521 ASSERT_FALSE(FieldTrialList::TrialExists("Bar"));
522 ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted3"));
523
524 FieldTrialList::CreateTrialsFromString(
525 "Unaccepted1/Unaccepted1_name/"
526 "Foo/Foo_name/"
527 "Unaccepted2/Unaccepted2_name/"
528 "Bar/Bar_name/"
529 "Unaccepted3/Unaccepted3_name/",
530 FieldTrialList::DONT_ACTIVATE_TRIALS,
531 base::Bind(&IsAcceptedTestFieldTrial));
532
533 EXPECT_FALSE(FieldTrialList::TrialExists("Unaccepted1"));
534 EXPECT_TRUE(FieldTrialList::TrialExists("Foo"));
535 EXPECT_FALSE(FieldTrialList::TrialExists("Unaccepted2"));
536 EXPECT_TRUE(FieldTrialList::TrialExists("Bar"));
537 EXPECT_FALSE(FieldTrialList::TrialExists("Unaccepted3"));
538
539 FieldTrial::ActiveGroups active_groups;
540 FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
541 EXPECT_TRUE(active_groups.empty());
542
543 FieldTrial* trial = FieldTrialList::Find("Foo");
544 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial);
545 EXPECT_EQ("Foo", trial->trial_name());
546 EXPECT_EQ("Foo_name", trial->group_name());
547
548 trial = FieldTrialList::Find("Bar");
549 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial);
550 EXPECT_EQ("Bar", trial->trial_name());
551 EXPECT_EQ("Bar_name", trial->group_name());
552 }
553
554 TEST_F(FieldTrialTest, CreateTrialsFromStringNullCallback) {
555 ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted1"));
556 ASSERT_FALSE(FieldTrialList::TrialExists("Foo"));
557
558 // All field trials should be accepted when the callback is null.
559 FieldTrialList::CreateTrialsFromString(
560 "Unaccepted1/Unaccepted1_name/Foo/Foo_name/",
561 FieldTrialList::DONT_ACTIVATE_TRIALS,
562 FieldTrialList::IsAcceptedFieldTrialCallback());
563
564 FieldTrial::ActiveGroups active_groups;
565 FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
566 EXPECT_TRUE(active_groups.empty());
567
568 FieldTrial* trial = FieldTrialList::Find("Foo");
569 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial);
570 EXPECT_EQ("Foo", trial->trial_name());
571 EXPECT_EQ("Foo_name", trial->group_name());
572
573 trial = FieldTrialList::Find("Unaccepted1");
574 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial);
575 EXPECT_EQ("Unaccepted1", trial->trial_name());
576 EXPECT_EQ("Unaccepted1_name", trial->group_name());
577 }
578
497 TEST_F(FieldTrialTest, CreateFieldTrial) { 579 TEST_F(FieldTrialTest, CreateFieldTrial) {
498 ASSERT_FALSE(FieldTrialList::TrialExists("Some_name")); 580 ASSERT_FALSE(FieldTrialList::TrialExists("Some_name"));
499 581
500 FieldTrialList::CreateFieldTrial("Some_name", "Winner"); 582 FieldTrialList::CreateFieldTrial("Some_name", "Winner");
501 583
502 FieldTrial* trial = FieldTrialList::Find("Some_name"); 584 FieldTrial* trial = FieldTrialList::Find("Some_name");
503 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial); 585 ASSERT_NE(static_cast<FieldTrial*>(NULL), trial);
504 EXPECT_EQ("Winner", trial->group_name()); 586 EXPECT_EQ("Winner", trial->group_name());
505 EXPECT_EQ("Some_name", trial->trial_name()); 587 EXPECT_EQ("Some_name", trial->trial_name());
506 } 588 }
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
914 EXPECT_TRUE(active_groups.empty()); 996 EXPECT_TRUE(active_groups.empty());
915 997
916 // The trial shouldn't be listed in the |StatesToString()| result. 998 // The trial shouldn't be listed in the |StatesToString()| result.
917 std::string states; 999 std::string states;
918 FieldTrialList::StatesToString(&states); 1000 FieldTrialList::StatesToString(&states);
919 EXPECT_TRUE(states.empty()); 1001 EXPECT_TRUE(states.empty());
920 } 1002 }
921 } 1003 }
922 1004
923 } // namespace base 1005 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698