1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map>
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/win/registry.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_function.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_function_dispatcher.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_apitest.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_rlz_module.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "rlz/win/lib/rlz_lib.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockRlzSendFinancialPingFunction : public RlzSendFinancialPingFunction {
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool RunImpl();
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static int expected_count_;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static int expected_count() {
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return expected_count_;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint MockRlzSendFinancialPingFunction::expected_count_ = 0;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool MockRlzSendFinancialPingFunction::RunImpl() {
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(RlzSendFinancialPingFunction::RunImpl());
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ++expected_count_;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionFunction* MockRlzSendFinancialPingFunctionFactory() {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new MockRlzSendFinancialPingFunction();
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionApiTest, Rlz) {
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommandLine::ForCurrentProcess()->AppendSwitch(
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      switches::kEnableExperimentalExtensionApis);
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Before running the tests, clear the state of the RLZ products used.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rlz_lib::AccessPoint access_points[] = {
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rlz_lib::GD_WEB_SERVER,
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rlz_lib::GD_OUTLOOK,
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rlz_lib::NO_ACCESS_POINT,
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rlz_lib::ClearProductState(rlz_lib::PINYIN_IME, access_points);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rlz_lib::ClearProductState(rlz_lib::DESKTOP, access_points);
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Check that the state has really been cleared.
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  base::win::RegKey key(HKEY_CURRENT_USER,
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                        L"Software\\Google\\Common\\Rlz\\Events\\N",
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                        KEY_READ);
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_FALSE(key.Valid());
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  key.Open(HKEY_CURRENT_USER, L"Software\\Google\\Common\\Rlz\\Events\\D",
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick           KEY_READ);
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(key.Valid());
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Mock out experimental.rlz.sendFinancialPing().
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(ExtensionFunctionDispatcher::OverrideFunction(
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "experimental.rlz.sendFinancialPing",
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      MockRlzSendFinancialPingFunctionFactory));
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set the access point that the test code is expecting.
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(rlz_lib::SetAccessPointRlz(rlz_lib::GD_DESKBAND, "rlz_apitest"));
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now run all the tests.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(RunExtensionTest("rlz")) << message_;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(3, MockRlzSendFinancialPingFunction::expected_count());
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionFunctionDispatcher::ResetFunctions();
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now make sure we recorded what was expected.  If the code in test.js
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // changes, need to make appropriate changes here.
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  key.Open(HKEY_CURRENT_USER, L"Software\\Google\\Common\\Rlz\\Events\\N",
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick           KEY_READ);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(key.Valid());
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DWORD value;
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(ERROR_SUCCESS, key.ReadValueDW(L"D3I", &value));
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, value);
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(ERROR_SUCCESS, key.ReadValueDW(L"D3S", &value));
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, value);
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(ERROR_SUCCESS, key.ReadValueDW(L"D3F", &value));
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, value);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(ERROR_SUCCESS, key.ReadValueDW(L"D4I", &value));
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, value);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  key.Open(HKEY_CURRENT_USER, L"Software\\Google\\Common\\Rlz\\Events\\D",
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick           KEY_READ);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(key.Valid());
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cleanup.
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rlz_lib::ClearProductState(rlz_lib::PINYIN_IME, access_points);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
100