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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/rlz/rlz.h" 6 7 #include "base/memory/scoped_ptr.h" 8 #include "base/strings/utf_string_conversions.h" 9 #include "base/time/time.h" 10 #include "chrome/browser/autocomplete/autocomplete_controller.h" 11 #include "chrome/browser/chrome_notification_types.h" 12 #include "chrome/browser/google/google_brand.h" 13 #include "chrome/browser/omnibox/omnibox_log.h" 14 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/installer/util/browser_distribution.h" 16 #include "chrome/installer/util/google_update_constants.h" 17 #include "components/metrics/proto/omnibox_event.pb.h" 18 #include "content/public/browser/navigation_entry.h" 19 #include "content/public/browser/notification_details.h" 20 #include "content/public/browser/notification_service.h" 21 #include "content/public/browser/notification_source.h" 22 #include "rlz/test/rlz_test_helpers.h" 23 #include "testing/gtest/include/gtest/gtest.h" 24 25 #if defined(OS_WIN) 26 #include "base/win/registry.h" 27 #endif 28 29 using content::NavigationEntry; 30 using testing::AssertionResult; 31 using testing::AssertionSuccess; 32 using testing::AssertionFailure; 33 34 #if defined(OS_WIN) 35 using base::win::RegKey; 36 #endif 37 38 namespace { 39 40 // Dummy RLZ string for the access points. 41 const char kOmniboxRlzString[] = "test_omnibox"; 42 const char kHomepageRlzString[] = "test_homepage"; 43 const char kAppListRlzString[] = "test_applist"; 44 const char kNewOmniboxRlzString[] = "new_omnibox"; 45 const char kNewHomepageRlzString[] = "new_homepage"; 46 const char kNewAppListRlzString[] = "new_applist"; 47 48 // Some helper macros to test it a string contains/does not contain a substring. 49 50 AssertionResult CmpHelperSTRC(const char* str_expression, 51 const char* substr_expression, 52 const char* str, 53 const char* substr) { 54 if (NULL != strstr(str, substr)) { 55 return AssertionSuccess(); 56 } 57 58 return AssertionFailure() << "Expected: (" << substr_expression << ") in (" 59 << str_expression << "), actual: '" 60 << substr << "' not in '" << str << "'"; 61 } 62 63 AssertionResult CmpHelperSTRNC(const char* str_expression, 64 const char* substr_expression, 65 const char* str, 66 const char* substr) { 67 if (NULL == strstr(str, substr)) { 68 return AssertionSuccess(); 69 } 70 71 return AssertionFailure() << "Expected: (" << substr_expression 72 << ") not in (" << str_expression << "), actual: '" 73 << substr << "' in '" << str << "'"; 74 } 75 76 #define EXPECT_STR_CONTAINS(str, substr) \ 77 EXPECT_PRED_FORMAT2(CmpHelperSTRC, str, substr) 78 79 #define EXPECT_STR_NOT_CONTAIN(str, substr) \ 80 EXPECT_PRED_FORMAT2(CmpHelperSTRNC, str, substr) 81 82 } // namespace 83 84 // Test class for RLZ tracker. Makes some member functions public and 85 // overrides others to make it easier to test. 86 class TestRLZTracker : public RLZTracker { 87 public: 88 using RLZTracker::InitRlzDelayed; 89 using RLZTracker::DelayedInit; 90 using RLZTracker::Observe; 91 92 TestRLZTracker() : assume_not_ui_thread_(true) { 93 set_tracker(this); 94 } 95 96 virtual ~TestRLZTracker() { 97 set_tracker(NULL); 98 } 99 100 bool was_ping_sent_for_brand(const std::string& brand) const { 101 return pinged_brands_.count(brand) > 0; 102 } 103 104 void set_assume_not_ui_thread(bool assume_not_ui_thread) { 105 assume_not_ui_thread_ = assume_not_ui_thread; 106 } 107 108 private: 109 virtual void ScheduleDelayedInit(base::TimeDelta delay) OVERRIDE { 110 // If the delay is 0, invoke the delayed init now. Otherwise, 111 // don't schedule anything, it will be manually called during tests. 112 if (delay == base::TimeDelta()) 113 DelayedInit(); 114 } 115 116 virtual void ScheduleFinancialPing() OVERRIDE { 117 PingNowImpl(); 118 } 119 120 virtual bool ScheduleRecordProductEvent(rlz_lib::Product product, 121 rlz_lib::AccessPoint point, 122 rlz_lib::Event event_id) OVERRIDE { 123 return !assume_not_ui_thread_; 124 } 125 126 virtual bool ScheduleGetAccessPointRlz(rlz_lib::AccessPoint point) OVERRIDE { 127 return !assume_not_ui_thread_; 128 } 129 130 virtual bool ScheduleRecordFirstSearch(rlz_lib::AccessPoint point) OVERRIDE { 131 return !assume_not_ui_thread_; 132 } 133 134 #if defined(OS_CHROMEOS) 135 virtual bool ScheduleClearRlzState() OVERRIDE { 136 return !assume_not_ui_thread_; 137 } 138 #endif 139 140 virtual bool SendFinancialPing(const std::string& brand, 141 const base::string16& lang, 142 const base::string16& referral) OVERRIDE { 143 // Don't ping the server during tests, just pretend as if we did. 144 EXPECT_FALSE(brand.empty()); 145 pinged_brands_.insert(brand); 146 147 // Set new access points RLZ string, like the actual server ping would have 148 // done. 149 rlz_lib::SetAccessPointRlz(RLZTracker::ChromeOmnibox(), 150 kNewOmniboxRlzString); 151 rlz_lib::SetAccessPointRlz(RLZTracker::ChromeHomePage(), 152 kNewHomepageRlzString); 153 rlz_lib::SetAccessPointRlz(RLZTracker::ChromeAppList(), 154 kNewAppListRlzString); 155 return true; 156 } 157 158 std::set<std::string> pinged_brands_; 159 bool assume_not_ui_thread_; 160 161 DISALLOW_COPY_AND_ASSIGN(TestRLZTracker); 162 }; 163 164 class RlzLibTest : public RlzLibTestNoMachineState { 165 protected: 166 virtual void SetUp() OVERRIDE; 167 168 void SetMainBrand(const char* brand); 169 void SetReactivationBrand(const char* brand); 170 #if defined(OS_WIN) 171 void SetRegistryBrandValue(const wchar_t* name, const char* brand); 172 #endif 173 174 void SimulateOmniboxUsage(); 175 void SimulateHomepageUsage(); 176 void SimulateAppListUsage(); 177 void InvokeDelayedInit(); 178 179 void ExpectEventRecorded(const char* event_name, bool expected); 180 void ExpectRlzPingSent(bool expected); 181 void ExpectReactivationRlzPingSent(bool expected); 182 183 TestRLZTracker tracker_; 184 #if defined(OS_POSIX) 185 scoped_ptr<google_brand::BrandForTesting> brand_override_; 186 #endif 187 }; 188 189 void RlzLibTest::SetUp() { 190 RlzLibTestNoMachineState::SetUp(); 191 192 // Make sure a non-organic brand code is set in the registry or the RLZTracker 193 // is pretty much a no-op. 194 SetMainBrand("TEST"); 195 SetReactivationBrand(""); 196 } 197 198 void RlzLibTest::SetMainBrand(const char* brand) { 199 #if defined(OS_WIN) 200 SetRegistryBrandValue(google_update::kRegRLZBrandField, brand); 201 #elif defined(OS_POSIX) 202 brand_override_.reset(new google_brand::BrandForTesting(brand)); 203 #endif 204 std::string check_brand; 205 google_brand::GetBrand(&check_brand); 206 EXPECT_EQ(brand, check_brand); 207 } 208 209 void RlzLibTest::SetReactivationBrand(const char* brand) { 210 // TODO(thakis): Reactivation doesn't exist on Mac yet. 211 #if defined(OS_WIN) 212 SetRegistryBrandValue(google_update::kRegRLZReactivationBrandField, brand); 213 std::string check_brand; 214 google_brand::GetReactivationBrand(&check_brand); 215 EXPECT_EQ(brand, check_brand); 216 #endif 217 } 218 219 #if defined(OS_WIN) 220 void RlzLibTest::SetRegistryBrandValue(const wchar_t* name, 221 const char* brand) { 222 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); 223 base::string16 reg_path = dist->GetStateKey(); 224 RegKey key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_SET_VALUE); 225 if (*brand == 0) { 226 LONG result = key.DeleteValue(name); 227 ASSERT_TRUE(ERROR_SUCCESS == result || ERROR_FILE_NOT_FOUND == result); 228 } else { 229 base::string16 brand16 = base::ASCIIToUTF16(brand); 230 ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(name, brand16.c_str())); 231 } 232 } 233 #endif 234 235 void RlzLibTest::SimulateOmniboxUsage() { 236 // Create a dummy OmniboxLog object. The 'is_popup_open' field needs to be 237 // true to trigger record of the first search. All other fields are passed in 238 // with empty or invalid values. 239 AutocompleteResult empty_result; 240 OmniboxLog dummy(base::string16(), false, metrics::OmniboxInputType::INVALID, 241 true, 0, false, -1, 242 metrics::OmniboxEventProto::INVALID_SPEC, 243 base::TimeDelta::FromSeconds(0), 0, 244 base::TimeDelta::FromSeconds(0), 245 AutocompleteResult()); 246 247 tracker_.Observe(chrome::NOTIFICATION_OMNIBOX_OPENED_URL, 248 content::NotificationService::AllSources(), 249 content::Details<OmniboxLog>(&dummy)); 250 } 251 252 void RlzLibTest::SimulateHomepageUsage() { 253 scoped_ptr<NavigationEntry> entry(NavigationEntry::Create()); 254 entry->SetPageID(0); 255 entry->SetTransitionType(ui::PAGE_TRANSITION_HOME_PAGE); 256 tracker_.Observe(content::NOTIFICATION_NAV_ENTRY_PENDING, 257 content::NotificationService::AllSources(), 258 content::Details<NavigationEntry>(entry.get())); 259 } 260 261 void RlzLibTest::SimulateAppListUsage() { 262 RLZTracker::RecordAppListSearch(); 263 } 264 265 void RlzLibTest::InvokeDelayedInit() { 266 tracker_.DelayedInit(); 267 } 268 269 void RlzLibTest::ExpectEventRecorded(const char* event_name, bool expected) { 270 char cgi[rlz_lib::kMaxCgiLength]; 271 GetProductEventsAsCgi(rlz_lib::CHROME, cgi, arraysize(cgi)); 272 if (expected) { 273 EXPECT_STR_CONTAINS(cgi, event_name); 274 } else { 275 EXPECT_STR_NOT_CONTAIN(cgi, event_name); 276 } 277 } 278 279 void RlzLibTest::ExpectRlzPingSent(bool expected) { 280 std::string brand; 281 google_brand::GetBrand(&brand); 282 EXPECT_EQ(expected, tracker_.was_ping_sent_for_brand(brand.c_str())); 283 } 284 285 void RlzLibTest::ExpectReactivationRlzPingSent(bool expected) { 286 std::string brand; 287 google_brand::GetReactivationBrand(&brand); 288 EXPECT_EQ(expected, tracker_.was_ping_sent_for_brand(brand.c_str())); 289 } 290 291 // The events that affect the different RLZ scenarios are the following: 292 // 293 // A: the user starts chrome for the first time 294 // B: the user stops chrome 295 // C: the user start a subsequent time 296 // D: the user stops chrome again 297 // I: the RLZTracker::DelayedInit() method is invoked 298 // X: the user performs a search using the omnibox 299 // Y: the user performs a search using the home page 300 // Z: the user performs a search using the app list 301 // 302 // The events A to D happen in chronological order, but the other events 303 // may happen at any point between A-B or C-D, in no particular order. 304 // 305 // The visible results of the scenarios on Win are: 306 // 307 // C1I event is recorded 308 // C2I event is recorded 309 // C7I event is recorded 310 // C1F event is recorded 311 // C2F event is recorded 312 // C7F event is recorded 313 // C1S event is recorded 314 // C2S event is recorded 315 // C7S event is recorded 316 // RLZ ping sent 317 // 318 // On Mac, C5 / C6 / C8 are sent instead of C1 / C2 / C7. 319 // On ChromeOS, CA / CB / CC are sent, respectively. 320 // 321 // Variations on the above scenarios: 322 // 323 // - if the delay specified to InitRlzDelayed() is negative, then the RLZ 324 // ping should be sent out at the time of event X and not wait for I 325 // 326 // Also want to test that pre-warming the RLZ string cache works correctly. 327 328 #if defined(OS_WIN) 329 const char kOmniboxInstall[] = "C1I"; 330 const char kOmniboxSetToGoogle[] = "C1S"; 331 const char kOmniboxFirstSearch[] = "C1F"; 332 333 const char kHomepageInstall[] = "C2I"; 334 const char kHomepageSetToGoogle[] = "C2S"; 335 const char kHomepageFirstSeach[] = "C2F"; 336 337 const char kAppListInstall[] = "C7I"; 338 const char kAppListSetToGoogle[] = "C7S"; 339 const char kAppListFirstSearch[] = "C7F"; 340 #elif defined(OS_MACOSX) 341 const char kOmniboxInstall[] = "C5I"; 342 const char kOmniboxSetToGoogle[] = "C5S"; 343 const char kOmniboxFirstSearch[] = "C5F"; 344 345 const char kHomepageInstall[] = "C6I"; 346 const char kHomepageSetToGoogle[] = "C6S"; 347 const char kHomepageFirstSeach[] = "C6F"; 348 349 const char kAppListInstall[] = "C8I"; 350 const char kAppListSetToGoogle[] = "C8S"; 351 const char kAppListFirstSearch[] = "C8F"; 352 #elif defined(OS_CHROMEOS) 353 const char kOmniboxInstall[] = "CAI"; 354 const char kOmniboxSetToGoogle[] = "CAS"; 355 const char kOmniboxFirstSearch[] = "CAF"; 356 357 const char kHomepageInstall[] = "CBI"; 358 const char kHomepageSetToGoogle[] = "CBS"; 359 const char kHomepageFirstSeach[] = "CBF"; 360 361 const char kAppListInstall[] = "CCI"; 362 const char kAppListSetToGoogle[] = "CCS"; 363 const char kAppListFirstSearch[] = "CCF"; 364 #endif 365 366 const base::TimeDelta kDelay = base::TimeDelta::FromMilliseconds(20); 367 368 TEST_F(RlzLibTest, RecordProductEvent) { 369 RLZTracker::RecordProductEvent(rlz_lib::CHROME, RLZTracker::ChromeOmnibox(), 370 rlz_lib::FIRST_SEARCH); 371 372 ExpectEventRecorded(kOmniboxFirstSearch, true); 373 } 374 375 TEST_F(RlzLibTest, QuickStopAfterStart) { 376 TestRLZTracker::InitRlzDelayed(true, false, kDelay, true, true, true); 377 378 // Omnibox events. 379 ExpectEventRecorded(kOmniboxInstall, false); 380 ExpectEventRecorded(kOmniboxSetToGoogle, false); 381 ExpectEventRecorded(kOmniboxFirstSearch, false); 382 383 // Home page events. 384 ExpectEventRecorded(kHomepageInstall, false); 385 ExpectEventRecorded(kHomepageSetToGoogle, false); 386 ExpectEventRecorded(kHomepageFirstSeach, false); 387 388 // App list events. 389 ExpectEventRecorded(kAppListInstall, false); 390 ExpectEventRecorded(kAppListSetToGoogle, false); 391 ExpectEventRecorded(kAppListFirstSearch, false); 392 393 ExpectRlzPingSent(false); 394 } 395 396 TEST_F(RlzLibTest, DelayedInitOnly) { 397 TestRLZTracker::InitRlzDelayed(true, false, kDelay, true, true, false); 398 InvokeDelayedInit(); 399 400 // Omnibox events. 401 ExpectEventRecorded(kOmniboxInstall, true); 402 ExpectEventRecorded(kOmniboxSetToGoogle, true); 403 ExpectEventRecorded(kOmniboxFirstSearch, false); 404 405 // Home page events. 406 ExpectEventRecorded(kHomepageInstall, true); 407 ExpectEventRecorded(kHomepageSetToGoogle, true); 408 ExpectEventRecorded(kHomepageFirstSeach, false); 409 410 // App list events. 411 ExpectEventRecorded(kAppListInstall, true); 412 ExpectEventRecorded(kAppListSetToGoogle, true); 413 ExpectEventRecorded(kAppListFirstSearch, false); 414 415 ExpectRlzPingSent(true); 416 } 417 418 TEST_F(RlzLibTest, DelayedInitOnlyGoogleAsStartup) { 419 TestRLZTracker::InitRlzDelayed(true, false, kDelay, false, false, true); 420 InvokeDelayedInit(); 421 422 // Omnibox events. 423 ExpectEventRecorded(kOmniboxInstall, true); 424 ExpectEventRecorded(kOmniboxSetToGoogle, false); 425 ExpectEventRecorded(kOmniboxFirstSearch, false); 426 427 // Home page events. 428 ExpectEventRecorded(kHomepageInstall, true); 429 ExpectEventRecorded(kHomepageSetToGoogle, true); 430 ExpectEventRecorded(kHomepageFirstSeach, true); 431 432 // App list events. 433 ExpectEventRecorded(kAppListInstall, true); 434 ExpectEventRecorded(kAppListSetToGoogle, false); 435 ExpectEventRecorded(kAppListFirstSearch, false); 436 437 ExpectRlzPingSent(true); 438 } 439 440 TEST_F(RlzLibTest, DelayedInitOnlyNoFirstRunNoRlzStrings) { 441 TestRLZTracker::InitRlzDelayed(false, false, kDelay, true, true, false); 442 InvokeDelayedInit(); 443 444 // Omnibox events. 445 ExpectEventRecorded(kOmniboxInstall, true); 446 ExpectEventRecorded(kOmniboxSetToGoogle, true); 447 ExpectEventRecorded(kOmniboxFirstSearch, false); 448 449 // Home page events. 450 ExpectEventRecorded(kHomepageInstall, true); 451 ExpectEventRecorded(kHomepageSetToGoogle, true); 452 ExpectEventRecorded(kHomepageFirstSeach, false); 453 454 // App list events. 455 ExpectEventRecorded(kAppListInstall, true); 456 ExpectEventRecorded(kAppListSetToGoogle, true); 457 ExpectEventRecorded(kAppListFirstSearch, false); 458 459 ExpectRlzPingSent(true); 460 } 461 462 TEST_F(RlzLibTest, DelayedInitOnlyNoFirstRunNoRlzStringsGoogleAsStartup) { 463 TestRLZTracker::InitRlzDelayed(false, false, kDelay, false, false, true); 464 InvokeDelayedInit(); 465 466 // Omnibox events. 467 ExpectEventRecorded(kOmniboxInstall, true); 468 ExpectEventRecorded(kOmniboxSetToGoogle, false); 469 ExpectEventRecorded(kOmniboxFirstSearch, false); 470 471 // Home page events. 472 ExpectEventRecorded(kHomepageInstall, true); 473 ExpectEventRecorded(kHomepageSetToGoogle, true); 474 ExpectEventRecorded(kHomepageFirstSeach, true); 475 476 // App list events. 477 ExpectEventRecorded(kAppListInstall, true); 478 ExpectEventRecorded(kAppListSetToGoogle, false); 479 ExpectEventRecorded(kAppListFirstSearch, false); 480 481 ExpectRlzPingSent(true); 482 } 483 484 TEST_F(RlzLibTest, DelayedInitOnlyNoFirstRun) { 485 // Set some dummy RLZ strings to simulate that we already ran before and 486 // performed a successful ping to the RLZ server. 487 rlz_lib::SetAccessPointRlz(RLZTracker::ChromeOmnibox(), kOmniboxRlzString); 488 rlz_lib::SetAccessPointRlz(RLZTracker::ChromeHomePage(), kHomepageRlzString); 489 rlz_lib::SetAccessPointRlz(RLZTracker::ChromeAppList(), kAppListRlzString); 490 491 TestRLZTracker::InitRlzDelayed(false, false, kDelay, true, true, true); 492 InvokeDelayedInit(); 493 494 // Omnibox events. 495 ExpectEventRecorded(kOmniboxInstall, true); 496 ExpectEventRecorded(kOmniboxSetToGoogle, false); 497 ExpectEventRecorded(kOmniboxFirstSearch, false); 498 499 // Home page events. 500 ExpectEventRecorded(kHomepageInstall, true); 501 ExpectEventRecorded(kHomepageSetToGoogle, false); 502 ExpectEventRecorded(kHomepageFirstSeach, true); 503 504 // App list events. 505 ExpectEventRecorded(kAppListInstall, true); 506 ExpectEventRecorded(kAppListSetToGoogle, false); 507 ExpectEventRecorded(kAppListFirstSearch, false); 508 509 ExpectRlzPingSent(true); 510 } 511 512 TEST_F(RlzLibTest, DelayedInitOnlyNoGoogleDefaultSearchOrHomepageOrStartup) { 513 TestRLZTracker::InitRlzDelayed(true, false, kDelay, false, false, false); 514 InvokeDelayedInit(); 515 516 // Omnibox events. 517 ExpectEventRecorded(kOmniboxInstall, true); 518 ExpectEventRecorded(kOmniboxSetToGoogle, false); 519 ExpectEventRecorded(kOmniboxFirstSearch, false); 520 521 // Home page events. 522 ExpectEventRecorded(kHomepageInstall, true); 523 ExpectEventRecorded(kHomepageSetToGoogle, false); 524 ExpectEventRecorded(kHomepageFirstSeach, false); 525 526 // App list events. 527 ExpectEventRecorded(kAppListInstall, true); 528 ExpectEventRecorded(kAppListSetToGoogle, false); 529 ExpectEventRecorded(kAppListFirstSearch, false); 530 531 ExpectRlzPingSent(true); 532 } 533 534 TEST_F(RlzLibTest, OmniboxUsageOnly) { 535 TestRLZTracker::InitRlzDelayed(true, false, kDelay, true, true, false); 536 SimulateOmniboxUsage(); 537 538 // Omnibox events. 539 ExpectEventRecorded(kOmniboxInstall, false); 540 ExpectEventRecorded(kOmniboxSetToGoogle, false); 541 ExpectEventRecorded(kOmniboxFirstSearch, true); 542 543 // Home page events. 544 ExpectEventRecorded(kHomepageInstall, false); 545 ExpectEventRecorded(kHomepageSetToGoogle, false); 546 ExpectEventRecorded(kHomepageFirstSeach, false); 547 548 // App list events. 549 ExpectEventRecorded(kAppListInstall, false); 550 ExpectEventRecorded(kAppListSetToGoogle, false); 551 ExpectEventRecorded(kAppListFirstSearch, false); 552 553 ExpectRlzPingSent(false); 554 } 555 556 TEST_F(RlzLibTest, HomepageUsageOnly) { 557 TestRLZTracker::InitRlzDelayed(true, false, kDelay, true, true, false); 558 SimulateHomepageUsage(); 559 560 // Omnibox events. 561 ExpectEventRecorded(kOmniboxInstall, false); 562 ExpectEventRecorded(kOmniboxSetToGoogle, false); 563 ExpectEventRecorded(kOmniboxFirstSearch, false); 564 565 // Home page events. 566 ExpectEventRecorded(kHomepageInstall, false); 567 ExpectEventRecorded(kHomepageSetToGoogle, false); 568 ExpectEventRecorded(kHomepageFirstSeach, true); 569 570 // App list events. 571 ExpectEventRecorded(kAppListInstall, false); 572 ExpectEventRecorded(kAppListSetToGoogle, false); 573 ExpectEventRecorded(kAppListFirstSearch, false); 574 575 ExpectRlzPingSent(false); 576 } 577 578 TEST_F(RlzLibTest, AppListUsageOnly) { 579 TestRLZTracker::InitRlzDelayed(true, false, kDelay, true, true, false); 580 SimulateAppListUsage(); 581 582 // Omnibox events. 583 ExpectEventRecorded(kOmniboxInstall, false); 584 ExpectEventRecorded(kOmniboxSetToGoogle, false); 585 ExpectEventRecorded(kOmniboxFirstSearch, false); 586 587 // Home page events. 588 ExpectEventRecorded(kHomepageInstall, false); 589 ExpectEventRecorded(kHomepageSetToGoogle, false); 590 ExpectEventRecorded(kHomepageFirstSeach, false); 591 592 // App list events. 593 ExpectEventRecorded(kAppListInstall, false); 594 ExpectEventRecorded(kAppListSetToGoogle, false); 595 ExpectEventRecorded(kAppListFirstSearch, true); 596 597 ExpectRlzPingSent(false); 598 } 599 600 TEST_F(RlzLibTest, UsageBeforeDelayedInit) { 601 TestRLZTracker::InitRlzDelayed(true, false, kDelay, true, true, false); 602 SimulateOmniboxUsage(); 603 SimulateHomepageUsage(); 604 SimulateAppListUsage(); 605 InvokeDelayedInit(); 606 607 // Omnibox events. 608 ExpectEventRecorded(kOmniboxInstall, true); 609 ExpectEventRecorded(kOmniboxSetToGoogle, true); 610 ExpectEventRecorded(kOmniboxFirstSearch, true); 611 612 // Home page events. 613 ExpectEventRecorded(kHomepageInstall, true); 614 ExpectEventRecorded(kHomepageSetToGoogle, true); 615 ExpectEventRecorded(kHomepageFirstSeach, true); 616 617 // App list events. 618 ExpectEventRecorded(kAppListInstall, true); 619 ExpectEventRecorded(kAppListSetToGoogle, true); 620 ExpectEventRecorded(kAppListFirstSearch, true); 621 622 ExpectRlzPingSent(true); 623 } 624 625 TEST_F(RlzLibTest, UsageAfterDelayedInit) { 626 TestRLZTracker::InitRlzDelayed(true, false, kDelay, true, true, false); 627 InvokeDelayedInit(); 628 SimulateOmniboxUsage(); 629 SimulateHomepageUsage(); 630 SimulateAppListUsage(); 631 632 // Omnibox events. 633 ExpectEventRecorded(kOmniboxInstall, true); 634 ExpectEventRecorded(kOmniboxSetToGoogle, true); 635 ExpectEventRecorded(kOmniboxFirstSearch, true); 636 637 // Home page events. 638 ExpectEventRecorded(kHomepageInstall, true); 639 ExpectEventRecorded(kHomepageSetToGoogle, true); 640 ExpectEventRecorded(kHomepageFirstSeach, true); 641 642 // App list events. 643 ExpectEventRecorded(kAppListInstall, true); 644 ExpectEventRecorded(kAppListSetToGoogle, true); 645 ExpectEventRecorded(kAppListFirstSearch, true); 646 647 ExpectRlzPingSent(true); 648 } 649 650 TEST_F(RlzLibTest, OmniboxUsageSendsPingWhenSendPingImmediately) { 651 TestRLZTracker::InitRlzDelayed(true, true, kDelay, true, true, false); 652 SimulateOmniboxUsage(); 653 654 // Omnibox events. 655 ExpectEventRecorded(kOmniboxInstall, true); 656 ExpectEventRecorded(kOmniboxSetToGoogle, true); 657 ExpectEventRecorded(kOmniboxFirstSearch, true); 658 659 // Home page events. 660 ExpectEventRecorded(kHomepageInstall, true); 661 ExpectEventRecorded(kHomepageSetToGoogle, true); 662 ExpectEventRecorded(kHomepageFirstSeach, false); 663 664 // App list events. 665 ExpectEventRecorded(kAppListInstall, true); 666 ExpectEventRecorded(kAppListSetToGoogle, true); 667 ExpectEventRecorded(kAppListFirstSearch, false); 668 669 ExpectRlzPingSent(true); 670 } 671 672 TEST_F(RlzLibTest, HomepageUsageDoesNotSendPingWhenSendPingImmediately) { 673 TestRLZTracker::InitRlzDelayed(true, true, kDelay, true, true, false); 674 SimulateHomepageUsage(); 675 676 // Omnibox events. 677 ExpectEventRecorded(kOmniboxInstall, false); 678 ExpectEventRecorded(kOmniboxSetToGoogle, false); 679 ExpectEventRecorded(kOmniboxFirstSearch, false); 680 681 // Home page events. 682 ExpectEventRecorded(kHomepageInstall, false); 683 ExpectEventRecorded(kHomepageSetToGoogle, false); 684 ExpectEventRecorded(kHomepageFirstSeach, true); 685 686 // App list events. 687 ExpectEventRecorded(kAppListInstall, false); 688 ExpectEventRecorded(kAppListSetToGoogle, false); 689 ExpectEventRecorded(kAppListFirstSearch, false); 690 691 ExpectRlzPingSent(false); 692 } 693 694 TEST_F(RlzLibTest, StartupUsageDoesNotSendPingWhenSendPingImmediately) { 695 TestRLZTracker::InitRlzDelayed(true, true, kDelay, true, false, true); 696 SimulateHomepageUsage(); 697 698 // Omnibox events. 699 ExpectEventRecorded(kOmniboxInstall, false); 700 ExpectEventRecorded(kOmniboxSetToGoogle, false); 701 ExpectEventRecorded(kOmniboxFirstSearch, false); 702 703 // Home page events. 704 ExpectEventRecorded(kHomepageInstall, false); 705 ExpectEventRecorded(kHomepageSetToGoogle, false); 706 ExpectEventRecorded(kHomepageFirstSeach, true); 707 708 // App list events. 709 ExpectEventRecorded(kAppListInstall, false); 710 ExpectEventRecorded(kAppListSetToGoogle, false); 711 ExpectEventRecorded(kAppListFirstSearch, false); 712 713 ExpectRlzPingSent(false); 714 } 715 716 TEST_F(RlzLibTest, AppListUsageDoesNotSendPingWhenSendPingImmediately) { 717 TestRLZTracker::InitRlzDelayed(true, true, kDelay, true, false, false); 718 SimulateAppListUsage(); 719 720 // Omnibox events. 721 ExpectEventRecorded(kOmniboxInstall, false); 722 ExpectEventRecorded(kOmniboxSetToGoogle, false); 723 ExpectEventRecorded(kOmniboxFirstSearch, false); 724 725 // Home page events. 726 ExpectEventRecorded(kHomepageInstall, false); 727 ExpectEventRecorded(kHomepageSetToGoogle, false); 728 ExpectEventRecorded(kHomepageFirstSeach, false); 729 730 // App list events. 731 ExpectEventRecorded(kAppListInstall, false); 732 ExpectEventRecorded(kAppListSetToGoogle, false); 733 ExpectEventRecorded(kAppListFirstSearch, true); 734 735 ExpectRlzPingSent(false); 736 } 737 738 TEST_F(RlzLibTest, GetAccessPointRlzOnIoThread) { 739 // Set dummy RLZ string. 740 rlz_lib::SetAccessPointRlz(RLZTracker::ChromeOmnibox(), kOmniboxRlzString); 741 742 base::string16 rlz; 743 744 tracker_.set_assume_not_ui_thread(true); 745 EXPECT_TRUE(RLZTracker::GetAccessPointRlz(RLZTracker::ChromeOmnibox(), &rlz)); 746 EXPECT_STREQ(kOmniboxRlzString, base::UTF16ToUTF8(rlz).c_str()); 747 } 748 749 TEST_F(RlzLibTest, GetAccessPointRlzNotOnIoThread) { 750 // Set dummy RLZ string. 751 rlz_lib::SetAccessPointRlz(RLZTracker::ChromeOmnibox(), kOmniboxRlzString); 752 753 base::string16 rlz; 754 755 tracker_.set_assume_not_ui_thread(false); 756 EXPECT_FALSE( 757 RLZTracker::GetAccessPointRlz(RLZTracker::ChromeOmnibox(), &rlz)); 758 } 759 760 TEST_F(RlzLibTest, GetAccessPointRlzIsCached) { 761 // Set dummy RLZ string. 762 rlz_lib::SetAccessPointRlz(RLZTracker::ChromeOmnibox(), kOmniboxRlzString); 763 764 base::string16 rlz; 765 766 tracker_.set_assume_not_ui_thread(false); 767 EXPECT_FALSE( 768 RLZTracker::GetAccessPointRlz(RLZTracker::ChromeOmnibox(), &rlz)); 769 770 tracker_.set_assume_not_ui_thread(true); 771 EXPECT_TRUE(RLZTracker::GetAccessPointRlz(RLZTracker::ChromeOmnibox(), &rlz)); 772 EXPECT_STREQ(kOmniboxRlzString, base::UTF16ToUTF8(rlz).c_str()); 773 774 tracker_.set_assume_not_ui_thread(false); 775 EXPECT_TRUE(RLZTracker::GetAccessPointRlz(RLZTracker::ChromeOmnibox(), &rlz)); 776 EXPECT_STREQ(kOmniboxRlzString, base::UTF16ToUTF8(rlz).c_str()); 777 } 778 779 TEST_F(RlzLibTest, PingUpdatesRlzCache) { 780 // Set dummy RLZ string. 781 rlz_lib::SetAccessPointRlz(RLZTracker::ChromeOmnibox(), kOmniboxRlzString); 782 rlz_lib::SetAccessPointRlz(RLZTracker::ChromeHomePage(), kHomepageRlzString); 783 rlz_lib::SetAccessPointRlz(RLZTracker::ChromeAppList(), kAppListRlzString); 784 785 base::string16 rlz; 786 787 // Prime the cache. 788 tracker_.set_assume_not_ui_thread(true); 789 790 EXPECT_TRUE(RLZTracker::GetAccessPointRlz(RLZTracker::ChromeOmnibox(), &rlz)); 791 EXPECT_STREQ(kOmniboxRlzString, base::UTF16ToUTF8(rlz).c_str()); 792 EXPECT_TRUE(RLZTracker::GetAccessPointRlz( 793 RLZTracker::ChromeHomePage(), &rlz)); 794 EXPECT_STREQ(kHomepageRlzString, base::UTF16ToUTF8(rlz).c_str()); 795 EXPECT_TRUE(RLZTracker::GetAccessPointRlz(RLZTracker::ChromeAppList(), &rlz)); 796 EXPECT_STREQ(kAppListRlzString, base::UTF16ToUTF8(rlz).c_str()); 797 798 // Make sure cache is valid. 799 tracker_.set_assume_not_ui_thread(false); 800 801 EXPECT_TRUE(RLZTracker::GetAccessPointRlz(RLZTracker::ChromeOmnibox(), &rlz)); 802 EXPECT_STREQ(kOmniboxRlzString, base::UTF16ToUTF8(rlz).c_str()); 803 EXPECT_TRUE(RLZTracker::GetAccessPointRlz( 804 RLZTracker::ChromeHomePage(), &rlz)); 805 EXPECT_STREQ(kHomepageRlzString, base::UTF16ToUTF8(rlz).c_str()); 806 EXPECT_TRUE(RLZTracker::GetAccessPointRlz(RLZTracker::ChromeAppList(), &rlz)); 807 EXPECT_STREQ(kAppListRlzString, base::UTF16ToUTF8(rlz).c_str()); 808 809 // Perform ping. 810 tracker_.set_assume_not_ui_thread(true); 811 TestRLZTracker::InitRlzDelayed(true, false, kDelay, true, true, false); 812 InvokeDelayedInit(); 813 ExpectRlzPingSent(true); 814 815 // Make sure cache is now updated. 816 tracker_.set_assume_not_ui_thread(false); 817 818 EXPECT_TRUE(RLZTracker::GetAccessPointRlz(RLZTracker::ChromeOmnibox(), &rlz)); 819 EXPECT_STREQ(kNewOmniboxRlzString, base::UTF16ToUTF8(rlz).c_str()); 820 EXPECT_TRUE(RLZTracker::GetAccessPointRlz( 821 RLZTracker::ChromeHomePage(), &rlz)); 822 EXPECT_STREQ(kNewHomepageRlzString, base::UTF16ToUTF8(rlz).c_str()); 823 EXPECT_TRUE(RLZTracker::GetAccessPointRlz(RLZTracker::ChromeAppList(), &rlz)); 824 EXPECT_STREQ(kNewAppListRlzString, base::UTF16ToUTF8(rlz).c_str()); 825 } 826 827 TEST_F(RlzLibTest, ObserveHandlesBadArgs) { 828 scoped_ptr<NavigationEntry> entry(NavigationEntry::Create()); 829 entry->SetPageID(0); 830 entry->SetTransitionType(ui::PAGE_TRANSITION_LINK); 831 tracker_.Observe(content::NOTIFICATION_NAV_ENTRY_PENDING, 832 content::NotificationService::AllSources(), 833 content::Details<NavigationEntry>(NULL)); 834 tracker_.Observe(content::NOTIFICATION_NAV_ENTRY_PENDING, 835 content::NotificationService::AllSources(), 836 content::Details<NavigationEntry>(entry.get())); 837 } 838 839 // TODO(thakis): Reactivation doesn't exist on Mac yet. 840 #if defined(OS_WIN) 841 TEST_F(RlzLibTest, ReactivationNonOrganicNonOrganic) { 842 SetReactivationBrand("REAC"); 843 844 TestRLZTracker::InitRlzDelayed(true, false, kDelay, true, true, false); 845 InvokeDelayedInit(); 846 847 ExpectRlzPingSent(true); 848 ExpectReactivationRlzPingSent(true); 849 } 850 851 TEST_F(RlzLibTest, ReactivationOrganicNonOrganic) { 852 SetMainBrand("GGLS"); 853 SetReactivationBrand("REAC"); 854 855 TestRLZTracker::InitRlzDelayed(true, false, kDelay, true, true, false); 856 InvokeDelayedInit(); 857 858 ExpectRlzPingSent(false); 859 ExpectReactivationRlzPingSent(true); 860 } 861 862 TEST_F(RlzLibTest, ReactivationNonOrganicOrganic) { 863 SetMainBrand("TEST"); 864 SetReactivationBrand("GGLS"); 865 866 TestRLZTracker::InitRlzDelayed(true, false, kDelay, true, true, false); 867 InvokeDelayedInit(); 868 869 ExpectRlzPingSent(true); 870 ExpectReactivationRlzPingSent(false); 871 } 872 873 TEST_F(RlzLibTest, ReactivationOrganicOrganic) { 874 SetMainBrand("GGLS"); 875 SetReactivationBrand("GGRS"); 876 877 TestRLZTracker::InitRlzDelayed(true, false, kDelay, true, true, false); 878 InvokeDelayedInit(); 879 880 ExpectRlzPingSent(false); 881 ExpectReactivationRlzPingSent(false); 882 } 883 #endif // defined(OS_WIN) 884 885 #if defined(OS_CHROMEOS) 886 TEST_F(RlzLibTest, ClearRlzState) { 887 RLZTracker::RecordProductEvent(rlz_lib::CHROME, RLZTracker::ChromeOmnibox(), 888 rlz_lib::FIRST_SEARCH); 889 890 ExpectEventRecorded(kOmniboxFirstSearch, true); 891 892 RLZTracker::ClearRlzState(); 893 894 ExpectEventRecorded(kOmniboxFirstSearch, false); 895 } 896 #endif // defined(OS_CHROMEOS) 897