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

Unified Diff: chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc

Issue 2949943003: Introduce lock screen app manager interface (Closed)
Patch Set: . 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
diff --git a/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
index 9ff4e9758b1a57a66f46686513365e0ace251a52..b9f7217e59b19fe76e7d5ca912767fec21f39bdc 100644
--- a/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
@@ -5,14 +5,22 @@
#include "chrome/browser/chromeos/lock_screen_apps/state_controller.h"
#include <memory>
+#include <string>
#include <utility>
#include <vector>
#include "ash/public/interfaces/tray_action.mojom.h"
+#include "base/files/file_path.h"
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/test/scoped_command_line.h"
+#include "chrome/browser/chromeos/lock_screen_apps/app_manager.h"
#include "chrome/browser/chromeos/lock_screen_apps/state_observer.h"
+#include "chrome/common/chrome_constants.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_profile.h"
+#include "chrome/test/base/testing_profile_manager.h"
+#include "components/session_manager/core/session_manager.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -20,6 +28,100 @@ using ash::mojom::TrayActionState;
namespace {
+class TestAppManager : public lock_screen_apps::AppManager {
+ public:
+ enum class State {
+ kNotInitialized,
+ kStarted,
+ kStopped,
+ };
+
+ TestAppManager(Profile* expected_primary_profile,
+ Profile* expected_lock_screen_profile)
+ : expected_primary_profile_(expected_primary_profile),
+ expected_lock_screen_profile_(expected_lock_screen_profile) {}
+
+ ~TestAppManager() override = default;
+
+ void Initialize(Profile* primary_profile,
+ Profile* lock_screen_profile) override {
+ ASSERT_EQ(State::kNotInitialized, state_);
+ ASSERT_EQ(expected_primary_profile_, primary_profile);
+ ASSERT_EQ(expected_lock_screen_profile_, lock_screen_profile);
+
+ state_ = State::kStopped;
+ }
+
+ void Start(const base::Closure& change_callback) override {
+ ASSERT_TRUE(change_callback_.is_null());
+ ASSERT_FALSE(change_callback.is_null());
+ change_callback_ = change_callback;
+ state_ = State::kStarted;
+ }
+
+ void Stop() override {
+ change_callback_.Reset();
+ state_ = State::kStopped;
+ }
+
+ bool LaunchNoteTaking() override {
+ EXPECT_EQ(State::kStarted, state_);
+ ++launch_count_;
+ return app_launchable_;
+ }
+
+ bool IsNoteTakingAppAvailable() const override {
+ return state_ == State::kStarted && !app_id_.empty();
+ }
+
+ std::string GetNoteTakingAppId() const override {
+ if (state_ != State::kStarted)
+ return std::string();
+ return app_id_;
+ }
+
+ void SetInitialAppState(const std::string& app_id, bool app_launchable) {
+ ASSERT_NE(State::kStarted, state_);
+
+ app_launchable_ = app_launchable;
+ app_id_ = app_id;
+ }
+
+ void UpdateApp(const std::string& app_id, bool app_launchable) {
+ ASSERT_EQ(State::kStarted, state_);
+
+ app_launchable_ = app_launchable;
+ if (app_id == app_id_)
+ return;
+ app_id_ = app_id;
+
+ change_callback_.Run();
+ }
+
+ State state() const { return state_; }
+
+ int launch_count() const { return launch_count_; }
+
+ private:
+ const Profile* const expected_primary_profile_;
+ const Profile* const expected_lock_screen_profile_;
+
+ base::Closure change_callback_;
+
+ State state_ = State::kNotInitialized;
+
+ // Number of requested app launches.
+ int launch_count_ = 0;
+
+ // Information about the test app:
+ // The app ID.
+ std::string app_id_;
+ // Whether app launch should succeed.
+ bool app_launchable_ = false;
+
+ DISALLOW_COPY_AND_ASSIGN(TestAppManager);
+};
+
class TestStateObserver : public lock_screen_apps::StateObserver {
public:
TestStateObserver() = default;
@@ -29,7 +131,7 @@ class TestStateObserver : public lock_screen_apps::StateObserver {
observed_states_.push_back(state);
}
- const std::vector<TrayActionState> observed_states() const {
+ const std::vector<TrayActionState>& observed_states() const {
return observed_states_;
}
@@ -102,7 +204,8 @@ class LockScreenAppStateNotSupportedTest : public testing::Test {
class LockScreenAppStateTest : public testing::Test {
public:
- LockScreenAppStateTest() = default;
+ LockScreenAppStateTest()
+ : profile_manager_(TestingBrowserProcess::GetGlobal()) {}
~LockScreenAppStateTest() override = default;
void SetUp() override {
@@ -110,6 +213,12 @@ class LockScreenAppStateTest : public testing::Test {
command_line_->GetProcessCommandLine()->InitFromArgv(
{"", "--enable-lock-screen-apps"});
+ ASSERT_TRUE(profile_manager_.SetUp());
+
+ session_manager_ = base::MakeUnique<session_manager::SessionManager>();
+ session_manager_->SetSessionState(
+ session_manager::SessionState::LOGIN_PRIMARY);
+
ASSERT_TRUE(lock_screen_apps::StateController::IsEnabled());
state_controller_ = base::MakeUnique<lock_screen_apps::StateController>();
@@ -119,11 +228,51 @@ class LockScreenAppStateTest : public testing::Test {
state_controller_->FlushTrayActionForTesting();
state_controller_->AddObserver(&observer_);
+
+ // Create fake sign-in profile.
+ TestingProfile::Builder builder;
+ builder.SetPath(
+ profile_manager_.profiles_dir().AppendASCII(chrome::kInitialProfile));
+ TestingProfile* signin_profile = builder.BuildIncognito(
+ profile_manager_.CreateTestingProfile(chrome::kInitialProfile));
+
+ std::unique_ptr<TestAppManager> app_manager =
+ base::MakeUnique<TestAppManager>(&profile_,
+ signin_profile->GetOriginalProfile());
+ app_manager_ = app_manager.get();
+ state_controller_->SetAppManagerForTesting(std::move(app_manager));
}
void TearDown() override {
state_controller_->RemoveObserver(&observer_);
state_controller_.reset();
+ session_manager_.reset();
+ app_manager_ = nullptr;
+ }
+
+ // Helper method to move state controller to available state.
+ // Should be called at the begining of tests, at most once.
+ bool EnableNoteTakingApp(bool enable_app_launch) {
+ app_manager_->SetInitialAppState("test_app_id", enable_app_launch);
+ state_controller_->SetPrimaryProfile(&profile_);
+ session_manager_->SetSessionState(session_manager::SessionState::LOCKED);
+ if (app_manager_->state() != TestAppManager::State::kStarted) {
+ ADD_FAILURE() << "Lock app manager Start not invoked.";
+ return false;
+ }
+ state_controller_->FlushTrayActionForTesting();
+
+ observer_.ClearObservedStates();
+ tray_action_.ClearObservedStates();
+
+ return state_controller_->GetLockScreenNoteState() ==
+ TrayActionState::kAvailable;
+ }
+
+ TestingProfile* profile() { return &profile_; }
+
+ session_manager::SessionManager* session_manager() {
+ return session_manager_.get();
}
TestStateObserver* observer() { return &observer_; }
@@ -134,13 +283,21 @@ class LockScreenAppStateTest : public testing::Test {
return state_controller_.get();
}
+ TestAppManager* app_manager() { return app_manager_; }
+
private:
std::unique_ptr<base::test::ScopedCommandLine> command_line_;
content::TestBrowserThreadBundle threads_;
+ TestingProfileManager profile_manager_;
+ TestingProfile profile_;
+
+ std::unique_ptr<session_manager::SessionManager> session_manager_;
std::unique_ptr<lock_screen_apps::StateController> state_controller_;
+
TestStateObserver observer_;
TestTrayAction tray_action_;
+ TestAppManager* app_manager_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(LockScreenAppStateTest);
};
@@ -155,6 +312,7 @@ TEST_F(LockScreenAppStateTest, InitialState) {
EXPECT_EQ(TrayActionState::kNotAvailable,
state_controller()->GetLockScreenNoteState());
+ EXPECT_EQ(TestAppManager::State::kNotInitialized, app_manager()->state());
state_controller()->MoveToBackground();
EXPECT_EQ(TrayActionState::kNotAvailable,
@@ -164,7 +322,205 @@ TEST_F(LockScreenAppStateTest, InitialState) {
EXPECT_EQ(0u, tray_action()->observed_states().size());
}
+TEST_F(LockScreenAppStateTest, SetPrimaryProfile) {
+ EXPECT_EQ(TestAppManager::State::kNotInitialized, app_manager()->state());
+ state_controller()->SetPrimaryProfile(profile());
+
+ EXPECT_EQ(TestAppManager::State::kStopped, app_manager()->state());
+ EXPECT_EQ(TrayActionState::kNotAvailable,
+ state_controller()->GetLockScreenNoteState());
+ EXPECT_EQ(0u, observer()->observed_states().size());
+}
+
+TEST_F(LockScreenAppStateTest, SetPrimaryProfileWhenSessionLocked) {
+ session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
+ EXPECT_EQ(TrayActionState::kNotAvailable,
+ state_controller()->GetLockScreenNoteState());
+
+ EXPECT_EQ(TestAppManager::State::kNotInitialized, app_manager()->state());
+
+ app_manager()->SetInitialAppState("app_id", true);
+ state_controller()->SetPrimaryProfile(profile());
+
+ ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state());
+
+ EXPECT_EQ(TrayActionState::kAvailable,
+ state_controller()->GetLockScreenNoteState());
+
+ state_controller()->FlushTrayActionForTesting();
+ ASSERT_EQ(1u, observer()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
+ ASSERT_EQ(1u, tray_action()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
+}
+
+TEST_F(LockScreenAppStateTest, SessionLock) {
+ app_manager()->SetInitialAppState("app_id", true);
+ state_controller()->SetPrimaryProfile(profile());
+ ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state());
+
+ session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
+
+ ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state());
+
+ EXPECT_EQ(TrayActionState::kAvailable,
+ state_controller()->GetLockScreenNoteState());
+ state_controller()->FlushTrayActionForTesting();
+ ASSERT_EQ(1u, observer()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
+ observer()->ClearObservedStates();
+ ASSERT_EQ(1u, tray_action()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
+ tray_action()->ClearObservedStates();
+
+ // When the session is unlocked again, app manager is stopped, and tray action
+ // disabled again.
+ session_manager()->SetSessionState(session_manager::SessionState::ACTIVE);
+
+ EXPECT_EQ(TestAppManager::State::kStopped, app_manager()->state());
+
+ EXPECT_EQ(TrayActionState::kNotAvailable,
+ state_controller()->GetLockScreenNoteState());
+ state_controller()->FlushTrayActionForTesting();
+ ASSERT_EQ(1u, observer()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kNotAvailable, observer()->observed_states()[0]);
+ observer()->ClearObservedStates();
+ ASSERT_EQ(1u, tray_action()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kNotAvailable,
+ tray_action()->observed_states()[0]);
+ tray_action()->ClearObservedStates();
+
+ // Test that subsequent session lock works as expected.
+ session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
+ ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state());
+
+ EXPECT_EQ(TrayActionState::kAvailable,
+ state_controller()->GetLockScreenNoteState());
+ state_controller()->FlushTrayActionForTesting();
+ ASSERT_EQ(1u, observer()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
+ ASSERT_EQ(1u, tray_action()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
+}
+
+TEST_F(LockScreenAppStateTest, SessionUnlockedWhileStartingAppManager) {
+ state_controller()->SetPrimaryProfile(profile());
+ ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state());
+
+ session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
+
+ ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state());
+
+ session_manager()->SetSessionState(session_manager::SessionState::ACTIVE);
+ ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state());
+
+ EXPECT_EQ(TrayActionState::kNotAvailable,
+ state_controller()->GetLockScreenNoteState());
+ state_controller()->FlushTrayActionForTesting();
+ EXPECT_EQ(0u, observer()->observed_states().size());
+ EXPECT_EQ(0u, tray_action()->observed_states().size());
+
+ // Test that subsequent session lock works as expected.
+ session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
+
+ ASSERT_EQ(TestAppManager::State::kStarted, app_manager()->state());
+ app_manager()->UpdateApp("app_id", true);
+
+ EXPECT_EQ(TrayActionState::kAvailable,
+ state_controller()->GetLockScreenNoteState());
+ state_controller()->FlushTrayActionForTesting();
+ ASSERT_EQ(1u, observer()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
+ ASSERT_EQ(1u, tray_action()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
+}
+
+TEST_F(LockScreenAppStateTest, AppManagerNoApp) {
+ state_controller()->SetPrimaryProfile(profile());
+ ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state());
+
+ session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
+
+ EXPECT_EQ(TestAppManager::State::kStarted, app_manager()->state());
+
+ EXPECT_EQ(TrayActionState::kNotAvailable,
+ state_controller()->GetLockScreenNoteState());
+ state_controller()->FlushTrayActionForTesting();
+ EXPECT_EQ(0u, observer()->observed_states().size());
+ EXPECT_EQ(0u, tray_action()->observed_states().size());
+
+ tray_action()->SendNewNoteRequest();
+
+ EXPECT_EQ(TrayActionState::kNotAvailable,
+ state_controller()->GetLockScreenNoteState());
+ state_controller()->FlushTrayActionForTesting();
+ EXPECT_EQ(0u, observer()->observed_states().size());
+ EXPECT_EQ(0u, tray_action()->observed_states().size());
+
+ // App manager should be started on next session lock.
+ session_manager()->SetSessionState(session_manager::SessionState::ACTIVE);
+ ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state());
+ app_manager()->SetInitialAppState("app_id", false);
+
+ session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
+
+ EXPECT_EQ(TrayActionState::kAvailable,
+ state_controller()->GetLockScreenNoteState());
+ state_controller()->FlushTrayActionForTesting();
+ ASSERT_EQ(1u, observer()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
+ ASSERT_EQ(1u, tray_action()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
+}
+
+TEST_F(LockScreenAppStateTest, AppAvailabilityChanges) {
+ state_controller()->SetPrimaryProfile(profile());
+ ASSERT_EQ(TestAppManager::State::kStopped, app_manager()->state());
+
+ app_manager()->SetInitialAppState("app_id", false);
+ session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
+
+ EXPECT_EQ(TestAppManager::State::kStarted, app_manager()->state());
+
+ EXPECT_EQ(TrayActionState::kAvailable,
+ state_controller()->GetLockScreenNoteState());
+ state_controller()->FlushTrayActionForTesting();
+ ASSERT_EQ(1u, observer()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
+ observer()->ClearObservedStates();
+ ASSERT_EQ(1u, tray_action()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
+ tray_action()->ClearObservedStates();
+
+ app_manager()->UpdateApp("", false);
+
+ EXPECT_EQ(TrayActionState::kNotAvailable,
+ state_controller()->GetLockScreenNoteState());
+ state_controller()->FlushTrayActionForTesting();
+ ASSERT_EQ(1u, observer()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kNotAvailable, observer()->observed_states()[0]);
+ observer()->ClearObservedStates();
+ ASSERT_EQ(1u, tray_action()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kNotAvailable,
+ tray_action()->observed_states()[0]);
+ tray_action()->ClearObservedStates();
+
+ app_manager()->UpdateApp("app_id_1", true);
+
+ EXPECT_EQ(TrayActionState::kAvailable,
+ state_controller()->GetLockScreenNoteState());
+ state_controller()->FlushTrayActionForTesting();
+ ASSERT_EQ(1u, observer()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[0]);
+ observer()->ClearObservedStates();
+ ASSERT_EQ(1u, tray_action()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[0]);
+ tray_action()->ClearObservedStates();
+}
+
TEST_F(LockScreenAppStateTest, MoveToBackgroundFromActive) {
+ ASSERT_TRUE(EnableNoteTakingApp(true /* enable_app_launch */));
+
state_controller()->SetLockScreenNoteStateForTesting(
TrayActionState::kActive);
@@ -181,6 +537,8 @@ TEST_F(LockScreenAppStateTest, MoveToBackgroundFromActive) {
}
TEST_F(LockScreenAppStateTest, MoveToForeground) {
+ ASSERT_TRUE(EnableNoteTakingApp(true /* enable_app_launch */));
+
state_controller()->SetLockScreenNoteStateForTesting(
TrayActionState::kBackground);
@@ -197,8 +555,7 @@ TEST_F(LockScreenAppStateTest, MoveToForeground) {
}
TEST_F(LockScreenAppStateTest, MoveToForegroundFromNonBackgroundState) {
- state_controller()->SetLockScreenNoteStateForTesting(
- TrayActionState::kAvailable);
+ ASSERT_TRUE(EnableNoteTakingApp(true /* enable_app_launch */));
state_controller()->MoveToForeground();
state_controller()->FlushTrayActionForTesting();
@@ -222,26 +579,60 @@ TEST_F(LockScreenAppStateTest, HandleActionWhenNotAvaiable) {
}
TEST_F(LockScreenAppStateTest, HandleAction) {
- state_controller()->SetLockScreenNoteStateForTesting(
- TrayActionState::kAvailable);
+ ASSERT_TRUE(EnableNoteTakingApp(true /* enable_app_launch */));
tray_action()->SendNewNoteRequest();
state_controller()->FlushTrayActionForTesting();
- EXPECT_EQ(TrayActionState::kActive,
+ EXPECT_EQ(TrayActionState::kLaunching,
state_controller()->GetLockScreenNoteState());
ASSERT_EQ(1u, observer()->observed_states().size());
- EXPECT_EQ(TrayActionState::kActive, observer()->observed_states()[0]);
+ EXPECT_EQ(TrayActionState::kLaunching, observer()->observed_states()[0]);
observer()->ClearObservedStates();
ASSERT_EQ(1u, tray_action()->observed_states().size());
- EXPECT_EQ(TrayActionState::kActive, tray_action()->observed_states()[0]);
+ EXPECT_EQ(TrayActionState::kLaunching, tray_action()->observed_states()[0]);
tray_action()->ClearObservedStates();
+ EXPECT_EQ(1, app_manager()->launch_count());
+
tray_action()->SendNewNoteRequest();
state_controller()->FlushTrayActionForTesting();
// There should be no state change - the state_controller was already in
- // active state when the request was received.
+ // launching state when the request was received.
EXPECT_EQ(0u, observer()->observed_states().size());
EXPECT_EQ(0u, tray_action()->observed_states().size());
+ EXPECT_EQ(1, app_manager()->launch_count());
+}
+
+TEST_F(LockScreenAppStateTest, HandleActionWithLaunchFailure) {
+ ASSERT_TRUE(EnableNoteTakingApp(false /* enable_app_launch */));
+
+ tray_action()->SendNewNoteRequest();
+ state_controller()->FlushTrayActionForTesting();
+
+ EXPECT_EQ(TrayActionState::kAvailable,
+ state_controller()->GetLockScreenNoteState());
+ ASSERT_EQ(2u, observer()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kLaunching, observer()->observed_states()[0]);
+ EXPECT_EQ(TrayActionState::kAvailable, observer()->observed_states()[1]);
+ observer()->ClearObservedStates();
+ ASSERT_EQ(2u, tray_action()->observed_states().size());
+ EXPECT_EQ(TrayActionState::kLaunching, tray_action()->observed_states()[0]);
+ EXPECT_EQ(TrayActionState::kAvailable, tray_action()->observed_states()[1]);
+ tray_action()->ClearObservedStates();
+
+ EXPECT_EQ(1, app_manager()->launch_count());
+
+ tray_action()->SendNewNoteRequest();
+ state_controller()->FlushTrayActionForTesting();
+
+ EXPECT_EQ(TrayActionState::kAvailable,
+ state_controller()->GetLockScreenNoteState());
+
+ // There should be no state change - the state_controller was already in
+ // launching state when the request was received.
+ EXPECT_EQ(2u, observer()->observed_states().size());
+ EXPECT_EQ(2u, tray_action()->observed_states().size());
+ EXPECT_EQ(2, app_manager()->launch_count());
}

Powered by Google App Engine
This is Rietveld 408576698