Index: chrome/browser/chromeos/first_run/drive_first_run_browsertest.cc |
diff --git a/chrome/browser/chromeos/first_run/drive_first_run_browsertest.cc b/chrome/browser/chromeos/first_run/drive_first_run_browsertest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c40cabb3ee7d39fe560680f67227199aa9109edb |
--- /dev/null |
+++ b/chrome/browser/chromeos/first_run/drive_first_run_browsertest.cc |
@@ -0,0 +1,192 @@ |
+// Copyright 2013 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. |
+ |
+#include "base/bind.h" |
+#include "base/files/file_path.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/message_loop/message_loop.h" |
+#include "base/path_service.h" |
+#include "base/strings/string_number_conversions.h" |
+#include "chrome/browser/chromeos/first_run/drive_first_run_controller.h" |
+#include "chrome/browser/extensions/crx_installer.h" |
+#include "chrome/browser/extensions/extension_service.h" |
+#include "chrome/browser/extensions/extension_system.h" |
+#include "chrome/browser/extensions/extension_test_notification_observer.h" |
+#include "chrome/common/chrome_paths.h" |
+#include "chrome/test/base/in_process_browser_test.h" |
+#include "content/public/test/test_utils.h" |
+#include "net/dns/mock_host_resolver.h" |
+#include "net/http/http_status_code.h" |
+#include "net/test/embedded_test_server/embedded_test_server.h" |
+#include "net/test/embedded_test_server/http_request.h" |
+#include "net/test/embedded_test_server/http_response.h" |
+ |
+namespace chromeos { |
+ |
+namespace { |
+ |
+// Directory containing data files for the tests. |
+const char kTestDirectory[] = "drive_first_run"; |
+ |
+// Directory containing correct hosted app page served by the test server. |
+const char kGoodServerDirectory[] = "good"; |
+ |
+// Directory containing incorrect hosted app page served by the test server. |
+const char kBadServerDirectory[] = "bad"; |
+ |
+// Name of the test hosted app .crx file. |
+const char kTestAppCrxName[] = "app.crx"; |
+ |
+// App id of the test hosted app. |
+const char kTestAppId[] = "kipccbklifbfblhpplnmklieangbjnhb"; |
+ |
+// The endpoint belonging to the test hosted app. |
+const char kTestEndpointUrl[] = "http://example.com/endpoint.html"; |
+ |
+} // namespace |
+ |
+class DriveFirstRunTest : public InProcessBrowserTest, |
+ public DriveFirstRunController::Observer { |
+ protected: |
+ DriveFirstRunTest(); |
+ |
+ // InProcessBrowserTest overrides: |
+ virtual void SetUpOnMainThread() OVERRIDE; |
+ virtual void CleanUpOnMainThread() OVERRIDE; |
+ |
+ // DriveFirstRunController::Observer overrides: |
+ virtual void OnCompletion(bool success) OVERRIDE; |
+ virtual void OnTimedOut() OVERRIDE; |
+ |
+ void InstallApp(); |
+ |
+ void InitTestServer(const std::string& directory); |
+ |
+ bool WaitForFirstRunResult(); |
+ |
+ void EnableOfflineMode(); |
+ |
+ void SetDelays(int initial_delay_secs, int timeout_secs); |
+ |
+ bool timed_out() const { return timed_out_; } |
+ |
+ private: |
+ // |controller_| is responsible for its own lifetime. |
+ DriveFirstRunController* controller_; |
+ scoped_refptr<content::MessageLoopRunner> runner_; |
+ |
+ bool timed_out_; |
+ bool waiting_for_result_; |
+ bool success_; |
+ base::FilePath test_data_dir_; |
+ std::string endpoint_url_; |
+}; |
+ |
+DriveFirstRunTest::DriveFirstRunTest() : |
+ timed_out_(false), |
+ waiting_for_result_(false), |
+ success_(false) {} |
+ |
+void DriveFirstRunTest::SetUpOnMainThread() { |
+ InProcessBrowserTest::SetUpOnMainThread(); |
+ PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_); |
+ test_data_dir_ = test_data_dir_.AppendASCII(kTestDirectory); |
+ |
+ host_resolver()->AddRule("example.com", "127.0.0.1"); |
+ |
+ // |controller_| will delete itself when it completes. |
+ controller_ = new DriveFirstRunController(); |
+ controller_->AddObserver(this); |
+ controller_->SetDelaysForTest(0, 10); |
+ controller_->SetAppInfoForTest(kTestAppId, kTestEndpointUrl); |
+} |
+ |
+void DriveFirstRunTest::CleanUpOnMainThread() { |
+ InProcessBrowserTest::CleanUpOnMainThread(); |
+ content::RunAllPendingInMessageLoop(); |
+} |
+ |
+void DriveFirstRunTest::InitTestServer(const std::string& directory) { |
+ embedded_test_server()->ServeFilesFromDirectory( |
+ test_data_dir_.AppendASCII(directory)); |
+ ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
+ |
+ // Configure the endpoint to use the test server's port. |
+ const GURL url(kTestEndpointUrl); |
+ GURL::Replacements replacements; |
+ std::string port(base::IntToString(embedded_test_server()->port())); |
+ replacements.SetPortStr(port); |
+ endpoint_url_ = url.ReplaceComponents(replacements).spec(); |
+ controller_->SetAppInfoForTest(kTestAppId, endpoint_url_); |
+} |
+ |
+void DriveFirstRunTest::InstallApp() { |
+ ExtensionService* extension_service = extensions::ExtensionSystem::Get( |
+ browser()->profile())->extension_service(); |
+ scoped_refptr<extensions::CrxInstaller> installer = |
+ extensions::CrxInstaller::CreateSilent(extension_service); |
+ |
+ installer->InstallCrx(test_data_dir_.AppendASCII(kTestAppCrxName)); |
+ ExtensionTestNotificationObserver observer(browser()); |
+ observer.WaitForExtensionLoad(); |
+ |
+ ASSERT_TRUE(extension_service->GetExtensionById(kTestAppId, false)); |
+} |
+ |
+void DriveFirstRunTest::EnableOfflineMode() { |
+ controller_->EnableOfflineMode(); |
+} |
+ |
+void DriveFirstRunTest::SetDelays(int initial_delay_secs, int timeout_secs) { |
+ controller_->SetDelaysForTest(initial_delay_secs, timeout_secs); |
+} |
+ |
+bool DriveFirstRunTest::WaitForFirstRunResult() { |
+ waiting_for_result_ = true; |
+ runner_ = new content::MessageLoopRunner; |
+ runner_->Run(); |
+ EXPECT_FALSE(waiting_for_result_); |
+ return success_; |
+} |
+ |
+void DriveFirstRunTest::OnCompletion(bool success) { |
+ EXPECT_TRUE(waiting_for_result_); |
+ waiting_for_result_ = false; |
+ success_ = success; |
+ runner_->Quit(); |
+ |
+ // |controller_| will eventually delete itself upon completion, so invalidate |
+ // the pointer. |
+ controller_ = NULL; |
+} |
+ |
+void DriveFirstRunTest::OnTimedOut() { |
+ timed_out_ = true; |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DriveFirstRunTest, OfflineEnabled) { |
+ InstallApp(); |
+ InitTestServer(kGoodServerDirectory); |
+ EnableOfflineMode(); |
+ EXPECT_TRUE(WaitForFirstRunResult()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DriveFirstRunTest, AppNotInstalled) { |
+ InitTestServer(kGoodServerDirectory); |
+ EnableOfflineMode(); |
+ EXPECT_FALSE(WaitForFirstRunResult()); |
+ EXPECT_FALSE(timed_out()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DriveFirstRunTest, TimedOut) { |
+ // Test that the controller times out instead of hanging forever. |
+ InstallApp(); |
+ InitTestServer(kBadServerDirectory); |
+ SetDelays(0, 0); |
+ EnableOfflineMode(); |
+ EXPECT_FALSE(WaitForFirstRunResult()); |
+ EXPECT_TRUE(timed_out()); |
+} |
+ |
+} // namespace chromeos |