1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "base/android/application_status_listener.h"
7 #include "base/run_loop.h"
8 #include "base/synchronization/waitable_event.h"
9 #include "chrome/browser/metrics/thread_watcher.h"
10 #include "chrome/browser/metrics/thread_watcher_android.h"
11 #include "content/public/test/test_browser_thread.h"
12 #include "testing/gtest/include/gtest/gtest.h"
14 using content::BrowserThread
;
17 void OnThreadWatcherTask(base::WaitableEvent
* event
) {
21 void PostAndWaitForWatchdogThread(base::WaitableEvent
* event
) {
22 WatchDogThread::PostDelayedTask(
24 base::Bind(&OnThreadWatcherTask
, event
),
25 base::TimeDelta::FromSeconds(0));
27 EXPECT_TRUE(event
->TimedWait(base::TimeDelta::FromSeconds(1)));
30 void NotifyApplicationStateChange(base::android::ApplicationState state
) {
31 base::WaitableEvent
watchdog_thread_event(false, false);
33 base::android::ApplicationStatusListener::NotifyApplicationStateChange(state
);
34 base::RunLoop().RunUntilIdle();
36 PostAndWaitForWatchdogThread(&watchdog_thread_event
);
41 TEST(ThreadWatcherAndroidTest
, ApplicationStatusNotification
) {
42 // Do not delay the ThreadWatcherList initialization for this test.
43 ThreadWatcherList::g_initialize_delay_seconds
= 0;
45 base::MessageLoopForUI message_loop_for_ui
;
46 content::TestBrowserThread
ui_thread(BrowserThread::UI
, &message_loop_for_ui
);
49 scoped_ptr
<WatchDogThread
> watchdog_thread_(new WatchDogThread());
50 watchdog_thread_
->Start();
52 EXPECT_FALSE(ThreadWatcherList::g_thread_watcher_list_
);
55 // Register, and notify the application has just started,
56 // and ensure the thread watcher list is created.
57 ThreadWatcherAndroid::RegisterApplicationStatusListener();
58 ThreadWatcherList::StartWatchingAll(*base::CommandLine::ForCurrentProcess());
59 NotifyApplicationStateChange(
60 base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES
);
61 EXPECT_TRUE(ThreadWatcherList::g_thread_watcher_list_
);
63 // Notify the application has been stopped, and ensure the thread watcher list
64 // has been destroyed.
65 NotifyApplicationStateChange(
66 base::android::APPLICATION_STATE_HAS_STOPPED_ACTIVITIES
);
67 EXPECT_FALSE(ThreadWatcherList::g_thread_watcher_list_
);
69 // And again the last transition, STOPPED -> STARTED.
70 NotifyApplicationStateChange(
71 base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES
);
72 EXPECT_TRUE(ThreadWatcherList::g_thread_watcher_list_
);