Commit 20f0f782 authored by rsorokin@chromium.org's avatar rsorokin@chromium.org

Start session fail causes restart chrome

BUG=244628
TEST=manual check on Acer C720

Review URL: https://codereview.chromium.org/228703004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@266791 0039d316-1c4b-4281-b951-d872f2087c98
parent 31a6b374
...@@ -33,7 +33,7 @@ const char kUserId3[] = "user3@example.com"; ...@@ -33,7 +33,7 @@ const char kUserId3[] = "user3@example.com";
class CrashRestoreSimpleTest : public InProcessBrowserTest { class CrashRestoreSimpleTest : public InProcessBrowserTest {
protected: protected:
CrashRestoreSimpleTest() {} CrashRestoreSimpleTest() : session_started_count_(0) {}
virtual ~CrashRestoreSimpleTest() {} virtual ~CrashRestoreSimpleTest() {}
...@@ -53,10 +53,27 @@ class CrashRestoreSimpleTest : public InProcessBrowserTest { ...@@ -53,10 +53,27 @@ class CrashRestoreSimpleTest : public InProcessBrowserTest {
dbus_thread_manager->SetSessionManagerClient( dbus_thread_manager->SetSessionManagerClient(
scoped_ptr<SessionManagerClient>(session_manager_client_)); scoped_ptr<SessionManagerClient>(session_manager_client_));
DBusThreadManager::SetInstanceForTesting(dbus_thread_manager); DBusThreadManager::SetInstanceForTesting(dbus_thread_manager);
session_manager_client_->StartSession(kUserId1); // We need to create MessageLoop here to process callback from
// session_manager
base::MessageLoop msg_loop;
session_manager_client_->StartSession(
kUserId1,
base::Bind(&CrashRestoreSimpleTest::OnSessionStarted,
base::Unretained(this),
kUserId1));
base::RunLoop().RunUntilIdle();
ASSERT_EQ(1, session_started_count_);
} }
public:
void OnSessionStarted(const std::string& user_email, bool success) {
ASSERT_TRUE(success);
++session_started_count_;
}
protected:
FakeSessionManagerClient* session_manager_client_; FakeSessionManagerClient* session_manager_client_;
int session_started_count_;
}; };
IN_PROC_BROWSER_TEST_F(CrashRestoreSimpleTest, RestoreSessionForOneUser) { IN_PROC_BROWSER_TEST_F(CrashRestoreSimpleTest, RestoreSessionForOneUser) {
...@@ -118,8 +135,21 @@ class CrashRestoreComplexTest : public CrashRestoreSimpleTest { ...@@ -118,8 +135,21 @@ class CrashRestoreComplexTest : public CrashRestoreSimpleTest {
virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
CrashRestoreSimpleTest::SetUpInProcessBrowserTestFixture(); CrashRestoreSimpleTest::SetUpInProcessBrowserTestFixture();
session_manager_client_->StartSession(kUserId2); // We need to create MessageLoop here to process callback from
session_manager_client_->StartSession(kUserId3); // session_manager
base::MessageLoop msg_loop;
session_manager_client_->StartSession(
kUserId2,
base::Bind(&CrashRestoreSimpleTest::OnSessionStarted,
base::Unretained(this),
kUserId2));
session_manager_client_->StartSession(
kUserId3,
base::Bind(&CrashRestoreSimpleTest::OnSessionStarted,
base::Unretained(this),
kUserId3));
base::RunLoop().RunUntilIdle();
ASSERT_EQ(3, CrashRestoreSimpleTest::session_started_count_);
} }
}; };
......
...@@ -200,6 +200,19 @@ class LoginUtilsImpl ...@@ -200,6 +200,19 @@ class LoginUtilsImpl
// the authentication profile. // the authentication profile.
void CompleteProfileCreate(Profile* user_profile); void CompleteProfileCreate(Profile* user_profile);
// Callback to resume profile preparing after start session.
void OnSessionStarted(const UserContext& user_context,
const std::string& display_email,
bool has_cookies,
LoginUtils::Delegate* delegate,
bool success);
// Complete profile preparation with having active session.
void CompletePrepareProfileWithActiveSession(const UserContext& user_context,
const std::string& display_email,
bool has_cookies,
LoginUtils::Delegate* delegate);
// Finalized profile preparation. // Finalized profile preparation.
void FinalizePrepareProfile(Profile* user_profile); void FinalizePrepareProfile(Profile* user_profile);
...@@ -400,10 +413,42 @@ void LoginUtilsImpl::PrepareProfile( ...@@ -400,10 +413,42 @@ void LoginUtilsImpl::PrepareProfile(
if (!has_active_session) { if (!has_active_session) {
btl->AddLoginTimeMarker("StartSession-Start", false); btl->AddLoginTimeMarker("StartSession-Start", false);
DBusThreadManager::Get()->GetSessionManagerClient()->StartSession( DBusThreadManager::Get()->GetSessionManagerClient()->StartSession(
user_context.username); user_context.username,
btl->AddLoginTimeMarker("StartSession-End", false); base::Bind(&LoginUtilsImpl::OnSessionStarted,
AsWeakPtr(),
user_context,
display_email,
has_cookies,
delegate));
return;
}
CompletePrepareProfileWithActiveSession(
user_context, display_email, has_cookies, delegate);
}
void LoginUtilsImpl::OnSessionStarted(const UserContext& user_context,
const std::string& display_email,
bool has_cookies,
LoginUtils::Delegate* delegate,
bool success) {
BootTimesLoader* btl = BootTimesLoader::Get();
btl->AddLoginTimeMarker("StartSession-End", false);
if (!success) {
LOG(ERROR) << "StartSession failed";
chrome::AttemptUserExit();
return;
} }
CompletePrepareProfileWithActiveSession(
user_context, display_email, has_cookies, delegate);
}
void LoginUtilsImpl::CompletePrepareProfileWithActiveSession(
const UserContext& user_context,
const std::string& display_email,
bool has_cookies,
LoginUtils::Delegate* delegate) {
BootTimesLoader* btl = BootTimesLoader::Get();
btl->AddLoginTimeMarker("UserLoggedIn-Start", false); btl->AddLoginTimeMarker("UserLoggedIn-Start", false);
UserManager* user_manager = UserManager::Get(); UserManager* user_manager = UserManager::Get();
user_manager->UserLoggedIn(user_context.username, user_manager->UserLoggedIn(user_context.username,
......
...@@ -116,7 +116,10 @@ void DeviceSettingsTestHelper::EmitLoginPromptVisible() {} ...@@ -116,7 +116,10 @@ void DeviceSettingsTestHelper::EmitLoginPromptVisible() {}
void DeviceSettingsTestHelper::RestartJob(int pid, void DeviceSettingsTestHelper::RestartJob(int pid,
const std::string& command_line) {} const std::string& command_line) {}
void DeviceSettingsTestHelper::StartSession(const std::string& user_email) {} void DeviceSettingsTestHelper::StartSession(
const std::string& user_email,
const StartSessionCallback& callback) {
}
void DeviceSettingsTestHelper::StopSession() {} void DeviceSettingsTestHelper::StopSession() {}
......
...@@ -88,7 +88,8 @@ class DeviceSettingsTestHelper : public SessionManagerClient { ...@@ -88,7 +88,8 @@ class DeviceSettingsTestHelper : public SessionManagerClient {
virtual bool HasObserver(Observer* observer) OVERRIDE; virtual bool HasObserver(Observer* observer) OVERRIDE;
virtual void EmitLoginPromptVisible() OVERRIDE; virtual void EmitLoginPromptVisible() OVERRIDE;
virtual void RestartJob(int pid, const std::string& command_line) OVERRIDE; virtual void RestartJob(int pid, const std::string& command_line) OVERRIDE;
virtual void StartSession(const std::string& user_email) OVERRIDE; virtual void StartSession(const std::string& user_email,
const StartSessionCallback& callback) OVERRIDE;
virtual void StopSession() OVERRIDE; virtual void StopSession() OVERRIDE;
virtual void StartDeviceWipe() OVERRIDE; virtual void StartDeviceWipe() OVERRIDE;
virtual void RequestLockScreen() OVERRIDE; virtual void RequestLockScreen() OVERRIDE;
......
...@@ -46,11 +46,14 @@ void FakeSessionManagerClient::RestartJob(int pid, ...@@ -46,11 +46,14 @@ void FakeSessionManagerClient::RestartJob(int pid,
const std::string& command_line) { const std::string& command_line) {
} }
void FakeSessionManagerClient::StartSession(const std::string& user_email) { void FakeSessionManagerClient::StartSession(
const std::string& user_email,
const StartSessionCallback& callback) {
DCHECK_EQ(0UL, user_sessions_.count(user_email)); DCHECK_EQ(0UL, user_sessions_.count(user_email));
std::string user_id_hash = std::string user_id_hash =
CryptohomeClient::GetStubSanitizedUsername(user_email); CryptohomeClient::GetStubSanitizedUsername(user_email);
user_sessions_[user_email] = user_id_hash; user_sessions_[user_email] = user_id_hash;
base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(callback, true));
} }
void FakeSessionManagerClient::StopSession() { void FakeSessionManagerClient::StopSession() {
......
...@@ -30,7 +30,8 @@ class FakeSessionManagerClient : public SessionManagerClient { ...@@ -30,7 +30,8 @@ class FakeSessionManagerClient : public SessionManagerClient {
virtual bool HasObserver(Observer* observer) OVERRIDE; virtual bool HasObserver(Observer* observer) OVERRIDE;
virtual void EmitLoginPromptVisible() OVERRIDE; virtual void EmitLoginPromptVisible() OVERRIDE;
virtual void RestartJob(int pid, const std::string& command_line) OVERRIDE; virtual void RestartJob(int pid, const std::string& command_line) OVERRIDE;
virtual void StartSession(const std::string& user_email) OVERRIDE; virtual void StartSession(const std::string& user_email,
const StartSessionCallback& callback) OVERRIDE;
virtual void StopSession() OVERRIDE; virtual void StopSession() OVERRIDE;
virtual void StartDeviceWipe() OVERRIDE; virtual void StartDeviceWipe() OVERRIDE;
virtual void RequestLockScreen() OVERRIDE; virtual void RequestLockScreen() OVERRIDE;
......
...@@ -24,7 +24,8 @@ class MockSessionManagerClient : public SessionManagerClient { ...@@ -24,7 +24,8 @@ class MockSessionManagerClient : public SessionManagerClient {
MOCK_METHOD1(HasObserver, bool(Observer*)); MOCK_METHOD1(HasObserver, bool(Observer*));
MOCK_METHOD0(EmitLoginPromptVisible, void(void)); MOCK_METHOD0(EmitLoginPromptVisible, void(void));
MOCK_METHOD2(RestartJob, void(int, const std::string&)); MOCK_METHOD2(RestartJob, void(int, const std::string&));
MOCK_METHOD1(StartSession, void(const std::string&)); MOCK_METHOD2(StartSession,
void(const std::string&, const StartSessionCallback&));
MOCK_METHOD0(StopSession, void(void)); MOCK_METHOD0(StopSession, void(void));
MOCK_METHOD0(StartDeviceWipe, void(void)); MOCK_METHOD0(StartDeviceWipe, void(void));
MOCK_METHOD0(RequestLockScreen, void(void)); MOCK_METHOD0(RequestLockScreen, void(void));
......
...@@ -71,7 +71,8 @@ class SessionManagerClientImpl : public SessionManagerClient { ...@@ -71,7 +71,8 @@ class SessionManagerClientImpl : public SessionManagerClient {
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
} }
virtual void StartSession(const std::string& user_email) OVERRIDE { virtual void StartSession(const std::string& user_email,
const StartSessionCallback& callback) OVERRIDE {
dbus::MethodCall method_call(login_manager::kSessionManagerInterface, dbus::MethodCall method_call(login_manager::kSessionManagerInterface,
login_manager::kSessionManagerStartSession); login_manager::kSessionManagerStartSession);
dbus::MessageWriter writer(&method_call); dbus::MessageWriter writer(&method_call);
...@@ -81,7 +82,8 @@ class SessionManagerClientImpl : public SessionManagerClient { ...@@ -81,7 +82,8 @@ class SessionManagerClientImpl : public SessionManagerClient {
&method_call, &method_call,
dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::Bind(&SessionManagerClientImpl::OnStartSession, base::Bind(&SessionManagerClientImpl::OnStartSession,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr(),
callback));
} }
virtual void StopSession() OVERRIDE { virtual void StopSession() OVERRIDE {
...@@ -332,10 +334,18 @@ class SessionManagerClientImpl : public SessionManagerClient { ...@@ -332,10 +334,18 @@ class SessionManagerClientImpl : public SessionManagerClient {
} }
// Called when kSessionManagerStartSession method is complete. // Called when kSessionManagerStartSession method is complete.
void OnStartSession(dbus::Response* response) { void OnStartSession(const StartSessionCallback& callback,
LOG_IF(ERROR, !response) dbus::Response* response) {
<< "Failed to call " bool success = false;
<< login_manager::kSessionManagerStartSession; if (!response) {
LOG(ERROR) << "Failed to call "
<< login_manager::kSessionManagerStartSession;
} else {
dbus::MessageReader reader(response);
if (!reader.PopBool(&success))
LOG(ERROR) << "Invalid response: " << response->ToString();
}
callback.Run(success);
} }
// Called when kSessionManagerStopSession method is complete. // Called when kSessionManagerStopSession method is complete.
...@@ -518,7 +528,10 @@ class SessionManagerClientStubImpl : public SessionManagerClient { ...@@ -518,7 +528,10 @@ class SessionManagerClientStubImpl : public SessionManagerClient {
} }
virtual void EmitLoginPromptVisible() OVERRIDE {} virtual void EmitLoginPromptVisible() OVERRIDE {}
virtual void RestartJob(int pid, const std::string& command_line) OVERRIDE {} virtual void RestartJob(int pid, const std::string& command_line) OVERRIDE {}
virtual void StartSession(const std::string& user_email) OVERRIDE {} virtual void StartSession(const std::string& user_email,
const StartSessionCallback& callback) OVERRIDE {
callback.Run(true);
}
virtual void StopSession() OVERRIDE {} virtual void StopSession() OVERRIDE {}
virtual void StartDeviceWipe() OVERRIDE {} virtual void StartDeviceWipe() OVERRIDE {}
virtual void RequestLockScreen() OVERRIDE { virtual void RequestLockScreen() OVERRIDE {
......
...@@ -70,8 +70,13 @@ class CHROMEOS_EXPORT SessionManagerClient : public DBusClient { ...@@ -70,8 +70,13 @@ class CHROMEOS_EXPORT SessionManagerClient : public DBusClient {
// Restarts a job referenced by |pid| with the provided command line. // Restarts a job referenced by |pid| with the provided command line.
virtual void RestartJob(int pid, const std::string& command_line) = 0; virtual void RestartJob(int pid, const std::string& command_line) = 0;
// Used for StartSession. Takes a boolean indicating whether the
// operation was successful or not.
typedef base::Callback<void(bool success)> StartSessionCallback;
// Starts the session for the user. // Starts the session for the user.
virtual void StartSession(const std::string& user_email) = 0; virtual void StartSession(const std::string& user_email,
const StartSessionCallback& callback) = 0;
// Stops the current session. // Stops the current session.
virtual void StopSession() = 0; virtual void StopSession() = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment