1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/basictypes.h"
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/command_line.h"
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/compiler_specific.h"
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/files/file_path.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/path_service.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chrome_notification_types.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/login/demo_mode/demo_app_launcher.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/login/test/app_window_waiter.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/extensions/extension_browsertest.h"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/profiles/profile.h"
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/profiles/profile_manager.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/chrome_paths.h"
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chromeos/chromeos_switches.h"
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chromeos/network/network_state.h"
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chromeos/network/network_state_handler.h"
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/notification_service.h"
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/notification_source.h"
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/test_utils.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/app_window/app_window_registry.h"
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace chromeos {
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace {
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::FilePath GetTestDemoAppPath() {
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::FilePath test_data_dir;
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir));
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return test_data_dir.Append(FILE_PATH_LITERAL("chromeos/demo_app"));
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
37effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochProfile* WaitForProfile() {
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!user_manager || !user_manager->IsUserLoggedIn()) {
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    content::WindowedNotificationObserver(
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        chrome::NOTIFICATION_SESSION_STARTED,
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        content::NotificationService::AllSources()).Wait();
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return ProfileManager::GetActiveUserProfile();
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool VerifyDemoAppLaunch() {
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Profile* profile = WaitForProfile();
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return AppWindowWaiter(extensions::AppWindowRegistry::Get(profile),
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                         DemoAppLauncher::kDemoAppId).Wait() != NULL;
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool VerifyNetworksDisabled() {
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return !handler->FirstNetworkByType(NetworkTypePattern::NonVirtual());
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass DemoAppLauncherTest : public ExtensionBrowserTest {
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DemoAppLauncherTest() {
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    set_exit_when_last_browser_closes(false);
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~DemoAppLauncherTest() {}
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    command_line->AppendSwitch(switches::kLoginManager);
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    command_line->AppendSwitch(switches::kForceLoginManagerInTests);
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    command_line->AppendSwitchASCII(switches::kLoginProfile, "user");
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    command_line->AppendSwitchASCII(switches::kDerelictIdleTimeout, "0");
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    command_line->AppendSwitchASCII(switches::kOobeTimerInterval, "0");
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    command_line->AppendSwitchASCII(switches::kDerelictDetectionTimeout, "0");
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void SetUp() OVERRIDE {
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    chromeos::DemoAppLauncher::SetDemoAppPathForTesting(GetTestDemoAppPath());
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ExtensionBrowserTest::SetUp();
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(DemoAppLauncherTest);
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
88effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(DemoAppLauncherTest, Basic) {
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // This test is fairly unique in the sense that the test actually starts as
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // soon as Chrome launches, so there isn't any typical "launch this test"
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // steps that we need to take. All we can do is verify that our demo app
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // did launch.
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(VerifyDemoAppLaunch());
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuIN_PROC_BROWSER_TEST_F(DemoAppLauncherTest, NoNetwork) {
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(VerifyDemoAppLaunch());
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(VerifyNetworksDisabled());
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace chromeos
102