push_messaging_canary_test.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/push_messaging/sync_setup_helper.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestExtensionId[] = "mfaehphpebmlbfdiegjnpidmibldjbjk";
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kPasswordFileForTest[] = "password-file-for-test";
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kOverrideUserDataDir[] = "override-user-data-dir";
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class provides tests specific to the push messaging
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// canary test server.  These tests require network access,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and should not be run by normal buildbots as part of the normal
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// checkin process.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PushMessagingCanaryTest : public ExtensionApiTest {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PushMessagingCanaryTest() {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_setup_helper_.reset(new SyncSetupHelper());
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~PushMessagingCanaryTest() {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CommandLine* command_line = CommandLine::ForCurrentProcess();
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(command_line->HasSwitch(kPasswordFileForTest));
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath password_file =
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        command_line->GetSwitchValuePath(kPasswordFileForTest);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(sync_setup_helper_->ReadPasswordFile(password_file));
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The test framework overrides any command line user-data-dir
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // argument with a /tmp/.org.chromium.Chromium.XXXXXX directory.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // That happens in the ChromeTestLauncherDelegate, and affects
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // all unit tests (no opt out available).  It intentionally erases
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // any --user-data-dir switch if present and appends a new one.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Re-override the default data dir for our test so we can persist
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the profile for this particular test so we can persist the max
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // invalidation version between runs.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& override_user_data_dir =
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        command_line->GetSwitchValuePath(kOverrideUserDataDir);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(!override_user_data_dir.empty());
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    command_line->AppendSwitchPath(switches::kUserDataDir,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   base::FilePath(override_user_data_dir));
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(INFO) << "command line file override switch is "
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              << override_user_data_dir.value();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionApiTest::SetUp();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InitializeSync() {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(sync_setup_helper_->InitializeSync(profile()));
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // InProcessBrowserTest override. Destroys the sync client and sync
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // profile created by the test.  We must clean up ProfileSyncServiceHarness
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // now before the profile is cleaned up.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CleanUpOnMainThread() OVERRIDE {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_setup_helper_.reset();
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const SyncSetupHelper* sync_setup_helper() const {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return sync_setup_helper_.get();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Override InProcessBrowserTest. Change behavior of the default host
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // resolver to avoid DNS lookup errors, so we can make network calls.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The resolver object lifetime is managed by sync_test_setup, not here.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EnableDNSLookupForThisTest(
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new net::RuleBasedHostResolverProc(host_resolver()));
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DisableDNSLookupForThisTest();
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Change behavior of the default host resolver to allow DNS lookup
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to proceed instead of being blocked by the test infrastructure.
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void EnableDNSLookupForThisTest(
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      net::RuleBasedHostResolverProc* host_resolver) {
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // mock_host_resolver_override_ takes ownership of the resolver.
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<net::RuleBasedHostResolverProc> resolver =
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new net::RuleBasedHostResolverProc(host_resolver);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resolver->AllowDirectLookup("*.google.com");
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // On Linux, we use Chromium's NSS implementation which uses the following
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // hosts for certificate verification. Without these overrides, running the
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // integration tests on Linux causes error as we make external DNS lookups.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resolver->AllowDirectLookup("*.thawte.com");
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resolver->AllowDirectLookup("*.geotrust.com");
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resolver->AllowDirectLookup("*.gstatic.com");
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resolver->AllowDirectLookup("*.googleapis.com");
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_host_resolver_override_.reset(
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new net::ScopedDefaultHostResolverProc(resolver.get()));
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We need to reset the DNS lookup when we finish, or the test will fail.
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DisableDNSLookupForThisTest() {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_host_resolver_override_.reset();
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SyncSetupHelper> sync_setup_helper_;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This test needs to make live DNS requests for access to
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GAIA and sync server URLs under google.com. We use a scoped version
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to override the default resolver while the test is active.
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::ScopedDefaultHostResolverProc> mock_host_resolver_override_;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that a push can make a round trip through the servers.
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test is disabled to keep it from running on trybots since
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// it requires network access, and it is not a good idea to run
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// this test as part of a checkin or nightly test.
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PushMessagingCanaryTest, MANUAL_ReceivesPush) {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitializeSync();
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ExtensionSet* installed_extensions = extension_service()->extensions();
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!installed_extensions->Contains(kTestExtensionId)) {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Extension* extension =
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LoadExtension(test_data_dir_.AppendASCII("push_messaging_canary"));
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(extension);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(installed_extensions->Contains(kTestExtensionId));
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResultCatcher catcher;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  catcher.RestrictToProfile(profile());
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* extension =
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_service()->extensions()->GetByID(kTestExtensionId);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(extension);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), extension->GetResourceURL("push_messaging_canary.html"));
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& client_id = sync_setup_helper()->client_id();
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& client_secret = sync_setup_helper()->client_secret();
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& refresh_token = sync_setup_helper()->refresh_token();
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16& script_string = base::UTF8ToUTF16(base::StringPrintf(
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "startTestWithCredentials('%s', '%s', '%s');",
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      client_id.c_str(), client_secret.c_str(), refresh_token.c_str()));
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost()->
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ExecuteJavascriptInWebFrame(base::string16(), script_string);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
170