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)// A test application for the RLZ library.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These tests should not be executed on the build server:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - They assert for the failed cases.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - They modify machine state (registry).
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These tests require write access to HKLM and HKCU.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The "GGLA" brand is used to test the normal code flow of the code, and the
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "TEST" brand is used to test the supplementary brand code code flow.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/posix/eintr_wrapper.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "rlz/lib/financial_ping.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/lib/rlz_lib.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/lib/rlz_value_store.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/test/rlz_test_helpers.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <Windows.h>
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/win/lib/machine_deal.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(RLZ_NETWORK_IMPLEMENTATION_CHROME_NET)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MachineDealCodeHelper
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public rlz_lib::MachineDealCode
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool Clear() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return rlz_lib::MachineDealCode::Clear();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineDealCodeHelper() {}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~MachineDealCodeHelper() {}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RlzLibTest : public RlzLibTestBase {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, RecordProductEvent) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char cgi_50[50];
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi_50, 50));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=I7S", cgi_50);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi_50, 50));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=I7S,W1I", cgi_50);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi_50, 50));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=I7S,W1I", cgi_50);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, ClearProductEvent) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char cgi_50[50];
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear 1 of 1 events.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi_50, 50));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=I7S", cgi_50);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              cgi_50, 50));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", cgi_50);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear 1 of 2 events.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi_50, 50));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=I7S,W1I", cgi_50);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi_50, 50));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=W1I", cgi_50);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear a non-recorded event.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IETB_SEARCH_BOX, rlz_lib::FIRST_SEARCH));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi_50, 50));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=W1I", cgi_50);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, GetProductEventsAsCgi) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char cgi_50[50];
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char cgi_1[1];
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi_50, 50));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              cgi_1, 1));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi_50, 50));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=I7S,W1I", cgi_50);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, ClearAllAllProductEvents) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char cgi_50[50];
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi_50, 50));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=I7S", cgi_50);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              cgi_50, 50));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", cgi_50);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, SetAccessPointRlz) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char rlz_50[50];
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, ""));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_50, 50));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", rlz_50);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, "IeTbRlz"));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_50, 50));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("IeTbRlz", rlz_50);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, GetAccessPointRlz) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char rlz_1[1];
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char rlz_50[50];
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, ""));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_1, 1));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", rlz_1);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, "IeTbRlz"));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_1, 1));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_50, 50));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("IeTbRlz", rlz_50);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, GetPingParams) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineDealCodeHelper::Clear();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "TbRlzValue"));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IE_HOME_PAGE, ""));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char cgi[2048];
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_lib::AccessPoint points[] =
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {rlz_lib::IETB_SEARCH_BOX, rlz_lib::NO_ACCESS_POINT,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     rlz_lib::NO_ACCESS_POINT};
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetPingParams(rlz_lib::TOOLBAR_NOTIFIER, points,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     cgi, 2048));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("rep=2&rlz=T4:TbRlzValue", cgi);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Set("dcc_value"));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DCC_PARAM "&dcc=dcc_value"
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DCC_PARAM ""
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, ""));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetPingParams(rlz_lib::TOOLBAR_NOTIFIER, points,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     cgi, 2048));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("rep=2&rlz=T4:" DCC_PARAM, cgi);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "TbRlzValue"));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::GetPingParams(rlz_lib::TOOLBAR_NOTIFIER, points,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      cgi, 23 + strlen(DCC_PARAM)));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", cgi);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetPingParams(rlz_lib::TOOLBAR_NOTIFIER, points,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     cgi, 24 + strlen(DCC_PARAM)));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("rep=2&rlz=T4:TbRlzValue" DCC_PARAM, cgi);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetAccessPointRlz(rlz_lib::IE_HOME_PAGE, cgi, 2048));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  points[2] = rlz_lib::IE_HOME_PAGE;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetPingParams(rlz_lib::TOOLBAR_NOTIFIER, points,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     cgi, 2048));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("rep=2&rlz=T4:TbRlzValue" DCC_PARAM, cgi);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, IsPingResponseValid) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kBadPingResponses[] = {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No checksum.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "version: 3.0.914.7250\r\n"
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n"
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-action: custom-action\r\n"
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-target: SearchWithGoogleUpdate.exe\r\n"
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n"
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz: 1R1_____en__252\r\n"
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzXX: 1R1_____en__250\r\n",
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Invalid checksum.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "version: 3.0.914.7250\r\n"
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n"
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-action: custom-action\r\n"
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-target: SearchWithGoogleUpdate.exe\r\n"
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n"
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz: 1R1_____en__252\r\n"
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzXX: 1R1_____en__250\r\n"
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4  1T4_____en__251\r\n"
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4: 1T4_____en__252\r\n"
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz\r\n"
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: B12CC79A",
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Misplaced checksum.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "version: 3.0.914.7250\r\n"
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n"
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-action: custom-action\r\n"
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-target: SearchWithGoogleUpdate.exe\r\n"
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n"
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz: 1R1_____en__252\r\n"
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzXX: 1R1_____en__250\r\n"
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: B12CC79C\r\n"
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4  1T4_____en__251\r\n"
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4: 1T4_____en__252\r\n"
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz\r\n",
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kGoodPingResponses[] = {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "version: 3.0.914.7250\r\n"
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n"
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-action: custom-action\r\n"
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-target: SearchWithGoogleUpdate.exe\r\n"
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n"
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz: 1R1_____en__252\r\n"
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzXX: 1R1_____en__250\r\n"
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4  1T4_____en__251\r\n"
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4: 1T4_____en__252\r\n"
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz\r\n"
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: D6FD55A3",
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "version: 3.0.914.7250\r\n"
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n"
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-action: custom-action\r\n"
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-target: SearchWithGoogleUpdate.exe\r\n"
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n"
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz: 1R1_____en__252\r\n"
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzXX: 1R1_____en__250\r\n"
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4  1T4_____en__251\r\n"
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4: 1T4_____en__252\r\n"
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz\r\n"
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: D6FD55A3\r\n"
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "extradata: not checksummed",
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; kBadPingResponses[i]; i++)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(rlz_lib::IsPingResponseValid(kBadPingResponses[i], NULL));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; kGoodPingResponses[i]; i++)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(rlz_lib::IsPingResponseValid(kGoodPingResponses[i], NULL));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, ParsePingResponse) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kPingResponse =
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "version: 3.0.914.7250\r\n"
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n"
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-action: custom-action\r\n"
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-target: SearchWithGoogleUpdate.exe\r\n"
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n"
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz: 1R1_____en__252\r\n"  // Invalid RLZ - no access point.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzXX: 1R1_____en__250\r\n"  // Invalid RLZ - bad access point.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4  1T4_____en__251\r\n"  // Invalid RLZ - missing colon.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4: 1T4_____en__252\r\n"  // GoodRLZ.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "events: I7S,W1I\r\n"  // Clear all events.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz\r\n"
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "dcc: dcc_value\r\n"
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: F9070F81";
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Set("dcc_value2"));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record some product events to check that they get cleared.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IETB_SEARCH_BOX, "TbRlzValue"));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         kPingResponse));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Set("dcc_value"));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         kPingResponse));
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char value[50];
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, value, 50));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("1T4_____en__252", value);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              value, 50));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", value);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kPingResponse2 =
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4:    1T4_____de__253  \r\n"  // Good with extra spaces.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: 321334F5\r\n";
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         kPingResponse2));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, value, 50));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("1T4_____de__253", value);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kPingResponse3 =
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: 0\r\n";  // Good RLZ - empty response.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         kPingResponse3));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("1T4_____de__253", value);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test whether a stateful event will only be sent in financial pings once.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, ParsePingResponseWithStatefulEvents) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kPingResponse =
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "version: 3.0.914.7250\r\n"
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n"
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-action: custom-action\r\n"
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-target: SearchWithGoogleUpdate.exe\r\n"
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n"
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4: 1T4_____en__252\r\n"  // GoodRLZ.
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "events: I7S,W1I\r\n"         // Clear all events.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "stateful-events: W1I\r\n"    // W1I as an stateful event.
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz\r\n"
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "dcc: dcc_value\r\n"
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: 55191759";
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record some product events to check that they get cleared.
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IETB_SEARCH_BOX, "TbRlzValue"));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         kPingResponse));
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check all the events sent earlier are cleared.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char value[50];
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              value, 50));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", value);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record both events (one is stateless and the other is stateful) again.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the stateful event won't be sent again while the stateless one will.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             value, 50));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=I7S", value);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that stateful events are cleared by ClearAllProductEvents().  After
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // calling it, trying to record a stateful again should result in it being
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // recorded again.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             value, 50));
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=W1I", value);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class URLRequestRAII {
4218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public:
4228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  URLRequestRAII(net::URLRequestContextGetter* context) {
4238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    rlz_lib::SetURLRequestContext(context);
4248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
4258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ~URLRequestRAII() {
4268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    rlz_lib::SetURLRequestContext(NULL);
4278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
4288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
4298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, SendFinancialPing) {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't really check a value or result in this test. All this does is
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // attempt to ping the financial server, which you can verify in Fiddler.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: Make this a measurable test.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(RLZ_NETWORK_IMPLEMENTATION_CHROME_NET)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::mac::ScopedNSAutoreleasePool pool;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Thread::Options options;
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  options.message_loop_type = base::MessageLoop::TYPE_IO;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Thread io_thread("rlz_unittest_io_thread");
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(io_thread.StartWithOptions(options));
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<net::TestURLRequestContextGetter> context =
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new net::TestURLRequestContextGetter(
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          io_thread.message_loop()->message_loop_proxy());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_lib::SetURLRequestContext(context.get());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestRAII set_context(context.get());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineDealCodeHelper::Clear();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Set("dcc_value"));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "TbRlzValue"));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_lib::AccessPoint points[] =
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {rlz_lib::IETB_SEARCH_BOX, rlz_lib::NO_ACCESS_POINT,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     rlz_lib::NO_ACCESS_POINT};
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string request;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_lib::SendFinancialPing(rlz_lib::TOOLBAR_NOTIFIER, points,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "swg", "GGLA", "SwgProductId1234", "en-UK", false,
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /*skip_time_check=*/true);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(RLZ_NETWORK_IMPLEMENTATION_CHROME_NET)
4798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void ResetContext() {
4818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  rlz_lib::SetURLRequestContext(NULL);
4828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(RlzLibTest, SendFinancialPingDuringShutdown) {
4858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // rlz_lib::SendFinancialPing fails when this is set.
4868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (!rlz_lib::SupplementaryBranding::GetBrand().empty())
4878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
4888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_MACOSX)
4908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::mac::ScopedNSAutoreleasePool pool;
4918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
4928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::Thread::Options options;
4948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  options.message_loop_type = base::MessageLoop::TYPE_IO;
4958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::Thread io_thread("rlz_unittest_io_thread");
4978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(io_thread.StartWithOptions(options));
4988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_refptr<net::TestURLRequestContextGetter> context =
5008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      new net::TestURLRequestContextGetter(
5018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          io_thread.message_loop()->message_loop_proxy());
5028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  rlz_lib::SetURLRequestContext(context.get());
5038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  URLRequestRAII set_context(context.get());
5058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  rlz_lib::AccessPoint points[] =
5078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    {rlz_lib::IETB_SEARCH_BOX, rlz_lib::NO_ACCESS_POINT,
5088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)     rlz_lib::NO_ACCESS_POINT};
5098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  rlz_lib::test::ResetSendFinancialPingInterrupted();
5108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(rlz_lib::test::WasSendFinancialPingInterrupted());
5118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::MessageLoop loop;
5138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  loop.PostTask(FROM_HERE, base::Bind(&ResetContext));
5148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string request;
5158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(rlz_lib::SendFinancialPing(rlz_lib::TOOLBAR_NOTIFIER, points,
5168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "swg", "GGLA", "SwgProductId1234", "en-UK", false,
5178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      /*skip_time_check=*/true));
5188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(rlz_lib::test::WasSendFinancialPingInterrupted());
5208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  rlz_lib::test::ResetSendFinancialPingInterrupted();
5218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
5238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, ClearProductState) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineDealCodeHelper::Clear();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "TbRlzValue"));
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::GD_DESKBAND,
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GdbRlzValue"));
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_lib::AccessPoint points[] =
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { rlz_lib::IETB_SEARCH_BOX, rlz_lib::NO_ACCESS_POINT };
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IETB_SEARCH_BOX, rlz_lib::INSTALL));
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_lib::AccessPoint points2[] =
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { rlz_lib::IETB_SEARCH_BOX,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::GD_DESKBAND,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::NO_ACCESS_POINT };
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char cgi[2048];
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetPingParams(rlz_lib::TOOLBAR_NOTIFIER, points2,
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     cgi, 2048));
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("rep=2&rlz=T4:TbRlzValue,D1:GdbRlzValue", cgi);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi, 2048));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string events(cgi);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(0u, events.find("I7S"));
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(0u, events.find("T4I"));
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(0u, events.find("T4R"));
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_lib::ClearProductState(rlz_lib::TOOLBAR_NOTIFIER, points);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         cgi, 2048));
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", cgi);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::GD_DESKBAND,
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         cgi, 2048));
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("GdbRlzValue", cgi);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              cgi, 2048));
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", cgi);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<class T>
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class typed_buffer_ptr {
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<char[]> buffer_;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typed_buffer_ptr() {
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit typed_buffer_ptr(size_t size) : buffer_(new char[size]) {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void reset(size_t size) {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer_.reset(new char[size]);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  operator T*() {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return reinterpret_cast<T*>(buffer_.get());
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace rlz_lib {
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasAccess(PSID sid, ACCESS_MASK access_mask, ACL* dacl);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool EmptyAcl(ACL* acl) {
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACL_SIZE_INFORMATION info;
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ret = GetAclInformation(acl, &info, sizeof(info), AclSizeInformation);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ret);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (DWORD i = 0; i < info.AceCount && ret; ++i) {
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = DeleteAce(acl, 0);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ret);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ret;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, HasAccess) {
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a SID that represents ALL USERS.
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD users_sid_size = SECURITY_MAX_SID_SIZE;
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typed_buffer_ptr<SID> users_sid(users_sid_size);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateWellKnownSid(WinBuiltinUsersSid, NULL, users_sid, &users_sid_size);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RLZ always asks for KEY_ALL_ACCESS access to the key.  This is what we
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test here.
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No ACL mean no access.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, NULL));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an ACL for these tests.
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const DWORD kMaxAclSize = 1024;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typed_buffer_ptr<ACL> dacl(kMaxAclSize);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeAcl(dacl, kMaxAclSize, ACL_REVISION);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Empty DACL mean no access.
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl));
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACE without all needed privileges should mean no access.
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_READ, users_sid));
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl));
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACE without all needed privileges should mean no access.
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(EmptyAcl(dacl));
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_WRITE, users_sid));
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl));
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A deny ACE before an allow ACE should not give access.
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(EmptyAcl(dacl));
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessDeniedAce(dacl, ACL_REVISION, KEY_ALL_ACCESS,
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 users_sid));
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_ALL_ACCESS,
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  users_sid));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl));
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A deny ACE before an allow ACE should not give access.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(EmptyAcl(dacl));
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessDeniedAce(dacl, ACL_REVISION, KEY_READ, users_sid));
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_ALL_ACCESS,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  users_sid));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl));
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An allow ACE without all required bits should not give access.
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(EmptyAcl(dacl));
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_WRITE, users_sid));
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl));
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An allow ACE with all required bits should give access.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(EmptyAcl(dacl));
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_ALL_ACCESS,
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  users_sid));
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl));
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A deny ACE after an allow ACE should not give access.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(EmptyAcl(dacl));
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_ALL_ACCESS,
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  users_sid));
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessDeniedAce(dacl, ACL_REVISION, KEY_READ, users_sid));
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl));
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An inherit-only allow ACE should not give access.
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(EmptyAcl(dacl));
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessAllowedAceEx(dacl, ACL_REVISION, INHERIT_ONLY_ACE,
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    KEY_ALL_ACCESS, users_sid));
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl));
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An inherit-only deny ACE should not apply.
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(EmptyAcl(dacl));
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessDeniedAceEx(dacl, ACL_REVISION, INHERIT_ONLY_ACE,
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   KEY_ALL_ACCESS, users_sid));
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_ALL_ACCESS,
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  users_sid));
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl));
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, BrandingRecordProductEvent) {
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't run these tests if a supplementary brand is already in place.  That
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // way we can control the branding.
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rlz_lib::SupplementaryBranding::GetBrand().empty())
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char cgi_50[50];
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record different events for the same product with diffrent branding, and
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // make sure that the information remains separate.
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rlz_lib::SupplementaryBranding branding("TEST");
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that recording events with the default brand and a supplementary
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // brand don't overwrite each other.
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi_50, 50));
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=I7S", cgi_50);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rlz_lib::SupplementaryBranding branding("TEST");
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::INSTALL));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               cgi_50, 50));
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ("events=I7I", cgi_50);
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             cgi_50, 50));
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=I7S", cgi_50);
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, BrandingSetAccessPointRlz) {
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't run these tests if a supplementary brand is already in place.  That
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // way we can control the branding.
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rlz_lib::SupplementaryBranding::GetBrand().empty())
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char rlz_50[50];
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that setting RLZ strings with the default brand and a supplementary
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // brand don't overwrite each other.
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, "IeTbRlz"));
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_50, 50));
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("IeTbRlz", rlz_50);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rlz_lib::SupplementaryBranding branding("TEST");
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, "SuppRlz"));
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_50,
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           50));
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ("SuppRlz", rlz_50);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_50, 50));
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("IeTbRlz", rlz_50);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, BrandingWithStatefulEvents) {
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't run these tests if a supplementary brand is already in place.  That
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // way we can control the branding.
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rlz_lib::SupplementaryBranding::GetBrand().empty())
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kPingResponse =
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "version: 3.0.914.7250\r\n"
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n"
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-action: custom-action\r\n"
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "launch-target: SearchWithGoogleUpdate.exe\r\n"
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n"
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlzT4: 1T4_____en__252\r\n"  // GoodRLZ.
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "events: I7S,W1I\r\n"         // Clear all events.
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "stateful-events: W1I\r\n"    // W1I as an stateful event.
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "rlz\r\n"
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "dcc: dcc_value\r\n"
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: 55191759";
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rlz_lib::SupplementaryBranding branding("TEST");
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER));
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record some product events for the default and supplementary brand.
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that they get cleared only for the default brand.
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL));
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rlz_lib::SupplementaryBranding branding("TEST");
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL));
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER,
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         kPingResponse));
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check all the events sent earlier are cleared only for default brand.
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char value[50];
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              value, 50));
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", value);
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rlz_lib::SupplementaryBranding branding("TEST");
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               value, 50));
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ("events=I7S,W1I", value);
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record both events (one is stateless and the other is stateful) again.
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL));
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the stateful event won't be sent again while the stateless one will.
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             value, 50));
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=I7S", value);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rlz_lib::SupplementaryBranding branding("TEST");
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER,
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           kPingResponse));
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                value, 50));
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ("", value);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER,
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             value, 50));
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("events=I7S", value);
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_POSIX)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ReadonlyRlzDirectoryTest : public RlzLibTestNoMachineState {
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReadonlyRlzDirectoryTest::SetUp() {
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RlzLibTestNoMachineState::SetUp();
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make the rlz directory non-writeable.
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int chmod_result = chmod(temp_dir_.path().value().c_str(), 0500);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, chmod_result);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ReadonlyRlzDirectoryTest, WriteFails) {
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The rlz test runner runs every test twice: Once normally, and once with
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a SupplementaryBranding on the stack. In the latter case, the rlz lock
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has already been acquired before the rlz directory got changed to
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // read-only, which makes this test pointless. So run it only in the first
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pass.
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rlz_lib::SupplementaryBranding::GetBrand().empty())
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE));
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Regression test for http://crbug.com/121255
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ReadonlyRlzDirectoryTest, SupplementaryBrandingDoesNotCrash) {
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See the comment at the top of WriteFails.
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rlz_lib::SupplementaryBranding::GetBrand().empty())
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_lib::SupplementaryBranding branding("TEST");
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::INSTALL));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Regression test for http://crbug.com/141108
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RlzLibTest, ConcurrentStoreAccessWithProcessExitsWhileLockHeld) {
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See the comment at the top of WriteFails.
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rlz_lib::SupplementaryBranding::GetBrand().empty())
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<pid_t> pids;
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 10; ++i) {
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pid_t pid = fork();
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(-1, pid);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pid == 0) {
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Child.
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // SupplementaryBranding is a RAII object for the rlz lock.
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rlz_lib::SupplementaryBranding branding("TEST");
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Simulate a crash while holding the lock in some of the children.
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (i > 0 && i % 3 == 0)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          _exit(0);
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Note: Since this is in a forked child, a failing expectation won't
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // make the test fail. It does however cause lots of "check failed"
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // error output. The parent process will then check the exit code
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // below to make the test fail.
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bool success = rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::INSTALL);
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_TRUE(success);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _exit(success ? 0 : 1);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _exit(0);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Parent.
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pids.push_back(pid);
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pids.size(); ++i) {
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HANDLE_EINTR(waitpid(pids[i], &status, 0)) != -1)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(WIFEXITED(status) && WEXITSTATUS(status) == 0);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No child should have the lock at this point, not even the crashed ones.
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::INSTALL));
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RlzLibTest, LockAcquistionSucceedsButStoreFileCannotBeCreated) {
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See the comment at the top of WriteFails.
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rlz_lib::SupplementaryBranding::GetBrand().empty())
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a directory where the rlz file is supposed to appear. This way,
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the lock file can be created successfully, but creation of the rlz file
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // itself will fail.
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int mkdir_result = mkdir(rlz_lib::testing::RlzStoreFilenameStr().c_str(),
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0500);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, mkdir_result);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_lib::SupplementaryBranding branding("TEST");
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER,
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::INSTALL));
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
940