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 } // 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 | |
| OLD | NEW |