| 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 |