1 // Copyright (c) 2012 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 #include "jingle/notifier/base/weak_xmpp_client.h"
6
7 #include "base/basictypes.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/memory/weak_ptr.h"
10 #include "base/message_loop/message_loop.h"
11 #include "jingle/glue/task_pump.h"
12 #include "talk/base/sigslot.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace notifier {
17
18 namespace {
19
20 class MockXmppDelegate : public sigslot::has_slots<> {
21 public:
~MockXmppDelegate()22 virtual ~MockXmppDelegate() {}
23
24 MOCK_METHOD1(OnStateChange, void(buzz::XmppEngine::State));
25 MOCK_METHOD2(OnInputLog, void(const char*, int));
26 MOCK_METHOD2(OnOutputLog, void(const char*, int));
27 };
28
29 const buzz::XmppEngine::State kState = buzz::XmppEngine::STATE_OPEN;
30 const char kInputLog[] = "input log";
31 const char kOutputLog[] = "output log";
32
33 class WeakXmppClientTest : public testing::Test {
34 protected:
WeakXmppClientTest()35 WeakXmppClientTest() : task_pump_(new jingle_glue::TaskPump()) {}
36
~WeakXmppClientTest()37 virtual ~WeakXmppClientTest() {}
38
ConnectSignals(buzz::XmppClient * xmpp_client)39 void ConnectSignals(buzz::XmppClient* xmpp_client) {
40 xmpp_client->SignalStateChange.connect(
41 &mock_xmpp_delegate_, &MockXmppDelegate::OnStateChange);
42 xmpp_client->SignalLogInput.connect(
43 &mock_xmpp_delegate_, &MockXmppDelegate::OnInputLog);
44 xmpp_client->SignalLogOutput.connect(
45 &mock_xmpp_delegate_, &MockXmppDelegate::OnOutputLog);
46 }
47
ExpectSignalCalls()48 void ExpectSignalCalls() {
49 EXPECT_CALL(mock_xmpp_delegate_, OnStateChange(kState));
50 EXPECT_CALL(mock_xmpp_delegate_,
51 OnInputLog(kInputLog, arraysize(kInputLog)));
52 EXPECT_CALL(mock_xmpp_delegate_,
53 OnOutputLog(kOutputLog, arraysize(kOutputLog)));
54 }
55
RaiseSignals(buzz::XmppClient * xmpp_client)56 void RaiseSignals(buzz::XmppClient* xmpp_client) {
57 xmpp_client->SignalStateChange(kState);
58 xmpp_client->SignalLogInput(kInputLog, arraysize(kInputLog));
59 xmpp_client->SignalLogOutput(kOutputLog, arraysize(kOutputLog));
60 }
61
62 // Needed by TaskPump.
63 base::MessageLoop message_loop_;
64
65 scoped_ptr<jingle_glue::TaskPump> task_pump_;
66 MockXmppDelegate mock_xmpp_delegate_;
67 };
68
TEST_F(WeakXmppClientTest,InvalidationViaInvalidate)69 TEST_F(WeakXmppClientTest, InvalidationViaInvalidate) {
70 ExpectSignalCalls();
71
72 WeakXmppClient* weak_xmpp_client = new WeakXmppClient(task_pump_.get());
73 ConnectSignals(weak_xmpp_client);
74
75 weak_xmpp_client->Start();
76 base::WeakPtr<WeakXmppClient> weak_ptr = weak_xmpp_client->AsWeakPtr();
77 EXPECT_TRUE(weak_ptr.get());
78 RaiseSignals(weak_ptr.get());
79
80 weak_xmpp_client->Invalidate();
81 EXPECT_FALSE(weak_ptr.get());
82 // We know that |weak_xmpp_client| is still valid at this point,
83 // although it should be entirely disconnected.
84 RaiseSignals(weak_xmpp_client);
85 }
86
TEST_F(WeakXmppClientTest,InvalidationViaStop)87 TEST_F(WeakXmppClientTest, InvalidationViaStop) {
88 ExpectSignalCalls();
89
90 WeakXmppClient* weak_xmpp_client = new WeakXmppClient(task_pump_.get());
91 ConnectSignals(weak_xmpp_client);
92
93 weak_xmpp_client->Start();
94 base::WeakPtr<WeakXmppClient> weak_ptr = weak_xmpp_client->AsWeakPtr();
95 EXPECT_TRUE(weak_ptr.get());
96 RaiseSignals(weak_ptr.get());
97
98 weak_xmpp_client->Abort();
99 EXPECT_FALSE(weak_ptr.get());
100 // We know that |weak_xmpp_client| is still valid at this point,
101 // although it should be entirely disconnected.
102 RaiseSignals(weak_xmpp_client);
103 }
104
TEST_F(WeakXmppClientTest,InvalidationViaDestructor)105 TEST_F(WeakXmppClientTest, InvalidationViaDestructor) {
106 ExpectSignalCalls();
107
108 WeakXmppClient* weak_xmpp_client = new WeakXmppClient(task_pump_.get());
109 ConnectSignals(weak_xmpp_client);
110
111 weak_xmpp_client->Start();
112 base::WeakPtr<WeakXmppClient> weak_ptr = weak_xmpp_client->AsWeakPtr();
113 EXPECT_TRUE(weak_ptr.get());
114 RaiseSignals(weak_ptr.get());
115
116 task_pump_.reset();
117 EXPECT_FALSE(weak_ptr.get());
118 // |weak_xmpp_client| is truly invalid at this point so we can't
119 // RaiseSignals() with it.
120 }
121
122 } // namespace
123
124 } // namespace notifier
125