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
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_SYNC_PROFILE_SYNC_TEST_UTIL_H_
6#define CHROME_BROWSER_SYNC_PROFILE_SYNC_TEST_UTIL_H_
7#pragma once
8
9#include <string>
10
11#include "base/memory/ref_counted.h"
12#include "base/memory/scoped_ptr.h"
13#include "base/message_loop.h"
14#include "base/synchronization/waitable_event.h"
15#include "chrome/browser/sync/profile_sync_service_observer.h"
16#include "content/browser/browser_thread.h"
17#include "content/common/notification_service.h"
18#include "content/common/notification_source.h"
19#include "content/common/notification_type.h"
20#include "testing/gmock/include/gmock/gmock.h"
21
22namespace base {
23class Thread;
24}
25
26ACTION_P(Notify, type) {
27  NotificationService::current()->Notify(type,
28                                         NotificationService::AllSources(),
29                                         NotificationService::NoDetails());
30}
31
32ACTION(QuitUIMessageLoop) {
33  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
34  MessageLoop::current()->Quit();
35}
36
37class ProfileSyncServiceObserverMock : public ProfileSyncServiceObserver {
38 public:
39  ProfileSyncServiceObserverMock();
40  virtual ~ProfileSyncServiceObserverMock();
41
42  MOCK_METHOD0(OnStateChanged, void());
43};
44
45class ThreadNotificationService
46    : public base::RefCountedThreadSafe<ThreadNotificationService> {
47 public:
48  explicit ThreadNotificationService(base::Thread* notification_thread);
49
50  void Init();
51  void TearDown();
52
53 private:
54  friend class base::RefCountedThreadSafe<ThreadNotificationService>;
55  virtual ~ThreadNotificationService();
56
57  void InitTask();
58  void TearDownTask();
59
60  base::WaitableEvent done_event_;
61  base::Thread* notification_thread_;
62  scoped_ptr<NotificationService> service_;
63};
64
65class ThreadNotifier :  // NOLINT
66    public base::RefCountedThreadSafe<ThreadNotifier> {
67 public:
68  explicit ThreadNotifier(base::Thread* notify_thread);
69
70  void Notify(NotificationType type, const NotificationDetails& details);
71
72  void Notify(NotificationType type,
73              const NotificationSource& source,
74              const NotificationDetails& details);
75
76 private:
77  friend class base::RefCountedThreadSafe<ThreadNotifier>;
78  virtual ~ThreadNotifier();
79
80  void NotifyTask(NotificationType type,
81                  const NotificationSource& source,
82                  const NotificationDetails& details);
83
84  base::WaitableEvent done_event_;
85  base::Thread* notify_thread_;
86};
87
88#endif  // CHROME_BROWSER_SYNC_PROFILE_SYNC_TEST_UTIL_H_
89