Chromium Code Reviews| OLD | NEW |
|---|---|
| (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 | |
| OLD | NEW |