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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « session_manager_service.cc ('k') | signaller.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved. 1 // Copyright (c) 2009-2010 The Chromium OS 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 "login_manager/session_manager_service.h" 5 #include "login_manager/session_manager_service.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <gtest/gtest.h> 8 #include <gtest/gtest.h>
9 #include <signal.h> 9 #include <signal.h>
10 #include <unistd.h> 10 #include <unistd.h>
11 11
12 #include <base/basictypes.h>
12 #include <base/command_line.h> 13 #include <base/command_line.h>
13 #include <base/logging.h> 14 #include <base/logging.h>
14 #include <base/scoped_ptr.h> 15 #include <base/scoped_ptr.h>
16 #include <base/string_util.h>
15 #include <chromeos/dbus/dbus.h> 17 #include <chromeos/dbus/dbus.h>
18 #include <chromeos/dbus/service_constants.h>
16 19
17 #include "login_manager/bindings/client.h" 20 #include "login_manager/bindings/client.h"
18 #include "login_manager/child_job.h" 21 #include "login_manager/child_job.h"
19 #include "login_manager/constants.h"
20 #include "login_manager/file_checker.h" 22 #include "login_manager/file_checker.h"
23 #include "login_manager/mock_child_job.h"
24 #include "login_manager/mock_system_utils.h"
25 #include "login_manager/system_utils.h"
21 26
22 namespace login_manager { 27 namespace login_manager {
23 28
29 using ::testing::Invoke;
30 using ::testing::InSequence;
31 using ::testing::Return;
32 using ::testing::_;
33
24 class SessionManagerTest : public ::testing::Test { }; 34 class SessionManagerTest : public ::testing::Test { };
25 35
26 // These would be better done with gmock. 36 TEST(SessionManagerTest, NoLoopTest) {
27 class TrueChecker : public FileChecker { 37 MockChildJob *job = new MockChildJob;
28 public: 38 login_manager::SessionManagerService manager(job); // manager takes ownership
29 TrueChecker() : FileChecker("") {} 39 manager.set_exit_on_child_done(true);
30 virtual bool exists() { 40
31 return true; 41 EXPECT_CALL(*job, ShouldRun())
42 .Times(1)
43 .WillRepeatedly(Return(false));
44
45 manager.Run();
46 }
47
48 static void BadExit() { exit(1); } // compatible with void Run()
49 TEST(SessionManagerTest, BadExitChild) {
50 MockChildJob *job = new MockChildJob;
51 login_manager::SessionManagerService manager(job); // manager takes ownership
52 manager.set_exit_on_child_done(true);
53
54 EXPECT_CALL(*job, ShouldRun())
55 .Times(2)
56 .WillOnce(Return(true))
57 .WillRepeatedly(Return(false));
58 ON_CALL(*job, Run())
59 .WillByDefault(Invoke(BadExit));
60
61 manager.Run();
62 }
63
64 static void CleanExit() { exit(0); }
65 TEST(SessionManagerTest, CleanExitChild) {
66 MockChildJob* job = new MockChildJob;
67 login_manager::SessionManagerService manager(job); // manager takes ownership
68 manager.set_exit_on_child_done(true);
69
70 EXPECT_CALL(*job, ShouldRun())
71 .Times(2)
72 .WillOnce(Return(true))
73 .WillRepeatedly(Return(false));
74 ON_CALL(*job, Run())
75 .WillByDefault(Invoke(CleanExit));
76
77 manager.Run();
78 }
79
80 TEST(SessionManagerTest, MultiRunTest) {
81 MockChildJob* job = new MockChildJob;
82 login_manager::SessionManagerService manager(job); // manager takes ownership
83 manager.set_exit_on_child_done(true);
84
85 EXPECT_CALL(*job, ShouldRun())
86 .Times(3)
87 .WillOnce(Return(true))
88 .WillOnce(Return(true))
89 .WillRepeatedly(Return(false));
90 ON_CALL(*job, Run())
91 .WillByDefault(Invoke(CleanExit));
92
93 manager.Run();
94 }
95
96 static const pid_t kDummyPid = 4;
97 TEST(SessionManagerTest, EasyCleanupTest) {
98 MockChildJob* job = new MockChildJob;
99 MockSystemUtils* utils = new MockSystemUtils;
100 login_manager::SessionManagerService manager(job); // manager takes ownership
101 manager.set_exit_on_child_done(true);
102 manager.set_child_pgid(kDummyPid);
103 manager.set_systemutils(utils);
104
105 int tries = 3;
106 EXPECT_CALL(*utils, child_is_gone(kDummyPid))
107 .Times(2)
108 .WillOnce(Return(false))
109 .WillOnce(Return(true));
110 EXPECT_CALL(*utils, kill(kDummyPid, SIGTERM))
111 .Times(1)
112 .WillOnce(Return(0));
113
114 manager.CleanupChildren(tries);
115 }
116
117 TEST(SessionManagerTest, HarderCleanupTest) {
118 MockChildJob* job = new MockChildJob;
119 MockSystemUtils* utils = new MockSystemUtils;
120 login_manager::SessionManagerService manager(job); // manager takes ownership
121 manager.set_exit_on_child_done(true);
122 manager.set_child_pgid(kDummyPid);
123 manager.set_systemutils(utils);
124
125 int tries = 3;
126 EXPECT_CALL(*utils, child_is_gone(kDummyPid))
127 .Times(tries)
128 .WillOnce(Return(false))
129 .WillOnce(Return(false))
130 .WillOnce(Return(true));
131 EXPECT_CALL(*utils, kill(kDummyPid, SIGTERM))
132 .Times(tries - 1)
133 .WillRepeatedly(Return(0));
134
135 manager.CleanupChildren(tries);
136 }
137
138 TEST(SessionManagerTest, KillCleanupTest) {
139 MockChildJob* job = new MockChildJob;
140 MockSystemUtils* utils = new MockSystemUtils;
141 login_manager::SessionManagerService manager(job); // manager takes ownership
142 manager.set_exit_on_child_done(true);
143 manager.set_child_pgid(kDummyPid);
144 manager.set_systemutils(utils);
145
146 int tries = 3;
147 EXPECT_CALL(*utils, child_is_gone(kDummyPid))
148 .Times(tries + 2)
149 .WillOnce(Return(false))
150 .WillOnce(Return(false))
151 .WillOnce(Return(false))
152 .WillOnce(Return(false))
153 .WillOnce(Return(true));
154
155 {
156 InSequence dummy;
157 EXPECT_CALL(*utils, kill(kDummyPid, SIGTERM))
158 .Times(tries)
159 .WillRepeatedly(Return(0));
160 EXPECT_CALL(*utils, kill(kDummyPid, SIGKILL))
161 .Times(1)
162 .WillOnce(Return(0));
32 } 163 }
33 }; 164
34 165 manager.CleanupChildren(tries);
35 class ThrowingJob : public ChildJob { 166 }
36 bool ShouldRun() { return false; }
37 void Run() { EXPECT_TRUE(false) << "Job should never run!"; }
38 void Toggle() {}
39 };
40
41 /*
42 TEST(SessionManagerTest, NoLoopTest) {
43 ChildJob* job = new ThrowingJob;
44 login_manager::SessionManager manager(NULL,
45 job, // manager takes ownership
46 false);
47 manager.LoopChrome("");
48 }
49 */
50
51 class RunEnJob : public ChildJob {
52 public:
53 RunEnJob(int desired_runs)
54 : desired_runs_(desired_runs),
55 num_loops_(0) {
56 }
57 bool ShouldRun() {
58 ++num_loops_;
59 if (num_loops_ >= desired_runs_) {
60 return false;
61 } else {
62 return true;
63 }
64 }
65 void Toggle() {}
66 int num_loops() { return num_loops_; }
67 private:
68 const int desired_runs_;
69 int num_loops_;
70 };
71
72 class CleanExitJob : public RunEnJob {
73 public:
74 CleanExitJob(int runs) : RunEnJob(runs) {}
75 void Run() { exit(0); }
76 };
77
78 class BadExitJob : public RunEnJob {
79 public:
80 BadExitJob(int runs) : RunEnJob(runs) {}
81 void Run() { exit(1); }
82 };
83
84 TEST(SessionManagerTest, CleanExitTest) {
85 CleanExitJob* job = new CleanExitJob(1);
86 login_manager::SessionManagerService manager(job, // manager takes ownership
87 true);
88 manager.Run();
89 EXPECT_EQ(1, job->num_loops());
90 }
91
92 TEST(SessionManagerTest, BadExitTest) {
93 BadExitJob* job = new BadExitJob(1);
94 login_manager::SessionManagerService manager(job, // manager takes ownership
95 true);
96 manager.Run();
97 EXPECT_EQ(1, job->num_loops());
98 }
99
100 TEST(SessionManagerTest, MultiRunTest) {
101 int runs = 3;
102 CleanExitJob* job = new CleanExitJob(runs);
103 login_manager::SessionManagerService manager(job, // manager takes ownership
104 true);
105 manager.Run();
106 EXPECT_EQ(3, job->num_loops());
107 }
108
109 class EnforceToggleJob : public ChildJob {
110 public:
111 EnforceToggleJob() : was_toggled_(false) {}
112 ~EnforceToggleJob() { EXPECT_TRUE(was_toggled_); }
113 bool ShouldRun() { return true; }
114 void Run() { }
115 void Toggle() { EXPECT_FALSE(was_toggled_); was_toggled_ = true; }
116 private:
117 bool was_toggled_;
118 };
119 167
120 TEST(SessionManagerTest, StartSessionTest) { 168 TEST(SessionManagerTest, StartSessionTest) {
121 ChildJob* job = new EnforceToggleJob; 169 MockChildJob* job = new MockChildJob;
122 login_manager::SessionManagerService manager(job); // manager takes ownership 170 login_manager::SessionManagerService manager(job); // manager takes ownership
171 manager.set_exit_on_child_done(true);
172
173 EXPECT_CALL(*job, ShouldRun())
174 .WillRepeatedly(Return(true));
175 EXPECT_CALL(*job, Toggle())
176 .Times(1);
177
123 gboolean out; 178 gboolean out;
124 manager.StartSession(NULL, NULL, &out, NULL); 179 gchar email[] = "user@somewhere";
180 gchar nothing[] = "";
181 manager.StartSession(email, nothing, &out, NULL);
125 } 182 }
126 183
127 TEST(SessionManagerTest, StopSessionTest) { 184 TEST(SessionManagerTest, StopSessionTest) {
128 ChildJob* job = new EnforceToggleJob; 185 MockChildJob* job = new MockChildJob;
129 login_manager::SessionManagerService manager(job); // manager takes ownership 186 login_manager::SessionManagerService manager(job); // manager takes ownership
187 manager.set_exit_on_child_done(true);
188
189 EXPECT_CALL(*job, ShouldRun())
190 .WillRepeatedly(Return(true));
191 EXPECT_CALL(*job, Toggle())
192 .Times(1);
193
130 gboolean out; 194 gboolean out;
131 manager.StopSession(NULL, &out, NULL); 195 gchar nothing[] = "";
132 } 196 manager.StopSession(nothing, &out, NULL);
197 }
198
199 TEST(SessionManagerTest, EmailAddressTest) {
200 const char valid[] = "user@somewhere";
201 EXPECT_TRUE(login_manager::SessionManagerService::ValidateEmail(valid));
202 }
203
204 TEST(SessionManagerTest, EmailAddressNonAsciiTest) {
205 char invalid[4] = "a@m";
206 invalid[2] = 254;
207 EXPECT_FALSE(login_manager::SessionManagerService::ValidateEmail(invalid));
208 }
209
210 TEST(SessionManagerTest, EmailAddressNoAtTest) {
211 const char no_at[] = "user";
212 EXPECT_FALSE(login_manager::SessionManagerService::ValidateEmail(no_at));
213 }
214
215 TEST(SessionManagerTest, EmailAddressTooMuchAtTest) {
216 const char extra_at[] = "user@what@where";
217 EXPECT_FALSE(login_manager::SessionManagerService::ValidateEmail(extra_at));
218 }
219
133 220
134 } // namespace login_manager 221 } // namespace login_manager
OLDNEW
« 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