rlz_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/rlz/rlz.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time/time.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_controller.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_input.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_notification_types.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google/google_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/omnibox/omnibox_log.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/browser_distribution.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_constants.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/test/rlz_test_helpers.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AssertionResult; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AssertionSuccess; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AssertionFailure; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::RegKey; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dummy RLZ string for the access points. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOmniboxRlzString[] = "test_omnibox"; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHomepageRlzString[] = "test_homepage"; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppListRlzString[] = "test_applist"; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNewOmniboxRlzString[] = "new_omnibox"; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNewHomepageRlzString[] = "new_homepage"; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNewAppListRlzString[] = "new_applist"; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Some helper macros to test it a string contains/does not contain a substring. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AssertionResult CmpHelperSTRC(const char* str_expression, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* substr_expression, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* str, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* substr) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (NULL != strstr(str, substr)) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AssertionSuccess(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AssertionFailure() << "Expected: (" << substr_expression << ") in (" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << str_expression << "), actual: '" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << substr << "' not in '" << str << "'"; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AssertionResult CmpHelperSTRNC(const char* str_expression, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* substr_expression, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* str, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* substr) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (NULL == strstr(str, substr)) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AssertionSuccess(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AssertionFailure() << "Expected: (" << substr_expression 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ") not in (" << str_expression << "), actual: '" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << substr << "' in '" << str << "'"; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define EXPECT_STR_CONTAINS(str, substr) \ 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_PRED_FORMAT2(CmpHelperSTRC, str, substr) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define EXPECT_STR_NOT_CONTAIN(str, substr) \ 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_PRED_FORMAT2(CmpHelperSTRNC, str, substr) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test class for RLZ tracker. Makes some member functions public and 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// overrides others to make it easier to test. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestRLZTracker : public RLZTracker { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using RLZTracker::InitRlzDelayed; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using RLZTracker::DelayedInit; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using RLZTracker::Observe; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRLZTracker() : assume_not_ui_thread_(true) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_tracker(this); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestRLZTracker() { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_tracker(NULL); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_ping_sent_for_brand(const std::string& brand) const { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pinged_brands_.count(brand) > 0; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_assume_not_ui_thread(bool assume_not_ui_thread) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assume_not_ui_thread_ = assume_not_ui_thread; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ScheduleDelayedInit(base::TimeDelta delay) OVERRIDE { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the delay is 0, invoke the delayed init now. Otherwise, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't schedule anything, it will be manually called during tests. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delay == base::TimeDelta()) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayedInit(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ScheduleFinancialPing() OVERRIDE { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PingNowImpl(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ScheduleRecordProductEvent(rlz_lib::Product product, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rlz_lib::AccessPoint point, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rlz_lib::Event event_id) OVERRIDE { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !assume_not_ui_thread_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ScheduleGetAccessPointRlz(rlz_lib::AccessPoint point) OVERRIDE { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !assume_not_ui_thread_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ScheduleRecordFirstSearch(rlz_lib::AccessPoint point) OVERRIDE { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !assume_not_ui_thread_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ScheduleClearRlzState() OVERRIDE { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !assume_not_ui_thread_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SendFinancialPing(const std::string& brand, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::string16& lang, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::string16& referral) OVERRIDE { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't ping the server during tests, just pretend as if we did. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(brand.empty()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pinged_brands_.insert(brand); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set new access points RLZ string, like the actual server ping would have 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // done. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rlz_lib::SetAccessPointRlz(RLZTracker::ChromeOmnibox(), 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNewOmniboxRlzString); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rlz_lib::SetAccessPointRlz(RLZTracker::ChromeHomePage(), 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNewHomepageRlzString); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rlz_lib::SetAccessPointRlz(RLZTracker::ChromeAppList(), 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNewAppListRlzString); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> pinged_brands_; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool assume_not_ui_thread_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestRLZTracker); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RlzLibTest : public RlzLibTestNoMachineState { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetMainBrand(const char* brand); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetReactivationBrand(const char* brand); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetRegistryBrandValue(const wchar_t* name, const char* brand); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateOmniboxUsage(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateHomepageUsage(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateAppListUsage(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InvokeDelayedInit(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectEventRecorded(const char* event_name, bool expected); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectRlzPingSent(bool expected); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectReactivationRlzPingSent(bool expected); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRLZTracker tracker_; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<google_util::BrandForTesting> brand_override_; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzLibTest::SetUp() { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RlzLibTestNoMachineState::SetUp(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure a non-organic brand code is set in the registry or the RLZTracker 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is pretty much a no-op. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMainBrand("TEST"); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetReactivationBrand(""); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzLibTest::SetMainBrand(const char* brand) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRegistryBrandValue(google_update::kRegRLZBrandField, brand); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) brand_override_.reset(new google_util::BrandForTesting(brand)); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string check_brand; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) google_util::GetBrand(&check_brand); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(brand, check_brand); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzLibTest::SetReactivationBrand(const char* brand) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(thakis): Reactivation doesn't exist on Mac yet. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRegistryBrandValue(google_update::kRegRLZReactivationBrandField, brand); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string check_brand; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) google_util::GetReactivationBrand(&check_brand); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(brand, check_brand); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzLibTest::SetRegistryBrandValue(const wchar_t* name, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* brand) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* dist = BrowserDistribution::GetDistribution(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::string16 reg_path = dist->GetStateKey(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegKey key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_SET_VALUE); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*brand == 0) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG result = key.DeleteValue(name); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ERROR_SUCCESS == result || ERROR_FILE_NOT_FOUND == result); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::string16 brand16 = base::ASCIIToUTF16(brand); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(name, brand16.c_str())); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzLibTest::SimulateOmniboxUsage() { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a dummy OmniboxLog object. The 'is_popup_open' field needs to be 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // true to trigger record of the first search. All other fields are passed in 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with empty or invalid values. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteResult empty_result; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OmniboxLog dummy(base::string16(), false, AutocompleteInput::INVALID, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, 0, false, -1, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteInput::INVALID_SPEC, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromSeconds(0), 0, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromSeconds(0), 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteResult()); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker_.Observe(chrome::NOTIFICATION_OMNIBOX_OPENED_URL, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources(), 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<OmniboxLog>(&dummy)); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzLibTest::SimulateHomepageUsage() { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<NavigationEntry> entry(NavigationEntry::Create()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetPageID(0); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetTransitionType(content::PAGE_TRANSITION_HOME_PAGE); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker_.Observe(content::NOTIFICATION_NAV_ENTRY_PENDING, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources(), 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<NavigationEntry>(entry.get())); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzLibTest::SimulateAppListUsage() { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RLZTracker::RecordAppListSearch(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzLibTest::InvokeDelayedInit() { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker_.DelayedInit(); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzLibTest::ExpectEventRecorded(const char* event_name, bool expected) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char cgi[rlz_lib::kMaxCgiLength]; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProductEventsAsCgi(rlz_lib::CHROME, cgi, arraysize(cgi)); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_CONTAINS(cgi, event_name); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_NOT_CONTAIN(cgi, event_name); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 278 279void RlzLibTest::ExpectRlzPingSent(bool expected) { 280 std::string brand; 281 google_util::GetBrand(&brand); 282 EXPECT_EQ(expected, tracker_.was_ping_sent_for_brand(brand.c_str())); 283} 284 285void RlzLibTest::ExpectReactivationRlzPingSent(bool expected) { 286 std::string brand; 287 google_util::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) 329const char kOmniboxInstall[] = "C1I"; 330const char kOmniboxSetToGoogle[] = "C1S"; 331const char kOmniboxFirstSearch[] = "C1F"; 332 333const char kHomepageInstall[] = "C2I"; 334const char kHomepageSetToGoogle[] = "C2S"; 335const char kHomepageFirstSeach[] = "C2F"; 336 337const char kAppListInstall[] = "C7I"; 338const char kAppListSetToGoogle[] = "C7S"; 339const char kAppListFirstSearch[] = "C7F"; 340#elif defined(OS_MACOSX) 341const char kOmniboxInstall[] = "C5I"; 342const char kOmniboxSetToGoogle[] = "C5S"; 343const char kOmniboxFirstSearch[] = "C5F"; 344 345const char kHomepageInstall[] = "C6I"; 346const char kHomepageSetToGoogle[] = "C6S"; 347const char kHomepageFirstSeach[] = "C6F"; 348 349const char kAppListInstall[] = "C8I"; 350const char kAppListSetToGoogle[] = "C8S"; 351const char kAppListFirstSearch[] = "C8F"; 352#elif defined(OS_CHROMEOS) 353const char kOmniboxInstall[] = "CAI"; 354const char kOmniboxSetToGoogle[] = "CAS"; 355const char kOmniboxFirstSearch[] = "CAF"; 356 357const char kHomepageInstall[] = "CBI"; 358const char kHomepageSetToGoogle[] = "CBS"; 359const char kHomepageFirstSeach[] = "CBF"; 360 361const char kAppListInstall[] = "CCI"; 362const char kAppListSetToGoogle[] = "CCS"; 363const char kAppListFirstSearch[] = "CCF"; 364#endif 365 366const base::TimeDelta kDelay = base::TimeDelta::FromMilliseconds(20); 367 368TEST_F(RlzLibTest, RecordProductEvent) { 369 RLZTracker::RecordProductEvent(rlz_lib::CHROME, RLZTracker::ChromeOmnibox(), 370 rlz_lib::FIRST_SEARCH); 371 372 ExpectEventRecorded(kOmniboxFirstSearch, true); 373} 374 375TEST_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 396TEST_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 418TEST_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 440TEST_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 462TEST_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 484TEST_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 512TEST_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 534TEST_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 556TEST_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 578TEST_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 600TEST_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 625TEST_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 650TEST_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 672TEST_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 694TEST_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 716TEST_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 738TEST_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 749TEST_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 760TEST_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 779TEST_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 827TEST_F(RlzLibTest, ObserveHandlesBadArgs) { 828 scoped_ptr<NavigationEntry> entry(NavigationEntry::Create()); 829 entry->SetPageID(0); 830 entry->SetTransitionType(content::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) 841TEST_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 851TEST_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 862TEST_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 873TEST_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) 886TEST_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