Index: chrome/browser/sync/notifier/server_notifier_thread_unittest.cc |
diff --git a/chrome/browser/sync/notifier/server_notifier_thread_unittest.cc b/chrome/browser/sync/notifier/server_notifier_thread_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..416ffe56641e2ca29e74a3073c5c7ee9666e6f04 |
--- /dev/null |
+++ b/chrome/browser/sync/notifier/server_notifier_thread_unittest.cc |
@@ -0,0 +1,148 @@ |
+// Copyright (c) 2010 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. |
+ |
+#include <string> |
+ |
+#include "base/compiler_specific.h" |
+#include "base/message_loop.h" |
+#include "base/scoped_ptr.h" |
+#include "base/task.h" |
+#include "chrome/browser/sync/notifier/server_notifier_thread.h" |
+#include "chrome/browser/sync/notifier/state_writer.h" |
+#include "jingle/notifier/base/fake_base_task.h" |
+#include "jingle/notifier/base/notifier_options.h" |
+#include "talk/xmpp/xmppclientsettings.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace sync_notifier { |
+ |
+class FakeServerNotifierThread : public ServerNotifierThread { |
+ public: |
+ FakeServerNotifierThread() |
+ : ServerNotifierThread(notifier::NotifierOptions(), "fake state", |
+ ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} |
+ |
+ virtual ~FakeServerNotifierThread() {} |
+ |
+ virtual void Start() { |
+ DCHECK_EQ(MessageLoop::current(), parent_message_loop_); |
+ ServerNotifierThread::Start(); |
+ worker_message_loop()->PostTask( |
+ FROM_HERE, |
+ NewRunnableMethod(this, |
+ &FakeServerNotifierThread::InitFakes)); |
+ } |
+ |
+ virtual void Logout() { |
+ DCHECK_EQ(MessageLoop::current(), parent_message_loop_); |
+ worker_message_loop()->PostTask( |
+ FROM_HERE, |
+ NewRunnableMethod(this, |
+ &FakeServerNotifierThread::DestroyFakes)); |
+ ServerNotifierThread::Logout(); |
+ } |
+ |
+ // We prevent the real connection attempt from happening and use |
+ // SimulateConnection()/SimulateDisconnection() instead. |
+ virtual void Login(const buzz::XmppClientSettings& settings) { |
+ DCHECK_EQ(MessageLoop::current(), parent_message_loop_); |
+ } |
+ |
+ // We pass ourselves as the StateWriter in the constructor, so shim |
+ // out WriteState() to prevent an infinite loop. |
+ virtual void WriteState(const std::string& state) { |
+ DCHECK_EQ(MessageLoop::current(), worker_message_loop()); |
+ } |
+ |
+ void SimulateConnect() { |
+ DCHECK_EQ(MessageLoop::current(), parent_message_loop_); |
+ worker_message_loop()->PostTask( |
+ FROM_HERE, |
+ NewRunnableMethod(this, |
+ &FakeServerNotifierThread::DoSimulateConnect)); |
+ } |
+ |
+ void SimulateDisconnect() { |
+ DCHECK_EQ(MessageLoop::current(), parent_message_loop_); |
+ worker_message_loop()->PostTask( |
+ FROM_HERE, |
+ NewRunnableMethod(this, |
+ &FakeServerNotifierThread::DoSimulateDisconnect)); |
+ } |
+ |
+ private: |
+ void InitFakes() { |
+ DCHECK_EQ(MessageLoop::current(), worker_message_loop()); |
+ fake_base_task_.reset(new notifier::FakeBaseTask()); |
+ } |
+ |
+ void DestroyFakes() { |
+ DCHECK_EQ(MessageLoop::current(), worker_message_loop()); |
+ fake_base_task_.reset(); |
+ } |
+ |
+ void DoSimulateConnect() { |
+ DCHECK_EQ(MessageLoop::current(), worker_message_loop()); |
+ OnConnect(fake_base_task_->AsWeakPtr()); |
+ } |
+ |
+ void DoSimulateDisconnect() { |
+ DCHECK_EQ(MessageLoop::current(), worker_message_loop()); |
+ OnDisconnect(); |
+ } |
+ |
+ // Used only on the worker thread. |
+ scoped_ptr<notifier::FakeBaseTask> fake_base_task_; |
+}; |
+ |
+} // namespace sync_notifier |
+ |
+DISABLE_RUNNABLE_METHOD_REFCOUNT(sync_notifier::FakeServerNotifierThread); |
+ |
+namespace sync_notifier { |
+ |
+namespace { |
+ |
+class ServerNotifierThreadTest : public testing::Test { |
+ protected: |
+ MessageLoop message_loop_; |
+}; |
+ |
+TEST_F(ServerNotifierThreadTest, Basic) { |
+ FakeServerNotifierThread server_notifier_thread; |
+ |
+ server_notifier_thread.Start(); |
+ server_notifier_thread.Login(buzz::XmppClientSettings()); |
+ server_notifier_thread.SimulateConnect(); |
+ server_notifier_thread.ListenForUpdates(); |
+ server_notifier_thread.SubscribeForUpdates(std::vector<std::string>()); |
+ server_notifier_thread.Logout(); |
+} |
+ |
+TEST_F(ServerNotifierThreadTest, DisconnectBeforeListen) { |
+ FakeServerNotifierThread server_notifier_thread; |
+ |
+ server_notifier_thread.Start(); |
+ server_notifier_thread.Login(buzz::XmppClientSettings()); |
+ server_notifier_thread.ListenForUpdates(); |
+ server_notifier_thread.SubscribeForUpdates(std::vector<std::string>()); |
+ server_notifier_thread.Logout(); |
+} |
+ |
+TEST_F(ServerNotifierThreadTest, Disconnected) { |
+ FakeServerNotifierThread server_notifier_thread; |
+ |
+ server_notifier_thread.Start(); |
+ server_notifier_thread.Login(buzz::XmppClientSettings()); |
+ server_notifier_thread.SimulateConnect(); |
+ server_notifier_thread.SimulateDisconnect(); |
+ server_notifier_thread.ListenForUpdates(); |
+ server_notifier_thread.SubscribeForUpdates(std::vector<std::string>()); |
+ server_notifier_thread.Logout(); |
+} |
+ |
+} // namespace |
+ |
+} // namespace sync_notifier |