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

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: commented test and h file. Fixed memory leak in test. style modification in cc file 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 const uint16_t kDefaultPacketSize = 20;
24 const uint8_t kWeaveVersion = 1;
25
26 // uWeave Header:
27 // 1--- ---- : type = 1 (control packet)
28 // -000 ---- : counter = 0
29 // ---- 0000 : command = 0 (request)
30 // 1000 0000 = 0x80
31 const uint8_t kControlRequestHeader = 0x80;
32
33 // uWeave Header:
34 // 1--- ---- : type = 1 (control packet)
35 // -000 ---- : counter = 0
36 // ---- 0001 : command = 1 (response)
37 // 1000 0001 = 0x81
38 const uint8_t kControlResponseHeader = 0x81;
39 } // namespace
40
41 namespace proximity_auth {
42
43 class ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest
44 : public testing::Test {
45 protected:
46 ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest() {}
47
48 private:
49 DISALLOW_COPY_AND_ASSIGN(
50 ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest);
51 };
52
53 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
54 WellBehavingServerPacketsNoControlDataTest) {
55 BluetoothLowEnergyWeavePacketReceiver::Factory factory;
56 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
57 factory.NewInstance(ReceiverType::SERVER);
58
59 std::vector<uint8_t> p0{
60 kControlRequestHeader, kWeaveVersion, 0, kWeaveVersion, 0, 0, 0};
Kyle Horimoto 2016/06/21 02:10:27 Isn't network order big endian? Shouldn't it be 0
Kyle Horimoto 2016/06/21 18:13:38 Ping.
jingxuy 2016/06/22 01:42:23 Done.
61 receiver->ReceivePacket(p0);
62 EXPECT_EQ(State::WAITING, receiver->GetState());
63
64 std::vector<uint8_t> p1(kDefaultPacketSize, 'a');
65 // uWeave Header:
66 // 0--- ---- : type = 0 (data packet)
67 // -001 ---- : counter = 1
68 // ---- 1--- : first packet = true
69 // ---- -0-- : last packet = false
70 // ---- --00 : defined by uWeave to be 0
71 // 0001 1000 = 0x18
72 p1[0] = 0x18;
73 receiver->ReceivePacket(p1);
74 EXPECT_EQ(State::RECEIVING_DATA, receiver->GetState());
75
76 // uWeave Header:
77 // 0--- ---- : type = 0 (data packet)
78 // -010 ---- : counter = 2
79 // ---- 0--- : first packet = false
80 // ---- -1-- : last packet = true
81 // ---- --00 : defined by uWeave to be 0
82 // 0010 0100 = 0x24
83 std::vector<uint8_t> p2{0x24, 'c', 'd'};
84 receiver->ReceivePacket(p2);
85 EXPECT_EQ(State::DATA_READY, receiver->GetState());
86 EXPECT_EQ("aaaaaaaaaaaaaaaaaaacd", receiver->GetDataMessage());
87
88 // uWeave Header:
89 // 0--- ---- : type = 0 (data packet)
90 // -011 ---- : counter = 3
91 // ---- 1--- : first packet = true
92 // ---- -1-- : last packet = true
93 // ---- --00 : defined by uWeave to be 0
94 // 0011 1100 = 0x3C
95 std::vector<uint8_t> p3{0x3C, 'g', 'o', 'o', 'g', 'l', 'e'};
96 receiver->ReceivePacket(p3);
97 EXPECT_EQ(State::DATA_READY, receiver->GetState());
98 EXPECT_EQ("google", receiver->GetDataMessage());
99
100 // uWeave Header:
101 // 1--- ---- : type = 1 (control packet)
102 // -100 ---- : counter = 4
103 // ---- 0010 : command = 2 (close)
104 // 1100 0010 = 0xC2
105 // 0x80 is the hex value for APPLICATION_ERROR
106 std::vector<uint8_t> p4{0xC2, 0x80, 0};
107 receiver->ReceivePacket(p4);
108 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
109 EXPECT_EQ(ReasonForClose::APPLICATION_ERROR, receiver->GetReasonForClose());
110 }
111
112 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
113 WellBehavingServerPacketsWithControlDataTest) {
Kyle Horimoto 2016/06/21 18:13:38 Also test: *when less than the full 13 bytes of c
jingxuy 2016/06/22 01:42:24 greater than 13 bytes is tested in controlpacketsi
114 BluetoothLowEnergyWeavePacketReceiver::Factory factory;
115 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
116 factory.NewInstance(ReceiverType::SERVER);
117
118 std::vector<uint8_t> p0{kControlRequestHeader,
119 kWeaveVersion,
120 0,
121 kWeaveVersion,
122 0,
123 0,
124 0,
125 'a',
126 'b',
127 'c',
128 'd',
129 'e',
130 'f',
131 'g',
132 'h',
133 'i',
134 'j',
135 'l',
136 'm',
137 'n'};
138 receiver->ReceivePacket(p0);
139 EXPECT_EQ(State::DATA_READY, receiver->GetState());
140 EXPECT_EQ("abcdefghijklmn", receiver->GetDataMessage());
141
142 // uWeave Header:
143 // 0--- ---- : type = 0 (data packet)
144 // -001 ---- : counter = 1
145 // ---- 1--- : first packet = true
146 // ---- -0-- : last packet = false
147 // ---- --00 : defined by uWeave to be 0
148 // 0001 1000 = 0x18
149 std::vector<uint8_t> p1(20, 'o');
150 p1[0] = 0x18;
151 receiver->ReceivePacket(p1);
152 EXPECT_EQ(State::RECEIVING_DATA, receiver->GetState());
153
154 // uWeave Header:
155 // 0--- ---- : type = 0 (data packet)
156 // -010 ---- : counter = 2
157 // ---- 0--- : first packet = false
158 // ---- -1-- : last packet = true
159 // ---- --00 : defined by uWeave to be 0
160 // 0010 0100 = 0x24
161 std::vector<uint8_t> p2{0x24, 'p', 'q'};
162 receiver->ReceivePacket(p2);
163 EXPECT_EQ(State::DATA_READY, receiver->GetState());
164 EXPECT_EQ("ooooooooooooooooooopq", receiver->GetDataMessage());
165
166 // uWeave Header:
167 // 1--- ---- : type = 1 (control packet)
168 // -011 ---- : counter = 3
169 // ---- 0010 : command = 2 (close)
170 // 1011 0010 = 0xB2
171 std::vector<uint8_t> p3{0xB2, 0, 0};
172 receiver->ReceivePacket(p3);
173 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
174 EXPECT_EQ(ReasonForClose::CLOSE_WITHOUT_ERROR, receiver->GetReasonForClose());
175 }
176
177 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
178 WellBehavingClientPacketsNoControlDataTest) {
179 BluetoothLowEnergyWeavePacketReceiver::Factory factory;
180 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
181 factory.NewInstance(ReceiverType::CLIENT);
182
183 std::vector<uint8_t> p0{kControlResponseHeader, kWeaveVersion, 0, 30, 0};
184 receiver->ReceivePacket(p0);
185 EXPECT_EQ(State::WAITING, receiver->GetState());
186 EXPECT_EQ((uint32_t)30, receiver->GetMaxPacketSize());
Kyle Horimoto 2016/06/21 18:13:38 For this test, can you actually try passing a pack
jingxuy 2016/06/22 01:42:24 Done.
187
188 // uWeave Header:
189 // 0--- ---- : type = 0 (data packet)
190 // -001 ---- : counter = 1
191 // ---- 1--- : first packet = true
192 // ---- -1-- : last packet = true
193 // ---- --00 : defined by uWeave to be 0
194 // 0001 1100 = 0x1C
195 std::vector<uint8_t> p1{0x1C, 'g', 'o', 'o', 'g', 'l', 'e'};
196 receiver->ReceivePacket(p1);
197 EXPECT_EQ(State::DATA_READY, receiver->GetState());
198 EXPECT_EQ("google", receiver->GetDataMessage());
199
200 // uWeave Header:
201 // 1--- ---- : type = 1 (control packet)
202 // -010 ---- : counter = 2
203 // ---- 0010 : command = 2 (close)
204 // 1010 0010 = 0xA2
205 std::vector<uint8_t> p2{0xA2, 0x80, 0};
206 receiver->ReceivePacket(p2);
207 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
208 EXPECT_EQ(ReasonForClose::APPLICATION_ERROR, receiver->GetReasonForClose());
209 }
210
211 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
212 WellBehavingClientPacketsWithControlDataTest) {
Kyle Horimoto 2016/06/21 18:13:38 Also test: *when the full 15 bytes of control dat
jingxuy 2016/06/22 01:42:23 Both the full packet and Error condition > 15 is t
213 BluetoothLowEnergyWeavePacketReceiver::Factory factory;
214 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
215 factory.NewInstance(ReceiverType::CLIENT);
216
217 std::vector<uint8_t> p0{kControlResponseHeader,
218 kWeaveVersion,
219 0,
220 kDefaultPacketSize,
221 0,
222 'a',
223 'b',
224 'c',
225 'd'};
226 receiver->ReceivePacket(p0);
227 EXPECT_EQ(State::DATA_READY, receiver->GetState());
228 EXPECT_EQ("abcd", receiver->GetDataMessage());
229
230 // uWeave Header:
231 // 0--- ---- : type = 0 (data packet)
232 // -001 ---- : counter = 1
233 // ---- 1--- : first packet = true
234 // ---- -1-- : last packet = true
235 // ---- --00 : defined by uWeave to be 0
236 // 0001 1100 = 0x1C
237 std::vector<uint8_t> p1{0x1C, 'g', 'o', 'o', 'g', 'l', 'e'};
238 receiver->ReceivePacket(p1);
239 EXPECT_EQ(State::DATA_READY, receiver->GetState());
240 EXPECT_EQ("google", receiver->GetDataMessage());
241
242 // uWeave Header:
243 // 1--- ---- : type = 1 (control packet)
244 // -010 ---- : counter = 2
245 // ---- 0010 : command = 2 (close)
246 // 1010 0010 = 0xA2
247 std::vector<uint8_t> p2{0xA2, 0, 0};
248 receiver->ReceivePacket(p2);
249 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
250 EXPECT_EQ(ReasonForClose::CLOSE_WITHOUT_ERROR, receiver->GetReasonForClose());
251 }
252
253 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
254 LegacyCloseWithoutReasonTest) {
255 BluetoothLowEnergyWeavePacketReceiver::Factory factory;
256 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
257 factory.NewInstance(ReceiverType::SERVER);
258
259 std::vector<uint8_t> p0{
260 kControlRequestHeader, kWeaveVersion, 0, kWeaveVersion, 0, 0, 0};
261 receiver->ReceivePacket(p0);
262 EXPECT_EQ(State::WAITING, receiver->GetState());
263
264 // uWeave Header:
265 // 1--- ---- : type = 1 (control packet)
266 // -001 ---- : counter = 1
267 // ---- 0010 : command = 2 (close)
268 // 1001 0010 = 0x92
269 std::vector<uint8_t> p1{0x92};
270 receiver->ReceivePacket(p1);
271 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
272 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonForClose());
273 }
274
275 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
276 ShortPacketTest) {
277 BluetoothLowEnergyWeavePacketReceiver::Factory factory;
278
279 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
280 factory.NewInstance(ReceiverType::CLIENT);
281
282 std::vector<uint8_t> p0{kControlResponseHeader, kWeaveVersion, 0,
283 kDefaultPacketSize, 0};
284 receiver->ReceivePacket(p0);
285 EXPECT_EQ(State::WAITING, receiver->GetState());
286
287 // uWeave Header:
288 // 0--- ---- : type = 0 (data packet)
289 // -001 ---- : counter = 1
290 // ---- 1--- : first packet = true
291 // ---- -1-- : last packet = true
292 // ---- --00 : defined by uWeave to be 0
293 // 0001 1100 = 0x1C
294 std::vector<uint8_t> p1{0x1C};
295 receiver->ReceivePacket(p1);
296 EXPECT_EQ(State::DATA_READY, receiver->GetState());
297 EXPECT_EQ("", receiver->GetDataMessage());
298
299 std::vector<uint8_t> p2;
300 receiver->ReceivePacket(p2);
301 EXPECT_EQ(State::ERROR, receiver->GetState());
302 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
303 }
304
305 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
Kyle Horimoto 2016/06/21 18:13:38 nit: For this test and the ones below, please just
jingxuy 2016/06/22 01:42:23 Done.
306 InappropriateConnectingTypeTest) {
Kyle Horimoto 2016/06/21 18:13:38 Also test that if a packet is received after we've
jingxuy 2016/06/22 01:42:24 Done.
307 BluetoothLowEnergyWeavePacketReceiver::Factory factory;
308
309 // Server receives connection response.
310 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
311 factory.NewInstance(ReceiverType::SERVER);
312 std::vector<uint8_t> p0{kControlResponseHeader, kWeaveVersion, 0,
313 kDefaultPacketSize, 0};
314 receiver->ReceivePacket(p0);
315 EXPECT_EQ(State::ERROR, receiver->GetState());
316 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
317
318 // Client receives connection request.
319 receiver = factory.NewInstance(ReceiverType::CLIENT);
320 std::vector<uint8_t> p1{
321 kControlRequestHeader, kWeaveVersion, 0, kWeaveVersion, 0, 0, 0};
322 receiver->ReceivePacket(p1);
323 EXPECT_EQ(State::ERROR, receiver->GetState());
324 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
325
326 // Receiving connection close as the first packet.
327 receiver = factory.NewInstance(ReceiverType::SERVER);
328 // uWeave Header:
329 // 1--- ---- : type = 1 (control packet)
330 // -000 ---- : counter = 0
331 // ---- 0010 : command = 2 (close)
332 // 1000 0010 = 0x82
333 std::vector<uint8_t> p2{0x82, 0, 0};
334 receiver->ReceivePacket(p2);
335 EXPECT_EQ(State::ERROR, receiver->GetState());
336 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
337
338 // Receiving data packet as the first packet.
339 receiver = factory.NewInstance(ReceiverType::SERVER);
340 // uWeave Header:
341 // 0--- ---- : type = 0 (data packet)
342 // -000 ---- : counter = 0
343 // ---- 1--- : first packet = true
344 // ---- -0-- : last packet = false
345 // ---- --00 : defined by uWeave to be 0
346 // 0000 1000 = 0x08
347 std::vector<uint8_t> p3{0x08, 'a', 'b', 'c', 'd'};
348 receiver->ReceivePacket(p3);
349 EXPECT_EQ(State::ERROR, receiver->GetState());
350 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
351 }
352
353 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
354 ControlPacketSizeTest) {
355 BluetoothLowEnergyWeavePacketReceiver::Factory factory;
356
357 // Connection request missing a byte.
358 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
359 factory.NewInstance(ReceiverType::SERVER);
360 std::vector<uint8_t> p0{
361 kControlRequestHeader, kWeaveVersion, 0, kWeaveVersion, 0, 0};
362 receiver->ReceivePacket(p0);
363 EXPECT_EQ(State::ERROR, receiver->GetState());
364 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
365
366 // Connection response missing a byte.
367 receiver = factory.NewInstance(ReceiverType::CLIENT);
368 std::vector<uint8_t> p1{kControlResponseHeader, kWeaveVersion, 0,
369 kDefaultPacketSize};
370 receiver->ReceivePacket(p1);
371 EXPECT_EQ(State::ERROR, receiver->GetState());
372 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
373
374 // Max length connection request is accepted.
375 receiver = factory.NewInstance(ReceiverType::SERVER);
376 std::vector<uint8_t> p2(kDefaultPacketSize, 0);
377 p2[0] = kControlRequestHeader;
378 p2[1] = 1;
379 p2[3] = 1;
380 receiver->ReceivePacket(p2);
381 EXPECT_EQ(State::DATA_READY, receiver->GetState());
382
383 // Connection request that's a byte too long.
384 receiver = factory.NewInstance(ReceiverType::SERVER);
385 p2.push_back(0);
386 receiver->ReceivePacket(p2);
387 EXPECT_EQ(State::ERROR, receiver->GetState());
388 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
389
390 // Max length connection response is accepted.
391 receiver = factory.NewInstance(ReceiverType::CLIENT);
392 std::vector<uint8_t> p3(kDefaultPacketSize, 0);
393 p3[0] = kControlResponseHeader;
394 p3[1] = 1;
395 p3[3] = kDefaultPacketSize;
396 receiver->ReceivePacket(p3);
397 EXPECT_EQ(State::DATA_READY, receiver->GetState());
398
399 // Connection response that's a byte too long.
400 receiver = factory.NewInstance(ReceiverType::CLIENT);
401 p3.push_back(0);
402 receiver->ReceivePacket(p3);
403 EXPECT_EQ(State::ERROR, receiver->GetState());
404 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
405 }
406
407 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
408 WrongFirstLastBitTest) {
409 BluetoothLowEnergyWeavePacketReceiver::Factory factory;
410 ;
Kyle Horimoto 2016/06/21 18:13:38 nit: Remove ;
jingxuy 2016/06/22 01:42:23 Done.
411
412 // First bit is not set when it's supposed to be with last bit not set.
Kyle Horimoto 2016/06/21 18:13:39 I'm not sure I understand this - can you explain?
jingxuy 2016/06/22 01:42:23 You receive the first packet and first bit and las
413 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
414 factory.NewInstance(ReceiverType::SERVER);
415 std::vector<uint8_t> p0{
416 kControlRequestHeader, kWeaveVersion, 0, kWeaveVersion, 0, 0, 0};
417 receiver->ReceivePacket(p0);
418 EXPECT_EQ(State::WAITING, receiver->GetState());
419
420 // uWeave Header:
421 // 0--- ---- : type = 0 (data packet)
422 // -001 ---- : counter = 1
423 // ---- 0--- : first packet = false
424 // ---- -0-- : last packet = false
425 // ---- --00 : defined by uWeave to be 0
426 // 0001 0000 = 0x10
427 std::vector<uint8_t> p1{0x10};
428 receiver->ReceivePacket(p1);
429 EXPECT_EQ(State::ERROR, receiver->GetState());
430 EXPECT_EQ(ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE,
431 receiver->GetReasonToClose());
432
433 // First bit is not set when it's supposed to be when last bit is set.
434 receiver = factory.NewInstance(ReceiverType::SERVER);
435 receiver->ReceivePacket(p0);
436 EXPECT_EQ(State::WAITING, receiver->GetState());
437
438 // uWeave Header:
439 // 0--- ---- : type = 0 (data packet)
440 // -001 ---- : counter = 1
441 // ---- 0--- : first packet = false
442 // ---- -1-- : last packet = true
443 // ---- --00 : defined by uWeave to be 0
444 // 0001 0100 = 0x14
445 std::vector<uint8_t> p2{0x14};
446 receiver->ReceivePacket(p1);
447 EXPECT_EQ(State::ERROR, receiver->GetState());
448 EXPECT_EQ(ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE,
449 receiver->GetReasonToClose());
450 }
451
452 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
453 OutOfOrderPacketTest) {
454 BluetoothLowEnergyWeavePacketReceiver::Factory factory;
455
456 // Skip a packet in number.
457 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
458 factory.NewInstance(ReceiverType::SERVER);
459 std::vector<uint8_t> p0{
460 kControlRequestHeader, kWeaveVersion, 0, kWeaveVersion, 0, 0, 0};
461 receiver->ReceivePacket(p0);
462 EXPECT_EQ(State::WAITING, receiver->GetState());
463
464 // uWeave Header:
465 // 0--- ---- : type = 0 (data packet)
466 // -010 ---- : counter = 2
467 // ---- 0--- : first packet = false
468 // ---- -0-- : last packet = false
469 // ---- --00 : defined by uWeave to be 0
470 // 0010 0000 = 0x20
471 std::vector<uint8_t> p1{0x20};
472 receiver->ReceivePacket(p1);
473 EXPECT_EQ(State::ERROR, receiver->GetState());
474 EXPECT_EQ(ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE,
475 receiver->GetReasonToClose());
476 }
477
478 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
479 IncorrectValuesInControlPacketTest) {
480 BluetoothLowEnergyWeavePacketReceiver::Factory factory;
481
482 // Invalid version in request.
483 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
484 factory.NewInstance(ReceiverType::SERVER);
485 const uint8_t kWrongVersion = 2;
486 std::vector<uint8_t> p0{
487 kControlRequestHeader, kWrongVersion, 0, kWeaveVersion, 0, 0, 0};
488 receiver->ReceivePacket(p0);
489 EXPECT_EQ(State::ERROR, receiver->GetState());
490 EXPECT_EQ(ReasonForClose::NO_COMMON_VERSION_SUPPORTED,
491 receiver->GetReasonToClose());
492
493 const uint8_t kSmallMaxPacketSize = 19;
494
495 // Invalid max packet size in request.
496 receiver = factory.NewInstance(ReceiverType::SERVER);
497 std::vector<uint8_t> p1{kControlRequestHeader,
498 kWeaveVersion,
499 0,
500 kWeaveVersion,
501 0,
502 kSmallMaxPacketSize,
503 0};
504 receiver->ReceivePacket(p1);
505 EXPECT_EQ(State::ERROR, receiver->GetState());
506 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
Kyle Horimoto 2016/06/21 18:13:38 Let's make error values for these cases - it seems
jingxuy 2016/06/22 01:42:23 GetReasonToClose has to return ReasonForClose beca
Kyle Horimoto 2016/06/22 01:56:19 Oops, my mistake. Sounds good.
jingxuy 2016/06/22 22:37:43 Done.
507
508 // Invalid selected version in response.
509 receiver = factory.NewInstance(ReceiverType::CLIENT);
510 std::vector<uint8_t> p2{kControlResponseHeader, 0, kWeaveVersion,
511 kDefaultPacketSize, 0};
512 receiver->ReceivePacket(p2);
513 EXPECT_EQ(State::ERROR, receiver->GetState());
514 EXPECT_EQ(ReasonForClose::NO_COMMON_VERSION_SUPPORTED,
515 receiver->GetReasonToClose());
516
517 // Invalid selected max packet size in response.
518 receiver = factory.NewInstance(ReceiverType::CLIENT);
519 std::vector<uint8_t> p3{kControlResponseHeader, kWeaveVersion, 0,
520 kSmallMaxPacketSize, 0};
521 receiver->ReceivePacket(p3);
522 EXPECT_EQ(State::ERROR, receiver->GetState());
523 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
524
525 // Invalid reason for close.
526 receiver = factory.NewInstance(ReceiverType::CLIENT);
527 std::vector<uint8_t> p4{kControlResponseHeader, kWeaveVersion, 0,
528 kDefaultPacketSize, 0};
529 receiver->ReceivePacket(p4);
530 EXPECT_EQ(State::WAITING, receiver->GetState());
531
532 const uint8_t kInvalidReasonForClose = 5;
533 // uWeave Header:
534 // 1--- ---- : type = 1 (control packet)
535 // -001 ---- : counter = 1
536 // ---- 0010 : command = 2 (close)
537 // 1001 0010 = 0x92
538 std::vector<uint8_t> p5{0x92, kInvalidReasonForClose, 0};
539 receiver->ReceivePacket(p5);
540 EXPECT_EQ(State::ERROR, receiver->GetState());
541 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
542 }
543
544 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
545 MaliciousHeaderTest) {
546 BluetoothLowEnergyWeavePacketReceiver::Factory factory;
547
548 // Invalid control command bit 2
549 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
550 factory.NewInstance(ReceiverType::SERVER);
551 // uWeave Header:
552 // 1--- ---- : type = 1 (control packet)
553 // -000 ---- : counter = 0
554 // ---- 0100 : command = 4 (INVALID)
555 // 1000 0100 = 0x84
556 std::vector<uint8_t> p0{0x84, kWeaveVersion, 0, kWeaveVersion, 0, 0, 0};
557 receiver->ReceivePacket(p0);
558 EXPECT_EQ(State::ERROR, receiver->GetState());
559 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
560
561 // Invalid control command bit 3
562 receiver = factory.NewInstance(ReceiverType::CLIENT);
563 // uWeave Header:
564 // 1--- ---- : type = 1 (control packet)
565 // -000 ---- : counter = 0
566 // ---- 1000 : command = 8 (INVALID)
567 // 1000 1000 = 0x88
568 std::vector<uint8_t> p1{0x88, kWeaveVersion, 0, kDefaultPacketSize, 0};
569 receiver->ReceivePacket(p1);
570 EXPECT_EQ(State::ERROR, receiver->GetState());
571 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
572
573 // Invalid bit 1 of data packet header
574 receiver = factory.NewInstance(ReceiverType::CLIENT);
575 std::vector<uint8_t> p2{kControlResponseHeader, kWeaveVersion, 0,
576 kDefaultPacketSize, 0};
577 receiver->ReceivePacket(p2);
578 EXPECT_EQ(State::WAITING, receiver->GetState());
579
580 // uWeave Header:
581 // 0--- ---- : type = 0 (data packet)
582 // -001 ---- : counter = 1
583 // ---- 1--- : first packet = true
584 // ---- -1-- : last packet = true
585 // ---- --10 : defined by uWeave to be 0, but bit 1 is not
586 // 0001 1110 = 0x1E
587 std::vector<uint8_t> p3{0x1E, 'a'};
588 receiver->ReceivePacket(p3);
589 EXPECT_EQ(State::ERROR, receiver->GetState());
590 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
591
592 // Invalid bit 0 of data packet header
593 receiver = factory.NewInstance(ReceiverType::CLIENT);
594 std::vector<uint8_t> p4{kControlResponseHeader, kWeaveVersion, 0,
595 kDefaultPacketSize, 0};
596 receiver->ReceivePacket(p4);
597 EXPECT_EQ(State::WAITING, receiver->GetState());
598
599 // uWeave Header:
600 // 0--- ---- : type = 0 (data packet)
601 // -001 ---- : counter = 1
602 // ---- 1--- : first packet = true
603 // ---- -1-- : last packet = true
604 // ---- --01 : defined by uWeave to be 0, but bit 0 is not
605 // 0001 1101 = 0x1D
606 std::vector<uint8_t> p5{0x1E, 'a'};
607 receiver->ReceivePacket(p5);
608 EXPECT_EQ(State::ERROR, receiver->GetState());
609 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
610 }
611
612 } // namespace proximity_auth
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698