OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium 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 "chrome/browser/process_singleton.h" | 5 #include "chrome/browser/process_singleton.h" |
6 | 6 |
7 #include <sys/types.h> | 7 #include <sys/types.h> |
8 #include <sys/wait.h> | 8 #include <sys/wait.h> |
9 #include <signal.h> | 9 #include <signal.h> |
10 #include <unistd.h> | 10 #include <unistd.h> |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 #define NotifyOtherProcessHostChanged FAILS_NotifyOtherProcessHostChanged | 139 #define NotifyOtherProcessHostChanged FAILS_NotifyOtherProcessHostChanged |
140 #endif | 140 #endif |
141 | 141 |
142 // TODO(james.su@gmail.com): port following tests to Windows. | 142 // TODO(james.su@gmail.com): port following tests to Windows. |
143 // Test success case of NotifyOtherProcess(). | 143 // Test success case of NotifyOtherProcess(). |
144 TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessSuccess) { | 144 TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessSuccess) { |
145 std::string url("about:blank"); | 145 std::string url("about:blank"); |
146 int original_tab_count = GetTabCount(); | 146 int original_tab_count = GetTabCount(); |
147 | 147 |
148 EXPECT_EQ(ProcessSingleton::PROCESS_NOTIFIED, | 148 EXPECT_EQ(ProcessSingleton::PROCESS_NOTIFIED, |
149 NotifyOtherProcess(url, action_timeout_ms())); | 149 NotifyOtherProcess(url, TestTimeouts::action_timeout_ms())); |
150 EXPECT_EQ(original_tab_count + 1, GetTabCount()); | 150 EXPECT_EQ(original_tab_count + 1, GetTabCount()); |
151 EXPECT_EQ(url, GetActiveTabURL().spec()); | 151 EXPECT_EQ(url, GetActiveTabURL().spec()); |
152 } | 152 } |
153 | 153 |
154 // Test failure case of NotifyOtherProcess(). | 154 // Test failure case of NotifyOtherProcess(). |
155 TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessFailure) { | 155 TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessFailure) { |
156 base::ProcessId pid = browser_process_id(); | 156 base::ProcessId pid = browser_process_id(); |
157 | 157 |
158 ASSERT_GE(pid, 1); | 158 ASSERT_GE(pid, 1); |
159 | 159 |
160 // Block the browser process, then it'll be killed by | 160 // Block the browser process, then it'll be killed by |
161 // ProcessSingleton::NotifyOtherProcess(). | 161 // ProcessSingleton::NotifyOtherProcess(). |
162 kill(pid, SIGSTOP); | 162 kill(pid, SIGSTOP); |
163 | 163 |
164 // Wait to make sure the browser process is actually stopped. | 164 // Wait to make sure the browser process is actually stopped. |
165 // It's necessary when running with valgrind. | 165 // It's necessary when running with valgrind. |
166 EXPECT_GE(HANDLE_EINTR(waitpid(pid, 0, WUNTRACED)), 0); | 166 EXPECT_GE(HANDLE_EINTR(waitpid(pid, 0, WUNTRACED)), 0); |
167 | 167 |
168 std::string url("about:blank"); | 168 std::string url("about:blank"); |
169 EXPECT_EQ(ProcessSingleton::PROCESS_NONE, | 169 EXPECT_EQ(ProcessSingleton::PROCESS_NONE, |
170 NotifyOtherProcess(url, action_timeout_ms())); | 170 NotifyOtherProcess(url, TestTimeouts::action_timeout_ms())); |
171 | 171 |
172 // Wait for a while to make sure the browser process is actually killed. | 172 // Wait for a while to make sure the browser process is actually killed. |
173 EXPECT_FALSE(CrashAwareSleep(TestTimeouts::action_timeout_ms())); | 173 EXPECT_FALSE(CrashAwareSleep(TestTimeouts::action_timeout_ms())); |
174 } | 174 } |
175 | 175 |
176 // Test that we don't kill ourselves by accident if a lockfile with the same pid | 176 // Test that we don't kill ourselves by accident if a lockfile with the same pid |
177 // happens to exist. | 177 // happens to exist. |
178 // TODO(mattm): This doesn't really need to be a uitest. (We don't use the | 178 // TODO(mattm): This doesn't really need to be a uitest. (We don't use the |
179 // uitest created browser process, but we do use some uitest provided stuff like | 179 // uitest created browser process, but we do use some uitest provided stuff like |
180 // the user_data_dir and the NotifyOtherProcess function in this file, which | 180 // the user_data_dir and the NotifyOtherProcess function in this file, which |
181 // would have to be duplicated or shared if this test was moved into a | 181 // would have to be duplicated or shared if this test was moved into a |
182 // unittest.) | 182 // unittest.) |
183 TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessNoSuicide) { | 183 TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessNoSuicide) { |
184 // Replace lockfile with one containing our own pid. | 184 // Replace lockfile with one containing our own pid. |
185 EXPECT_EQ(0, unlink(lock_path_.value().c_str())); | 185 EXPECT_EQ(0, unlink(lock_path_.value().c_str())); |
186 std::string symlink_content = StringPrintf( | 186 std::string symlink_content = StringPrintf( |
187 "%s%c%u", | 187 "%s%c%u", |
188 net::GetHostName().c_str(), | 188 net::GetHostName().c_str(), |
189 '-', | 189 '-', |
190 base::GetCurrentProcId()); | 190 base::GetCurrentProcId()); |
191 EXPECT_EQ(0, symlink(symlink_content.c_str(), lock_path_.value().c_str())); | 191 EXPECT_EQ(0, symlink(symlink_content.c_str(), lock_path_.value().c_str())); |
192 | 192 |
193 // Remove socket so that we will not be able to notify the existing browser. | 193 // Remove socket so that we will not be able to notify the existing browser. |
194 EXPECT_EQ(0, unlink(socket_path_.value().c_str())); | 194 EXPECT_EQ(0, unlink(socket_path_.value().c_str())); |
195 | 195 |
196 std::string url("about:blank"); | 196 std::string url("about:blank"); |
197 EXPECT_EQ(ProcessSingleton::PROCESS_NONE, | 197 EXPECT_EQ(ProcessSingleton::PROCESS_NONE, |
198 NotifyOtherProcess(url, action_timeout_ms())); | 198 NotifyOtherProcess(url, TestTimeouts::action_timeout_ms())); |
199 // If we've gotten to this point without killing ourself, the test succeeded. | 199 // If we've gotten to this point without killing ourself, the test succeeded. |
200 } | 200 } |
201 | 201 |
202 // Test that we can still notify a process on the same host even after the | 202 // Test that we can still notify a process on the same host even after the |
203 // hostname changed. | 203 // hostname changed. |
204 TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessHostChanged) { | 204 TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessHostChanged) { |
205 EXPECT_EQ(0, unlink(lock_path_.value().c_str())); | 205 EXPECT_EQ(0, unlink(lock_path_.value().c_str())); |
206 EXPECT_EQ(0, symlink("FAKEFOOHOST-1234", lock_path_.value().c_str())); | 206 EXPECT_EQ(0, symlink("FAKEFOOHOST-1234", lock_path_.value().c_str())); |
207 | 207 |
208 int original_tab_count = GetTabCount(); | 208 int original_tab_count = GetTabCount(); |
209 | 209 |
210 std::string url("about:blank"); | 210 std::string url("about:blank"); |
211 EXPECT_EQ(ProcessSingleton::PROCESS_NOTIFIED, | 211 EXPECT_EQ(ProcessSingleton::PROCESS_NOTIFIED, |
212 NotifyOtherProcess(url, action_timeout_ms())); | 212 NotifyOtherProcess(url, TestTimeouts::action_timeout_ms())); |
213 EXPECT_EQ(original_tab_count + 1, GetTabCount()); | 213 EXPECT_EQ(original_tab_count + 1, GetTabCount()); |
214 EXPECT_EQ(url, GetActiveTabURL().spec()); | 214 EXPECT_EQ(url, GetActiveTabURL().spec()); |
215 } | 215 } |
216 | 216 |
217 // Test that we fail when lock says process is on another host and we can't | 217 // Test that we fail when lock says process is on another host and we can't |
218 // notify it over the socket. | 218 // notify it over the socket. |
219 TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessDifferingHost) { | 219 TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessDifferingHost) { |
220 base::ProcessId pid = browser_process_id(); | 220 base::ProcessId pid = browser_process_id(); |
221 | 221 |
222 ASSERT_GE(pid, 1); | 222 ASSERT_GE(pid, 1); |
223 | 223 |
224 // Kill the browser process, so that it does not respond on the socket. | 224 // Kill the browser process, so that it does not respond on the socket. |
225 kill(pid, SIGKILL); | 225 kill(pid, SIGKILL); |
226 // Wait for a while to make sure the browser process is actually killed. | 226 // Wait for a while to make sure the browser process is actually killed. |
227 EXPECT_FALSE(CrashAwareSleep(TestTimeouts::action_timeout_ms())); | 227 EXPECT_FALSE(CrashAwareSleep(TestTimeouts::action_timeout_ms())); |
228 | 228 |
229 EXPECT_EQ(0, unlink(lock_path_.value().c_str())); | 229 EXPECT_EQ(0, unlink(lock_path_.value().c_str())); |
230 EXPECT_EQ(0, symlink("FAKEFOOHOST-1234", lock_path_.value().c_str())); | 230 EXPECT_EQ(0, symlink("FAKEFOOHOST-1234", lock_path_.value().c_str())); |
231 | 231 |
232 std::string url("about:blank"); | 232 std::string url("about:blank"); |
233 EXPECT_EQ(ProcessSingleton::PROFILE_IN_USE, | 233 EXPECT_EQ(ProcessSingleton::PROFILE_IN_USE, |
234 NotifyOtherProcess(url, action_timeout_ms())); | 234 NotifyOtherProcess(url, TestTimeouts::action_timeout_ms())); |
235 | 235 |
236 ASSERT_EQ(0, unlink(lock_path_.value().c_str())); | 236 ASSERT_EQ(0, unlink(lock_path_.value().c_str())); |
237 } | 237 } |
238 | 238 |
239 // Test that we fail when lock says process is on another host and we can't | 239 // Test that we fail when lock says process is on another host and we can't |
240 // notify it over the socket. | 240 // notify it over the socket. |
241 TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessOrCreate_DifferingHost) { | 241 TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessOrCreate_DifferingHost) { |
242 base::ProcessId pid = browser_process_id(); | 242 base::ProcessId pid = browser_process_id(); |
243 | 243 |
244 ASSERT_GE(pid, 1); | 244 ASSERT_GE(pid, 1); |
245 | 245 |
246 // Kill the browser process, so that it does not respond on the socket. | 246 // Kill the browser process, so that it does not respond on the socket. |
247 kill(pid, SIGKILL); | 247 kill(pid, SIGKILL); |
248 // Wait for a while to make sure the browser process is actually killed. | 248 // Wait for a while to make sure the browser process is actually killed. |
249 EXPECT_FALSE(CrashAwareSleep(TestTimeouts::action_timeout_ms())); | 249 EXPECT_FALSE(CrashAwareSleep(TestTimeouts::action_timeout_ms())); |
250 | 250 |
251 EXPECT_EQ(0, unlink(lock_path_.value().c_str())); | 251 EXPECT_EQ(0, unlink(lock_path_.value().c_str())); |
252 EXPECT_EQ(0, symlink("FAKEFOOHOST-1234", lock_path_.value().c_str())); | 252 EXPECT_EQ(0, symlink("FAKEFOOHOST-1234", lock_path_.value().c_str())); |
253 | 253 |
254 std::string url("about:blank"); | 254 std::string url("about:blank"); |
255 EXPECT_EQ(ProcessSingleton::PROFILE_IN_USE, | 255 EXPECT_EQ(ProcessSingleton::PROFILE_IN_USE, |
256 NotifyOtherProcessOrCreate(url, action_timeout_ms())); | 256 NotifyOtherProcessOrCreate(url, TestTimeouts::action_timeout_ms())); |
257 | 257 |
258 ASSERT_EQ(0, unlink(lock_path_.value().c_str())); | 258 ASSERT_EQ(0, unlink(lock_path_.value().c_str())); |
259 } | 259 } |
260 | 260 |
261 // Test that Create fails when another browser is using the profile directory. | 261 // Test that Create fails when another browser is using the profile directory. |
262 TEST_F(ProcessSingletonLinuxTest, CreateFailsWithExistingBrowser) { | 262 TEST_F(ProcessSingletonLinuxTest, CreateFailsWithExistingBrowser) { |
263 scoped_ptr<ProcessSingleton> process_singleton(CreateProcessSingleton()); | 263 scoped_ptr<ProcessSingleton> process_singleton(CreateProcessSingleton()); |
264 EXPECT_FALSE(process_singleton->Create()); | 264 EXPECT_FALSE(process_singleton->Create()); |
265 } | 265 } |
266 | 266 |
(...skipping 21 matching lines...) Expand all Loading... |
288 // Change the cookie. | 288 // Change the cookie. |
289 EXPECT_EQ(0, unlink(cookie_path_.value().c_str())); | 289 EXPECT_EQ(0, unlink(cookie_path_.value().c_str())); |
290 EXPECT_EQ(0, symlink("INCORRECTCOOKIE", cookie_path_.value().c_str())); | 290 EXPECT_EQ(0, symlink("INCORRECTCOOKIE", cookie_path_.value().c_str())); |
291 | 291 |
292 // Also change the hostname, so the remote does not retry. | 292 // Also change the hostname, so the remote does not retry. |
293 EXPECT_EQ(0, unlink(lock_path_.value().c_str())); | 293 EXPECT_EQ(0, unlink(lock_path_.value().c_str())); |
294 EXPECT_EQ(0, symlink("FAKEFOOHOST-1234", lock_path_.value().c_str())); | 294 EXPECT_EQ(0, symlink("FAKEFOOHOST-1234", lock_path_.value().c_str())); |
295 | 295 |
296 std::string url("about:blank"); | 296 std::string url("about:blank"); |
297 EXPECT_EQ(ProcessSingleton::PROFILE_IN_USE, | 297 EXPECT_EQ(ProcessSingleton::PROFILE_IN_USE, |
298 NotifyOtherProcessOrCreate(url, action_timeout_ms())); | 298 NotifyOtherProcessOrCreate(url, TestTimeouts::action_timeout_ms())); |
299 } | 299 } |
OLD | NEW |