OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #if 0 | |
6 | |
7 #include "base/basictypes.h" | 5 #include "base/basictypes.h" |
8 #include "base/logging.h" | 6 #include "base/logging.h" |
9 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
10 #include "base/message_loop_proxy.h" | 8 #include "base/message_loop_proxy.h" |
11 #include "base/scoped_ptr.h" | 9 #include "base/scoped_ptr.h" |
12 #include "base/synchronization/condition_variable.h" | 10 #include "base/synchronization/condition_variable.h" |
13 #include "base/synchronization/lock.h" | 11 #include "base/synchronization/lock.h" |
14 #include "base/threading/platform_thread.h" | 12 #include "base/threading/platform_thread.h" |
15 #include "base/time.h" | 13 #include "base/time.h" |
| 14 #include "build/build_config.h" |
16 #include "chrome/browser/metrics/thread_watcher.h" | 15 #include "chrome/browser/metrics/thread_watcher.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
18 #include "testing/platform_test.h" | 17 #include "testing/platform_test.h" |
19 | 18 |
20 using base::TimeDelta; | 19 using base::TimeDelta; |
21 using base::TimeTicks; | 20 using base::TimeTicks; |
22 | 21 |
23 enum State { | 22 enum State { |
24 INITIALIZED, // Created ThreadWatch object. | 23 INITIALIZED, // Created ThreadWatch object. |
25 ACTIVATED, // Thread watching activated. | 24 ACTIVATED, // Thread watching activated. |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 check_response_state_ = FAILED; | 138 check_response_state_ = FAILED; |
140 } | 139 } |
141 } | 140 } |
142 // Broadcast to indicate we have checked responsiveness of the thread that | 141 // Broadcast to indicate we have checked responsiveness of the thread that |
143 // is watched. | 142 // is watched. |
144 state_changed_.Broadcast(); | 143 state_changed_.Broadcast(); |
145 return responsive; | 144 return responsive; |
146 } | 145 } |
147 | 146 |
148 void VeryLongMethod(TimeDelta wait_time) { | 147 void VeryLongMethod(TimeDelta wait_time) { |
149 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::WATCHDOG)); | 148 DCHECK(!WatchDogThread::CurrentlyOnWatchDogThread()); |
150 TimeTicks end_time = TimeTicks::Now() + wait_time; | 149 TimeTicks end_time = TimeTicks::Now() + wait_time; |
151 { | 150 { |
152 base::AutoLock auto_lock(custom_lock_); | 151 base::AutoLock auto_lock(custom_lock_); |
153 while (wait_state_ != STOPPED_WAITING && TimeTicks::Now() < end_time) { | 152 while (wait_state_ != STOPPED_WAITING && TimeTicks::Now() < end_time) { |
154 TimeDelta state_change_wait_time = end_time - TimeTicks::Now(); | 153 TimeDelta state_change_wait_time = end_time - TimeTicks::Now(); |
155 // LOG(INFO) << "In VeryLongMethod: thread_name_: " << thread_name_ << | 154 // LOG(INFO) << "In VeryLongMethod: thread_name_: " << thread_name_ << |
156 // " wait:" << state_change_wait_time.InMilliseconds() << | 155 // " wait:" << state_change_wait_time.InMilliseconds() << |
157 // " wait_state_:" << wait_state_; | 156 // " wait_state_:" << wait_state_; |
158 state_changed_.TimedWait(state_change_wait_time); | 157 state_changed_.TimedWait(state_change_wait_time); |
159 } | 158 } |
160 } | 159 } |
161 } | 160 } |
162 | 161 |
163 State WaitForStateChange(const TimeDelta& wait_time, State expected_state) { | 162 State WaitForStateChange(const TimeDelta& wait_time, State expected_state) { |
164 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::WATCHDOG)); | 163 DCHECK(!WatchDogThread::CurrentlyOnWatchDogThread()); |
165 UpdateWaitState(STARTED_WAITING); | 164 UpdateWaitState(STARTED_WAITING); |
166 | 165 |
167 State exit_state; | 166 State exit_state; |
168 // Keep the thread that is running the tests waiting until ThreadWatcher | 167 // Keep the thread that is running the tests waiting until ThreadWatcher |
169 // object's state changes to the expected_state or until wait_time elapses. | 168 // object's state changes to the expected_state or until wait_time elapses. |
170 for (int i = 0; i < 3; ++i) { | 169 for (int i = 0; i < 3; ++i) { |
171 TimeTicks end_time = TimeTicks::Now() + wait_time; | 170 TimeTicks end_time = TimeTicks::Now() + wait_time; |
172 { | 171 { |
173 base::AutoLock auto_lock(custom_lock_); | 172 base::AutoLock auto_lock(custom_lock_); |
174 while (thread_watcher_state_ != expected_state && | 173 while (thread_watcher_state_ != expected_state && |
(...skipping 14 matching lines...) Expand all Loading... |
189 } | 188 } |
190 // LOG(INFO) << "In WaitForStateChange: thread_name_: " << thread_name_ << | 189 // LOG(INFO) << "In WaitForStateChange: thread_name_: " << thread_name_ << |
191 // " expected_state: " << expected_state << | 190 // " expected_state: " << expected_state << |
192 // " exit_state:" << exit_state; | 191 // " exit_state:" << exit_state; |
193 UpdateWaitState(STOPPED_WAITING); | 192 UpdateWaitState(STOPPED_WAITING); |
194 return exit_state; | 193 return exit_state; |
195 } | 194 } |
196 | 195 |
197 CheckResponseState WaitForCheckResponse(const TimeDelta& wait_time, | 196 CheckResponseState WaitForCheckResponse(const TimeDelta& wait_time, |
198 CheckResponseState expected_state) { | 197 CheckResponseState expected_state) { |
199 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::WATCHDOG)); | 198 DCHECK(!WatchDogThread::CurrentlyOnWatchDogThread()); |
200 UpdateWaitState(STARTED_WAITING); | 199 UpdateWaitState(STARTED_WAITING); |
201 | 200 |
202 CheckResponseState exit_state; | 201 CheckResponseState exit_state; |
203 // Keep the thread that is running the tests waiting until ThreadWatcher | 202 // Keep the thread that is running the tests waiting until ThreadWatcher |
204 // object's check_response_state_ changes to the expected_state or until | 203 // object's check_response_state_ changes to the expected_state or until |
205 // wait_time elapses. | 204 // wait_time elapses. |
206 for (int i = 0; i < 3; ++i) { | 205 for (int i = 0; i < 3; ++i) { |
207 TimeTicks end_time = TimeTicks::Now() + wait_time; | 206 TimeTicks end_time = TimeTicks::Now() + wait_time; |
208 { | 207 { |
209 base::AutoLock auto_lock(custom_lock_); | 208 base::AutoLock auto_lock(custom_lock_); |
(...skipping 28 matching lines...) Expand all Loading... |
238 static const TimeDelta kSleepTime; | 237 static const TimeDelta kSleepTime; |
239 static const TimeDelta kUnresponsiveTime; | 238 static const TimeDelta kUnresponsiveTime; |
240 static const BrowserThread::ID io_thread_id; | 239 static const BrowserThread::ID io_thread_id; |
241 static const std::string io_thread_name; | 240 static const std::string io_thread_name; |
242 static const BrowserThread::ID webkit_thread_id; | 241 static const BrowserThread::ID webkit_thread_id; |
243 static const std::string webkit_thread_name; | 242 static const std::string webkit_thread_name; |
244 CustomThreadWatcher* io_watcher_; | 243 CustomThreadWatcher* io_watcher_; |
245 CustomThreadWatcher* webkit_watcher_; | 244 CustomThreadWatcher* webkit_watcher_; |
246 | 245 |
247 ThreadWatcherTest() { | 246 ThreadWatcherTest() { |
248 } | |
249 | |
250 protected: | |
251 virtual void SetUp() { | |
252 webkit_thread_.reset(new BrowserThread(BrowserThread::WEBKIT)); | 247 webkit_thread_.reset(new BrowserThread(BrowserThread::WEBKIT)); |
253 io_thread_.reset(new BrowserThread(BrowserThread::IO)); | 248 io_thread_.reset(new BrowserThread(BrowserThread::IO)); |
254 watchdog_thread_.reset(new BrowserThread(BrowserThread::WATCHDOG)); | 249 watchdog_thread_.reset(new WatchDogThread()); |
255 webkit_thread_->Start(); | 250 webkit_thread_->Start(); |
256 io_thread_->Start(); | 251 io_thread_->Start(); |
257 watchdog_thread_->Start(); | 252 watchdog_thread_->Start(); |
258 | 253 |
259 // Setup the registry for thread watchers. | 254 // Setup the registry for thread watchers. |
260 thread_watcher_list_ = new ThreadWatcherList(); | 255 thread_watcher_list_ = new ThreadWatcherList(); |
261 | 256 |
262 // Create thread watcher object for the IO thread. | 257 // Create thread watcher object for the IO thread. |
263 io_watcher_ = new CustomThreadWatcher(io_thread_id, io_thread_name, | 258 io_watcher_ = new CustomThreadWatcher(io_thread_id, io_thread_name, |
264 kSleepTime, kUnresponsiveTime); | 259 kSleepTime, kUnresponsiveTime); |
265 | 260 |
266 // Create thread watcher object for the WEBKIT thread. | 261 // Create thread watcher object for the WEBKIT thread. |
267 webkit_watcher_ = new CustomThreadWatcher( | 262 webkit_watcher_ = new CustomThreadWatcher( |
268 webkit_thread_id, webkit_thread_name, kSleepTime, kUnresponsiveTime); | 263 webkit_thread_id, webkit_thread_name, kSleepTime, kUnresponsiveTime); |
269 } | 264 } |
270 | 265 |
271 virtual void TearDown() { | 266 ~ThreadWatcherTest() { |
272 // io_thread_->Stop(); | 267 // io_thread_->Stop(); |
273 // webkit_thread_->Stop(); | 268 // webkit_thread_->Stop(); |
274 // watchdog_thread_->Stop(); | 269 // watchdog_thread_->Stop(); |
275 io_thread_.reset(); | 270 io_thread_.reset(); |
276 webkit_thread_.reset(); | 271 webkit_thread_.reset(); |
277 watchdog_thread_.reset(); | 272 watchdog_thread_.reset(); |
278 delete thread_watcher_list_; | 273 delete thread_watcher_list_; |
279 } | 274 } |
280 | 275 |
281 private: | 276 private: |
282 scoped_ptr<BrowserThread> webkit_thread_; | 277 scoped_ptr<BrowserThread> webkit_thread_; |
283 scoped_ptr<BrowserThread> io_thread_; | 278 scoped_ptr<BrowserThread> io_thread_; |
284 scoped_ptr<BrowserThread> watchdog_thread_; | 279 scoped_ptr<WatchDogThread> watchdog_thread_; |
285 ThreadWatcherList* thread_watcher_list_; | 280 ThreadWatcherList* thread_watcher_list_; |
286 }; | 281 }; |
287 | 282 |
288 // Define static constants. | 283 // Define static constants. |
289 const TimeDelta ThreadWatcherTest::kSleepTime = | 284 const TimeDelta ThreadWatcherTest::kSleepTime = |
290 TimeDelta::FromMilliseconds(50); | 285 TimeDelta::FromMilliseconds(50); |
291 const TimeDelta ThreadWatcherTest::kUnresponsiveTime = | 286 const TimeDelta ThreadWatcherTest::kUnresponsiveTime = |
292 TimeDelta::FromMilliseconds(500); | 287 TimeDelta::FromMilliseconds(500); |
293 const BrowserThread::ID ThreadWatcherTest::io_thread_id = BrowserThread::IO; | 288 const BrowserThread::ID ThreadWatcherTest::io_thread_id = BrowserThread::IO; |
294 const std::string ThreadWatcherTest::io_thread_name = "IO"; | 289 const std::string ThreadWatcherTest::io_thread_name = "IO"; |
(...skipping 17 matching lines...) Expand all Loading... |
312 // Check ThreadWatcher object of watched WEBKIT thread has correct data. | 307 // Check ThreadWatcher object of watched WEBKIT thread has correct data. |
313 EXPECT_EQ(webkit_thread_id, webkit_watcher_->thread_id()); | 308 EXPECT_EQ(webkit_thread_id, webkit_watcher_->thread_id()); |
314 EXPECT_EQ(webkit_thread_name, webkit_watcher_->thread_name()); | 309 EXPECT_EQ(webkit_thread_name, webkit_watcher_->thread_name()); |
315 EXPECT_EQ(kSleepTime, webkit_watcher_->sleep_time()); | 310 EXPECT_EQ(kSleepTime, webkit_watcher_->sleep_time()); |
316 EXPECT_EQ(kUnresponsiveTime, webkit_watcher_->unresponsive_time()); | 311 EXPECT_EQ(kUnresponsiveTime, webkit_watcher_->unresponsive_time()); |
317 EXPECT_FALSE(webkit_watcher_->active()); | 312 EXPECT_FALSE(webkit_watcher_->active()); |
318 } | 313 } |
319 | 314 |
320 // Test ActivateThreadWatching and DeActivateThreadWatching of IO thread. This | 315 // Test ActivateThreadWatching and DeActivateThreadWatching of IO thread. This |
321 // method also checks that pong message was sent by the watched thread and pong | 316 // method also checks that pong message was sent by the watched thread and pong |
322 // message was received by the WATCHDOG thread. It also checks that | 317 // message was received by the WatchDogThread. It also checks that |
323 // OnCheckResponsiveness has verified the ping-pong mechanism and the watched | 318 // OnCheckResponsiveness has verified the ping-pong mechanism and the watched |
324 // thread is not hung. | 319 // thread is not hung. |
325 TEST_F(ThreadWatcherTest, ThreadResponding) { | 320 TEST_F(ThreadWatcherTest, ThreadResponding) { |
326 TimeTicks time_before_ping = TimeTicks::Now(); | 321 TimeTicks time_before_ping = TimeTicks::Now(); |
327 // Activate watching IO thread. | 322 // Activate watching IO thread. |
328 BrowserThread::PostTask( | 323 MessageLoop* message_loop = WatchDogThread::CurrentMessageLoop(); |
329 BrowserThread::WATCHDOG, | 324 ASSERT_TRUE(message_loop != NULL); |
| 325 message_loop->PostTask( |
330 FROM_HERE, | 326 FROM_HERE, |
331 NewRunnableMethod(io_watcher_, &ThreadWatcher::ActivateThreadWatching)); | 327 NewRunnableMethod(io_watcher_, &ThreadWatcher::ActivateThreadWatching)); |
332 | 328 |
333 // Activate would have started ping/pong messaging. Expect atleast one | 329 // Activate would have started ping/pong messaging. Expect atleast one |
334 // ping/pong messaging sequence to happen. | 330 // ping/pong messaging sequence to happen. |
335 io_watcher_->WaitForStateChange(kSleepTime + TimeDelta::FromMinutes(1), | 331 io_watcher_->WaitForStateChange(kSleepTime + TimeDelta::FromMinutes(1), |
336 RECEIVED_PONG); | 332 RECEIVED_PONG); |
337 io_watcher_->WaitForStateChange(kSleepTime + TimeDelta::FromMinutes(1), | 333 io_watcher_->WaitForStateChange(kSleepTime + TimeDelta::FromMinutes(1), |
338 SENT_PING); | 334 SENT_PING); |
339 EXPECT_GT(io_watcher_->ping_sent_, static_cast<uint64>(0)); | 335 EXPECT_GT(io_watcher_->ping_sent_, static_cast<uint64>(0)); |
340 EXPECT_GT(io_watcher_->pong_received_, static_cast<uint64>(0)); | 336 EXPECT_GT(io_watcher_->pong_received_, static_cast<uint64>(0)); |
341 EXPECT_TRUE(io_watcher_->active()); | 337 EXPECT_TRUE(io_watcher_->active()); |
342 EXPECT_GE(io_watcher_->ping_time_, time_before_ping); | 338 EXPECT_GE(io_watcher_->ping_time_, time_before_ping); |
343 EXPECT_GE(io_watcher_->ping_sequence_number_, static_cast<uint64>(0)); | 339 EXPECT_GE(io_watcher_->ping_sequence_number_, static_cast<uint64>(0)); |
344 | 340 |
345 // Verify watched thread is responding with ping/pong messaging. | 341 // Verify watched thread is responding with ping/pong messaging. |
346 io_watcher_->WaitForCheckResponse( | 342 io_watcher_->WaitForCheckResponse( |
347 kUnresponsiveTime + TimeDelta::FromMinutes(1), SUCCESSFUL); | 343 kUnresponsiveTime + TimeDelta::FromMinutes(1), SUCCESSFUL); |
348 EXPECT_GT(io_watcher_->success_response_, static_cast<uint64>(0)); | 344 EXPECT_GT(io_watcher_->success_response_, static_cast<uint64>(0)); |
349 EXPECT_EQ(io_watcher_->failed_response_, static_cast<uint64>(0)); | 345 EXPECT_EQ(io_watcher_->failed_response_, static_cast<uint64>(0)); |
350 | 346 |
351 // DeActivate thread watching for shutdown. | 347 // DeActivate thread watching for shutdown. |
352 BrowserThread::PostTask( | 348 message_loop = WatchDogThread::CurrentMessageLoop(); |
353 BrowserThread::WATCHDOG, | 349 ASSERT_TRUE(message_loop != NULL); |
| 350 message_loop->PostTask( |
354 FROM_HERE, | 351 FROM_HERE, |
355 NewRunnableMethod(io_watcher_, &ThreadWatcher::DeActivateThreadWatching)); | 352 NewRunnableMethod(io_watcher_, &ThreadWatcher::DeActivateThreadWatching)); |
356 } | 353 } |
357 | 354 |
358 // This test posts a task on watched thread that takes very long time (this is | 355 // This test posts a task on watched thread that takes very long time (this is |
359 // to simulate hanging of watched thread). It then checks for | 356 // to simulate hanging of watched thread). It then checks for |
360 // OnCheckResponsiveness raising an alert (OnCheckResponsiveness returns false | 357 // OnCheckResponsiveness raising an alert (OnCheckResponsiveness returns false |
361 // if the watched thread is not responding). | 358 // if the watched thread is not responding). |
362 TEST_F(ThreadWatcherTest, ThreadNotResponding) { | 359 TEST_F(ThreadWatcherTest, ThreadNotResponding) { |
363 // Simulate hanging of watched thread by making the watched thread wait for a | 360 // Simulate hanging of watched thread by making the watched thread wait for a |
364 // very long time by posting a task on watched thread that keeps it busy. | 361 // very long time by posting a task on watched thread that keeps it busy. |
365 BrowserThread::PostTask( | 362 BrowserThread::PostTask( |
366 io_thread_id, | 363 io_thread_id, |
367 FROM_HERE, | 364 FROM_HERE, |
368 NewRunnableMethod( | 365 NewRunnableMethod( |
369 io_watcher_, | 366 io_watcher_, |
370 &CustomThreadWatcher::VeryLongMethod, | 367 &CustomThreadWatcher::VeryLongMethod, |
371 kUnresponsiveTime * 10)); | 368 kUnresponsiveTime * 10)); |
372 | 369 |
373 // Activate thread watching. | 370 // Activate thread watching. |
374 BrowserThread::PostTask( | 371 MessageLoop* message_loop = WatchDogThread::CurrentMessageLoop(); |
375 BrowserThread::WATCHDOG, | 372 ASSERT_TRUE(message_loop != NULL); |
| 373 message_loop->PostTask( |
376 FROM_HERE, | 374 FROM_HERE, |
377 NewRunnableMethod(io_watcher_, &ThreadWatcher::ActivateThreadWatching)); | 375 NewRunnableMethod(io_watcher_, &ThreadWatcher::ActivateThreadWatching)); |
378 | 376 |
379 // Verify watched thread is not responding for ping messages. | 377 // Verify watched thread is not responding for ping messages. |
380 io_watcher_->WaitForCheckResponse( | 378 io_watcher_->WaitForCheckResponse( |
381 kUnresponsiveTime + TimeDelta::FromMinutes(1), FAILED); | 379 kUnresponsiveTime + TimeDelta::FromMinutes(1), FAILED); |
382 EXPECT_EQ(io_watcher_->success_response_, static_cast<uint64>(0)); | 380 EXPECT_EQ(io_watcher_->success_response_, static_cast<uint64>(0)); |
383 EXPECT_GT(io_watcher_->failed_response_, static_cast<uint64>(0)); | 381 EXPECT_GT(io_watcher_->failed_response_, static_cast<uint64>(0)); |
384 | 382 |
385 // DeActivate thread watching for shutdown. | 383 // DeActivate thread watching for shutdown. |
386 BrowserThread::PostTask( | 384 message_loop = WatchDogThread::CurrentMessageLoop(); |
387 BrowserThread::WATCHDOG, | 385 ASSERT_TRUE(message_loop != NULL); |
| 386 message_loop->PostTask( |
388 FROM_HERE, | 387 FROM_HERE, |
389 NewRunnableMethod(io_watcher_, &ThreadWatcher::DeActivateThreadWatching)); | 388 NewRunnableMethod(io_watcher_, &ThreadWatcher::DeActivateThreadWatching)); |
390 } | 389 } |
391 | 390 |
392 // Test watching of multiple threads with all threads not responding. | 391 // Test watching of multiple threads with all threads not responding. |
393 TEST_F(ThreadWatcherTest, MultipleThreadsResponding) { | 392 TEST_F(ThreadWatcherTest, MultipleThreadsResponding) { |
394 // Check for WEBKIT thread to perform ping/pong messaging. | 393 // Check for WEBKIT thread to perform ping/pong messaging. |
395 BrowserThread::PostTask( | 394 MessageLoop* message_loop = WatchDogThread::CurrentMessageLoop(); |
396 BrowserThread::WATCHDOG, | 395 ASSERT_TRUE(message_loop != NULL); |
| 396 message_loop->PostTask( |
397 FROM_HERE, | 397 FROM_HERE, |
398 NewRunnableMethod( | 398 NewRunnableMethod( |
399 webkit_watcher_, &ThreadWatcher::ActivateThreadWatching)); | 399 webkit_watcher_, &ThreadWatcher::ActivateThreadWatching)); |
| 400 |
400 // Check for IO thread to perform ping/pong messaging. | 401 // Check for IO thread to perform ping/pong messaging. |
401 BrowserThread::PostTask( | 402 message_loop->PostTask( |
402 BrowserThread::WATCHDOG, | |
403 FROM_HERE, | 403 FROM_HERE, |
404 NewRunnableMethod(io_watcher_, &ThreadWatcher::ActivateThreadWatching)); | 404 NewRunnableMethod(io_watcher_, &ThreadWatcher::ActivateThreadWatching)); |
405 | 405 |
406 // Verify WEBKIT thread is responding with ping/pong messaging. | 406 // Verify WEBKIT thread is responding with ping/pong messaging. |
407 webkit_watcher_->WaitForCheckResponse( | 407 webkit_watcher_->WaitForCheckResponse( |
408 kUnresponsiveTime + TimeDelta::FromMinutes(1), SUCCESSFUL); | 408 kUnresponsiveTime + TimeDelta::FromMinutes(1), SUCCESSFUL); |
409 EXPECT_GT(webkit_watcher_->ping_sent_, static_cast<uint64>(0)); | 409 EXPECT_GT(webkit_watcher_->ping_sent_, static_cast<uint64>(0)); |
410 EXPECT_GT(webkit_watcher_->pong_received_, static_cast<uint64>(0)); | 410 EXPECT_GT(webkit_watcher_->pong_received_, static_cast<uint64>(0)); |
411 EXPECT_GE(webkit_watcher_->ping_sequence_number_, static_cast<uint64>(0)); | 411 EXPECT_GE(webkit_watcher_->ping_sequence_number_, static_cast<uint64>(0)); |
412 EXPECT_GT(webkit_watcher_->success_response_, static_cast<uint64>(0)); | 412 EXPECT_GT(webkit_watcher_->success_response_, static_cast<uint64>(0)); |
413 EXPECT_EQ(webkit_watcher_->failed_response_, static_cast<uint64>(0)); | 413 EXPECT_EQ(webkit_watcher_->failed_response_, static_cast<uint64>(0)); |
414 | 414 |
415 // Verify IO thread is responding with ping/pong messaging. | 415 // Verify IO thread is responding with ping/pong messaging. |
416 io_watcher_->WaitForCheckResponse( | 416 io_watcher_->WaitForCheckResponse( |
417 kUnresponsiveTime + TimeDelta::FromMinutes(1), SUCCESSFUL); | 417 kUnresponsiveTime + TimeDelta::FromMinutes(1), SUCCESSFUL); |
418 EXPECT_GT(io_watcher_->ping_sent_, static_cast<uint64>(0)); | 418 EXPECT_GT(io_watcher_->ping_sent_, static_cast<uint64>(0)); |
419 EXPECT_GT(io_watcher_->pong_received_, static_cast<uint64>(0)); | 419 EXPECT_GT(io_watcher_->pong_received_, static_cast<uint64>(0)); |
420 EXPECT_GE(io_watcher_->ping_sequence_number_, static_cast<uint64>(0)); | 420 EXPECT_GE(io_watcher_->ping_sequence_number_, static_cast<uint64>(0)); |
421 EXPECT_GT(io_watcher_->success_response_, static_cast<uint64>(0)); | 421 EXPECT_GT(io_watcher_->success_response_, static_cast<uint64>(0)); |
422 EXPECT_EQ(io_watcher_->failed_response_, static_cast<uint64>(0)); | 422 EXPECT_EQ(io_watcher_->failed_response_, static_cast<uint64>(0)); |
423 | 423 |
424 // DeActivate thread watching for shutdown. | 424 // DeActivate thread watching for shutdown. |
425 BrowserThread::PostTask( | 425 message_loop = WatchDogThread::CurrentMessageLoop(); |
426 BrowserThread::WATCHDOG, | 426 ASSERT_TRUE(message_loop != NULL); |
| 427 message_loop->PostTask( |
427 FROM_HERE, | 428 FROM_HERE, |
428 NewRunnableMethod(io_watcher_, &ThreadWatcher::DeActivateThreadWatching)); | 429 NewRunnableMethod( |
429 BrowserThread::PostTask( | 430 io_watcher_, &ThreadWatcher::DeActivateThreadWatching)); |
430 BrowserThread::WATCHDOG, | 431 |
| 432 message_loop->PostTask( |
431 FROM_HERE, | 433 FROM_HERE, |
432 NewRunnableMethod( | 434 NewRunnableMethod( |
433 webkit_watcher_, &ThreadWatcher::DeActivateThreadWatching)); | 435 webkit_watcher_, &ThreadWatcher::DeActivateThreadWatching)); |
434 } | 436 } |
435 | 437 |
436 // Test watching of multiple threads with one of the threads not responding. | 438 // Test watching of multiple threads with one of the threads not responding. |
437 TEST_F(ThreadWatcherTest, MultipleThreadsNotResponding) { | 439 TEST_F(ThreadWatcherTest, MultipleThreadsNotResponding) { |
438 // Simulate hanging of watched thread by making the watched thread wait for a | 440 // Simulate hanging of watched thread by making the watched thread wait for a |
439 // very long time by posting a task on watched thread that keeps it busy. | 441 // very long time by posting a task on watched thread that keeps it busy. |
440 BrowserThread::PostTask( | 442 BrowserThread::PostTask( |
441 io_thread_id, | 443 io_thread_id, |
442 FROM_HERE, | 444 FROM_HERE, |
443 NewRunnableMethod( | 445 NewRunnableMethod( |
444 io_watcher_, | 446 io_watcher_, |
445 &CustomThreadWatcher::VeryLongMethod, | 447 &CustomThreadWatcher::VeryLongMethod, |
446 kUnresponsiveTime * 10)); | 448 kUnresponsiveTime * 10)); |
447 | 449 |
448 // Activate watching of WEBKIT thread. | 450 // Activate watching of WEBKIT thread. |
449 BrowserThread::PostTask( | 451 MessageLoop* message_loop = WatchDogThread::CurrentMessageLoop(); |
450 BrowserThread::WATCHDOG, | 452 ASSERT_TRUE(message_loop != NULL); |
| 453 message_loop->PostTask( |
451 FROM_HERE, | 454 FROM_HERE, |
452 NewRunnableMethod( | 455 NewRunnableMethod( |
453 webkit_watcher_, &ThreadWatcher::ActivateThreadWatching)); | 456 webkit_watcher_, &ThreadWatcher::ActivateThreadWatching)); |
454 | 457 |
455 // Activate watching of IO thread. | 458 // Activate watching of IO thread. |
456 BrowserThread::PostTask( | 459 message_loop->PostTask( |
457 BrowserThread::WATCHDOG, | |
458 FROM_HERE, | 460 FROM_HERE, |
459 NewRunnableMethod(io_watcher_, &ThreadWatcher::ActivateThreadWatching)); | 461 NewRunnableMethod(io_watcher_, &ThreadWatcher::ActivateThreadWatching)); |
460 | 462 |
461 // Verify WEBKIT thread is responding with ping/pong messaging. | 463 // Verify WEBKIT thread is responding with ping/pong messaging. |
462 webkit_watcher_->WaitForCheckResponse( | 464 webkit_watcher_->WaitForCheckResponse( |
463 kUnresponsiveTime + TimeDelta::FromMinutes(1), SUCCESSFUL); | 465 kUnresponsiveTime + TimeDelta::FromMinutes(1), SUCCESSFUL); |
464 EXPECT_GT(webkit_watcher_->success_response_, static_cast<uint64>(0)); | 466 EXPECT_GT(webkit_watcher_->success_response_, static_cast<uint64>(0)); |
465 EXPECT_EQ(webkit_watcher_->failed_response_, static_cast<uint64>(0)); | 467 EXPECT_EQ(webkit_watcher_->failed_response_, static_cast<uint64>(0)); |
466 | 468 |
467 // Verify IO thread is not responding for ping messages. | 469 // Verify IO thread is not responding for ping messages. |
468 io_watcher_->WaitForCheckResponse( | 470 io_watcher_->WaitForCheckResponse( |
469 kUnresponsiveTime + TimeDelta::FromMinutes(1), FAILED); | 471 kUnresponsiveTime + TimeDelta::FromMinutes(1), FAILED); |
470 EXPECT_EQ(io_watcher_->success_response_, static_cast<uint64>(0)); | 472 EXPECT_EQ(io_watcher_->success_response_, static_cast<uint64>(0)); |
471 EXPECT_GT(io_watcher_->failed_response_, static_cast<uint64>(0)); | 473 EXPECT_GT(io_watcher_->failed_response_, static_cast<uint64>(0)); |
472 | 474 |
473 // DeActivate thread watching for shutdown. | 475 // DeActivate thread watching for shutdown. |
474 BrowserThread::PostTask( | 476 message_loop = WatchDogThread::CurrentMessageLoop(); |
475 BrowserThread::WATCHDOG, | 477 ASSERT_TRUE(message_loop != NULL); |
| 478 message_loop->PostTask( |
476 FROM_HERE, | 479 FROM_HERE, |
477 NewRunnableMethod(io_watcher_, &ThreadWatcher::DeActivateThreadWatching)); | 480 NewRunnableMethod(io_watcher_, &ThreadWatcher::DeActivateThreadWatching)); |
478 BrowserThread::PostTask( | 481 message_loop->PostTask( |
479 BrowserThread::WATCHDOG, | |
480 FROM_HERE, | 482 FROM_HERE, |
481 NewRunnableMethod( | 483 NewRunnableMethod( |
482 webkit_watcher_, &ThreadWatcher::DeActivateThreadWatching)); | 484 webkit_watcher_, &ThreadWatcher::DeActivateThreadWatching)); |
483 } | 485 } |
484 | |
485 #endif // 0 | |
OLD | NEW |