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

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: wrong first bit is now packet_out_of_sequence error instead of unknown, switch log from base to PA 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 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0, 0};
44 receiver->ReceivePacket(p0);
45 EXPECT_EQ(State::WAITING, receiver->GetState());
46
47 std::vector<uint8_t> p1{0x18, 'a', 'b'};
48 receiver->ReceivePacket(p1);
49 EXPECT_EQ(State::RECEIVING_DATA, receiver->GetState());
50
51 std::vector<uint8_t> p2{0x24, 'c', 'd'};
52 receiver->ReceivePacket(p2);
53 EXPECT_EQ(State::DATA_READY, receiver->GetState());
54 EXPECT_EQ("abcd", receiver->GetDataMessage());
55
56 std::vector<uint8_t> p3{0x3C, 'g', 'o', 'o', 'g', 'l', 'e'};
57 receiver->ReceivePacket(p3);
58 EXPECT_EQ(State::DATA_READY, receiver->GetState());
59 EXPECT_EQ("google", receiver->GetDataMessage());
60
61 std::vector<uint8_t> p4{0xC2, 0x80, 0x00};
62 receiver->ReceivePacket(p4);
63 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
64 EXPECT_EQ(ReasonForClose::APPLICATION_ERROR, receiver->GetReasonForClose());
65 }
66
67 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
68 WellBehavingServerPacketsWithControlDataTest) {
69 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
70 (new BluetoothLowEnergyWeavePacketReceiver::Factory())
71 ->NewInstance(ReceiverType::SERVER);
72
73 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0, 0, 'a', 'b', 'c', 'd'};
74 receiver->ReceivePacket(p0);
75 EXPECT_EQ(State::DATA_READY, receiver->GetState());
76 EXPECT_EQ("abcd", receiver->GetDataMessage());
77
78 std::vector<uint8_t> p1{0x18, 'e', 'f'};
79 receiver->ReceivePacket(p1);
80 EXPECT_EQ(State::RECEIVING_DATA, receiver->GetState());
81
82 std::vector<uint8_t> p2{0x24, 'g', 'h'};
83 receiver->ReceivePacket(p2);
84 EXPECT_EQ(State::DATA_READY, receiver->GetState());
85 EXPECT_EQ("efgh", receiver->GetDataMessage());
86
87 std::vector<uint8_t> p3{0xB2, 0x00, 0x00};
88 receiver->ReceivePacket(p3);
89 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
90 EXPECT_EQ(ReasonForClose::CLOSE_WITHOUT_ERROR, receiver->GetReasonForClose());
91 }
92
93 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
94 WellBehavingClientPacketsNoControlDataTest) {
95 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
96 (new BluetoothLowEnergyWeavePacketReceiver::Factory())
97 ->NewInstance(ReceiverType::CLIENT);
98
99 std::vector<uint8_t> p0{0x81, 1, 0, 30, 0};
100 receiver->ReceivePacket(p0);
101 EXPECT_EQ(State::WAITING, receiver->GetState());
102 EXPECT_EQ((uint32_t)30, receiver->GetMaxPacketSize());
103
104 std::vector<uint8_t> p1{0x1C, 'g', 'o', 'o', 'g', 'l', 'e'};
105 receiver->ReceivePacket(p1);
106 EXPECT_EQ(State::DATA_READY, receiver->GetState());
107 EXPECT_EQ("google", receiver->GetDataMessage());
108
109 std::vector<uint8_t> p2{0xA2, 0x80, 0x00};
110 receiver->ReceivePacket(p2);
111 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
112 EXPECT_EQ(ReasonForClose::APPLICATION_ERROR, receiver->GetReasonForClose());
113 }
114
115 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
116 WellBehavingClientPacketsWithControlDataTest) {
117 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
118 (new BluetoothLowEnergyWeavePacketReceiver::Factory())
119 ->NewInstance(ReceiverType::CLIENT);
120
121 std::vector<uint8_t> p0{0x81, 1, 0, 20, 0, 'a', 'b', 'c', 'd'};
122 receiver->ReceivePacket(p0);
123 EXPECT_EQ(State::DATA_READY, receiver->GetState());
124 EXPECT_EQ("abcd", receiver->GetDataMessage());
125
126 std::vector<uint8_t> p1{0x1C, 'g', 'o', 'o', 'g', 'l', 'e'};
127 receiver->ReceivePacket(p1);
128 EXPECT_EQ(State::DATA_READY, receiver->GetState());
129 EXPECT_EQ("google", receiver->GetDataMessage());
130
131 std::vector<uint8_t> p2{0xA2, 0x00, 0x00};
132 receiver->ReceivePacket(p2);
133 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState());
134 EXPECT_EQ(ReasonForClose::CLOSE_WITHOUT_ERROR, receiver->GetReasonForClose());
135 }
136
137 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
138 ShortPacketTest) {
139 BluetoothLowEnergyWeavePacketReceiver::Factory factory =
140 BluetoothLowEnergyWeavePacketReceiver::Factory();
141
142 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
143 factory.NewInstance(ReceiverType::CLIENT);
144
145 std::vector<uint8_t> p0{0x81, 1, 0, 20, 0};
146 receiver->ReceivePacket(p0);
147 EXPECT_EQ(State::WAITING, receiver->GetState());
148
149 std::vector<uint8_t> p1{0x1C};
150 receiver->ReceivePacket(p1);
151 EXPECT_EQ(State::DATA_READY, receiver->GetState());
152 EXPECT_EQ("", receiver->GetDataMessage());
153
154 std::vector<uint8_t> p2;
155 receiver->ReceivePacket(p2);
156 EXPECT_EQ(State::ERROR, receiver->GetState());
157 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
158 }
159
160 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
161 InappropriateConnectingTypeTest) {
162 BluetoothLowEnergyWeavePacketReceiver::Factory factory =
163 BluetoothLowEnergyWeavePacketReceiver::Factory();
164
165 // Server receives connection response.
166 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
167 factory.NewInstance(ReceiverType::SERVER);
168 std::vector<uint8_t> p0{0x81, 1, 0, 20, 0};
169 receiver->ReceivePacket(p0);
170 EXPECT_EQ(State::ERROR, receiver->GetState());
171 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
172
173 // Client receives connection request.
174 receiver = factory.NewInstance(ReceiverType::CLIENT);
175 std::vector<uint8_t> p1{0x80, 1, 0, 1, 0, 0, 0};
176 receiver->ReceivePacket(p1);
177 EXPECT_EQ(State::ERROR, receiver->GetState());
178 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
179
180 // Receiving connection close as the first packet.
181 receiver = factory.NewInstance(ReceiverType::SERVER);
182 std::vector<uint8_t> p2{0x82, 0, 0};
183 receiver->ReceivePacket(p2);
184 EXPECT_EQ(State::ERROR, receiver->GetState());
185 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
186
187 // Receiving data packet as the first packet.
188 receiver = factory.NewInstance(ReceiverType::SERVER);
189 std::vector<uint8_t> p3{0x08, 'a', 'b', 'c', 'd'};
190 receiver->ReceivePacket(p3);
191 EXPECT_EQ(State::ERROR, receiver->GetState());
192 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
193 }
194
195 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
196 ControlPacketSizeTest) {
197 BluetoothLowEnergyWeavePacketReceiver::Factory factory =
198 BluetoothLowEnergyWeavePacketReceiver::Factory();
199
200 // Connection request missing a byte.
201 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
202 factory.NewInstance(ReceiverType::SERVER);
203 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0};
204 receiver->ReceivePacket(p0);
205 EXPECT_EQ(State::ERROR, receiver->GetState());
206 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
207
208 // Connection response missing a byte.
209 receiver = factory.NewInstance(ReceiverType::CLIENT);
210 std::vector<uint8_t> p1{0x81, 1, 0, 20};
211 receiver->ReceivePacket(p1);
212 EXPECT_EQ(State::ERROR, receiver->GetState());
213 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
214
215 // Max length connection request is accepted.
216 receiver = factory.NewInstance(ReceiverType::SERVER);
217 std::vector<uint8_t> p2(20, 0);
218 p2[0] = 0x80;
219 p2[1] = 1;
220 p2[3] = 1;
221 receiver->ReceivePacket(p2);
222 EXPECT_EQ(State::DATA_READY, receiver->GetState());
223
224 // Connection request that's a byte too long.
225 receiver = factory.NewInstance(ReceiverType::SERVER);
226 p2.push_back(0);
227 receiver->ReceivePacket(p2);
228 EXPECT_EQ(State::ERROR, receiver->GetState());
229 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
230
231 // Max length connection response is accepted.
232 receiver = factory.NewInstance(ReceiverType::CLIENT);
233 std::vector<uint8_t> p3(20, 0);
234 p3[0] = 0x81;
235 p3[1] = 1;
236 p3[3] = 20;
237 receiver->ReceivePacket(p3);
238 EXPECT_EQ(State::DATA_READY, receiver->GetState());
239
240 // Connection response that's a byte too long.
241 receiver = factory.NewInstance(ReceiverType::CLIENT);
242 p3.push_back(0);
243 receiver->ReceivePacket(p3);
244 EXPECT_EQ(State::ERROR, receiver->GetState());
245 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
246 }
247
248 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
249 WrongFirstLastBitTest) {
250 BluetoothLowEnergyWeavePacketReceiver::Factory factory =
251 BluetoothLowEnergyWeavePacketReceiver::Factory();
252
253 // First bit is not set when it's supposed to be with last bit not set.
254 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
255 factory.NewInstance(ReceiverType::SERVER);
256 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0, 0};
257 receiver->ReceivePacket(p0);
258 EXPECT_EQ(State::WAITING, receiver->GetState());
259
260 std::vector<uint8_t> p1{0x10};
261 receiver->ReceivePacket(p1);
262 EXPECT_EQ(State::ERROR, receiver->GetState());
263 EXPECT_EQ(ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE,
264 receiver->GetReasonToClose());
265
266 // First bit is not set when it's supposed to be when last bit is set.
267 receiver = factory.NewInstance(ReceiverType::SERVER);
268 receiver->ReceivePacket(p0);
269 EXPECT_EQ(State::WAITING, receiver->GetState());
270
271 std::vector<uint8_t> p2{0x14};
272 receiver->ReceivePacket(p1);
273 EXPECT_EQ(State::ERROR, receiver->GetState());
274 EXPECT_EQ(ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE,
275 receiver->GetReasonToClose());
276 }
277
278 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
279 OutOfOrderPacketTest) {
280 BluetoothLowEnergyWeavePacketReceiver::Factory factory =
281 BluetoothLowEnergyWeavePacketReceiver::Factory();
282
283 // Skip a packet in number.
284 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
285 factory.NewInstance(ReceiverType::SERVER);
286 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0, 0};
287 receiver->ReceivePacket(p0);
288 EXPECT_EQ(State::WAITING, receiver->GetState());
289
290 std::vector<uint8_t> p1{0x20};
291 receiver->ReceivePacket(p1);
292 EXPECT_EQ(State::ERROR, receiver->GetState());
293 EXPECT_EQ(ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE,
294 receiver->GetReasonToClose());
295 }
296
297 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest,
298 IncorrectValuesInControlPacketTest) {
299 BluetoothLowEnergyWeavePacketReceiver::Factory factory =
300 BluetoothLowEnergyWeavePacketReceiver::Factory();
301
302 // Invalid version in request.
303 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver =
304 factory.NewInstance(ReceiverType::SERVER);
305 std::vector<uint8_t> p0{0x80, 2, 0, 1, 0, 0, 0};
306 receiver->ReceivePacket(p0);
307 EXPECT_EQ(State::ERROR, receiver->GetState());
308 EXPECT_EQ(ReasonForClose::NO_COMMON_VERSION_SUPPORTED,
309 receiver->GetReasonToClose());
310
311 // Invalid max packet size in request.
312 receiver = factory.NewInstance(ReceiverType::SERVER);
313 std::vector<uint8_t> p1{0x80, 1, 0, 1, 0, 19, 0};
314 receiver->ReceivePacket(p1);
315 EXPECT_EQ(State::ERROR, receiver->GetState());
316 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
317
318 // Invalid selected version in response.
319 receiver = factory.NewInstance(ReceiverType::CLIENT);
320 std::vector<uint8_t> p2{0x81, 0, 1, 20, 0};
321 receiver->ReceivePacket(p2);
322 EXPECT_EQ(State::ERROR, receiver->GetState());
323 EXPECT_EQ(ReasonForClose::NO_COMMON_VERSION_SUPPORTED,
324 receiver->GetReasonToClose());
325
326 // Invalid selected max packet size in response.
327 receiver = factory.NewInstance(ReceiverType::CLIENT);
328 std::vector<uint8_t> p3{0x81, 1, 0, 19, 0};
329 receiver->ReceivePacket(p3);
330 EXPECT_EQ(State::ERROR, receiver->GetState());
331 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
332
333 // Invalid reason for close.
334 receiver = factory.NewInstance(ReceiverType::CLIENT);
335 std::vector<uint8_t> p4{0x81, 1, 0, 20, 0};
336 receiver->ReceivePacket(p4);
337 EXPECT_EQ(State::WAITING, receiver->GetState());
338
339 std::vector<uint8_t> p5{0x92, 0x05, 0x00};
340 receiver->ReceivePacket(p5);
341 EXPECT_EQ(State::ERROR, receiver->GetState());
342 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose());
343 }
344
345 // TODO(jingxuy): test for other malicious headers
346
347 } // namespace proximity_auth
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698