Allow launching an app from the command line using --load-and-launch-app.

BUG=151580

TEST=PlatformAppBrowserTest.LoadAndLaunchApp, PlatformAppLoadAndLaunchBrowserTest.LoadAndLaunchApp

Review URL: https://chromiumcodereview.appspot.com/12177008

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@183157 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/load_and_launch_browsertest.cc b/chrome/browser/extensions/load_and_launch_browsertest.cc
new file mode 100644
index 0000000..7f1e1d1
--- /dev/null
+++ b/chrome/browser/extensions/load_and_launch_browsertest.cc
@@ -0,0 +1,97 @@
+// 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.
+
+// Tests for the --load-and-launch-app switch.
+// The two cases are when chrome is running and another process uses the switch
+// and when chrome is started from scratch.
+
+#include "base/test/test_timeouts.h"
+#include "chrome/browser/extensions/extension_browsertest.h"
+#include "chrome/browser/extensions/extension_test_message_listener.h"
+#include "chrome/browser/extensions/platform_app_browsertest_util.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/common/chrome_switches.h"
+#include "content/public/test/test_launcher.h"
+
+namespace extensions {
+
+// TODO(jackhou): Enable this test once it works on OSX. It currently does not
+// work for the same reason --app-id doesn't. See http://crbug.com/148465
+#if defined(OS_MACOSX)
+#define MAYBE_LoadAndLaunchAppChromeRunning \
+        DISABLED_LoadAndLaunchAppChromeRunning
+#else
+#define MAYBE_LoadAndLaunchAppChromeRunning LoadAndLaunchAppChromeRunning
+#endif
+
+// Case where Chrome is already running.
+IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
+                       MAYBE_LoadAndLaunchAppChromeRunning) {
+  ExtensionTestMessageListener launched_listener("Launched", false);
+
+  const CommandLine& cmdline = *CommandLine::ForCurrentProcess();
+  CommandLine new_cmdline(cmdline.GetProgram());
+
+  const char* kSwitchNames[] = {
+    switches::kUserDataDir,
+  };
+  new_cmdline.CopySwitchesFrom(cmdline, kSwitchNames, arraysize(kSwitchNames));
+
+  base::FilePath app_path = test_data_dir_
+      .AppendASCII("platform_apps")
+      .AppendASCII("minimal");
+
+  new_cmdline.AppendSwitchNative(switches::kLoadAndLaunchApp,
+                                 app_path.value());
+
+  new_cmdline.AppendSwitch(content::kLaunchAsBrowser);
+  base::ProcessHandle process;
+  base::LaunchProcess(new_cmdline, base::LaunchOptions(), &process);
+  ASSERT_NE(base::kNullProcessHandle, process);
+
+  ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
+  ASSERT_TRUE(base::WaitForSingleProcess(
+      process, TestTimeouts::action_timeout()));
+}
+
+namespace {
+
+// TestFixture that appends --load-and-launch-app before calling BrowserMain.
+class PlatformAppLoadAndLaunchBrowserTest : public PlatformAppBrowserTest {
+ protected:
+  PlatformAppLoadAndLaunchBrowserTest() {}
+
+  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
+    PlatformAppBrowserTest::SetUpCommandLine(command_line);
+    app_path_ = test_data_dir_
+        .AppendASCII("platform_apps")
+        .AppendASCII("minimal");
+    command_line->AppendSwitchNative(switches::kLoadAndLaunchApp,
+                                     app_path_.value());
+  }
+
+  void LoadAndLaunchApp() {
+    ExtensionTestMessageListener launched_listener("Launched", false);
+    ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
+
+    // Start an actual browser because we can't shut down with just an app
+    // window.
+    CreateBrowser(ProfileManager::GetDefaultProfile());
+  }
+
+ private:
+  base::FilePath app_path_;
+
+  DISALLOW_COPY_AND_ASSIGN(PlatformAppLoadAndLaunchBrowserTest);
+};
+
+}  // namespace
+
+// Case where Chrome is not running.
+IN_PROC_BROWSER_TEST_F(PlatformAppLoadAndLaunchBrowserTest,
+                       LoadAndLaunchAppChromeNotRunning) {
+  LoadAndLaunchApp();
+}
+
+}  // namespace extensions