diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-26 00:39:45 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-26 00:39:45 +0000 |
commit | 6dba1dd2efa3ed67bd41312bc682fc12c3c69544 (patch) | |
tree | bfb0bca756ad3e274227d085b82dedda508424fe /rlz/lib/rlz_lib_test.cc | |
parent | 4a44f6610eb14a728a22a9dea00d6707d2e616e1 (diff) | |
download | chromium_src-6dba1dd2efa3ed67bd41312bc682fc12c3c69544.zip chromium_src-6dba1dd2efa3ed67bd41312bc682fc12c3c69544.tar.gz chromium_src-6dba1dd2efa3ed67bd41312bc682fc12c3c69544.tar.bz2 |
Revert 144071 - Add a regenerate button to regenerate the password in Windows.
BUG=120480
TEST=Not tested.
Review URL: https://chromiumcodereview.appspot.com/10642009
TBR=zysxqn@google.com
Review URL: https://chromiumcodereview.appspot.com/10659022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@144074 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'rlz/lib/rlz_lib_test.cc')
-rw-r--r-- | rlz/lib/rlz_lib_test.cc | 824 |
1 files changed, 824 insertions, 0 deletions
diff --git a/rlz/lib/rlz_lib_test.cc b/rlz/lib/rlz_lib_test.cc new file mode 100644 index 0000000..0f8cb4c --- /dev/null +++ b/rlz/lib/rlz_lib_test.cc @@ -0,0 +1,824 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// A test application for the RLZ library. +// +// These tests should not be executed on the build server: +// - They assert for the failed cases. +// - They modify machine state (registry). +// +// These tests require write access to HKLM and HKCU. +// +// The "GGLA" brand is used to test the normal code flow of the code, and the +// "TEST" brand is used to test the supplementary brand code code flow. + +#include "base/logging.h" +#include "base/memory/scoped_ptr.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +#include "rlz/lib/rlz_lib.h" +#include "rlz/test/rlz_test_helpers.h" + +#if defined(OS_WIN) +#include <Windows.h> +#include "rlz/win/lib/machine_deal.h" +#endif + +#if defined(RLZ_NETWORK_IMPLEMENTATION_CHROME_NET) +#include "base/mac/scoped_nsautorelease_pool.h" +#include "base/threading/thread.h" +#include "net/url_request/url_request_test_util.h" +#endif + + +class MachineDealCodeHelper +#if defined(OS_WIN) + : public rlz_lib::MachineDealCode +#endif + { + public: + static bool Clear() { +#if defined(OS_WIN) + return rlz_lib::MachineDealCode::Clear(); +#else + return true; +#endif + } + + private: + MachineDealCodeHelper() {} + ~MachineDealCodeHelper() {} +}; + +class RlzLibTest : public RlzLibTestBase { +}; + +TEST_F(RlzLibTest, RecordProductEvent) { + char cgi_50[50]; + + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("events=I7S", cgi_50); + + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("events=I7S,W1I", cgi_50); + + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("events=I7S,W1I", cgi_50); +} + +TEST_F(RlzLibTest, ClearProductEvent) { + char cgi_50[50]; + + // Clear 1 of 1 events. + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("events=I7S", cgi_50); + EXPECT_TRUE(rlz_lib::ClearProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("", cgi_50); + + // Clear 1 of 2 events. + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("events=I7S,W1I", cgi_50); + EXPECT_TRUE(rlz_lib::ClearProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("events=W1I", cgi_50); + + // Clear a non-recorded event. + EXPECT_TRUE(rlz_lib::ClearProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IETB_SEARCH_BOX, rlz_lib::FIRST_SEARCH)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("events=W1I", cgi_50); +} + + +TEST_F(RlzLibTest, GetProductEventsAsCgi) { + char cgi_50[50]; + char cgi_1[1]; + + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL)); + + EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_1, 1)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("events=I7S,W1I", cgi_50); +} + +TEST_F(RlzLibTest, ClearAllAllProductEvents) { + char cgi_50[50]; + + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("events=I7S", cgi_50); + + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("", cgi_50); +} + +TEST_F(RlzLibTest, SetAccessPointRlz) { + char rlz_50[50]; + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, "")); + EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_50, 50)); + EXPECT_STREQ("", rlz_50); + + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, "IeTbRlz")); + EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_50, 50)); + EXPECT_STREQ("IeTbRlz", rlz_50); +} + +TEST_F(RlzLibTest, GetAccessPointRlz) { + char rlz_1[1]; + char rlz_50[50]; + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, "")); + EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_1, 1)); + EXPECT_STREQ("", rlz_1); + + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, "IeTbRlz")); + EXPECT_FALSE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_1, 1)); + EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_50, 50)); + EXPECT_STREQ("IeTbRlz", rlz_50); +} + +TEST_F(RlzLibTest, GetPingParams) { + MachineDealCodeHelper::Clear(); + + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, + "TbRlzValue")); + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IE_HOME_PAGE, "")); + + char cgi[2048]; + rlz_lib::AccessPoint points[] = + {rlz_lib::IETB_SEARCH_BOX, rlz_lib::NO_ACCESS_POINT, + rlz_lib::NO_ACCESS_POINT}; + + EXPECT_TRUE(rlz_lib::GetPingParams(rlz_lib::TOOLBAR_NOTIFIER, points, + cgi, 2048)); + EXPECT_STREQ("rep=2&rlz=T4:TbRlzValue", cgi); + +#if defined(OS_WIN) + EXPECT_TRUE(rlz_lib::MachineDealCode::Set("dcc_value")); +#define DCC_PARAM "&dcc=dcc_value" +#else +#define DCC_PARAM "" +#endif + + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, "")); + EXPECT_TRUE(rlz_lib::GetPingParams(rlz_lib::TOOLBAR_NOTIFIER, points, + cgi, 2048)); + EXPECT_STREQ("rep=2&rlz=T4:" DCC_PARAM, cgi); + + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, + "TbRlzValue")); + EXPECT_FALSE(rlz_lib::GetPingParams(rlz_lib::TOOLBAR_NOTIFIER, points, + cgi, 23 + strlen(DCC_PARAM))); + EXPECT_STREQ("", cgi); + EXPECT_TRUE(rlz_lib::GetPingParams(rlz_lib::TOOLBAR_NOTIFIER, points, + cgi, 24 + strlen(DCC_PARAM))); + EXPECT_STREQ("rep=2&rlz=T4:TbRlzValue" DCC_PARAM, cgi); + + EXPECT_TRUE(GetAccessPointRlz(rlz_lib::IE_HOME_PAGE, cgi, 2048)); + points[2] = rlz_lib::IE_HOME_PAGE; + EXPECT_TRUE(rlz_lib::GetPingParams(rlz_lib::TOOLBAR_NOTIFIER, points, + cgi, 2048)); + EXPECT_STREQ("rep=2&rlz=T4:TbRlzValue" DCC_PARAM, cgi); +} + +TEST_F(RlzLibTest, IsPingResponseValid) { + const char* kBadPingResponses[] = { + // No checksum. + "version: 3.0.914.7250\r\n" + "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n" + "launch-action: custom-action\r\n" + "launch-target: SearchWithGoogleUpdate.exe\r\n" + "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n" + "rlz: 1R1_____en__252\r\n" + "rlzXX: 1R1_____en__250\r\n", + + // Invalid checksum. + "version: 3.0.914.7250\r\n" + "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n" + "launch-action: custom-action\r\n" + "launch-target: SearchWithGoogleUpdate.exe\r\n" + "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n" + "rlz: 1R1_____en__252\r\n" + "rlzXX: 1R1_____en__250\r\n" + "rlzT4 1T4_____en__251\r\n" + "rlzT4: 1T4_____en__252\r\n" + "rlz\r\n" + "crc32: B12CC79A", + + // Misplaced checksum. + "version: 3.0.914.7250\r\n" + "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n" + "launch-action: custom-action\r\n" + "launch-target: SearchWithGoogleUpdate.exe\r\n" + "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n" + "rlz: 1R1_____en__252\r\n" + "rlzXX: 1R1_____en__250\r\n" + "crc32: B12CC79C\r\n" + "rlzT4 1T4_____en__251\r\n" + "rlzT4: 1T4_____en__252\r\n" + "rlz\r\n", + + NULL + }; + + const char* kGoodPingResponses[] = { + "version: 3.0.914.7250\r\n" + "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n" + "launch-action: custom-action\r\n" + "launch-target: SearchWithGoogleUpdate.exe\r\n" + "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n" + "rlz: 1R1_____en__252\r\n" + "rlzXX: 1R1_____en__250\r\n" + "rlzT4 1T4_____en__251\r\n" + "rlzT4: 1T4_____en__252\r\n" + "rlz\r\n" + "crc32: D6FD55A3", + + "version: 3.0.914.7250\r\n" + "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n" + "launch-action: custom-action\r\n" + "launch-target: SearchWithGoogleUpdate.exe\r\n" + "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n" + "rlz: 1R1_____en__252\r\n" + "rlzXX: 1R1_____en__250\r\n" + "rlzT4 1T4_____en__251\r\n" + "rlzT4: 1T4_____en__252\r\n" + "rlz\r\n" + "crc32: D6FD55A3\r\n" + "extradata: not checksummed", + + NULL + }; + + for (int i = 0; kBadPingResponses[i]; i++) + EXPECT_FALSE(rlz_lib::IsPingResponseValid(kBadPingResponses[i], NULL)); + + for (int i = 0; kGoodPingResponses[i]; i++) + EXPECT_TRUE(rlz_lib::IsPingResponseValid(kGoodPingResponses[i], NULL)); +} + +TEST_F(RlzLibTest, ParsePingResponse) { + const char* kPingResponse = + "version: 3.0.914.7250\r\n" + "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n" + "launch-action: custom-action\r\n" + "launch-target: SearchWithGoogleUpdate.exe\r\n" + "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n" + "rlz: 1R1_____en__252\r\n" // Invalid RLZ - no access point. + "rlzXX: 1R1_____en__250\r\n" // Invalid RLZ - bad access point. + "rlzT4 1T4_____en__251\r\n" // Invalid RLZ - missing colon. + "rlzT4: 1T4_____en__252\r\n" // GoodRLZ. + "events: I7S,W1I\r\n" // Clear all events. + "rlz\r\n" + "dcc: dcc_value\r\n" + "crc32: F9070F81"; + +#if defined(OS_WIN) + EXPECT_TRUE(rlz_lib::MachineDealCode::Set("dcc_value2")); +#endif + + // Record some product events to check that they get cleared. + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL)); + + EXPECT_TRUE(rlz_lib::SetAccessPointRlz( + rlz_lib::IETB_SEARCH_BOX, "TbRlzValue")); + + EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER, + kPingResponse)); + +#if defined(OS_WIN) + EXPECT_TRUE(rlz_lib::MachineDealCode::Set("dcc_value")); +#endif + EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER, + kPingResponse)); + + char value[50]; + EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, value, 50)); + EXPECT_STREQ("1T4_____en__252", value); + EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + value, 50)); + EXPECT_STREQ("", value); + + const char* kPingResponse2 = + "rlzT4: 1T4_____de__253 \r\n" // Good with extra spaces. + "crc32: 321334F5\r\n"; + EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER, + kPingResponse2)); + EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, value, 50)); + EXPECT_STREQ("1T4_____de__253", value); + + const char* kPingResponse3 = + "crc32: 0\r\n"; // Good RLZ - empty response. + EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER, + kPingResponse3)); + EXPECT_STREQ("1T4_____de__253", value); +} + +// Test whether a stateful event will only be sent in financial pings once. +TEST_F(RlzLibTest, ParsePingResponseWithStatefulEvents) { + const char* kPingResponse = + "version: 3.0.914.7250\r\n" + "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n" + "launch-action: custom-action\r\n" + "launch-target: SearchWithGoogleUpdate.exe\r\n" + "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n" + "rlzT4: 1T4_____en__252\r\n" // GoodRLZ. + "events: I7S,W1I\r\n" // Clear all events. + "stateful-events: W1I\r\n" // W1I as an stateful event. + "rlz\r\n" + "dcc: dcc_value\r\n" + "crc32: 55191759"; + + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + + // Record some product events to check that they get cleared. + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL)); + + EXPECT_TRUE(rlz_lib::SetAccessPointRlz( + rlz_lib::IETB_SEARCH_BOX, "TbRlzValue")); + + EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER, + kPingResponse)); + + // Check all the events sent earlier are cleared. + char value[50]; + EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + value, 50)); + EXPECT_STREQ("", value); + + // Record both events (one is stateless and the other is stateful) again. + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL)); + + // Check the stateful event won't be sent again while the stateless one will. + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + value, 50)); + EXPECT_STREQ("events=I7S", value); + + // Test that stateful events are cleared by ClearAllProductEvents(). After + // calling it, trying to record a stateful again should result in it being + // recorded again. + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + value, 50)); + EXPECT_STREQ("events=W1I", value); +} + +TEST_F(RlzLibTest, SendFinancialPing) { + // We don't really check a value or result in this test. All this does is + // attempt to ping the financial server, which you can verify in Fiddler. + // TODO: Make this a measurable test. + +#if defined(RLZ_NETWORK_IMPLEMENTATION_CHROME_NET) +#if defined(OS_MACOSX) + base::mac::ScopedNSAutoreleasePool pool; +#endif + + base::Thread::Options options; + options.message_loop_type = MessageLoop::TYPE_IO; + + base::Thread io_thread("rlz_unittest_io_thread"); + ASSERT_TRUE(io_thread.StartWithOptions(options)); + + scoped_refptr<TestURLRequestContextGetter> context = + new TestURLRequestContextGetter( + io_thread.message_loop()->message_loop_proxy()); + rlz_lib::SetURLRequestContext(context.get()); + + class URLRequestRAII { + public: + URLRequestRAII(net::URLRequestContextGetter* context) { + rlz_lib::SetURLRequestContext(context); + } + ~URLRequestRAII() { + rlz_lib::SetURLRequestContext(NULL); + } + }; + + URLRequestRAII set_context(context.get()); +#endif + + MachineDealCodeHelper::Clear(); +#if defined(OS_WIN) + EXPECT_TRUE(rlz_lib::MachineDealCode::Set("dcc_value")); +#endif + + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, + "TbRlzValue")); + + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL)); + + rlz_lib::AccessPoint points[] = + {rlz_lib::IETB_SEARCH_BOX, rlz_lib::NO_ACCESS_POINT, + rlz_lib::NO_ACCESS_POINT}; + + std::string request; + rlz_lib::SendFinancialPing(rlz_lib::TOOLBAR_NOTIFIER, points, + "swg", "GGLA", "SwgProductId1234", "en-UK", false, + /*skip_time_check=*/true); +} + +TEST_F(RlzLibTest, ClearProductState) { + MachineDealCodeHelper::Clear(); + + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, + "TbRlzValue")); + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::GD_DESKBAND, + "GdbRlzValue")); + + rlz_lib::AccessPoint points[] = + { rlz_lib::IETB_SEARCH_BOX, rlz_lib::NO_ACCESS_POINT }; + + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IETB_SEARCH_BOX, rlz_lib::INSTALL)); + + rlz_lib::AccessPoint points2[] = + { rlz_lib::IETB_SEARCH_BOX, + rlz_lib::GD_DESKBAND, + rlz_lib::NO_ACCESS_POINT }; + + char cgi[2048]; + EXPECT_TRUE(rlz_lib::GetPingParams(rlz_lib::TOOLBAR_NOTIFIER, points2, + cgi, 2048)); + EXPECT_STREQ("rep=2&rlz=T4:TbRlzValue,D1:GdbRlzValue", cgi); + + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi, 2048)); + std::string events(cgi); + EXPECT_LT(0u, events.find("I7S")); + EXPECT_LT(0u, events.find("T4I")); + EXPECT_LT(0u, events.find("T4R")); + + rlz_lib::ClearProductState(rlz_lib::TOOLBAR_NOTIFIER, points); + + EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, + cgi, 2048)); + EXPECT_STREQ("", cgi); + EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::GD_DESKBAND, + cgi, 2048)); + EXPECT_STREQ("GdbRlzValue", cgi); + + EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi, 2048)); + EXPECT_STREQ("", cgi); +} + +#if defined(OS_WIN) +template<class T> +class typed_buffer_ptr { + scoped_array<char> buffer_; + + public: + typed_buffer_ptr() { + } + + explicit typed_buffer_ptr(size_t size) : buffer_(new char[size]) { + } + + void reset(size_t size) { + buffer_.reset(new char[size]); + } + + operator T*() { + return reinterpret_cast<T*>(buffer_.get()); + } +}; + +namespace rlz_lib { +bool HasAccess(PSID sid, ACCESS_MASK access_mask, ACL* dacl); +} + +bool EmptyAcl(ACL* acl) { + ACL_SIZE_INFORMATION info; + bool ret = GetAclInformation(acl, &info, sizeof(info), AclSizeInformation); + EXPECT_TRUE(ret); + + for (DWORD i = 0; i < info.AceCount && ret; ++i) { + ret = DeleteAce(acl, 0); + EXPECT_TRUE(ret); + } + + return ret; +} + +TEST_F(RlzLibTest, HasAccess) { + // Create a SID that represents ALL USERS. + DWORD users_sid_size = SECURITY_MAX_SID_SIZE; + typed_buffer_ptr<SID> users_sid(users_sid_size); + CreateWellKnownSid(WinBuiltinUsersSid, NULL, users_sid, &users_sid_size); + + // RLZ always asks for KEY_ALL_ACCESS access to the key. This is what we + // test here. + + // No ACL mean no access. + EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, NULL)); + + // Create an ACL for these tests. + const DWORD kMaxAclSize = 1024; + typed_buffer_ptr<ACL> dacl(kMaxAclSize); + InitializeAcl(dacl, kMaxAclSize, ACL_REVISION); + + // Empty DACL mean no access. + EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl)); + + // ACE without all needed privileges should mean no access. + EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_READ, users_sid)); + EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl)); + + // ACE without all needed privileges should mean no access. + EXPECT_TRUE(EmptyAcl(dacl)); + EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_WRITE, users_sid)); + EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl)); + + // A deny ACE before an allow ACE should not give access. + EXPECT_TRUE(EmptyAcl(dacl)); + EXPECT_TRUE(AddAccessDeniedAce(dacl, ACL_REVISION, KEY_ALL_ACCESS, + users_sid)); + EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_ALL_ACCESS, + users_sid)); + EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl)); + + // A deny ACE before an allow ACE should not give access. + EXPECT_TRUE(EmptyAcl(dacl)); + EXPECT_TRUE(AddAccessDeniedAce(dacl, ACL_REVISION, KEY_READ, users_sid)); + EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_ALL_ACCESS, + users_sid)); + EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl)); + + + // An allow ACE without all required bits should not give access. + EXPECT_TRUE(EmptyAcl(dacl)); + EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_WRITE, users_sid)); + EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl)); + + // An allow ACE with all required bits should give access. + EXPECT_TRUE(EmptyAcl(dacl)); + EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_ALL_ACCESS, + users_sid)); + EXPECT_TRUE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl)); + + // A deny ACE after an allow ACE should not give access. + EXPECT_TRUE(EmptyAcl(dacl)); + EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_ALL_ACCESS, + users_sid)); + EXPECT_TRUE(AddAccessDeniedAce(dacl, ACL_REVISION, KEY_READ, users_sid)); + EXPECT_TRUE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl)); + + // An inherit-only allow ACE should not give access. + EXPECT_TRUE(EmptyAcl(dacl)); + EXPECT_TRUE(AddAccessAllowedAceEx(dacl, ACL_REVISION, INHERIT_ONLY_ACE, + KEY_ALL_ACCESS, users_sid)); + EXPECT_FALSE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl)); + + // An inherit-only deny ACE should not apply. + EXPECT_TRUE(EmptyAcl(dacl)); + EXPECT_TRUE(AddAccessDeniedAceEx(dacl, ACL_REVISION, INHERIT_ONLY_ACE, + KEY_ALL_ACCESS, users_sid)); + EXPECT_TRUE(AddAccessAllowedAce(dacl, ACL_REVISION, KEY_ALL_ACCESS, + users_sid)); + EXPECT_TRUE(rlz_lib::HasAccess(users_sid, KEY_ALL_ACCESS, dacl)); +} +#endif + +TEST_F(RlzLibTest, BrandingRecordProductEvent) { + // Don't run these tests if a supplementary brand is already in place. That + // way we can control the branding. + if (!rlz_lib::SupplementaryBranding::GetBrand().empty()) + return; + + char cgi_50[50]; + + // Record different events for the same product with diffrent branding, and + // make sure that the information remains separate. + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + { + rlz_lib::SupplementaryBranding branding("TEST"); + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + } + + // Test that recording events with the default brand and a supplementary + // brand don't overwrite each other. + + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("events=I7S", cgi_50); + + { + rlz_lib::SupplementaryBranding branding("TEST"); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::INSTALL)); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("events=I7I", cgi_50); + } + + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + cgi_50, 50)); + EXPECT_STREQ("events=I7S", cgi_50); +} + +TEST_F(RlzLibTest, BrandingSetAccessPointRlz) { + // Don't run these tests if a supplementary brand is already in place. That + // way we can control the branding. + if (!rlz_lib::SupplementaryBranding::GetBrand().empty()) + return; + + char rlz_50[50]; + + // Test that setting RLZ strings with the default brand and a supplementary + // brand don't overwrite each other. + + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, "IeTbRlz")); + EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_50, 50)); + EXPECT_STREQ("IeTbRlz", rlz_50); + + { + rlz_lib::SupplementaryBranding branding("TEST"); + + EXPECT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, "SuppRlz")); + EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_50, + 50)); + EXPECT_STREQ("SuppRlz", rlz_50); + } + + EXPECT_TRUE(rlz_lib::GetAccessPointRlz(rlz_lib::IETB_SEARCH_BOX, rlz_50, 50)); + EXPECT_STREQ("IeTbRlz", rlz_50); + +} + +TEST_F(RlzLibTest, BrandingWithStatefulEvents) { + // Don't run these tests if a supplementary brand is already in place. That + // way we can control the branding. + if (!rlz_lib::SupplementaryBranding::GetBrand().empty()) + return; + + const char* kPingResponse = + "version: 3.0.914.7250\r\n" + "url: http://www.corp.google.com/~av/45/opt/SearchWithGoogleUpdate.exe\r\n" + "launch-action: custom-action\r\n" + "launch-target: SearchWithGoogleUpdate.exe\r\n" + "signature: c08a3f4438e1442c4fe5678ee147cf6c5516e5d62bb64e\r\n" + "rlzT4: 1T4_____en__252\r\n" // GoodRLZ. + "events: I7S,W1I\r\n" // Clear all events. + "stateful-events: W1I\r\n" // W1I as an stateful event. + "rlz\r\n" + "dcc: dcc_value\r\n" + "crc32: 55191759"; + + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + { + rlz_lib::SupplementaryBranding branding("TEST"); + EXPECT_TRUE(rlz_lib::ClearAllProductEvents(rlz_lib::TOOLBAR_NOTIFIER)); + } + + // Record some product events for the default and supplementary brand. + // Check that they get cleared only for the default brand. + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL)); + + { + rlz_lib::SupplementaryBranding branding("TEST"); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL)); + } + + EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER, + kPingResponse)); + + // Check all the events sent earlier are cleared only for default brand. + char value[50]; + EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + value, 50)); + EXPECT_STREQ("", value); + + { + rlz_lib::SupplementaryBranding branding("TEST"); + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + value, 50)); + EXPECT_STREQ("events=I7S,W1I", value); + } + + // Record both events (one is stateless and the other is stateful) again. + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); + EXPECT_TRUE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_HOME_PAGE, rlz_lib::INSTALL)); + + // Check the stateful event won't be sent again while the stateless one will. + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + value, 50)); + EXPECT_STREQ("events=I7S", value); + + { + rlz_lib::SupplementaryBranding branding("TEST"); + EXPECT_TRUE(rlz_lib::ParsePingResponse(rlz_lib::TOOLBAR_NOTIFIER, + kPingResponse)); + + EXPECT_FALSE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + value, 50)); + EXPECT_STREQ("", value); + } + + EXPECT_TRUE(rlz_lib::GetProductEventsAsCgi(rlz_lib::TOOLBAR_NOTIFIER, + value, 50)); + EXPECT_STREQ("events=I7S", value); +} + +#if defined(OS_MACOSX) +class ReadonlyRlzDirectoryTest : public RlzLibTestNoMachineState { + protected: + virtual void SetUp() OVERRIDE; +}; + +void ReadonlyRlzDirectoryTest::SetUp() { + RlzLibTestNoMachineState::SetUp(); + // Make the rlz directory non-writeable. + chmod(temp_dir_.path().value().c_str(), 0500); +} + +TEST_F(ReadonlyRlzDirectoryTest, WriteFails) { + // The rlz test runner runs every test twice: Once normally, and once with + // a SupplementaryBranding on the stack. In the latter case, the rlz lock + // has already been acquired before the rlz directory got changed to + // read-only, which makes this test pointless. So run it only in the first + // pass. + if (!rlz_lib::SupplementaryBranding::GetBrand().empty()) + return; + + EXPECT_FALSE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::SET_TO_GOOGLE)); +} + +// Regression test for http://crbug.com/121255 +TEST_F(ReadonlyRlzDirectoryTest, SupplementaryBrandingDoesNotCrash) { + // See the comment at the top of WriteFails. + if (!rlz_lib::SupplementaryBranding::GetBrand().empty()) + return; + + rlz_lib::SupplementaryBranding branding("TEST"); + EXPECT_FALSE(rlz_lib::RecordProductEvent(rlz_lib::TOOLBAR_NOTIFIER, + rlz_lib::IE_DEFAULT_SEARCH, rlz_lib::INSTALL)); +} +#endif |