Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(693)

Side by Side Diff: components/proximity_auth/ble/bluetooth_low_energy_weave_packet_receiver_unittest.cc

Issue 2053013002: Weave Packet Receiver (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@proximity_auth_weave_migration
Patch Set: fixed typo build problem Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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/ble/bluetooth_low_energy_weave_packet_receiv er.h"
6
7 #include <algorithm>
8 #include <string>
9
10 #include "base/logging.h"
11 #include "components/proximity_auth/ble/bluetooth_low_energy_weave_packet_genera tor.h"
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 using proximity_auth::BluetoothLowEnergyWeavePacketGenerator;
16 using proximity_auth::BluetoothLowEnergyWeavePacketReceiver;
17
18 namespace {
19 typedef BluetoothLowEnergyWeavePacketReceiver::State State;
20 typedef BluetoothLowEnergyWeavePacketReceiver::ReceiverType ReceiverType;
21 typedef BluetoothLowEnergyWeavePacketGenerator::ReasonForClose ReasonForClose;
22
23 } // namespace
24
25 namespace proximity_auth {
26
27 class ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest
28 : public testing::Test {
29 protected:
30 ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest() {}
31
32 private:
33 DISALLOW_COPY_AND_ASSIGN(
34 ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest);
35 };
36
37 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
38 WellBehavingServerPacketsNoControlDataTest) {
39 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
40 (new BluetoothLowEnergyWeavePacketReceiver::Factory())
41 ->NewInstance(ReceiverType::SERVER);
42
43 // TODO(jingxuy): put comments on hex values
Kyle Horimoto 2016/06/20 23:25:40 Please also describe what the other values are. Fo
jingxuy 2016/06/21 01:19:15 Done.
Kyle Horimoto 2016/06/21 02:10:27 You still need to use constants for the last two 0
Kyle Horimoto 2016/06/21 18:13:38 Ping.
jingxuy 2016/06/22 01:42:23 Done.
44 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0, 0};
45 receiver->ReceivePacket(p0);
46 EXPECT_EQ(State::WAITING, receiver->GetState());
47
48 std::vector<uint8_t> p1{0x18, 'a', 'b'};
Kyle Horimoto 2016/06/20 23:25:40 If a packet is NOT the last packet in a message, i
jingxuy 2016/06/21 01:19:15 Done.
49 receiver->ReceivePacket(p1);
50 EXPECT_EQ(State::RECEIVING_DATA, receiver->GetState());
51
52 std::vector<uint8_t> p2{0x24, 'c', 'd'};
53 receiver->ReceivePacket(p2);
54 EXPECT_EQ(State::DATA_READY, receiver->GetState());
55 EXPECT_EQ("abcd", receiver->GetDataMessage());
56
57 std::vector<uint8_t> p3{0x3C, 'g', 'o', 'o', 'g', 'l', 'e'};
58 receiver->ReceivePacket(p3);
59 EXPECT_EQ(State::DATA_READY, receiver->GetState());
60 EXPECT_EQ("google", receiver->GetDataMessage());
61
62 std::vector<uint8_t> p4{0xC2, 0x80, 0x00};
63 receiver->ReceivePacket(p4);
64 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
65 EXPECT_EQ(ReasonForClose::APPLICATION_ERROR, receiver->GetReasonForClose());
66 }
67
68 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
69 WellBehavingServerPacketsWithControlDataTest) {
70 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
71 (new BluetoothLowEnergyWeavePacketReceiver::Factory())
72 ->NewInstance(ReceiverType::SERVER);
73
74 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0, 0, 'a', 'b', 'c', 'd'};
75 receiver->ReceivePacket(p0);
76 EXPECT_EQ(State::DATA_READY, receiver->GetState());
77 EXPECT_EQ("abcd", receiver->GetDataMessage());
78
79 std::vector<uint8_t> p1{0x18, 'e', 'f'};
80 receiver->ReceivePacket(p1);
81 EXPECT_EQ(State::RECEIVING_DATA, receiver->GetState());
82
83 std::vector<uint8_t> p2{0x24, 'g', 'h'};
84 receiver->ReceivePacket(p2);
85 EXPECT_EQ(State::DATA_READY, receiver->GetState());
86 EXPECT_EQ("efgh", receiver->GetDataMessage());
87
88 std::vector<uint8_t> p3{0xB2, 0x00, 0x00};
89 receiver->ReceivePacket(p3);
90 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
91 EXPECT_EQ(ReasonForClose::CLOSE_WITHOUT_ERROR, receiver->GetReasonForClose());
92 }
93
94 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
95 WellBehavingClientPacketsNoControlDataTest) {
96 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
97 (new BluetoothLowEnergyWeavePacketReceiver::Factory())
98 ->NewInstance(ReceiverType::CLIENT);
99
100 std::vector<uint8_t> p0{0x81, 1, 0, 30, 0};
101 receiver->ReceivePacket(p0);
102 EXPECT_EQ(State::WAITING, receiver->GetState());
103 EXPECT_EQ((uint32_t)30, receiver->GetMaxPacketSize());
104
105 std::vector<uint8_t> p1{0x1C, 'g', 'o', 'o', 'g', 'l', 'e'};
106 receiver->ReceivePacket(p1);
107 EXPECT_EQ(State::DATA_READY, receiver->GetState());
108 EXPECT_EQ("google", receiver->GetDataMessage());
109
110 std::vector<uint8_t> p2{0xA2, 0x80, 0x00};
111 receiver->ReceivePacket(p2);
112 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
113 EXPECT_EQ(ReasonForClose::APPLICATION_ERROR, receiver->GetReasonForClose());
114 }
115
116 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
117 WellBehavingClientPacketsWithControlDataTest) {
118 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
119 (new BluetoothLowEnergyWeavePacketReceiver::Factory())
120 ->NewInstance(ReceiverType::CLIENT);
121
122 std::vector<uint8_t> p0{0x81, 1, 0, 20, 0, 'a', 'b', 'c', 'd'};
123 receiver->ReceivePacket(p0);
124 EXPECT_EQ(State::DATA_READY, receiver->GetState());
125 EXPECT_EQ("abcd", receiver->GetDataMessage());
126
127 std::vector<uint8_t> p1{0x1C, 'g', 'o', 'o', 'g', 'l', 'e'};
128 receiver->ReceivePacket(p1);
129 EXPECT_EQ(State::DATA_READY, receiver->GetState());
130 EXPECT_EQ("google", receiver->GetDataMessage());
131
132 std::vector<uint8_t> p2{0xA2, 0x00, 0x00};
133 receiver->ReceivePacket(p2);
134 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
135 EXPECT_EQ(ReasonForClose::CLOSE_WITHOUT_ERROR, receiver->GetReasonForClose());
136 }
137
138 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
139 ShortPacketTest) {
140 BluetoothLowEnergyWeavePacketReceiver::Factory factory =
141 BluetoothLowEnergyWeavePacketReceiver::Factory();
142
143 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
144 factory.NewInstance(ReceiverType::CLIENT);
145
146 std::vector<uint8_t> p0{0x81, 1, 0, 20, 0};
147 receiver->ReceivePacket(p0);
148 EXPECT_EQ(State::WAITING, receiver->GetState());
149
150 std::vector<uint8_t> p1{0x1C};
151 receiver->ReceivePacket(p1);
152 EXPECT_EQ(State::DATA_READY, receiver->GetState());
153 EXPECT_EQ("", receiver->GetDataMessage());
154
155 std::vector<uint8_t> p2;
156 receiver->ReceivePacket(p2);
157 EXPECT_EQ(State::ERROR, receiver->GetState());
158 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
159 }
160
161 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
162 InappropriateConnectingTypeTest) {
163 BluetoothLowEnergyWeavePacketReceiver::Factory factory =
164 BluetoothLowEnergyWeavePacketReceiver::Factory();
165
166 // Server receives connection response.
167 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
168 factory.NewInstance(ReceiverType::SERVER);
169 std::vector<uint8_t> p0{0x81, 1, 0, 20, 0};
170 receiver->ReceivePacket(p0);
171 EXPECT_EQ(State::ERROR, receiver->GetState());
172 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
173
174 // Client receives connection request.
175 receiver = factory.NewInstance(ReceiverType::CLIENT);
176 std::vector<uint8_t> p1{0x80, 1, 0, 1, 0, 0, 0};
177 receiver->ReceivePacket(p1);
178 EXPECT_EQ(State::ERROR, receiver->GetState());
179 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
180
181 // Receiving connection close as the first packet.
182 receiver = factory.NewInstance(ReceiverType::SERVER);
183 std::vector<uint8_t> p2{0x82, 0, 0};
184 receiver->ReceivePacket(p2);
185 EXPECT_EQ(State::ERROR, receiver->GetState());
186 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
187
188 // Receiving data packet as the first packet.
189 receiver = factory.NewInstance(ReceiverType::SERVER);
190 std::vector<uint8_t> p3{0x08, 'a', 'b', 'c', 'd'};
191 receiver->ReceivePacket(p3);
192 EXPECT_EQ(State::ERROR, receiver->GetState());
193 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
194 }
195
196 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
197 ControlPacketSizeTest) {
198 BluetoothLowEnergyWeavePacketReceiver::Factory factory =
199 BluetoothLowEnergyWeavePacketReceiver::Factory();
200
201 // Connection request missing a byte.
202 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
203 factory.NewInstance(ReceiverType::SERVER);
204 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0};
205 receiver->ReceivePacket(p0);
206 EXPECT_EQ(State::ERROR, receiver->GetState());
207 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
208
209 // Connection response missing a byte.
210 receiver = factory.NewInstance(ReceiverType::CLIENT);
211 std::vector<uint8_t> p1{0x81, 1, 0, 20};
212 receiver->ReceivePacket(p1);
213 EXPECT_EQ(State::ERROR, receiver->GetState());
214 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
215
216 // Max length connection request is accepted.
217 receiver = factory.NewInstance(ReceiverType::SERVER);
218 std::vector<uint8_t> p2(20, 0);
219 p2[0] = 0x80;
220 p2[1] = 1;
221 p2[3] = 1;
222 receiver->ReceivePacket(p2);
223 EXPECT_EQ(State::DATA_READY, receiver->GetState());
224
225 // Connection request that's a byte too long.
226 receiver = factory.NewInstance(ReceiverType::SERVER);
227 p2.push_back(0);
228 receiver->ReceivePacket(p2);
229 EXPECT_EQ(State::ERROR, receiver->GetState());
230 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
231
232 // Max length connection response is accepted.
233 receiver = factory.NewInstance(ReceiverType::CLIENT);
234 std::vector<uint8_t> p3(20, 0);
235 p3[0] = 0x81;
236 p3[1] = 1;
237 p3[3] = 20;
238 receiver->ReceivePacket(p3);
239 EXPECT_EQ(State::DATA_READY, receiver->GetState());
240
241 // Connection response that's a byte too long.
242 receiver = factory.NewInstance(ReceiverType::CLIENT);
243 p3.push_back(0);
244 receiver->ReceivePacket(p3);
245 EXPECT_EQ(State::ERROR, receiver->GetState());
246 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
247 }
248
249 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
250 WrongFirstLastBitTest) {
251 BluetoothLowEnergyWeavePacketReceiver::Factory factory =
252 BluetoothLowEnergyWeavePacketReceiver::Factory();
253
254 // First bit is not set when it's supposed to be with last bit not set.
255 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
256 factory.NewInstance(ReceiverType::SERVER);
257 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0, 0};
258 receiver->ReceivePacket(p0);
259 EXPECT_EQ(State::WAITING, receiver->GetState());
260
261 std::vector<uint8_t> p1{0x10};
262 receiver->ReceivePacket(p1);
263 EXPECT_EQ(State::ERROR, receiver->GetState());
264 EXPECT_EQ(ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE,
265 receiver->GetReasonToClose());
266
267 // First bit is not set when it's supposed to be when last bit is set.
268 receiver = factory.NewInstance(ReceiverType::SERVER);
269 receiver->ReceivePacket(p0);
270 EXPECT_EQ(State::WAITING, receiver->GetState());
271
272 std::vector<uint8_t> p2{0x14};
273 receiver->ReceivePacket(p1);
274 EXPECT_EQ(State::ERROR, receiver->GetState());
275 EXPECT_EQ(ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE,
276 receiver->GetReasonToClose());
277 }
278
279 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
280 OutOfOrderPacketTest) {
281 BluetoothLowEnergyWeavePacketReceiver::Factory factory =
282 BluetoothLowEnergyWeavePacketReceiver::Factory();
283
284 // Skip a packet in number.
285 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
286 factory.NewInstance(ReceiverType::SERVER);
287 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0, 0};
288 receiver->ReceivePacket(p0);
289 EXPECT_EQ(State::WAITING, receiver->GetState());
290
291 std::vector<uint8_t> p1{0x20};
292 receiver->ReceivePacket(p1);
293 EXPECT_EQ(State::ERROR, receiver->GetState());
294 EXPECT_EQ(ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE,
295 receiver->GetReasonToClose());
296 }
297
298 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
299 IncorrectValuesInControlPacketTest) {
300 BluetoothLowEnergyWeavePacketReceiver::Factory factory =
301 BluetoothLowEnergyWeavePacketReceiver::Factory();
302
303 // Invalid version in request.
304 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
305 factory.NewInstance(ReceiverType::SERVER);
306 std::vector<uint8_t> p0{0x80, 2, 0, 1, 0, 0, 0};
307 receiver->ReceivePacket(p0);
308 EXPECT_EQ(State::ERROR, receiver->GetState());
309 EXPECT_EQ(ReasonForClose::NO_COMMON_VERSION_SUPPORTED,
310 receiver->GetReasonToClose());
311
312 // Invalid max packet size in request.
313 receiver = factory.NewInstance(ReceiverType::SERVER);
314 std::vector<uint8_t> p1{0x80, 1, 0, 1, 0, 19, 0};
315 receiver->ReceivePacket(p1);
316 EXPECT_EQ(State::ERROR, receiver->GetState());
317 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
318
319 // Invalid selected version in response.
320 receiver = factory.NewInstance(ReceiverType::CLIENT);
321 std::vector<uint8_t> p2{0x81, 0, 1, 20, 0};
322 receiver->ReceivePacket(p2);
323 EXPECT_EQ(State::ERROR, receiver->GetState());
324 EXPECT_EQ(ReasonForClose::NO_COMMON_VERSION_SUPPORTED,
325 receiver->GetReasonToClose());
326
327 // Invalid selected max packet size in response.
328 receiver = factory.NewInstance(ReceiverType::CLIENT);
329 std::vector<uint8_t> p3{0x81, 1, 0, 19, 0};
330 receiver->ReceivePacket(p3);
331 EXPECT_EQ(State::ERROR, receiver->GetState());
332 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
333
334 // Invalid reason for close.
335 receiver = factory.NewInstance(ReceiverType::CLIENT);
336 std::vector<uint8_t> p4{0x81, 1, 0, 20, 0};
337 receiver->ReceivePacket(p4);
338 EXPECT_EQ(State::WAITING, receiver->GetState());
339
340 std::vector<uint8_t> p5{0x92, 0x05, 0x00};
341 receiver->ReceivePacket(p5);
342 EXPECT_EQ(State::ERROR, receiver->GetState());
343 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
344 }
345
346 // TODO(jingxuy): test for other malicious headers
347
348 } // namespace proximity_auth
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698