cloud_print_private_apitest.cc revision 5e3f23d412006dc4db4e659864679f29341e113f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/api/cloud_print_private.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Eq;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Property;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A base class for tests below.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionCloudPrintPrivateApiTest : public ExtensionApiTest {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionApiTest::SetUpCommandLine(command_line);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kCloudPrintServiceURL,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "http://www.cloudprintapp.com/files/extensions/api_test/"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "cloud_print_private");
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Start up the test server and get us ready for calling the install
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // API functions.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_resolver()->AddRule("www.cloudprintapp.com", "127.0.0.1");
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(test_server()->Start());
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a test server URL, but with host 'www.cloudprintapp.com' so it
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // matches the cloud print app's extent that we set up via command line
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // flags.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL GetTestServerURL(const std::string& path) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = test_server()->GetURL(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "files/extensions/api_test/cloud_print_private/" + path);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Replace the host with 'www.cloudprintapp.com' so it matches the cloud
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // print app's extent.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL::Replacements replace_host;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string host_str("www.cloudprintapp.com");
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replace_host.SetHostStr(host_str);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url.ReplaceComponents(replace_host);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using extensions::api::cloud_print_private::UserSettings;
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintTestsDelegateMock : public extensions::CloudPrintTestsDelegate {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintTestsDelegateMock() {}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MOCK_METHOD4(SetupConnector,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(const std::string& user_email,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const std::string& robot_email,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const std::string& credentials,
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    const UserSettings& user_settings));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetHostName, std::string());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetPrinters, std::vector<std::string>());
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(GetClientId, std::string());
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CloudPrintTestsDelegateMock);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MATCHER(IsExpectedUserSettings, "") {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const UserSettings& settings = arg;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return settings.connect_new_printers &&
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         settings.printers.size() == 2 &&
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         settings.printers[0]->name == "printer1" &&
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         !settings.printers[0]->connect &&
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         settings.printers[1]->name == "printer2" &&
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         settings.printers[1]->connect;
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// http://crbug.com/177163
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_WIN) && !defined(NDEBUG)
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_CloudPrintHosted DISABLED_CloudPrintHosted
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_CloudPrintHosted CloudPrintHosted
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCloudPrintPrivateApiTest,
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       MAYBE_CloudPrintHosted) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintTestsDelegateMock cloud_print_mock;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(cloud_print_mock,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              SetupConnector("foo@gmail.com",
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "foorobot@googleusercontent.com",
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "1/23546efa54",
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             IsExpectedUserSettings()));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(cloud_print_mock, GetHostName())
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return("TestHostName"));
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> printers;
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  printers.push_back("printer1");
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  printers.push_back("printer2");
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(cloud_print_mock, GetPrinters())
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(printers));
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(cloud_print_mock, GetClientId())
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return("TestAPIClient"));
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run this as a hosted app. Since we have overridden the cloud print service
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL in the command line, this URL should match the web extent for our
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cloud print component app and it should work.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL page_url = GetTestServerURL(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "enable_chrome_connector/cloud_print_success_tests.html");
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPageTest(page_url.spec()));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
124