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

Unified Diff: session_manager_unittest.cc

Issue 553016: port to use centralized constants files, and add input validation (Closed)
Patch Set: address shell injection, otehr comments (per wad) Created 10 years, 11 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
« no previous file with comments | « session_manager_service.cc ('k') | signaller.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: session_manager_unittest.cc
diff --git a/session_manager_unittest.cc b/session_manager_unittest.cc
index fff71a8b8f919ae40dd4a12055012179428f94aa..368981f389b31e256dbd39d98bd72b44d4e8cf49 100644
--- a/session_manager_unittest.cc
+++ b/session_manager_unittest.cc
@@ -9,126 +9,213 @@
#include <signal.h>
#include <unistd.h>
+#include <base/basictypes.h>
#include <base/command_line.h>
#include <base/logging.h>
#include <base/scoped_ptr.h>
+#include <base/string_util.h>
#include <chromeos/dbus/dbus.h>
+#include <chromeos/dbus/service_constants.h>
#include "login_manager/bindings/client.h"
#include "login_manager/child_job.h"
-#include "login_manager/constants.h"
#include "login_manager/file_checker.h"
+#include "login_manager/mock_child_job.h"
+#include "login_manager/mock_system_utils.h"
+#include "login_manager/system_utils.h"
namespace login_manager {
+using ::testing::Invoke;
+using ::testing::InSequence;
+using ::testing::Return;
+using ::testing::_;
+
class SessionManagerTest : public ::testing::Test { };
-// These would be better done with gmock.
-class TrueChecker : public FileChecker {
- public:
- TrueChecker() : FileChecker("") {}
- virtual bool exists() {
- return true;
- }
-};
+TEST(SessionManagerTest, NoLoopTest) {
+ MockChildJob *job = new MockChildJob;
+ login_manager::SessionManagerService manager(job); // manager takes ownership
+ manager.set_exit_on_child_done(true);
-class ThrowingJob : public ChildJob {
- bool ShouldRun() { return false; }
- void Run() { EXPECT_TRUE(false) << "Job should never run!"; }
- void Toggle() {}
-};
+ EXPECT_CALL(*job, ShouldRun())
+ .Times(1)
+ .WillRepeatedly(Return(false));
-/*
-TEST(SessionManagerTest, NoLoopTest) {
- ChildJob* job = new ThrowingJob;
- login_manager::SessionManager manager(NULL,
- job, // manager takes ownership
- false);
- manager.LoopChrome("");
+ manager.Run();
}
-*/
-class RunEnJob : public ChildJob {
- public:
- RunEnJob(int desired_runs)
- : desired_runs_(desired_runs),
- num_loops_(0) {
- }
- bool ShouldRun() {
- ++num_loops_;
- if (num_loops_ >= desired_runs_) {
- return false;
- } else {
- return true;
- }
- }
- void Toggle() {}
- int num_loops() { return num_loops_; }
- private:
- const int desired_runs_;
- int num_loops_;
-};
-
-class CleanExitJob : public RunEnJob {
- public:
- CleanExitJob(int runs) : RunEnJob(runs) {}
- void Run() { exit(0); }
-};
-
-class BadExitJob : public RunEnJob {
- public:
- BadExitJob(int runs) : RunEnJob(runs) {}
- void Run() { exit(1); }
-};
-
-TEST(SessionManagerTest, CleanExitTest) {
- CleanExitJob* job = new CleanExitJob(1);
- login_manager::SessionManagerService manager(job, // manager takes ownership
- true);
+static void BadExit() { exit(1); } // compatible with void Run()
+TEST(SessionManagerTest, BadExitChild) {
+ MockChildJob *job = new MockChildJob;
+ login_manager::SessionManagerService manager(job); // manager takes ownership
+ manager.set_exit_on_child_done(true);
+
+ EXPECT_CALL(*job, ShouldRun())
+ .Times(2)
+ .WillOnce(Return(true))
+ .WillRepeatedly(Return(false));
+ ON_CALL(*job, Run())
+ .WillByDefault(Invoke(BadExit));
+
manager.Run();
- EXPECT_EQ(1, job->num_loops());
}
-TEST(SessionManagerTest, BadExitTest) {
- BadExitJob* job = new BadExitJob(1);
- login_manager::SessionManagerService manager(job, // manager takes ownership
- true);
+static void CleanExit() { exit(0); }
+TEST(SessionManagerTest, CleanExitChild) {
+ MockChildJob* job = new MockChildJob;
+ login_manager::SessionManagerService manager(job); // manager takes ownership
+ manager.set_exit_on_child_done(true);
+
+ EXPECT_CALL(*job, ShouldRun())
+ .Times(2)
+ .WillOnce(Return(true))
+ .WillRepeatedly(Return(false));
+ ON_CALL(*job, Run())
+ .WillByDefault(Invoke(CleanExit));
+
manager.Run();
- EXPECT_EQ(1, job->num_loops());
}
TEST(SessionManagerTest, MultiRunTest) {
- int runs = 3;
- CleanExitJob* job = new CleanExitJob(runs);
- login_manager::SessionManagerService manager(job, // manager takes ownership
- true);
+ MockChildJob* job = new MockChildJob;
+ login_manager::SessionManagerService manager(job); // manager takes ownership
+ manager.set_exit_on_child_done(true);
+
+ EXPECT_CALL(*job, ShouldRun())
+ .Times(3)
+ .WillOnce(Return(true))
+ .WillOnce(Return(true))
+ .WillRepeatedly(Return(false));
+ ON_CALL(*job, Run())
+ .WillByDefault(Invoke(CleanExit));
+
manager.Run();
- EXPECT_EQ(3, job->num_loops());
}
-class EnforceToggleJob : public ChildJob {
- public:
- EnforceToggleJob() : was_toggled_(false) {}
- ~EnforceToggleJob() { EXPECT_TRUE(was_toggled_); }
- bool ShouldRun() { return true; }
- void Run() { }
- void Toggle() { EXPECT_FALSE(was_toggled_); was_toggled_ = true; }
- private:
- bool was_toggled_;
-};
+static const pid_t kDummyPid = 4;
+TEST(SessionManagerTest, EasyCleanupTest) {
+ MockChildJob* job = new MockChildJob;
+ MockSystemUtils* utils = new MockSystemUtils;
+ login_manager::SessionManagerService manager(job); // manager takes ownership
+ manager.set_exit_on_child_done(true);
+ manager.set_child_pgid(kDummyPid);
+ manager.set_systemutils(utils);
+
+ int tries = 3;
+ EXPECT_CALL(*utils, child_is_gone(kDummyPid))
+ .Times(2)
+ .WillOnce(Return(false))
+ .WillOnce(Return(true));
+ EXPECT_CALL(*utils, kill(kDummyPid, SIGTERM))
+ .Times(1)
+ .WillOnce(Return(0));
+
+ manager.CleanupChildren(tries);
+}
+
+TEST(SessionManagerTest, HarderCleanupTest) {
+ MockChildJob* job = new MockChildJob;
+ MockSystemUtils* utils = new MockSystemUtils;
+ login_manager::SessionManagerService manager(job); // manager takes ownership
+ manager.set_exit_on_child_done(true);
+ manager.set_child_pgid(kDummyPid);
+ manager.set_systemutils(utils);
+
+ int tries = 3;
+ EXPECT_CALL(*utils, child_is_gone(kDummyPid))
+ .Times(tries)
+ .WillOnce(Return(false))
+ .WillOnce(Return(false))
+ .WillOnce(Return(true));
+ EXPECT_CALL(*utils, kill(kDummyPid, SIGTERM))
+ .Times(tries - 1)
+ .WillRepeatedly(Return(0));
+
+ manager.CleanupChildren(tries);
+}
+
+TEST(SessionManagerTest, KillCleanupTest) {
+ MockChildJob* job = new MockChildJob;
+ MockSystemUtils* utils = new MockSystemUtils;
+ login_manager::SessionManagerService manager(job); // manager takes ownership
+ manager.set_exit_on_child_done(true);
+ manager.set_child_pgid(kDummyPid);
+ manager.set_systemutils(utils);
+
+ int tries = 3;
+ EXPECT_CALL(*utils, child_is_gone(kDummyPid))
+ .Times(tries + 2)
+ .WillOnce(Return(false))
+ .WillOnce(Return(false))
+ .WillOnce(Return(false))
+ .WillOnce(Return(false))
+ .WillOnce(Return(true));
+
+ {
+ InSequence dummy;
+ EXPECT_CALL(*utils, kill(kDummyPid, SIGTERM))
+ .Times(tries)
+ .WillRepeatedly(Return(0));
+ EXPECT_CALL(*utils, kill(kDummyPid, SIGKILL))
+ .Times(1)
+ .WillOnce(Return(0));
+ }
+
+ manager.CleanupChildren(tries);
+}
TEST(SessionManagerTest, StartSessionTest) {
- ChildJob* job = new EnforceToggleJob;
+ MockChildJob* job = new MockChildJob;
login_manager::SessionManagerService manager(job); // manager takes ownership
+ manager.set_exit_on_child_done(true);
+
+ EXPECT_CALL(*job, ShouldRun())
+ .WillRepeatedly(Return(true));
+ EXPECT_CALL(*job, Toggle())
+ .Times(1);
+
gboolean out;
- manager.StartSession(NULL, NULL, &out, NULL);
+ gchar email[] = "user@somewhere";
+ gchar nothing[] = "";
+ manager.StartSession(email, nothing, &out, NULL);
}
TEST(SessionManagerTest, StopSessionTest) {
- ChildJob* job = new EnforceToggleJob;
+ MockChildJob* job = new MockChildJob;
login_manager::SessionManagerService manager(job); // manager takes ownership
+ manager.set_exit_on_child_done(true);
+
+ EXPECT_CALL(*job, ShouldRun())
+ .WillRepeatedly(Return(true));
+ EXPECT_CALL(*job, Toggle())
+ .Times(1);
+
gboolean out;
- manager.StopSession(NULL, &out, NULL);
+ gchar nothing[] = "";
+ manager.StopSession(nothing, &out, NULL);
+}
+
+TEST(SessionManagerTest, EmailAddressTest) {
+ const char valid[] = "user@somewhere";
+ EXPECT_TRUE(login_manager::SessionManagerService::ValidateEmail(valid));
+}
+
+TEST(SessionManagerTest, EmailAddressNonAsciiTest) {
+ char invalid[4] = "a@m";
+ invalid[2] = 254;
+ EXPECT_FALSE(login_manager::SessionManagerService::ValidateEmail(invalid));
}
+TEST(SessionManagerTest, EmailAddressNoAtTest) {
+ const char no_at[] = "user";
+ EXPECT_FALSE(login_manager::SessionManagerService::ValidateEmail(no_at));
+}
+
+TEST(SessionManagerTest, EmailAddressTooMuchAtTest) {
+ const char extra_at[] = "user@what@where";
+ EXPECT_FALSE(login_manager::SessionManagerService::ValidateEmail(extra_at));
+}
+
+
} // namespace login_manager
« no previous file with comments | « session_manager_service.cc ('k') | signaller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698