OLD | NEW |
---|---|
(Empty) | |
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. | |
4 | |
5 #include "components/proximity_auth/connection.h" | |
6 | |
7 #include "components/proximity_auth/connection_observer.h" | |
8 #include "components/proximity_auth/permit_message.h" | |
9 #include "net/base/io_buffer.h" | |
10 #include "testing/gmock/include/gmock/gmock.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | |
12 | |
13 using testing::_; | |
14 using testing::NiceMock; | |
15 using testing::Return; | |
16 using testing::StrictMock; | |
17 | |
18 namespace proximity_auth { | |
19 namespace { | |
20 | |
21 class MockConnection : public Connection { | |
22 public: | |
23 MockConnection() : Connection(RemoteDevice()) {} | |
24 ~MockConnection() {} | |
25 | |
26 MOCK_METHOD1(SetPaused, void(bool paused)); | |
27 MOCK_METHOD0(Connect, void()); | |
28 MOCK_METHOD0(Disconnect, void()); | |
29 MOCK_METHOD0(CancelConnectionAttempt, void()); | |
30 MOCK_METHOD1(SendMessageImplProxy, void(PermitMessage* message)); | |
31 MOCK_METHOD0(HasReceivedCompleteMessage, bool()); | |
32 MOCK_METHOD0(DeserializePermitMessageProxy, PermitMessage*()); | |
33 | |
34 // Gmock only supports copyable types, so create simple wrapper methods for | |
35 // ease of mocking. | |
36 virtual void SendMessageImpl(scoped_ptr<PermitMessage> message) OVERRIDE { | |
37 SendMessageImplProxy(message.get()); | |
38 } | |
39 | |
40 virtual scoped_ptr<PermitMessage> DeserializePermitMessage() OVERRIDE { | |
41 return make_scoped_ptr(DeserializePermitMessageProxy()); | |
42 } | |
43 | |
44 using Connection::status; | |
45 using Connection::SetStatus; | |
46 using Connection::OnDidSendMessage; | |
47 using Connection::OnBytesReceived; | |
48 | |
49 private: | |
50 DISALLOW_COPY_AND_ASSIGN(MockConnection); | |
51 }; | |
52 | |
53 class MockConnectionObserver : public ConnectionObserver { | |
54 public: | |
55 MockConnectionObserver() {} | |
56 virtual ~MockConnectionObserver() {} | |
57 | |
58 MOCK_METHOD3(OnConnectionStatusChanged, void(const Connection& connection, | |
59 Connection::Status old_status, | |
60 Connection::Status new_status)); | |
61 MOCK_METHOD2(OnMessageReceived, void(const Connection& connection, | |
62 const PermitMessage& message)); | |
63 MOCK_METHOD3(OnSendCompleted, void(const Connection& connection, | |
64 const PermitMessage& message, | |
65 bool success)); | |
66 | |
67 private: | |
68 DISALLOW_COPY_AND_ASSIGN(MockConnectionObserver); | |
69 }; | |
70 | |
71 // Unlike PermitMessage, offers a public constructor. | |
72 class TestPermitMessage : public PermitMessage { | |
73 public: | |
74 TestPermitMessage() {} | |
75 virtual ~TestPermitMessage() {} | |
76 | |
77 private: | |
78 DISALLOW_COPY_AND_ASSIGN(TestPermitMessage); | |
79 }; | |
80 | |
81 } // namespace | |
82 | |
83 TEST(ConnectionTest, IsConnected) { | |
Tim Song
2014/09/05 00:30:34
Prefix this test name with "ProximityAuth" or some
Ilya Sherman
2014/09/05 01:02:11
Done.
| |
84 StrictMock<MockConnection> connection; | |
85 EXPECT_EQ(false, connection.IsConnected()); | |
86 | |
87 connection.SetStatus(Connection::CONNECTED); | |
88 EXPECT_EQ(true, connection.IsConnected()); | |
89 | |
90 connection.SetStatus(Connection::DISCONNECTED); | |
91 EXPECT_EQ(false, connection.IsConnected()); | |
92 | |
93 connection.SetStatus(Connection::IN_PROGRESS); | |
94 EXPECT_EQ(false, connection.IsConnected()); | |
95 } | |
96 | |
97 TEST(ConnectionTest, SendMessage_FailsWhenNotConnected) { | |
98 StrictMock<MockConnection> connection; | |
99 connection.SetStatus(Connection::IN_PROGRESS); | |
100 | |
101 EXPECT_CALL(connection, SendMessageImplProxy(_)).Times(0); | |
102 connection.SendMessage(scoped_ptr<PermitMessage>()); | |
103 } | |
104 | |
105 TEST(ConnectionTest, SendMessage_FailsWhenAnotherMessageSendIsInProgress) { | |
106 NiceMock<MockConnection> connection; | |
107 connection.SetStatus(Connection::CONNECTED); | |
108 connection.SendMessage(scoped_ptr<PermitMessage>()); | |
109 | |
110 EXPECT_CALL(connection, SendMessageImplProxy(_)).Times(0); | |
111 connection.SendMessage(scoped_ptr<PermitMessage>()); | |
112 } | |
113 | |
114 TEST(ConnectionTest, SendMessage_SucceedsWhenConnected) { | |
115 StrictMock<MockConnection> connection; | |
116 connection.SetStatus(Connection::CONNECTED); | |
117 | |
118 EXPECT_CALL(connection, SendMessageImplProxy(_)); | |
119 connection.SendMessage(scoped_ptr<PermitMessage>()); | |
120 } | |
121 | |
122 TEST(ConnectionTest, SendMessage_SucceedsAfterPreviousMessageSendCompletes) { | |
123 NiceMock<MockConnection> connection; | |
124 connection.SetStatus(Connection::CONNECTED); | |
125 connection.SendMessage(scoped_ptr<PermitMessage>()); | |
126 connection.OnDidSendMessage(TestPermitMessage(), true /* success */); | |
127 | |
128 EXPECT_CALL(connection, SendMessageImplProxy(_)); | |
129 connection.SendMessage(scoped_ptr<PermitMessage>()); | |
130 } | |
131 | |
132 TEST(ConnectionTest, SetStatus_NotifiesObserversOfStatusChange) { | |
133 StrictMock<MockConnection> connection; | |
134 EXPECT_EQ(Connection::DISCONNECTED, connection.status()); | |
135 | |
136 StrictMock<MockConnectionObserver> observer; | |
137 connection.AddObserver(&observer); | |
138 | |
139 EXPECT_CALL(observer, | |
140 OnConnectionStatusChanged(Ref(connection), | |
141 Connection::DISCONNECTED, | |
142 Connection::CONNECTED)); | |
143 connection.SetStatus(Connection::CONNECTED); | |
144 } | |
145 | |
146 TEST(ConnectionTest, SetStatus_DoesntNotifyObserversIfStatusUnchanged) { | |
147 StrictMock<MockConnection> connection; | |
148 EXPECT_EQ(Connection::DISCONNECTED, connection.status()); | |
149 | |
150 StrictMock<MockConnectionObserver> observer; | |
151 connection.AddObserver(&observer); | |
152 | |
153 EXPECT_CALL(observer, OnConnectionStatusChanged(_, _, _)).Times(0); | |
154 connection.SetStatus(Connection::DISCONNECTED); | |
155 } | |
156 | |
157 TEST(ConnectionTest, | |
158 OnDidSendMessage_NotifiesObserversIfMessageSendInProgress) { | |
159 NiceMock<MockConnection> connection; | |
160 connection.SetStatus(Connection::CONNECTED); | |
161 connection.SendMessage(scoped_ptr<PermitMessage>()); | |
162 | |
163 StrictMock<MockConnectionObserver> observer; | |
164 connection.AddObserver(&observer); | |
165 | |
166 EXPECT_CALL(observer, OnSendCompleted(Ref(connection), _, true)); | |
167 connection.OnDidSendMessage(TestPermitMessage(), true /* success */); | |
168 } | |
169 | |
170 TEST(ConnectionTest, | |
171 OnDidSendMessage_DoesntNotifyObserversIfNoMessageSendInProgress) { | |
172 NiceMock<MockConnection> connection; | |
173 connection.SetStatus(Connection::CONNECTED); | |
174 | |
175 StrictMock<MockConnectionObserver> observer; | |
176 connection.AddObserver(&observer); | |
177 | |
178 EXPECT_CALL(observer, OnSendCompleted(_, _, _)).Times(0); | |
179 connection.OnDidSendMessage(TestPermitMessage(), true /* success */); | |
180 } | |
181 | |
182 TEST(ConnectionTest, OnBytesReceived_NotifiesObserversOnValidMessage) { | |
183 NiceMock<MockConnection> connection; | |
184 connection.SetStatus(Connection::CONNECTED); | |
185 | |
186 StrictMock<MockConnectionObserver> observer; | |
187 connection.AddObserver(&observer); | |
188 | |
189 ON_CALL(connection, HasReceivedCompleteMessage()).WillByDefault(Return(true)); | |
190 ON_CALL(connection, DeserializePermitMessageProxy()).WillByDefault( | |
191 Return(new TestPermitMessage)); | |
192 EXPECT_CALL(observer, OnMessageReceived(Ref(connection), _)); | |
193 connection.OnBytesReceived(new net::IOBuffer, 0); | |
194 } | |
195 | |
196 TEST(ConnectionTest, OnBytesReceived_DoesntNotifyObserversIfNotConnected) { | |
197 StrictMock<MockConnection> connection; | |
198 connection.SetStatus(Connection::IN_PROGRESS); | |
199 | |
200 StrictMock<MockConnectionObserver> observer; | |
201 connection.AddObserver(&observer); | |
202 | |
203 EXPECT_CALL(observer, OnMessageReceived(_, _)).Times(0); | |
204 connection.OnBytesReceived(scoped_refptr<net::IOBuffer>(), 0); | |
205 } | |
206 | |
207 TEST(ConnectionTest, | |
208 OnBytesReceived_DoesntNotifyObserversIfMessageIsIncomplete) { | |
209 NiceMock<MockConnection> connection; | |
210 connection.SetStatus(Connection::CONNECTED); | |
211 | |
212 StrictMock<MockConnectionObserver> observer; | |
213 connection.AddObserver(&observer); | |
214 | |
215 ON_CALL(connection, HasReceivedCompleteMessage()).WillByDefault( | |
216 Return(false)); | |
217 EXPECT_CALL(observer, OnMessageReceived(_, _)).Times(0); | |
218 connection.OnBytesReceived(new net::IOBuffer, 0); | |
219 } | |
220 | |
221 TEST(ConnectionTest, OnBytesReceived_DoesntNotifyObserversIfMessageIsInvalid) { | |
222 NiceMock<MockConnection> connection; | |
223 connection.SetStatus(Connection::CONNECTED); | |
224 | |
225 StrictMock<MockConnectionObserver> observer; | |
226 connection.AddObserver(&observer); | |
227 | |
228 ON_CALL(connection, HasReceivedCompleteMessage()).WillByDefault(Return(true)); | |
229 ON_CALL(connection, DeserializePermitMessageProxy()).WillByDefault( | |
230 Return(static_cast<PermitMessage*>(NULL))); | |
231 EXPECT_CALL(observer, OnMessageReceived(_, _)).Times(0); | |
232 connection.OnBytesReceived(new net::IOBuffer, 0); | |
233 } | |
234 | |
235 } // namespace proximity_auth | |
OLD | NEW |