Index: session_manager_unittest.cc |
diff --git a/session_manager_unittest.cc b/session_manager_unittest.cc |
index 2afaf361b70c5a8daca88a8729e5ebf3b22dd23e..a3a274fc89aac02e9081f674c840d46dd2c0158e 100644 |
--- a/session_manager_unittest.cc |
+++ b/session_manager_unittest.cc |
@@ -40,6 +40,7 @@ |
namespace login_manager { |
using ::testing::AnyNumber; |
+using ::testing::AtMost; |
using ::testing::DoAll; |
using ::testing::Invoke; |
using ::testing::Eq; |
@@ -52,6 +53,12 @@ static const char kCheckedFile[] = "/tmp/checked_file"; |
static const char kUptimeFile[] = "/tmp/uptime-chrome-exec"; |
static const char kDiskFile[] = "/tmp/disk-chrome-exec"; |
+// compatible with void Run() |
+static void BadExit() { _exit(1); } |
+static void BadExitAfterSleep() { sleep(1); _exit(1); } |
+static void RunAndSleep() { while (true) { sleep(1); } }; |
+static void CleanExit() { _exit(0); } |
+ |
// Used as a base class for the tests in this file. |
// Gives useful shared functionality. |
class SessionManagerTest : public ::testing::Test { |
@@ -62,8 +69,7 @@ class SessionManagerTest : public ::testing::Test { |
file_checker_(new MockFileChecker(kCheckedFile)), |
mitigator_(new MockMitigator), |
upstart_(new MockUpstartSignalEmitter), |
- must_destroy_mocks_(true), |
- fake_key_(CreateArray("dummy", strlen("dummy"))) { |
+ must_destroy_mocks_(true) { |
} |
virtual ~SessionManagerTest() { |
@@ -76,8 +82,6 @@ class SessionManagerTest : public ::testing::Test { |
FilePath disk(kDiskFile); |
file_util::Delete(uptime, false); |
file_util::Delete(disk, false); |
- |
- g_array_free(fake_key_, TRUE); |
} |
virtual void SetUp() { |
@@ -111,6 +115,7 @@ class SessionManagerTest : public ::testing::Test { |
static char kFakeEmail[]; |
static char kPropName[]; |
static char kPropValue[]; |
+ static const pid_t kDummyPid; |
// Creates the manager with the jobs. Mocks the file checker. |
// The second job can be NULL. |
@@ -161,25 +166,60 @@ class SessionManagerTest : public ::testing::Test { |
Return(true))); |
EXPECT_CALL(*key, Verify(_, _, _, _)) |
.WillOnce(Return(true)); |
+ // Confirm that the device is owned. |
+ EXPECT_CALL(*key, HaveCheckedDisk()) |
+ .WillOnce(Return(true)); |
+ EXPECT_CALL(*key, IsPopulated()) |
+ .WillOnce(Return(true)); |
} |
void ExpectStartSessionUnowned(const std::string& email_string, |
- MockChildJob* job, |
MockPrefStore* store) { |
+ MockChildJob* job = CreateTrivialMockJob(MAYBE_NEVER); |
EXPECT_CALL(*job, StartSession(email_string)) |
.Times(1); |
+ |
+ MockChildJob* k_job = new MockChildJob; |
+ EXPECT_CALL(*k_job, SetDesiredUid(getuid())) |
+ .Times(1); |
+ EXPECT_CALL(*k_job, GetDesiredUid()) |
+ .Times(1) |
+ .WillRepeatedly(Return(getuid())); |
+ EXPECT_CALL(*k_job, IsDesiredUidSet()) |
+ .WillRepeatedly(Return(true)); |
+ ON_CALL(*k_job, Run()) |
+ .WillByDefault(Invoke(CleanExit)); |
+ int keygen_pid = kDummyPid + 1; |
+ |
MockOwnerKey* key = new MockOwnerKey; |
EXPECT_CALL(*key, PopulateFromDiskIfPossible()) |
.WillRepeatedly(Return(true)); |
- // First, expect an attempt to set the device owner property, but |
+ EXPECT_CALL(*key, StartGeneration(k_job)) |
+ .WillOnce(Return(keygen_pid)); |
// act like this user isn't the owner. |
EXPECT_CALL(*key, Sign(_, _, _)) |
.WillOnce(Return(false)); |
- manager_->test_api().set_ownerkey(key); |
+ |
// Now, expect an attempt to check whether this user is the owner; respond |
// as though there isn't one. |
EXPECT_CALL(*store, Get(_, _, _)) |
.WillOnce(Return(false)); |
+ // Confirm that the device is NOT owned. |
+ EXPECT_CALL(*key, HaveCheckedDisk()) |
+ .WillOnce(Return(true)); |
+ EXPECT_CALL(*key, IsPopulated()) |
+ .WillOnce(Return(false)); |
+ |
+ manager_->test_api().set_keygen_job(k_job); // manager_ takes ownership. |
+ manager_->set_uid(getuid()); |
+ manager_->test_api().set_ownerkey(key); |
+ manager_->test_api().set_prefstore(store); |
+ |
+ EXPECT_CALL(*(utils_.get()), kill(keygen_pid, getuid(), SIGTERM)) |
+ .WillOnce(Return(0)); |
+ EXPECT_CALL(*(utils_.get()), ChildIsGone(keygen_pid, _)) |
+ .WillOnce(Return(true)); |
+ MockUtils(); |
} |
void ExpectStartSessionForOwner(const std::string& email_string, |
@@ -210,6 +250,13 @@ class SessionManagerTest : public ::testing::Test { |
Return(true))); |
EXPECT_CALL(*key, Verify(_, _, _, _)) |
.WillOnce(Return(true)); |
+ // Confirm that the device is owned. |
+ EXPECT_CALL(*key, HaveCheckedDisk()) |
+ .Times(AtMost(1)) |
+ .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(*key, IsPopulated()) |
+ .Times(AtMost(1)) |
+ .WillRepeatedly(Return(true)); |
} |
void StartFakeSession() { |
@@ -281,7 +328,6 @@ class SessionManagerTest : public ::testing::Test { |
MockUpstartSignalEmitter* upstart_; |
bool must_destroy_mocks_; |
std::string property_; |
- GArray* fake_key_; |
GArray* fake_sig_; |
std::string fake_sig_encoded_; |
}; |
@@ -290,14 +336,9 @@ class SessionManagerTest : public ::testing::Test { |
char SessionManagerTest::kFakeEmail[] = "cmasone@whaaat.org"; |
char SessionManagerTest::kPropName[] = "name"; |
char SessionManagerTest::kPropValue[] = "value"; |
+const pid_t SessionManagerTest::kDummyPid = 4; |
-// compatible with void Run() |
-static void BadExit() { _exit(1); } |
-static void BadExitAfterSleep() { sleep(1); _exit(1); } |
-static void RunAndSleep() { while (true) { sleep(1); } }; |
-static void CleanExit() { _exit(0); } |
- |
TEST_F(SessionManagerTest, NoLoopTest) { |
MockChildJob* job = CreateTrivialMockJob(NEVER); |
SimpleRunManager(new MockPrefStore); |
@@ -474,7 +515,6 @@ TEST_F(SessionManagerTest, KeygenTest) { |
ASSERT_GT(file_size, 0); |
} |
-static const pid_t kDummyPid = 4; |
TEST_F(SessionManagerTest, SessionNotStartedCleanup) { |
MockChildJob* job = CreateTrivialMockJob(MAYBE_NEVER); |
manager_->test_api().set_child_pid(0, kDummyPid); |
@@ -523,14 +563,16 @@ TEST_F(SessionManagerTest, SessionStartedCleanup) { |
ExpectStartSession(email, job, store); |
manager_->test_api().set_prefstore(store); |
manager_->StartSession(email, nothing, &out, NULL); |
- manager_->test_api().CleanupChildren(timeout); |
+ SimpleRunManager(store); |
} |
TEST_F(SessionManagerTest, SessionStartedSlowKillCleanup) { |
MockChildJob* job = CreateTrivialMockJob(MAYBE_NEVER); |
- SessionManagerService::TestApi test_api = manager_->test_api(); |
- test_api.set_child_pid(0, kDummyPid); |
+ manager_->test_api().set_child_pid(0, kDummyPid); |
+ gboolean out; |
+ gchar email[] = "user@somewhere"; |
+ gchar nothing[] = ""; |
int timeout = 3; |
EXPECT_CALL(*(utils_.get()), kill(kDummyPid, getuid(), SIGTERM)) |
.WillOnce(Return(0)); |
@@ -540,15 +582,11 @@ TEST_F(SessionManagerTest, SessionStartedSlowKillCleanup) { |
.WillOnce(Return(0)); |
MockUtils(); |
- gboolean out; |
- gchar email[] = "user@somewhere"; |
- gchar nothing[] = ""; |
- |
MockPrefStore* store = new MockPrefStore; |
ExpectStartSession(email, job, store); |
manager_->test_api().set_prefstore(store); |
manager_->StartSession(email, nothing, &out, NULL); |
- test_api.CleanupChildren(timeout); |
+ SimpleRunManager(store); |
} |
// Test that we avoid killing jobs that return true from their ShouldNeverKill() |
@@ -601,19 +639,18 @@ TEST_F(SessionManagerTest, StartSession) { |
} |
TEST_F(SessionManagerTest, StartSessionNew) { |
- MockChildJob* job = CreateTrivialMockJob(MAYBE_NEVER); |
- |
gboolean out; |
gchar email[] = "user@somewhere"; |
gchar nothing[] = ""; |
MockPrefStore* store = new MockPrefStore; |
- ExpectStartSessionUnowned(email, job, store); |
- manager_->test_api().set_prefstore(store); |
+ ExpectStartSessionUnowned(email, store); |
chromeos::glib::ScopedError error; |
EXPECT_EQ(TRUE, manager_->StartSession(email, |
nothing, |
&out, |
&chromeos::Resetter(&error).lvalue())); |
+ |
+ SimpleRunManager(store); |
} |
TEST_F(SessionManagerTest, StartOwnerSession) { |
@@ -720,67 +757,23 @@ TEST_F(SessionManagerTest, StatsRecorded) { |
EXPECT_TRUE(file_util::PathExists(disk)); |
} |
-TEST_F(SessionManagerTest, SetOwnerKeyNoSession) { |
- MockChildJob* job = CreateTrivialMockJob(MAYBE_NEVER); |
- MockUtils(); |
- |
- GError* error = NULL; |
- EXPECT_EQ(FALSE, manager_->SetOwnerKey(fake_key_, &error)); |
- EXPECT_EQ(CHROMEOS_LOGIN_ERROR_ILLEGAL_PUBKEY, error->code); |
- g_error_free(error); |
-} |
- |
-TEST_F(SessionManagerTest, SetOwnerKeyNssDbFail) { |
- MockFactory<SadNssUtil> factory; |
- NssUtil::set_factory(&factory); |
- |
- MockChildJob* job = CreateTrivialMockJob(MAYBE_NEVER); |
- MockUtils(); |
- StartFakeSession(); |
- |
- GError* error = NULL; |
- EXPECT_EQ(FALSE, manager_->SetOwnerKey(fake_key_, &error)); |
- EXPECT_EQ(CHROMEOS_LOGIN_ERROR_NO_USER_NSSDB, error->code); |
- g_error_free(error); |
-} |
- |
-TEST_F(SessionManagerTest, SetOwnerKeyCheckFail) { |
- MockFactory<KeyFailUtil> factory; |
- NssUtil::set_factory(&factory); |
- |
- MockChildJob* job = CreateTrivialMockJob(MAYBE_NEVER); |
- MockUtils(); |
- StartFakeSession(); |
- |
- GError* error = NULL; |
- EXPECT_EQ(FALSE, manager_->SetOwnerKey(fake_key_, &error)); |
- EXPECT_EQ(CHROMEOS_LOGIN_ERROR_ILLEGAL_PUBKEY, error->code); |
- g_error_free(error); |
-} |
- |
-TEST_F(SessionManagerTest, SetOwnerKeyPopulateFail) { |
- MockFactory<KeyCheckUtil> factory; |
- NssUtil::set_factory(&factory); |
- |
+TEST_F(SessionManagerTest, SetOwnerKeyShouldFail) { |
MockChildJob* job = CreateTrivialMockJob(MAYBE_NEVER); |
+ EXPECT_CALL(*(utils_.get()), |
+ SendSignalToChromium(chromium::kOwnerKeySetSignal, |
+ StrEq("failure"))) |
+ .Times(1); |
MockUtils(); |
- StartFakeSession(); |
- |
- std::vector<uint8> pub_key; |
- NssUtil::KeyFromBuffer(fake_key_, &pub_key); |
- |
- MockOwnerKey* key = new MockOwnerKey; |
- EXPECT_CALL(*key, PopulateFromBuffer(pub_key)) |
- .WillOnce(Return(false)); |
- manager_->test_api().set_ownerkey(key); |
GError* error = NULL; |
- EXPECT_EQ(FALSE, manager_->SetOwnerKey(fake_key_, &error)); |
+ GArray* fake_key = CreateArray(kPropValue, strlen(kPropValue)); |
+ EXPECT_EQ(FALSE, manager_->SetOwnerKey(fake_key, &error)); |
EXPECT_EQ(CHROMEOS_LOGIN_ERROR_ILLEGAL_PUBKEY, error->code); |
+ g_array_free(fake_key, TRUE); |
g_error_free(error); |
} |
-TEST_F(SessionManagerTest, SetOwnerKey) { |
+TEST_F(SessionManagerTest, ValidateAndStoreOwnerKey) { |
MockFactory<KeyCheckUtil> factory; |
NssUtil::set_factory(&factory); |
@@ -798,10 +791,9 @@ TEST_F(SessionManagerTest, SetOwnerKey) { |
StrEq("success"))) |
.Times(1); |
MockUtils(); |
- StartFakeSession(); |
std::vector<uint8> pub_key; |
- NssUtil::KeyFromBuffer(fake_key_, &pub_key); |
+ NssUtil::KeyFromBuffer(kPropValue, &pub_key); |
MockPrefStore* store = new MockPrefStore; |
MockOwnerKey* key = new MockOwnerKey; |
@@ -814,7 +806,6 @@ TEST_F(SessionManagerTest, SetOwnerKey) { |
.WillOnce(Return(true)); |
EXPECT_CALL(*key, Persist()) |
.WillOnce(Return(true)); |
- |
manager_->test_api().set_ownerkey(key); |
EXPECT_CALL(*store, Whitelist(kFakeEmail, _)) |
@@ -827,7 +818,8 @@ TEST_F(SessionManagerTest, SetOwnerKey) { |
.WillOnce(Return(true)); |
manager_->test_api().set_prefstore(store); |
- EXPECT_EQ(TRUE, manager_->SetOwnerKey(fake_key_, NULL)); |
+ StartFakeSession(); |
+ manager_->ValidateAndStoreOwnerKey(kPropValue); |
manager_->Run(); |
} |