Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(101)

Side by Side Diff: chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc

Issue 2934513003: Changes in app.window and app.runtime to support lock screen note taking (Closed)
Patch Set: split out browsertests Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/lock_screen_apps/state_controller.h" 5 #include "chrome/browser/chromeos/lock_screen_apps/state_controller.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
11 11
12 #include "ash/public/interfaces/tray_action.mojom.h" 12 #include "ash/public/interfaces/tray_action.mojom.h"
13 #include "base/files/file_path.h" 13 #include "base/files/file_path.h"
14 #include "base/memory/ptr_util.h" 14 #include "base/memory/ptr_util.h"
15 #include "base/run_loop.h"
16 #include "base/test/scoped_command_line.h" 15 #include "base/test/scoped_command_line.h"
17 #include "chrome/browser/chromeos/lock_screen_apps/app_manager.h" 16 #include "chrome/browser/chromeos/lock_screen_apps/app_manager.h"
18 #include "chrome/browser/chromeos/lock_screen_apps/state_observer.h" 17 #include "chrome/browser/chromeos/lock_screen_apps/state_observer.h"
18 #include "chrome/browser/extensions/extension_service.h"
19 #include "chrome/browser/extensions/test_extension_system.h"
20 #include "chrome/browser/ui/apps/chrome_app_delegate.h"
19 #include "chrome/common/chrome_constants.h" 21 #include "chrome/common/chrome_constants.h"
22 #include "chrome/test/base/browser_with_test_window_test.h"
20 #include "chrome/test/base/testing_browser_process.h" 23 #include "chrome/test/base/testing_browser_process.h"
21 #include "chrome/test/base/testing_profile.h" 24 #include "chrome/test/base/testing_profile.h"
22 #include "chrome/test/base/testing_profile_manager.h" 25 #include "chrome/test/base/testing_profile_manager.h"
23 #include "components/session_manager/core/session_manager.h" 26 #include "components/session_manager/core/session_manager.h"
24 #include "content/public/test/test_browser_thread_bundle.h" 27 #include "content/public/browser/web_contents.h"
28 #include "content/public/browser/web_contents_observer.h"
29 #include "content/public/test/test_utils.h"
30 #include "content/public/test/web_contents_tester.h"
31 #include "extensions/browser/app_window/app_window.h"
32 #include "extensions/browser/app_window/app_window_contents.h"
33 #include "extensions/browser/app_window/native_app_window.h"
34 #include "extensions/common/api/app_runtime.h"
35 #include "extensions/common/extension_builder.h"
36 #include "extensions/common/value_builder.h"
25 #include "testing/gtest/include/gtest/gtest.h" 37 #include "testing/gtest/include/gtest/gtest.h"
26 38
27 using ash::mojom::TrayActionState; 39 using ash::mojom::TrayActionState;
28 40
29 namespace { 41 namespace {
30 42
43 // App IDs used for test apps.
44 const char kTestAppId[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
45 const char kSecondaryTestAppId[] = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
46
47 scoped_refptr<extensions::Extension> CreateTestNoteTakingApp(
48 const std::string& app_id) {
49 return extensions::ExtensionBuilder()
50 .SetManifest(
51 extensions::DictionaryBuilder()
52 .Set("name", "Test App")
53 .Set("version", "1.0")
54 .Set("manifest_version", 2)
55 .Set("app",
56 extensions::DictionaryBuilder()
57 .Set("background",
58 extensions::DictionaryBuilder()
59 .Set("scripts", extensions::ListBuilder()
60 .Append("background.js")
61 .Build())
62 .Build())
63 .Build())
64 .Set("action_handlers",
65 extensions::ListBuilder()
66 .Append(extensions::DictionaryBuilder()
67 .Set("action", "new_note")
68 .SetBoolean("enabled_on_lock_screen", true)
69 .Build())
70 .Build())
71 .Build())
72 .SetID(app_id)
73 .Build();
74 }
75
31 class TestAppManager : public lock_screen_apps::AppManager { 76 class TestAppManager : public lock_screen_apps::AppManager {
32 public: 77 public:
33 enum class State { 78 enum class State {
34 kNotInitialized, 79 kNotInitialized,
35 kStarted, 80 kStarted,
36 kStopped, 81 kStopped,
37 }; 82 };
38 83
39 TestAppManager(Profile* expected_primary_profile, 84 TestAppManager(Profile* expected_primary_profile,
40 Profile* expected_lock_screen_profile) 85 Profile* expected_lock_screen_profile)
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 221
177 private: 222 private:
178 mojo::Binding<ash::mojom::TrayAction> binding_; 223 mojo::Binding<ash::mojom::TrayAction> binding_;
179 ash::mojom::TrayActionClientPtr client_; 224 ash::mojom::TrayActionClientPtr client_;
180 225
181 std::vector<TrayActionState> observed_states_; 226 std::vector<TrayActionState> observed_states_;
182 227
183 DISALLOW_COPY_AND_ASSIGN(TestTrayAction); 228 DISALLOW_COPY_AND_ASSIGN(TestTrayAction);
184 }; 229 };
185 230
231 class TestAppWindow : public content::WebContentsObserver {
232 public:
233 TestAppWindow(Profile* profile, const extensions::Extension* extension)
234 : web_contents_(
235 content::WebContentsTester::CreateTestWebContents(profile,
236 nullptr)),
237 window_(new extensions::AppWindow(profile,
238 new ChromeAppDelegate(true),
239 extension)) {}
240
241 ~TestAppWindow() override {
242 // Make sure the window is initialized, so |window_| does not get leaked.
243 if (!initialized_)
244 Initialize(false /* shown */);
245
246 Close();
247 }
248
249 void Initialize(bool shown) {
250 ASSERT_FALSE(initialized_);
251 initialized_ = true;
252
253 extensions::AppWindow::CreateParams params;
254 params.hidden = !shown;
255 window_->Init(GURL(std::string()),
256 new extensions::AppWindowContentsImpl(window_),
257 web_contents_->GetMainFrame(), params);
258 Observe(window_->web_contents());
259 }
260
261 void Close() {
262 if (!window_)
263 return;
264
265 if (!initialized_)
266 return;
267
268 content::WebContentsDestroyedWatcher destroyed_watcher(
269 window_->web_contents());
270 window_->GetBaseWindow()->Close();
271 destroyed_watcher.Wait();
272
273 EXPECT_FALSE(window_);
274 EXPECT_TRUE(closed_);
275 }
276
277 void WebContentsDestroyed() override {
278 closed_ = true;
279 window_ = nullptr;
280 }
281
282 extensions::AppWindow* window() { return window_; }
283
284 bool closed() const { return closed_; }
285
286 private:
287 std::unique_ptr<content::WebContents> web_contents_;
288 extensions::AppWindow* window_;
289 bool closed_ = false;
290 bool initialized_ = false;
291
292 DISALLOW_COPY_AND_ASSIGN(TestAppWindow);
293 };
294
186 class LockScreenAppStateNotSupportedTest : public testing::Test { 295 class LockScreenAppStateNotSupportedTest : public testing::Test {
187 public: 296 public:
188 LockScreenAppStateNotSupportedTest() = default; 297 LockScreenAppStateNotSupportedTest() = default;
189 298
190 ~LockScreenAppStateNotSupportedTest() override = default; 299 ~LockScreenAppStateNotSupportedTest() override = default;
191 300
192 void SetUp() override { 301 void SetUp() override {
193 command_line_ = base::MakeUnique<base::test::ScopedCommandLine>(); 302 command_line_ = base::MakeUnique<base::test::ScopedCommandLine>();
194 command_line_->GetProcessCommandLine()->InitFromArgv({""}); 303 command_line_->GetProcessCommandLine()->InitFromArgv({""});
195 } 304 }
196 305
197 private: 306 private:
198 std::unique_ptr<base::test::ScopedCommandLine> command_line_; 307 std::unique_ptr<base::test::ScopedCommandLine> command_line_;
199 308
200 DISALLOW_COPY_AND_ASSIGN(LockScreenAppStateNotSupportedTest); 309 DISALLOW_COPY_AND_ASSIGN(LockScreenAppStateNotSupportedTest);
201 }; 310 };
202 311
203 class LockScreenAppStateTest : public testing::Test { 312 class LockScreenAppStateTest : public BrowserWithTestWindowTest {
204 public: 313 public:
205 LockScreenAppStateTest() 314 LockScreenAppStateTest()
206 : profile_manager_(TestingBrowserProcess::GetGlobal()) {} 315 : profile_manager_(TestingBrowserProcess::GetGlobal()) {}
207 ~LockScreenAppStateTest() override = default; 316 ~LockScreenAppStateTest() override = default;
208 317
209 void SetUp() override { 318 void SetUp() override {
210 command_line_ = base::MakeUnique<base::test::ScopedCommandLine>(); 319 command_line_ = base::MakeUnique<base::test::ScopedCommandLine>();
211 command_line_->GetProcessCommandLine()->InitFromArgv( 320 command_line_->GetProcessCommandLine()->InitFromArgv(
212 {"", "--enable-lock-screen-apps"}); 321 {"", "--enable-lock-screen-apps"});
213 322
214 ASSERT_TRUE(profile_manager_.SetUp()); 323 ASSERT_TRUE(profile_manager_.SetUp());
215 324
325 BrowserWithTestWindowTest::SetUp();
326
216 session_manager_ = base::MakeUnique<session_manager::SessionManager>(); 327 session_manager_ = base::MakeUnique<session_manager::SessionManager>();
217 session_manager_->SetSessionState( 328 session_manager_->SetSessionState(
218 session_manager::SessionState::LOGIN_PRIMARY); 329 session_manager::SessionState::LOGIN_PRIMARY);
219 330
220 ASSERT_TRUE(lock_screen_apps::StateController::IsEnabled()); 331 ASSERT_TRUE(lock_screen_apps::StateController::IsEnabled());
221 332
222 state_controller_ = base::MakeUnique<lock_screen_apps::StateController>(); 333 state_controller_ = base::MakeUnique<lock_screen_apps::StateController>();
223 state_controller_->SetTrayActionPtrForTesting( 334 state_controller_->SetTrayActionPtrForTesting(
224 tray_action_.CreateInterfacePtrAndBind()); 335 tray_action_.CreateInterfacePtrAndBind());
225 state_controller_->Initialize(); 336 state_controller_->Initialize();
226 state_controller_->FlushTrayActionForTesting(); 337 state_controller_->FlushTrayActionForTesting();
227 338
228 state_controller_->AddObserver(&observer_); 339 state_controller_->AddObserver(&observer_);
229 340
230 // Create fake sign-in profile. 341 // Create fake sign-in profile.
231 TestingProfile::Builder builder; 342 TestingProfile::Builder builder;
232 builder.SetPath( 343 builder.SetPath(
233 profile_manager_.profiles_dir().AppendASCII(chrome::kInitialProfile)); 344 profile_manager_.profiles_dir().AppendASCII(chrome::kInitialProfile));
234 TestingProfile* signin_profile = builder.BuildIncognito( 345 signin_profile_ = builder.BuildIncognito(
235 profile_manager_.CreateTestingProfile(chrome::kInitialProfile)); 346 profile_manager_.CreateTestingProfile(chrome::kInitialProfile));
236 347
348 InitExtensionSystem(profile());
349 InitExtensionSystem(signin_profile());
350
237 std::unique_ptr<TestAppManager> app_manager = 351 std::unique_ptr<TestAppManager> app_manager =
238 base::MakeUnique<TestAppManager>(&profile_, 352 base::MakeUnique<TestAppManager>(&profile_,
239 signin_profile->GetOriginalProfile()); 353 signin_profile_->GetOriginalProfile());
240 app_manager_ = app_manager.get(); 354 app_manager_ = app_manager.get();
241 state_controller_->SetAppManagerForTesting(std::move(app_manager)); 355 state_controller_->SetAppManagerForTesting(std::move(app_manager));
242 } 356 }
243 357
244 void TearDown() override { 358 void TearDown() override {
359 extensions::ExtensionSystem::Get(profile())->Shutdown();
360 extensions::ExtensionSystem::Get(signin_profile())->Shutdown();
361
245 state_controller_->RemoveObserver(&observer_); 362 state_controller_->RemoveObserver(&observer_);
246 state_controller_.reset(); 363 state_controller_.reset();
247 session_manager_.reset(); 364 session_manager_.reset();
248 app_manager_ = nullptr; 365 app_manager_ = nullptr;
366 BrowserWithTestWindowTest::TearDown();
249 } 367 }
250 368
251 // Helper method to move state controller to available state. 369 void InitExtensionSystem(Profile* profile) {
370 extensions::TestExtensionSystem* extension_system =
371 static_cast<extensions::TestExtensionSystem*>(
372 extensions::ExtensionSystem::Get(profile));
373 extension_system->CreateExtensionService(
374 base::CommandLine::ForCurrentProcess(),
375 base::FilePath() /* install_directory */,
376 false /* autoupdate_enabled */);
377 }
378
379 void ExpectObservedStatesMatch(const std::vector<TrayActionState>& states,
380 const std::string& message) {
381 state_controller_->FlushTrayActionForTesting();
382 EXPECT_EQ(states, observer()->observed_states()) << message;
383 EXPECT_EQ(states, tray_action()->observed_states()) << message;
384 }
385
386 void ClearObservedStates() {
387 state_controller_->FlushTrayActionForTesting();
388 observer_.ClearObservedStates();
389 tray_action_.ClearObservedStates();
390 }
391
392 // Helper method to move state controller to the specified state.
252 // Should be called at the begining of tests, at most once. 393 // Should be called at the begining of tests, at most once.
253 bool EnableNoteTakingApp(bool enable_app_launch) { 394 bool InitializeNoteTakingApp(TrayActionState target_state,
254 app_manager_->SetInitialAppState("test_app_id", enable_app_launch); 395 bool enable_app_launch) {
396 app_ = CreateTestNoteTakingApp(kTestAppId);
397 extensions::ExtensionSystem::Get(signin_profile())
398 ->extension_service()
399 ->AddExtension(app_.get());
400
401 app_manager_->SetInitialAppState(kTestAppId, enable_app_launch);
255 state_controller_->SetPrimaryProfile(&profile_); 402 state_controller_->SetPrimaryProfile(&profile_);
403
404 if (target_state == TrayActionState::kNotAvailable)
405 return true;
406
256 session_manager_->SetSessionState(session_manager::SessionState::LOCKED); 407 session_manager_->SetSessionState(session_manager::SessionState::LOCKED);
257 if (app_manager_->state() != TestAppManager::State::kStarted) { 408 if (app_manager_->state() != TestAppManager::State::kStarted) {
258 ADD_FAILURE() << "Lock app manager Start not invoked."; 409 ADD_FAILURE() << "Lock app manager Start not invoked.";
259 return false; 410 return false;
260 } 411 }
412
413 ClearObservedStates();
414
415 if (state_controller_->GetLockScreenNoteState() !=
416 TrayActionState::kAvailable) {
417 ADD_FAILURE() << "Unable to move to available state.";
418 return false;
419 }
420 if (target_state == TrayActionState::kAvailable)
421 return true;
422
423 tray_action()->SendNewNoteRequest();
261 state_controller_->FlushTrayActionForTesting(); 424 state_controller_->FlushTrayActionForTesting();
262 425
263 observer_.ClearObservedStates(); 426 ClearObservedStates();
264 tray_action_.ClearObservedStates();
265 427
266 return state_controller_->GetLockScreenNoteState() == 428 if (state_controller_->GetLockScreenNoteState() !=
267 TrayActionState::kAvailable; 429 TrayActionState::kLaunching) {
430 ADD_FAILURE() << "Unable to move to launching state.";
431 return false;
432 }
433 if (target_state == TrayActionState::kLaunching)
434 return true;
435
436 app_window_ = base::MakeUnique<TestAppWindow>(signin_profile(), app());
437 if (!state_controller_->CanCreateAppWindowForAction(
benwells 2017/06/13 10:30:46 This call feels a bit redundant,as RegisterAppWind
tbarzic 2017/06/13 19:17:59 Done.
438 signin_profile(), app(),
439 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE)) {
440 ADD_FAILURE() << "Not allowed to create app window.";
441 return false;
442 }
443 if (!state_controller_->RegisterAppWindowForAction(
444 app_window()->window(),
445 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE)) {
446 ADD_FAILURE() << "Failed to register app window.";
447 return false;
448 }
449
450 app_window()->Initialize(true /* shown */);
451
452 ClearObservedStates();
453
454 return state_controller()->GetLockScreenNoteState() ==
455 TrayActionState::kActive;
268 } 456 }
269 457
270 TestingProfile* profile() { return &profile_; } 458 TestingProfile* profile() { return &profile_; }
459 TestingProfile* signin_profile() { return signin_profile_; }
271 460
272 session_manager::SessionManager* session_manager() { 461 session_manager::SessionManager* session_manager() {
273 return session_manager_.get(); 462 return session_manager_.get();
274 } 463 }
275 464
276 TestStateObserver* observer() { return &observer_; } 465 TestStateObserver* observer() { return &observer_; }
277 466
278 TestTrayAction* tray_action() { return &tray_action_; } 467 TestTrayAction* tray_action() { return &tray_action_; }
279 468
280 lock_screen_apps::StateController* state_controller() { 469 lock_screen_apps::StateController* state_controller() {
281 return state_controller_.get(); 470 return state_controller_.get();
282 } 471 }
283 472
284 TestAppManager* app_manager() { return app_manager_; } 473 TestAppManager* app_manager() { return app_manager_; }
285 474
475 TestAppWindow* app_window() { return app_window_.get(); }
476 const extensions::Extension* app() { return app_.get(); }
477
286 private: 478 private:
287 std::unique_ptr<base::test::ScopedCommandLine> command_line_; 479 std::unique_ptr<base::test::ScopedCommandLine> command_line_;
288 content::TestBrowserThreadBundle threads_;
289 TestingProfileManager profile_manager_; 480 TestingProfileManager profile_manager_;
290 TestingProfile profile_; 481 TestingProfile profile_;
482 TestingProfile* signin_profile_ = nullptr;
291 483
292 std::unique_ptr<session_manager::SessionManager> session_manager_; 484 std::unique_ptr<session_manager::SessionManager> session_manager_;
293 485
294 std::unique_ptr<lock_screen_apps::StateController> state_controller_; 486 std::unique_ptr<lock_screen_apps::StateController> state_controller_;
295 487
296 TestStateObserver observer_; 488 TestStateObserver observer_;
297 TestTrayAction tray_action_; 489 TestTrayAction tray_action_;
298 TestAppManager* app_manager_ = nullptr; 490 TestAppManager* app_manager_ = nullptr;
299 491
492 std::unique_ptr<TestAppWindow> app_window_;
493 scoped_refptr<const extensions::Extension> app_;
494
300 DISALLOW_COPY_AND_ASSIGN(LockScreenAppStateTest); 495 DISALLOW_COPY_AND_ASSIGN(LockScreenAppStateTest);
301 }; 496 };
302 497
303 } // namespace 498 } // namespace
304 499
305 TEST_F(LockScreenAppStateNotSupportedTest, NoInstance) { 500 TEST_F(LockScreenAppStateNotSupportedTest, NoInstance) {
306 EXPECT_FALSE(lock_screen_apps::StateController::IsEnabled()); 501 EXPECT_FALSE(lock_screen_apps::StateController::IsEnabled());
307 } 502 }
308 503
309 TEST_F(LockScreenAppStateTest, InitialState) { 504 TEST_F(LockScreenAppStateTest, InitialState) {
(...skipping 20 matching lines...) Expand all
330 EXPECT_EQ(0u, observer()->observed_states().size()); 525 EXPECT_EQ(0u, observer()->observed_states().size());
331 } 526 }
332 527
333 TEST_F(LockScreenAppStateTest, SetPrimaryProfileWhenSessionLocked) { 528 TEST_F(LockScreenAppStateTest, SetPrimaryProfileWhenSessionLocked) {
334 session_manager()->SetSessionState(session_manager::SessionState::LOCKED); 529 session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
335 EXPECT_EQ(TrayActionState::kNotAvailable, 530 EXPECT_EQ(TrayActionState::kNotAvailable,
336 state_controller()->GetLockScreenNoteState()); 531 state_controller()->GetLockScreenNoteState());
337 532
338 EXPECT_EQ(TestAppManager::State::kNotInitialized, app_manager()->state()); 533 EXPECT_EQ(TestAppManager::State::kNotInitialized, app_manager()->state());
339 534
340 app_manager()->SetInitialAppState("app_id", true); 535 app_manager()->SetInitialAppState(kTestAppId, true);
341 state_controller()->SetPrimaryProfile(profile()); 536 state_controller()->SetPrimaryProfile(profile());
342 537
343 ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state()); 538 ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state());
344 539
345 EXPECT_EQ(TrayActionState::kAvailable, 540 EXPECT_EQ(TrayActionState::kAvailable,
346 state_controller()->GetLockScreenNoteState()); 541 state_controller()->GetLockScreenNoteState());
347 542
348 state_controller()->FlushTrayActionForTesting(); 543 ExpectObservedStatesMatch({TrayActionState::kAvailable}, "Available on lock");
349 ASSERT_EQ(1u, observer()->observed_states().size());
350 EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
351 ASSERT_EQ(1u, tray_action()->observed_states().size());
352 EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
353 } 544 }
354 545
355 TEST_F(LockScreenAppStateTest, SessionLock) { 546 TEST_F(LockScreenAppStateTest, SessionLock) {
356 app_manager()->SetInitialAppState("app_id", true); 547 app_manager()->SetInitialAppState(kTestAppId, true);
357 state_controller()->SetPrimaryProfile(profile()); 548 state_controller()->SetPrimaryProfile(profile());
358 ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state()); 549 ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state());
359 550
360 session_manager()->SetSessionState(session_manager::SessionState::LOCKED); 551 session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
361 552
362 ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state()); 553 ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state());
363 554
364 EXPECT_EQ(TrayActionState::kAvailable, 555 EXPECT_EQ(TrayActionState::kAvailable,
365 state_controller()->GetLockScreenNoteState()); 556 state_controller()->GetLockScreenNoteState());
366 state_controller()->FlushTrayActionForTesting(); 557
367 ASSERT_EQ(1u, observer()->observed_states().size()); 558 ExpectObservedStatesMatch({TrayActionState::kAvailable}, "Available on lock");
368 EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]); 559 ClearObservedStates();
369 observer()->ClearObservedStates();
370 ASSERT_EQ(1u, tray_action()->observed_states().size());
371 EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
372 tray_action()->ClearObservedStates();
373 560
374 // When the session is unlocked again, app manager is stopped, and tray action 561 // When the session is unlocked again, app manager is stopped, and tray action
375 // disabled again. 562 // disabled again.
376 session_manager()->SetSessionState(session_manager::SessionState::ACTIVE); 563 session_manager()->SetSessionState(session_manager::SessionState::ACTIVE);
377 564
378 EXPECT_EQ(TestAppManager::State::kStopped, app_manager()->state()); 565 EXPECT_EQ(TestAppManager::State::kStopped, app_manager()->state());
379 566
380 EXPECT_EQ(TrayActionState::kNotAvailable, 567 EXPECT_EQ(TrayActionState::kNotAvailable,
381 state_controller()->GetLockScreenNoteState()); 568 state_controller()->GetLockScreenNoteState());
382 state_controller()->FlushTrayActionForTesting(); 569
383 ASSERT_EQ(1u, observer()->observed_states().size()); 570 ExpectObservedStatesMatch({TrayActionState::kNotAvailable},
384 EXPECT_EQ(TrayActionState::kNotAvailable, observer()->observed_states()[0]); 571 "Not available on unlock");
385 observer()->ClearObservedStates(); 572 ClearObservedStates();
386 ASSERT_EQ(1u, tray_action()->observed_states().size());
387 EXPECT_EQ(TrayActionState::kNotAvailable,
388 tray_action()->observed_states()[0]);
389 tray_action()->ClearObservedStates();
390 573
391 // Test that subsequent session lock works as expected. 574 // Test that subsequent session lock works as expected.
392 session_manager()->SetSessionState(session_manager::SessionState::LOCKED); 575 session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
393 ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state()); 576 ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state());
394 577 ExpectObservedStatesMatch({TrayActionState::kAvailable},
395 EXPECT_EQ(TrayActionState::kAvailable, 578 "Available on second lock");
396 state_controller()->GetLockScreenNoteState());
397 state_controller()->FlushTrayActionForTesting();
398 ASSERT_EQ(1u, observer()->observed_states().size());
399 EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
400 ASSERT_EQ(1u, tray_action()->observed_states().size());
401 EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
402 } 579 }
403 580
404 TEST_F(LockScreenAppStateTest, SessionUnlockedWhileStartingAppManager) { 581 TEST_F(LockScreenAppStateTest, SessionUnlockedWhileStartingAppManager) {
405 state_controller()->SetPrimaryProfile(profile()); 582 state_controller()->SetPrimaryProfile(profile());
406 ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state()); 583 ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state());
407 584
408 session_manager()->SetSessionState(session_manager::SessionState::LOCKED); 585 session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
409 586
410 ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state()); 587 ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state());
411 588
412 session_manager()->SetSessionState(session_manager::SessionState::ACTIVE); 589 session_manager()->SetSessionState(session_manager::SessionState::ACTIVE);
413 ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state()); 590 ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state());
414 591
415 EXPECT_EQ(TrayActionState::kNotAvailable, 592 EXPECT_EQ(TrayActionState::kNotAvailable,
416 state_controller()->GetLockScreenNoteState()); 593 state_controller()->GetLockScreenNoteState());
417 state_controller()->FlushTrayActionForTesting(); 594 state_controller()->FlushTrayActionForTesting();
418 EXPECT_EQ(0u, observer()->observed_states().size()); 595 EXPECT_EQ(0u, observer()->observed_states().size());
419 EXPECT_EQ(0u, tray_action()->observed_states().size()); 596 EXPECT_EQ(0u, tray_action()->observed_states().size());
420 597
421 // Test that subsequent session lock works as expected. 598 // Test that subsequent session lock works as expected.
422 session_manager()->SetSessionState(session_manager::SessionState::LOCKED); 599 session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
423 600
424 ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state()); 601 ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state());
425 app_manager()->UpdateApp("app_id", true); 602 app_manager()->UpdateApp(kTestAppId, true);
426 603
427 EXPECT_EQ(TrayActionState::kAvailable, 604 EXPECT_EQ(TrayActionState::kAvailable,
428 state_controller()->GetLockScreenNoteState()); 605 state_controller()->GetLockScreenNoteState());
429 state_controller()->FlushTrayActionForTesting(); 606 ExpectObservedStatesMatch({TrayActionState::kAvailable}, "Available on lock");
430 ASSERT_EQ(1u, observer()->observed_states().size());
431 EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
432 ASSERT_EQ(1u, tray_action()->observed_states().size());
433 EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
434 } 607 }
435 608
436 TEST_F(LockScreenAppStateTest, AppManagerNoApp) { 609 TEST_F(LockScreenAppStateTest, AppManagerNoApp) {
437 state_controller()->SetPrimaryProfile(profile()); 610 state_controller()->SetPrimaryProfile(profile());
438 ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state()); 611 ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state());
439 612
440 session_manager()->SetSessionState(session_manager::SessionState::LOCKED); 613 session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
441 614
442 EXPECT_EQ(TestAppManager::State::kStarted, app_manager()->state()); 615 EXPECT_EQ(TestAppManager::State::kStarted, app_manager()->state());
443 616
444 EXPECT_EQ(TrayActionState::kNotAvailable, 617 EXPECT_EQ(TrayActionState::kNotAvailable,
445 state_controller()->GetLockScreenNoteState()); 618 state_controller()->GetLockScreenNoteState());
446 state_controller()->FlushTrayActionForTesting(); 619 state_controller()->FlushTrayActionForTesting();
447 EXPECT_EQ(0u, observer()->observed_states().size()); 620 EXPECT_EQ(0u, observer()->observed_states().size());
448 EXPECT_EQ(0u, tray_action()->observed_states().size()); 621 EXPECT_EQ(0u, tray_action()->observed_states().size());
449 622
450 tray_action()->SendNewNoteRequest(); 623 tray_action()->SendNewNoteRequest();
451 624
452 EXPECT_EQ(TrayActionState::kNotAvailable, 625 EXPECT_EQ(TrayActionState::kNotAvailable,
453 state_controller()->GetLockScreenNoteState()); 626 state_controller()->GetLockScreenNoteState());
454 state_controller()->FlushTrayActionForTesting(); 627 state_controller()->FlushTrayActionForTesting();
455 EXPECT_EQ(0u, observer()->observed_states().size()); 628 EXPECT_EQ(0u, observer()->observed_states().size());
456 EXPECT_EQ(0u, tray_action()->observed_states().size()); 629 EXPECT_EQ(0u, tray_action()->observed_states().size());
457 630
458 // App manager should be started on next session lock. 631 // App manager should be started on next session lock.
459 session_manager()->SetSessionState(session_manager::SessionState::ACTIVE); 632 session_manager()->SetSessionState(session_manager::SessionState::ACTIVE);
460 ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state()); 633 ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state());
461 app_manager()->SetInitialAppState("app_id", false); 634 app_manager()->SetInitialAppState(kTestAppId, false);
462 635
463 session_manager()->SetSessionState(session_manager::SessionState::LOCKED); 636 session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
464 637
465 EXPECT_EQ(TrayActionState::kAvailable, 638 EXPECT_EQ(TrayActionState::kAvailable,
466 state_controller()->GetLockScreenNoteState()); 639 state_controller()->GetLockScreenNoteState());
467 state_controller()->FlushTrayActionForTesting(); 640 ExpectObservedStatesMatch({TrayActionState::kAvailable}, "Available on lock");
468 ASSERT_EQ(1u, observer()->observed_states().size());
469 EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
470 ASSERT_EQ(1u, tray_action()->observed_states().size());
471 EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
472 } 641 }
473 642
474 TEST_F(LockScreenAppStateTest, AppAvailabilityChanges) { 643 TEST_F(LockScreenAppStateTest, AppAvailabilityChanges) {
475 state_controller()->SetPrimaryProfile(profile()); 644 state_controller()->SetPrimaryProfile(profile());
476 ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state()); 645 ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state());
477 646
478 app_manager()->SetInitialAppState("app_id", false); 647 app_manager()->SetInitialAppState(kTestAppId, false);
479 session_manager()->SetSessionState(session_manager::SessionState::LOCKED); 648 session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
480 649
481 EXPECT_EQ(TestAppManager::State::kStarted, app_manager()->state()); 650 EXPECT_EQ(TestAppManager::State::kStarted, app_manager()->state());
482 651
483 EXPECT_EQ(TrayActionState::kAvailable, 652 EXPECT_EQ(TrayActionState::kAvailable,
484 state_controller()->GetLockScreenNoteState()); 653 state_controller()->GetLockScreenNoteState());
485 state_controller()->FlushTrayActionForTesting(); 654 ExpectObservedStatesMatch({TrayActionState::kAvailable}, "Available on lock");
486 ASSERT_EQ(1u, observer()->observed_states().size()); 655 ClearObservedStates();
487 EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
488 observer()->ClearObservedStates();
489 ASSERT_EQ(1u, tray_action()->observed_states().size());
490 EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
491 tray_action()->ClearObservedStates();
492 656
493 app_manager()->UpdateApp("", false); 657 app_manager()->UpdateApp("", false);
494 658
495 EXPECT_EQ(TrayActionState::kNotAvailable, 659 EXPECT_EQ(TrayActionState::kNotAvailable,
496 state_controller()->GetLockScreenNoteState()); 660 state_controller()->GetLockScreenNoteState());
497 state_controller()->FlushTrayActionForTesting(); 661 ExpectObservedStatesMatch({TrayActionState::kNotAvailable},
498 ASSERT_EQ(1u, observer()->observed_states().size()); 662 "Not available on app cleared");
499 EXPECT_EQ(TrayActionState::kNotAvailable, observer()->observed_states()[0]); 663 ClearObservedStates();
500 observer()->ClearObservedStates();
501 ASSERT_EQ(1u, tray_action()->observed_states().size());
502 EXPECT_EQ(TrayActionState::kNotAvailable,
503 tray_action()->observed_states()[0]);
504 tray_action()->ClearObservedStates();
505 664
506 app_manager()->UpdateApp("app_id_1", true); 665 app_manager()->UpdateApp(kSecondaryTestAppId, true);
507 666
508 EXPECT_EQ(TrayActionState::kAvailable, 667 EXPECT_EQ(TrayActionState::kAvailable,
509 state_controller()->GetLockScreenNoteState()); 668 state_controller()->GetLockScreenNoteState());
510 state_controller()->FlushTrayActionForTesting(); 669 ExpectObservedStatesMatch({TrayActionState::kAvailable},
511 ASSERT_EQ(1u, observer()->observed_states().size()); 670 "Available on other app set");
512 EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
513 observer()->ClearObservedStates();
514 ASSERT_EQ(1u, tray_action()->observed_states().size());
515 EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
516 tray_action()->ClearObservedStates();
517 } 671 }
518 672
519 TEST_F(LockScreenAppStateTest, MoveToBackgroundFromActive) { 673 TEST_F(LockScreenAppStateTest, MoveToBackgroundAndForeground) {
520 ASSERT_TRUE(EnableNoteTakingApp(true /* enable_app_launch */)); 674 ASSERT_TRUE(InitializeNoteTakingApp(TrayActionState::kActive,
521 675 true /* enable_app_launch */));
522 state_controller()->SetLockScreenNoteStateForTesting(
523 TrayActionState::kActive);
524 676
525 state_controller()->MoveToBackground(); 677 state_controller()->MoveToBackground();
526 state_controller()->FlushTrayActionForTesting(); 678 state_controller()->FlushTrayActionForTesting();
527 679
528 EXPECT_EQ(TrayActionState::kBackground, 680 EXPECT_EQ(TrayActionState::kBackground,
529 state_controller()->GetLockScreenNoteState()); 681 state_controller()->GetLockScreenNoteState());
530 682
531 ASSERT_EQ(1u, observer()->observed_states().size()); 683 ExpectObservedStatesMatch({TrayActionState::kBackground},
532 EXPECT_EQ(TrayActionState::kBackground, observer()->observed_states()[0]); 684 "Move to background");
533 ASSERT_EQ(1u, tray_action()->observed_states().size()); 685 ClearObservedStates();
534 EXPECT_EQ(TrayActionState::kBackground, tray_action()->observed_states()[0]);
535 }
536 686
537 TEST_F(LockScreenAppStateTest, MoveToForeground) { 687 base::RunLoop().RunUntilIdle();
538 ASSERT_TRUE(EnableNoteTakingApp(true /* enable_app_launch */)); 688 EXPECT_FALSE(app_window()->closed());
539
540 state_controller()->SetLockScreenNoteStateForTesting(
541 TrayActionState::kBackground);
542 689
543 state_controller()->MoveToForeground(); 690 state_controller()->MoveToForeground();
544 state_controller()->FlushTrayActionForTesting(); 691 state_controller()->FlushTrayActionForTesting();
545 692
546 EXPECT_EQ(TrayActionState::kActive, 693 EXPECT_EQ(TrayActionState::kActive,
547 state_controller()->GetLockScreenNoteState()); 694 state_controller()->GetLockScreenNoteState());
548 695
549 ASSERT_EQ(1u, observer()->observed_states().size()); 696 ExpectObservedStatesMatch({TrayActionState::kActive}, "Move to foreground");
550 EXPECT_EQ(TrayActionState::kActive, observer()->observed_states()[0]); 697
551 ASSERT_EQ(1u, tray_action()->observed_states().size()); 698 base::RunLoop().RunUntilIdle();
552 EXPECT_EQ(TrayActionState::kActive, tray_action()->observed_states()[0]); 699 EXPECT_FALSE(app_window()->closed());
553 } 700 }
554 701
555 TEST_F(LockScreenAppStateTest, MoveToForegroundFromNonBackgroundState) { 702 TEST_F(LockScreenAppStateTest, MoveToForegroundFromNonBackgroundState) {
556 ASSERT_TRUE(EnableNoteTakingApp(true /* enable_app_launch */)); 703 ASSERT_TRUE(InitializeNoteTakingApp(TrayActionState::kAvailable,
704 true /* enable_app_launch */));
557 705
558 state_controller()->MoveToForeground(); 706 state_controller()->MoveToForeground();
559 state_controller()->FlushTrayActionForTesting(); 707 state_controller()->FlushTrayActionForTesting();
560 708
561 EXPECT_EQ(TrayActionState::kAvailable, 709 EXPECT_EQ(TrayActionState::kAvailable,
562 state_controller()->GetLockScreenNoteState()); 710 state_controller()->GetLockScreenNoteState());
563 711
564 EXPECT_EQ(0u, observer()->observed_states().size()); 712 EXPECT_EQ(0u, observer()->observed_states().size());
565 EXPECT_EQ(0u, tray_action()->observed_states().size()); 713 EXPECT_EQ(0u, tray_action()->observed_states().size());
566 } 714 }
567 715
568 TEST_F(LockScreenAppStateTest, HandleActionWhenNotAvaiable) { 716 TEST_F(LockScreenAppStateTest, HandleActionWhenNotAvaiable) {
569 ASSERT_EQ(TrayActionState::kNotAvailable, 717 ASSERT_EQ(TrayActionState::kNotAvailable,
570 state_controller()->GetLockScreenNoteState()); 718 state_controller()->GetLockScreenNoteState());
571 719
572 tray_action()->SendNewNoteRequest(); 720 tray_action()->SendNewNoteRequest();
573 state_controller()->FlushTrayActionForTesting(); 721 state_controller()->FlushTrayActionForTesting();
574 722
575 EXPECT_EQ(0u, observer()->observed_states().size()); 723 EXPECT_EQ(0u, observer()->observed_states().size());
576 EXPECT_EQ(0u, tray_action()->observed_states().size()); 724 EXPECT_EQ(0u, tray_action()->observed_states().size());
577 } 725 }
578 726
579 TEST_F(LockScreenAppStateTest, HandleAction) { 727 TEST_F(LockScreenAppStateTest, HandleAction) {
580 ASSERT_TRUE(EnableNoteTakingApp(true /* enable_app_launch */)); 728 ASSERT_TRUE(InitializeNoteTakingApp(TrayActionState::kAvailable,
729 true /* enable_app_launch */));
581 730
582 tray_action()->SendNewNoteRequest(); 731 tray_action()->SendNewNoteRequest();
583 state_controller()->FlushTrayActionForTesting(); 732 state_controller()->FlushTrayActionForTesting();
584 733
585 EXPECT_EQ(TrayActionState::kLaunching, 734 ExpectObservedStatesMatch({TrayActionState::kLaunching},
586 state_controller()->GetLockScreenNoteState()); 735 "Launch on new note request");
587 ASSERT_EQ(1u, observer()->observed_states().size()); 736 ClearObservedStates();
588 EXPECT_EQ(TrayActionState::kLaunching, observer()->observed_states()[0]);
589 observer()->ClearObservedStates();
590 ASSERT_EQ(1u, tray_action()->observed_states().size());
591 EXPECT_EQ(TrayActionState::kLaunching, tray_action()->observed_states()[0]);
592 tray_action()->ClearObservedStates();
593
594 EXPECT_EQ(1, app_manager()->launch_count()); 737 EXPECT_EQ(1, app_manager()->launch_count());
595 738
596 tray_action()->SendNewNoteRequest(); 739 tray_action()->SendNewNoteRequest();
597 state_controller()->FlushTrayActionForTesting(); 740 state_controller()->FlushTrayActionForTesting();
598 741
599 // There should be no state change - the state_controller was already in 742 // There should be no state change - the state_controller was already in
600 // launching state when the request was received. 743 // launching state when the request was received.
601 EXPECT_EQ(0u, observer()->observed_states().size()); 744 EXPECT_EQ(0u, observer()->observed_states().size());
602 EXPECT_EQ(0u, tray_action()->observed_states().size()); 745 EXPECT_EQ(0u, tray_action()->observed_states().size());
603 EXPECT_EQ(1, app_manager()->launch_count()); 746 EXPECT_EQ(1, app_manager()->launch_count());
604 } 747 }
605 748
606 TEST_F(LockScreenAppStateTest, HandleActionWithLaunchFailure) { 749 TEST_F(LockScreenAppStateTest, HandleActionWithLaunchFailure) {
607 ASSERT_TRUE(EnableNoteTakingApp(false /* enable_app_launch */)); 750 ASSERT_TRUE(InitializeNoteTakingApp(TrayActionState::kAvailable,
751 false /* enable_app_launch */));
608 752
609 tray_action()->SendNewNoteRequest(); 753 tray_action()->SendNewNoteRequest();
610 state_controller()->FlushTrayActionForTesting(); 754 state_controller()->FlushTrayActionForTesting();
611 755
612 EXPECT_EQ(TrayActionState::kAvailable, 756 EXPECT_EQ(TrayActionState::kAvailable,
613 state_controller()->GetLockScreenNoteState()); 757 state_controller()->GetLockScreenNoteState());
614 ASSERT_EQ(2u, observer()->observed_states().size()); 758 ExpectObservedStatesMatch(
615 EXPECT_EQ(TrayActionState::kLaunching, observer()->observed_states()[0]); 759 {TrayActionState::kLaunching, TrayActionState::kAvailable},
616 EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[1]); 760 "Failed launch on new note request");
617 observer()->ClearObservedStates(); 761 ClearObservedStates();
618 ASSERT_EQ(2u, tray_action()->observed_states().size());
619 EXPECT_EQ(TrayActionState::kLaunching, tray_action()->observed_states()[0]);
620 EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[1]);
621 tray_action()->ClearObservedStates();
622 762
623 EXPECT_EQ(1, app_manager()->launch_count()); 763 EXPECT_EQ(1, app_manager()->launch_count());
624 764
625 tray_action()->SendNewNoteRequest(); 765 tray_action()->SendNewNoteRequest();
626 state_controller()->FlushTrayActionForTesting(); 766 state_controller()->FlushTrayActionForTesting();
627 767
628 EXPECT_EQ(TrayActionState::kAvailable, 768 EXPECT_EQ(TrayActionState::kAvailable,
629 state_controller()->GetLockScreenNoteState()); 769 state_controller()->GetLockScreenNoteState());
630 770
631 // There should be no state change - the state_controller was already in 771 ExpectObservedStatesMatch(
632 // launching state when the request was received. 772 {TrayActionState::kLaunching, TrayActionState::kAvailable},
633 EXPECT_EQ(2u, observer()->observed_states().size()); 773 "Second failed launch on new note request");
634 EXPECT_EQ(2u, tray_action()->observed_states().size());
635 EXPECT_EQ(2, app_manager()->launch_count()); 774 EXPECT_EQ(2, app_manager()->launch_count());
636 } 775 }
776
777 TEST_F(LockScreenAppStateTest, AppWindowRegistration) {
778 ASSERT_TRUE(InitializeNoteTakingApp(TrayActionState::kAvailable,
779 true /* enable_app_launch */));
780
781 EXPECT_FALSE(state_controller()->CanCreateAppWindowForAction(
782 signin_profile(), app(),
783 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
784
785 TestAppWindow app_window(signin_profile(), app());
786 EXPECT_FALSE(state_controller()->RegisterAppWindowForAction(
787 app_window.window(), extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
788
789 tray_action()->SendNewNoteRequest();
790 state_controller()->FlushTrayActionForTesting();
791
792 EXPECT_EQ(TrayActionState::kLaunching,
793 state_controller()->GetLockScreenNoteState());
794 observer()->ClearObservedStates();
795 tray_action()->ClearObservedStates();
796
797 TestAppWindow non_eligible_app_window(profile(), app());
798 EXPECT_FALSE(state_controller()->CanCreateAppWindowForAction(
799 profile(), app(), extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
800 EXPECT_FALSE(state_controller()->RegisterAppWindowForAction(
801 non_eligible_app_window.window(),
802 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
803
804 EXPECT_FALSE(state_controller()->CanCreateAppWindowForAction(
805 signin_profile(), app(), extensions::api::app_runtime::ACTION_TYPE_NONE));
806 EXPECT_FALSE(state_controller()->RegisterAppWindowForAction(
807 app_window.window(), extensions::api::app_runtime::ACTION_TYPE_NONE));
808
809 EXPECT_TRUE(state_controller()->CanCreateAppWindowForAction(
810 signin_profile(), app(),
811 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
812 // Repeated query should return true, until the app window is actually
813 // registered as the action handler.
814 EXPECT_TRUE(state_controller()->CanCreateAppWindowForAction(
815 signin_profile(), app(),
816 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
817
818 EXPECT_TRUE(state_controller()->RegisterAppWindowForAction(
819 app_window.window(), extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
820 app_window.Initialize(true /* shown */);
821 EXPECT_EQ(TrayActionState::kActive,
822 state_controller()->GetLockScreenNoteState());
823
824 // Test that second app window cannot be registered.
825 TestAppWindow second_app_window(signin_profile(), app());
826 EXPECT_FALSE(state_controller()->CanCreateAppWindowForAction(
827 signin_profile(), app(),
828 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
829 EXPECT_FALSE(state_controller()->RegisterAppWindowForAction(
830 second_app_window.window(),
831 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
832
833 EXPECT_FALSE(state_controller()->CanCreateAppWindowForAction(
834 signin_profile(), app(),
835 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
836 EXPECT_FALSE(state_controller()->RegisterAppWindowForAction(
837 second_app_window.window(),
838 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
839
840 // Test the app window does not get closed by itself.
841 base::RunLoop().RunUntilIdle();
842 EXPECT_FALSE(app_window.closed());
843
844 EXPECT_EQ(TrayActionState::kActive,
845 state_controller()->GetLockScreenNoteState());
846
847 // Closing the second app window, will not change the state.
848 second_app_window.Close();
849 EXPECT_EQ(TrayActionState::kActive,
850 state_controller()->GetLockScreenNoteState());
851
852 app_window.Close();
853 EXPECT_EQ(TrayActionState::kAvailable,
854 state_controller()->GetLockScreenNoteState());
855 }
856
857 TEST_F(LockScreenAppStateTest, AppWindowClosedBeforeBeingShown) {
858 ASSERT_TRUE(InitializeNoteTakingApp(TrayActionState::kLaunching,
859 true /* enable_app_launch */));
860
861 TestAppWindow app_window(signin_profile(), app());
862 ASSERT_TRUE(state_controller()->RegisterAppWindowForAction(
863 app_window.window(), extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
864 app_window.Initialize(false /* shown */);
865
866 app_window.Close();
867 EXPECT_EQ(TrayActionState::kAvailable,
868 state_controller()->GetLockScreenNoteState());
869 }
870
871 TEST_F(LockScreenAppStateTest, AppWindowClosedOnSessionUnlock) {
872 ASSERT_TRUE(InitializeNoteTakingApp(TrayActionState::kActive,
873 true /* enable_app_launch */));
874
875 session_manager()->SetSessionState(session_manager::SessionState::ACTIVE);
876 EXPECT_EQ(TrayActionState::kNotAvailable,
877 state_controller()->GetLockScreenNoteState());
878
879 base::RunLoop().RunUntilIdle();
880 EXPECT_TRUE(app_window()->closed());
881 }
882
883 TEST_F(LockScreenAppStateTest, AppWindowClosedOnAppUnload) {
884 ASSERT_TRUE(InitializeNoteTakingApp(TrayActionState::kActive,
885 true /* enable_app_launch */));
886
887 extensions::ExtensionSystem::Get(signin_profile())
888 ->extension_service()
889 ->UnloadExtension(app()->id(),
890 extensions::UnloadedExtensionReason::UNINSTALL);
891 app_manager()->UpdateApp("", false);
892
893 EXPECT_EQ(TrayActionState::kNotAvailable,
894 state_controller()->GetLockScreenNoteState());
895
896 base::RunLoop().RunUntilIdle();
897 EXPECT_TRUE(app_window()->closed());
898 }
899
900 TEST_F(LockScreenAppStateTest, AppWindowClosedOnNoteTakingAppChange) {
901 ASSERT_TRUE(InitializeNoteTakingApp(TrayActionState::kActive,
902 true /* enable_app_launch */));
903
904 scoped_refptr<extensions::Extension> secondary_app =
905 CreateTestNoteTakingApp(kSecondaryTestAppId);
906 extensions::ExtensionSystem::Get(signin_profile())
907 ->extension_service()
908 ->AddExtension(secondary_app.get());
909
910 app_manager()->UpdateApp(secondary_app->id(), true);
911
912 EXPECT_EQ(TrayActionState::kAvailable,
913 state_controller()->GetLockScreenNoteState());
914
915 base::RunLoop().RunUntilIdle();
916 EXPECT_TRUE(app_window()->closed());
917
918 tray_action()->SendNewNoteRequest();
919 state_controller()->FlushTrayActionForTesting();
920
921 TestAppWindow app_window(signin_profile(), app());
922 EXPECT_FALSE(state_controller()->CanCreateAppWindowForAction(
923 signin_profile(), app(),
924 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
925 EXPECT_FALSE(state_controller()->RegisterAppWindowForAction(
926 app_window.window(), extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
927 ASSERT_EQ(TrayActionState::kLaunching,
928 state_controller()->GetLockScreenNoteState());
929
930 TestAppWindow secondary_app_window(signin_profile(), secondary_app.get());
931 EXPECT_TRUE(state_controller()->CanCreateAppWindowForAction(
932 signin_profile(), secondary_app.get(),
933 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
934 EXPECT_TRUE(state_controller()->RegisterAppWindowForAction(
935 secondary_app_window.window(),
936 extensions::api::app_runtime::ACTION_TYPE_NEW_NOTE));
937 secondary_app_window.Initialize(true /* shown*/);
938 EXPECT_EQ(TrayActionState::kActive,
939 state_controller()->GetLockScreenNoteState());
940
941 base::RunLoop().RunUntilIdle();
942 EXPECT_FALSE(secondary_app_window.closed());
943
944 // Uninstall the app and test the secondary app window is closed.
945 extensions::ExtensionSystem::Get(signin_profile())
946 ->extension_service()
947 ->UnloadExtension(secondary_app->id(),
948 extensions::UnloadedExtensionReason::UNINSTALL);
949 base::RunLoop().RunUntilIdle();
950 EXPECT_TRUE(secondary_app_window.closed());
951 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698