summaryrefslogtreecommitdiffstats
path: root/chrome/test/thread_observer_helper.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/test/thread_observer_helper.h')
-rw-r--r--chrome/test/thread_observer_helper.h70
1 files changed, 70 insertions, 0 deletions
diff --git a/chrome/test/thread_observer_helper.h b/chrome/test/thread_observer_helper.h
new file mode 100644
index 0000000..b8ccc04
--- /dev/null
+++ b/chrome/test/thread_observer_helper.h
@@ -0,0 +1,70 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_TEST_THREAD_OBSERVER_HELPER_H__
+#define CHROME_TEST_THREAD_OBSERVER_HELPER_H__
+
+#include "base/ref_counted.h"
+#include "base/waitable_event.h"
+#include "chrome/browser/chrome_thread.h"
+#include "chrome/common/notification_observer_mock.h"
+#include "chrome/common/notification_registrar.h"
+#include "chrome/common/notification_service.h"
+
+// Helper class to add and remove observers on a non-UI thread from
+// the UI thread.
+template <class T, typename Traits>
+class ThreadObserverHelper : public base::RefCountedThreadSafe<T, Traits> {
+ public:
+ explicit ThreadObserverHelper(ChromeThread::ID id)
+ : id_(id), done_event_(false, false) {}
+
+ void Init() {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+ ChromeThread::PostTask(
+ id_,
+ FROM_HERE,
+ NewRunnableMethod(this, &ThreadObserverHelper::RegisterObserversTask));
+ done_event_.Wait();
+ }
+
+ virtual ~ThreadObserverHelper() {
+ DCHECK(ChromeThread::CurrentlyOn(id_));
+ registrar_.RemoveAll();
+ }
+
+ NotificationObserverMock* observer() {
+ return &observer_;
+ }
+
+ protected:
+ friend class base::RefCountedThreadSafe<T>;
+
+ virtual void RegisterObservers() = 0;
+
+ NotificationRegistrar registrar_;
+ NotificationObserverMock observer_;
+
+ private:
+ void RegisterObserversTask() {
+ DCHECK(ChromeThread::CurrentlyOn(id_));
+ RegisterObservers();
+ done_event_.Signal();
+ }
+
+ ChromeThread::ID id_;
+ base::WaitableEvent done_event_;
+};
+
+class DBThreadObserverHelper;
+typedef ThreadObserverHelper<
+ DBThreadObserverHelper,
+ ChromeThread::DeleteOnDBThread> DBThreadObserverHelperBase;
+
+class DBThreadObserverHelper : public DBThreadObserverHelperBase {
+ public:
+ DBThreadObserverHelper() : DBThreadObserverHelperBase(ChromeThread::DB) {}
+};
+
+#endif // CHROME_TEST_THREAD_OBSERVER_HELPER_H__