OLD | NEW |
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 Loading... |
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 |trial_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& trial_name) { |
| 443 return !StartsWithASCII(trial_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 Loading... |
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 |
OLD | NEW |