1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include <gtest/gtest.h> 17 #include <thread> 18 #include "db_errno.h" 19 #include "distributeddb_communicator_common.h" 20 #include "distributeddb_tools_unit_test.h" 21 #include "log_print.h" 22 #include "message.h" 23 #include "protocol_proto.h" 24 #include "time_sync.h" 25 #include "sync_types.h" 26 27 using namespace std; 28 using namespace testing::ext; 29 using namespace DistributedDB; 30 31 namespace { 32 constexpr int SEND_COUNT_GOAL = 20; // Send 20 times 33 34 EnvHandle g_envDeviceA; 35 EnvHandle g_envDeviceB; 36 ICommunicator *g_commAA = nullptr; 37 ICommunicator *g_commBA = nullptr; 38 ICommunicator *g_commBB = nullptr; 39 } 40 41 class DistributedDBCommunicatorSendReceiveTest : public testing::Test { 42 public: 43 static void SetUpTestCase(void); 44 static void TearDownTestCase(void); 45 void SetUp(); 46 void TearDown(); 47 }; 48 SetUpTestCase(void)49 void DistributedDBCommunicatorSendReceiveTest::SetUpTestCase(void) 50 { 51 /** 52 * @tc.setup: Create and init CommunicatorAggregator and AdapterStub 53 */ 54 LOGI("[UT][SendRecvTest][SetUpTestCase] Enter."); 55 bool errCode = SetUpEnv(g_envDeviceA, DEVICE_NAME_A); 56 ASSERT_EQ(errCode, true); 57 errCode = SetUpEnv(g_envDeviceB, DEVICE_NAME_B); 58 ASSERT_EQ(errCode, true); 59 DoRegTransformFunction(); 60 CommunicatorAggregator::EnableCommunicatorNotFoundFeedback(false); 61 } 62 TearDownTestCase(void)63 void DistributedDBCommunicatorSendReceiveTest::TearDownTestCase(void) 64 { 65 /** 66 * @tc.teardown: Finalize and release CommunicatorAggregator and AdapterStub 67 */ 68 LOGI("[UT][SendRecvTest][TearDownTestCase] Enter."); 69 std::this_thread::sleep_for(std::chrono::seconds(7)); // Wait 7 s to make sure all thread quiet and memory released 70 TearDownEnv(g_envDeviceA); 71 TearDownEnv(g_envDeviceB); 72 CommunicatorAggregator::EnableCommunicatorNotFoundFeedback(true); 73 } 74 SetUp()75 void DistributedDBCommunicatorSendReceiveTest::SetUp() 76 { 77 DistributedDBUnitTest::DistributedDBToolsUnitTest::PrintTestCaseInfo(); 78 /** 79 * @tc.setup: Alloc communicator AA, BA, BB 80 */ 81 int errorNo = E_OK; 82 g_commAA = g_envDeviceA.commAggrHandle->AllocCommunicator(LABEL_A, errorNo); 83 ASSERT_EQ(errorNo, E_OK); 84 ASSERT_NOT_NULL_AND_ACTIVATE(g_commAA); 85 86 errorNo = E_OK; 87 g_commBA = g_envDeviceB.commAggrHandle->AllocCommunicator(LABEL_A, errorNo); 88 ASSERT_EQ(errorNo, E_OK); 89 ASSERT_NOT_NULL_AND_ACTIVATE(g_commBA); 90 91 errorNo = E_OK; 92 g_commBB = g_envDeviceB.commAggrHandle->AllocCommunicator(LABEL_B, errorNo); 93 ASSERT_EQ(errorNo, E_OK); 94 ASSERT_NOT_NULL_AND_ACTIVATE(g_commBB); 95 } 96 TearDown()97 void DistributedDBCommunicatorSendReceiveTest::TearDown() 98 { 99 /** 100 * @tc.teardown: Release communicator AA, BA, BB 101 */ 102 g_envDeviceA.commAggrHandle->ReleaseCommunicator(g_commAA); 103 g_commAA = nullptr; 104 g_envDeviceB.commAggrHandle->ReleaseCommunicator(g_commBA); 105 g_commBA = nullptr; 106 g_envDeviceB.commAggrHandle->ReleaseCommunicator(g_commBB); 107 g_commBA = nullptr; 108 std::this_thread::sleep_for(std::chrono::milliseconds(200)); // Wait 200 ms to make sure all thread quiet 109 } 110 BuildAppLayerFrameMessage()111 static Message *BuildAppLayerFrameMessage() 112 { 113 DistributedDBUnitTest::DataSyncMessageInfo info; 114 info.messageId_ = DistributedDB::TIME_SYNC_MESSAGE; 115 info.messageType_ = TYPE_REQUEST; 116 DistributedDB::Message *message = nullptr; 117 DistributedDBUnitTest::DistributedDBToolsUnitTest::BuildMessage(info, message); 118 return message; 119 } 120 121 /** 122 * @tc.name: Send And Receive 001 123 * @tc.desc: Test send and receive based on equipment communicator 124 * @tc.type: FUNC 125 * @tc.require: AR000BVDGI AR000CQE0M 126 * @tc.author: xiaozhenjian 127 */ 128 HWTEST_F(DistributedDBCommunicatorSendReceiveTest, SendAndReceive001, TestSize.Level1) 129 { 130 // Preset 131 string srcTargetForAA; 132 Message *recvMsgForAA = nullptr; 133 string srcTargetForBA; 134 Message *recvMsgForBA = nullptr; 135 string srcTargetForBB; 136 Message *recvMsgForBB = nullptr; __anon922778e00202(const std::string &srcTarget, Message *inMsg) 137 g_commAA->RegOnMessageCallback([&srcTargetForAA, &recvMsgForAA](const std::string &srcTarget, Message *inMsg) { 138 srcTargetForAA = srcTarget; 139 recvMsgForAA = inMsg; 140 }, nullptr); __anon922778e00302(const std::string &srcTarget, Message *inMsg) 141 g_commBA->RegOnMessageCallback([&srcTargetForBA, &recvMsgForBA](const std::string &srcTarget, Message *inMsg) { 142 srcTargetForBA = srcTarget; 143 recvMsgForBA = inMsg; 144 }, nullptr); __anon922778e00402(const std::string &srcTarget, Message *inMsg) 145 g_commBB->RegOnMessageCallback([&srcTargetForBB, &recvMsgForBB](const std::string &srcTarget, Message *inMsg) { 146 srcTargetForBB = srcTarget; 147 recvMsgForBB = inMsg; 148 }, nullptr); 149 150 /** 151 * @tc.steps: step1. connect device A with device B 152 */ 153 AdapterStub::ConnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 154 155 /** 156 * @tc.steps: step2. device A send message(registered and tiny) to device B using communicator AA 157 * @tc.expected: step2. communicator BA received the message 158 */ 159 Message *msgForAA = BuildRegedTinyMessage(); 160 ASSERT_NE(msgForAA, nullptr); 161 SendConfig conf = {false, false, 0}; 162 int errCode = g_commAA->SendMessage(DEVICE_NAME_B, msgForAA, conf); 163 EXPECT_EQ(errCode, E_OK); 164 std::this_thread::sleep_for(std::chrono::milliseconds(200)); // sleep 200 ms 165 EXPECT_EQ(recvMsgForBB, nullptr); 166 EXPECT_EQ(srcTargetForBA, DEVICE_NAME_A); 167 ASSERT_NE(recvMsgForBA, nullptr); 168 EXPECT_EQ(recvMsgForBA->GetMessageId(), REGED_TINY_MSG_ID); 169 EXPECT_EQ(recvMsgForBA->GetMessageType(), TYPE_REQUEST); 170 EXPECT_EQ(recvMsgForBA->GetSessionId(), FIXED_SESSIONID); 171 EXPECT_EQ(recvMsgForBA->GetSequenceId(), FIXED_SEQUENCEID); 172 EXPECT_EQ(recvMsgForBA->GetErrorNo(), NO_ERROR); 173 delete recvMsgForBA; 174 recvMsgForBA = nullptr; 175 176 /** 177 * @tc.steps: step3. device B send message(registered and tiny) to device A using communicator BB 178 * @tc.expected: step3. communicator AA did not receive the message 179 */ 180 Message *msgForBB = BuildRegedTinyMessage(); 181 ASSERT_NE(msgForBB, nullptr); 182 conf = {true, 0}; 183 errCode = g_commBB->SendMessage(DEVICE_NAME_A, msgForBB, conf); 184 EXPECT_EQ(errCode, E_OK); 185 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 186 EXPECT_EQ(srcTargetForAA, ""); 187 188 // CleanUp 189 AdapterStub::DisconnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 190 } 191 192 /** 193 * @tc.name: Send And Receive 002 194 * @tc.desc: Test send oversize message will fail 195 * @tc.type: FUNC 196 * @tc.require: AR000BVDGK AR000CQE0O 197 * @tc.author: xiaozhenjian 198 */ 199 HWTEST_F(DistributedDBCommunicatorSendReceiveTest, SendAndReceive002, TestSize.Level1) 200 { 201 /** 202 * @tc.steps: step1. connect device A with device B 203 */ 204 AdapterStub::ConnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 205 206 /** 207 * @tc.steps: step2. device A send message(registered and oversize) to device B using communicator AA 208 * @tc.expected: step2. send fail 209 */ 210 Message *msgForAA = BuildRegedOverSizeMessage(); 211 ASSERT_NE(msgForAA, nullptr); 212 SendConfig conf = {true, false, 0}; 213 int errCode = g_commAA->SendMessage(DEVICE_NAME_B, msgForAA, conf); 214 EXPECT_NE(errCode, E_OK); 215 delete msgForAA; 216 msgForAA = nullptr; 217 218 // CleanUp 219 AdapterStub::DisconnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 220 } 221 222 /** 223 * @tc.name: Send And Receive 003 224 * @tc.desc: Test send unregistered message will fail 225 * @tc.type: FUNC 226 * @tc.require: AR000BVDGK AR000CQE0O 227 * @tc.author: xiaozhenjian 228 */ 229 HWTEST_F(DistributedDBCommunicatorSendReceiveTest, SendAndReceive003, TestSize.Level1) 230 { 231 /** 232 * @tc.steps: step1. connect device A with device B 233 */ 234 AdapterStub::ConnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 235 236 /** 237 * @tc.steps: step2. device A send message(unregistered and tiny) to device B using communicator AA 238 * @tc.expected: step2. send fail 239 */ 240 Message *msgForAA = BuildUnRegedTinyMessage(); 241 ASSERT_NE(msgForAA, nullptr); 242 SendConfig conf = {true, false, 0}; 243 int errCode = g_commAA->SendMessage(DEVICE_NAME_B, msgForAA, conf); 244 EXPECT_NE(errCode, E_OK); 245 delete msgForAA; 246 msgForAA = nullptr; 247 248 // CleanUp 249 AdapterStub::DisconnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 250 } 251 252 /** 253 * @tc.name: Send Flow Control 001 254 * @tc.desc: Test send in nonblock way 255 * @tc.type: FUNC 256 * @tc.require: AR000BVDGI AR000CQE0M 257 * @tc.author: xiaozhenjian 258 */ 259 HWTEST_F(DistributedDBCommunicatorSendReceiveTest, SendFlowControl001, TestSize.Level1) 260 { 261 // Preset 262 int countForBA = 0; 263 int countForBB = 0; __anon922778e00502()264 g_commBA->RegOnSendableCallback([&countForBA](){ countForBA++; }, nullptr); __anon922778e00602()265 g_commBB->RegOnSendableCallback([&countForBB](){ countForBB++; }, nullptr); 266 267 /** 268 * @tc.steps: step1. connect device A with device B 269 */ 270 AdapterStub::ConnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 271 std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Wait 100 ms to make sure send cause by online done 272 countForBA = 0; 273 countForBB = 0; 274 275 /** 276 * @tc.steps: step2. device B simulates send block 277 */ 278 g_envDeviceB.adapterHandle->SimulateSendBlock(); 279 280 /** 281 * @tc.steps: step3. device B send as much as possible message(unregistered and huge) in nonblock way 282 * to device A using communicator BA until send fail; 283 * @tc.expected: step3. send fail will happen. 284 */ 285 int sendCount = 0; 286 while (true) { 287 Message *msgForBA = BuildRegedHugeMessage(); 288 ASSERT_NE(msgForBA, nullptr); 289 SendConfig conf = {true, false, 0}; 290 int errCode = g_commBA->SendMessage(DEVICE_NAME_A, msgForBA, conf); 291 if (errCode == E_OK) { 292 sendCount++; 293 } else { 294 delete msgForBA; 295 msgForBA = nullptr; 296 break; 297 } 298 } 299 300 /** 301 * @tc.steps: step4. device B simulates send block terminate 302 * @tc.expected: step4. send count before fail is equal as expected. sendable callback happened. 303 */ 304 g_envDeviceB.adapterHandle->SimulateSendBlockClear(); 305 int expectSendCount = MAX_CAPACITY / (HUGE_SIZE + HEADER_SIZE) + 306 (MAX_CAPACITY % (HUGE_SIZE + HEADER_SIZE) == 0 ? 0 : 1); 307 EXPECT_EQ(sendCount, expectSendCount); 308 std::this_thread::sleep_for(std::chrono::milliseconds(1000)); 309 EXPECT_GE(countForBA, 1); 310 EXPECT_GE(countForBB, 1); 311 312 // CleanUp 313 AdapterStub::DisconnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 314 } 315 316 /** 317 * @tc.name: Send Flow Control 002 318 * @tc.desc: Test send in block(without timeout) way 319 * @tc.type: FUNC 320 * @tc.require: AR000BVDGI AR000CQE0M 321 * @tc.author: xiaozhenjian 322 */ 323 HWTEST_F(DistributedDBCommunicatorSendReceiveTest, SendFlowControl002, TestSize.Level1) 324 { 325 // Preset 326 int cntForBA = 0; 327 int cntForBB = 0; __anon922778e00702()328 g_commBA->RegOnSendableCallback([&cntForBA](){ cntForBA++; }, nullptr); __anon922778e00802()329 g_commBB->RegOnSendableCallback([&cntForBB](){ cntForBB++; }, nullptr); 330 331 /** 332 * @tc.steps: step1. connect device A with device B 333 */ 334 AdapterStub::ConnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 335 std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Wait 100 ms to make sure send cause by online done 336 cntForBA = 0; 337 cntForBB = 0; 338 339 /** 340 * @tc.steps: step2. device B simulates send block 341 */ 342 g_envDeviceB.adapterHandle->SimulateSendBlock(); 343 344 /** 345 * @tc.steps: step3. device B send a certain message(unregistered and huge) in block way 346 * without timeout to device A using communicator BA; 347 */ 348 int sendCount = 0; 349 int sendFailCount = 0; __anon922778e00902() 350 std::thread sendThread([&sendCount, &sendFailCount]() { 351 while (sendCount < SEND_COUNT_GOAL) { 352 Message *msgForBA = BuildRegedHugeMessage(); 353 ASSERT_NE(msgForBA, nullptr); 354 SendConfig conf = {false, false, 0}; 355 int errCode = g_commBA->SendMessage(DEVICE_NAME_A, msgForBA, conf); 356 if (errCode != E_OK) { 357 delete msgForBA; 358 msgForBA = nullptr; 359 sendFailCount++; 360 } 361 sendCount++; 362 } 363 }); 364 365 /** 366 * @tc.steps: step4. device B simulates send block terminate 367 * @tc.expected: step4. send fail count is zero. sendable callback happened. 368 */ 369 std::this_thread::sleep_for(std::chrono::milliseconds(200)); 370 g_envDeviceB.adapterHandle->SimulateSendBlockClear(); 371 std::this_thread::sleep_for(std::chrono::milliseconds(1000)); 372 sendThread.join(); 373 EXPECT_EQ(sendCount, SEND_COUNT_GOAL); 374 EXPECT_EQ(sendFailCount, 0); 375 EXPECT_GE(cntForBA, 1); 376 EXPECT_GE(cntForBB, 1); 377 378 // CleanUp 379 AdapterStub::DisconnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 380 } 381 382 /** 383 * @tc.name: Send Flow Control 003 384 * @tc.desc: Test send in block(with timeout) way 385 * @tc.type: FUNC 386 * @tc.require: AR000BVDGI AR000CQE0M 387 * @tc.author: xiaozhenjian 388 */ 389 HWTEST_F(DistributedDBCommunicatorSendReceiveTest, SendFlowControl003, TestSize.Level1) 390 { 391 // Preset 392 int cntsForBA = 0; 393 int cntsForBB = 0; __anon922778e00a02()394 g_commBA->RegOnSendableCallback([&cntsForBA](){ cntsForBA++; }, nullptr); __anon922778e00b02()395 g_commBB->RegOnSendableCallback([&cntsForBB](){ cntsForBB++; }, nullptr); 396 397 /** 398 * @tc.steps: step1. connect device A with device B 399 */ 400 AdapterStub::ConnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 401 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 402 cntsForBA = 0; 403 cntsForBB = 0; 404 405 /** 406 * @tc.steps: step2. device B simulates send block 407 */ 408 g_envDeviceB.adapterHandle->SimulateSendBlock(); 409 410 /** 411 * @tc.steps: step3. device B send a certain message(unregistered and huge) in block way 412 * with timeout to device A using communicator BA; 413 */ 414 int sendCnt = 0; 415 int sendFailCnt = 0; __anon922778e00c02() 416 std::thread sendThread([&sendCnt, &sendFailCnt]() { 417 while (sendCnt < SEND_COUNT_GOAL) { 418 Message *msgForBA = BuildRegedHugeMessage(); 419 ASSERT_NE(msgForBA, nullptr); 420 SendConfig conf = {false, false, 100}; 421 int errCode = g_commBA->SendMessage(DEVICE_NAME_A, msgForBA, conf); // 100 ms timeout 422 if (errCode != E_OK) { 423 delete msgForBA; 424 msgForBA = nullptr; 425 sendFailCnt++; 426 } 427 sendCnt++; 428 } 429 }); 430 431 /** 432 * @tc.steps: step4. device B simulates send block terminate 433 * @tc.expected: step4. send fail count is no more than expected. sendable callback happened. 434 */ 435 std::this_thread::sleep_for(std::chrono::milliseconds(300)); // wait 300 ms 436 g_envDeviceB.adapterHandle->SimulateSendBlockClear(); 437 std::this_thread::sleep_for(std::chrono::milliseconds(1200)); // wait 1200 ms 438 sendThread.join(); 439 EXPECT_EQ(sendCnt, SEND_COUNT_GOAL); 440 EXPECT_LE(sendFailCnt, 4); 441 EXPECT_GE(cntsForBA, 1); 442 EXPECT_GE(cntsForBB, 1); 443 444 // CleanUp 445 AdapterStub::DisconnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 446 } 447 448 /** 449 * @tc.name: Receive Check 001 450 * @tc.desc: Receive packet field check 451 * @tc.type: FUNC 452 * @tc.require: AR000BVRNU AR000CQE0J 453 * @tc.author: xiaozhenjian 454 */ 455 HWTEST_F(DistributedDBCommunicatorSendReceiveTest, ReceiveCheck001, TestSize.Level1) 456 { 457 // Preset 458 int recvCount = 0; __anon922778e00d02(const std::string &srcTarget, Message *inMsg) 459 g_commAA->RegOnMessageCallback([&recvCount](const std::string &srcTarget, Message *inMsg) { 460 recvCount++; 461 if (inMsg != nullptr) { 462 delete inMsg; 463 inMsg = nullptr; 464 } 465 }, nullptr); 466 AdapterStub::ConnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 467 468 /** 469 * @tc.steps: step1. create packet with magic field error 470 * @tc.expected: step1. no message callback 471 */ 472 g_envDeviceB.adapterHandle->SimulateSendBitErrorInMagicField(true, 0xFFFF); 473 Message *msgForBA = BuildRegedTinyMessage(); 474 SendConfig conf = {true, false, 0}; 475 int errCode = g_commBA->SendMessage(DEVICE_NAME_A, msgForBA, conf); 476 EXPECT_EQ(errCode, E_OK); 477 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 478 EXPECT_EQ(recvCount, 0); 479 g_envDeviceB.adapterHandle->SimulateSendBitErrorInMagicField(false, 0); 480 481 /** 482 * @tc.steps: step2. create packet with version field error 483 * @tc.expected: step2. no message callback 484 */ 485 g_envDeviceB.adapterHandle->SimulateSendBitErrorInVersionField(true, 0xFFFF); 486 msgForBA = BuildRegedTinyMessage(); 487 errCode = g_commBA->SendMessage(DEVICE_NAME_A, msgForBA, conf); 488 EXPECT_EQ(errCode, E_OK); 489 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 490 EXPECT_EQ(recvCount, 0); 491 g_envDeviceB.adapterHandle->SimulateSendBitErrorInVersionField(false, 0); 492 493 /** 494 * @tc.steps: step3. create packet with checksum field error 495 * @tc.expected: step3. no message callback 496 */ 497 g_envDeviceB.adapterHandle->SimulateSendBitErrorInCheckSumField(true, 0xFFFF); 498 msgForBA = BuildRegedTinyMessage(); 499 errCode = g_commBA->SendMessage(DEVICE_NAME_A, msgForBA, conf); 500 EXPECT_EQ(errCode, E_OK); 501 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 502 EXPECT_EQ(recvCount, 0); 503 g_envDeviceB.adapterHandle->SimulateSendBitErrorInCheckSumField(false, 0); 504 505 // CleanUp 506 AdapterStub::DisconnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 507 } 508 509 /** 510 * @tc.name: Receive Check 002 511 * @tc.desc: Receive packet field check 512 * @tc.type: FUNC 513 * @tc.require: AR000BVRNU AR000CQE0J 514 * @tc.author: xiaozhenjian 515 */ 516 HWTEST_F(DistributedDBCommunicatorSendReceiveTest, ReceiveCheck002, TestSize.Level1) 517 { 518 // Preset 519 int recvCount = 0; __anon922778e00e02(const std::string &srcTarget, Message *inMsg) 520 g_commAA->RegOnMessageCallback([&recvCount](const std::string &srcTarget, Message *inMsg) { 521 recvCount++; 522 if (inMsg != nullptr) { 523 delete inMsg; 524 inMsg = nullptr; 525 } 526 }, nullptr); 527 AdapterStub::ConnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 528 529 /** 530 * @tc.steps: step1. create packet with packetLen field error 531 * @tc.expected: step1. no message callback 532 */ 533 g_envDeviceB.adapterHandle->SimulateSendBitErrorInPacketLenField(true, 0xFFFF); 534 Message *msgForBA = BuildRegedTinyMessage(); 535 SendConfig conf = {true, false, 0}; 536 int errCode = g_commBA->SendMessage(DEVICE_NAME_A, msgForBA, conf); 537 EXPECT_EQ(errCode, E_OK); 538 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 539 EXPECT_EQ(recvCount, 0); 540 g_envDeviceB.adapterHandle->SimulateSendBitErrorInPacketLenField(false, 0); 541 542 /** 543 * @tc.steps: step1. create packet with packetType field error 544 * @tc.expected: step1. no message callback 545 */ 546 g_envDeviceB.adapterHandle->SimulateSendBitErrorInPacketTypeField(true, 0xFF); 547 msgForBA = BuildRegedTinyMessage(); 548 errCode = g_commBA->SendMessage(DEVICE_NAME_A, msgForBA, conf); 549 EXPECT_EQ(errCode, E_OK); 550 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 551 EXPECT_EQ(recvCount, 0); 552 g_envDeviceB.adapterHandle->SimulateSendBitErrorInPacketTypeField(false, 0); 553 554 /** 555 * @tc.steps: step1. create packet with paddingLen field error 556 * @tc.expected: step1. no message callback 557 */ 558 g_envDeviceB.adapterHandle->SimulateSendBitErrorInPaddingLenField(true, 0xFF); 559 msgForBA = BuildRegedTinyMessage(); 560 errCode = g_commBA->SendMessage(DEVICE_NAME_A, msgForBA, conf); 561 EXPECT_EQ(errCode, E_OK); 562 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 563 EXPECT_EQ(recvCount, 0); 564 g_envDeviceB.adapterHandle->SimulateSendBitErrorInPaddingLenField(false, 0); 565 566 // CleanUp 567 AdapterStub::DisconnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 568 } 569 570 /** 571 * @tc.name: Send Result Notify 001 572 * @tc.desc: Test send result notify 573 * @tc.type: FUNC 574 * @tc.require: AR000CQE0M 575 * @tc.author: xiaozhenjian 576 */ 577 HWTEST_F(DistributedDBCommunicatorSendReceiveTest, SendResultNotify001, TestSize.Level1) 578 { 579 // preset 580 std::vector<int> sendResult; __anon922778e00f02(int result, bool isDirectEnd) 581 auto sendResultNotifier = [&sendResult](int result, bool isDirectEnd) { 582 sendResult.push_back(result); 583 }; 584 585 /** 586 * @tc.steps: step1. connect device A with device B 587 */ 588 AdapterStub::ConnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 589 590 /** 591 * @tc.steps: step2. device A send message to device B using communicator AA 592 * @tc.expected: step2. notify send done and success 593 */ 594 Message *msgForAA = BuildRegedTinyMessage(); 595 ASSERT_NE(msgForAA, nullptr); 596 SendConfig conf = {false, false, 0}; 597 int errCode = g_commAA->SendMessage(DEVICE_NAME_B, msgForAA, conf, sendResultNotifier); 598 EXPECT_EQ(errCode, E_OK); 599 std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Sleep 100 ms 600 ASSERT_EQ(sendResult.size(), static_cast<size_t>(1)); // 1 notify 601 EXPECT_EQ(sendResult[0], E_OK); 602 603 /** 604 * @tc.steps: step3. disconnect device A with device B 605 */ 606 AdapterStub::DisconnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 607 608 /** 609 * @tc.steps: step4. device A send message to device B using communicator AA 610 * @tc.expected: step2. notify send done and fail 611 */ 612 msgForAA = BuildRegedTinyMessage(); 613 ASSERT_NE(msgForAA, nullptr); 614 errCode = g_commAA->SendMessage(DEVICE_NAME_B, msgForAA, conf, sendResultNotifier); 615 EXPECT_EQ(errCode, E_OK); 616 std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Sleep 100 ms 617 ASSERT_EQ(sendResult.size(), static_cast<size_t>(2)); // 2 notify 618 EXPECT_NE(sendResult[1], E_OK); // 1 for second element 619 } 620 621 #define REG_MESSAGE_CALLBACK(src, label) \ 622 string srcTargetFor##src##label; \ 623 Message *recvMsgFor##src##label = nullptr; \ 624 g_comm##src##label->RegOnMessageCallback( \ 625 [&srcTargetFor##src##label, &recvMsgFor##src##label](const std::string &srcTarget, Message *inMsg) { \ 626 srcTargetFor##src##label = srcTarget; \ 627 recvMsgFor##src##label = inMsg; \ 628 }, nullptr); 629 630 /** 631 * @tc.name: Message Feedback 001 632 * @tc.desc: Test feedback not support messageid and communicator not found 633 * @tc.type: FUNC 634 * @tc.require: AR000CQE0M 635 * @tc.author: xiaozhenjian 636 */ 637 HWTEST_F(DistributedDBCommunicatorSendReceiveTest, MessageFeedback001, TestSize.Level1) 638 { 639 CommunicatorAggregator::EnableCommunicatorNotFoundFeedback(true); 640 // preset 641 REG_MESSAGE_CALLBACK(A, A); 642 REG_MESSAGE_CALLBACK(B, A); 643 REG_MESSAGE_CALLBACK(B, B); 644 645 /** 646 * @tc.steps: step1. connect device A with device B 647 */ 648 AdapterStub::ConnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 649 650 /** 651 * @tc.steps: step2. device B send message to device A using communicator BB 652 * @tc.expected: step2. communicator BB receive communicator not found feedback 653 */ 654 Message *msgForBB = BuildRegedTinyMessage(); 655 ASSERT_NE(msgForBB, nullptr); 656 SendConfig conf = {false, false, 0}; 657 int errCode = g_commBB->SendMessage(DEVICE_NAME_A, msgForBB, conf); 658 EXPECT_EQ(errCode, E_OK); 659 std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Sleep 100 ms 660 ASSERT_NE(recvMsgForBB, nullptr); 661 EXPECT_EQ(srcTargetForBB, DEVICE_NAME_A); 662 EXPECT_EQ(recvMsgForBB->GetMessageId(), REGED_TINY_MSG_ID); 663 EXPECT_EQ(recvMsgForBB->GetMessageType(), TYPE_RESPONSE); 664 EXPECT_EQ(recvMsgForBB->GetSessionId(), FIXED_SESSIONID); 665 EXPECT_EQ(recvMsgForBB->GetSequenceId(), FIXED_SEQUENCEID); 666 EXPECT_EQ(recvMsgForBB->GetErrorNo(), static_cast<uint32_t>(E_FEEDBACK_COMMUNICATOR_NOT_FOUND)); 667 EXPECT_EQ(recvMsgForBB->GetObject<RegedTinyObject>(), nullptr); 668 delete recvMsgForBB; 669 recvMsgForBB = nullptr; 670 671 /** 672 * @tc.steps: step3. simulate messageid not registered 673 */ 674 g_envDeviceB.adapterHandle->SimulateSendBitErrorInMessageIdField(true, UNREGED_TINY_MSG_ID); 675 676 /** 677 * @tc.steps: step4. device B send message to device A using communicator BA 678 * @tc.expected: step4. communicator BA receive messageid not register feedback 679 */ 680 Message *msgForBA = BuildRegedTinyMessage(); 681 ASSERT_NE(msgForBA, nullptr); 682 errCode = g_commBA->SendMessage(DEVICE_NAME_A, msgForBA, conf); 683 EXPECT_EQ(errCode, E_OK); 684 std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Sleep 100 ms 685 ASSERT_NE(recvMsgForBA, nullptr); 686 EXPECT_EQ(srcTargetForBA, DEVICE_NAME_A); 687 EXPECT_EQ(recvMsgForBA->GetMessageId(), UNREGED_TINY_MSG_ID); 688 EXPECT_EQ(recvMsgForBA->GetMessageType(), TYPE_RESPONSE); 689 EXPECT_EQ(recvMsgForBA->GetSessionId(), FIXED_SESSIONID); 690 EXPECT_EQ(recvMsgForBA->GetSequenceId(), FIXED_SEQUENCEID); 691 EXPECT_EQ(recvMsgForBA->GetErrorNo(), static_cast<uint32_t>(E_FEEDBACK_UNKNOWN_MESSAGE)); 692 EXPECT_EQ(recvMsgForBA->GetObject<RegedTinyObject>(), nullptr); 693 delete recvMsgForBA; 694 recvMsgForBA = nullptr; 695 696 // CleanUp 697 g_envDeviceB.adapterHandle->SimulateSendBitErrorInMessageIdField(false, 0); 698 AdapterStub::DisconnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 699 CommunicatorAggregator::EnableCommunicatorNotFoundFeedback(false); 700 } 701 702 /** 703 * @tc.name: SendAndReceiveWithExtendHead001 704 * @tc.desc: Test fill extendHead func 705 * @tc.type: FUNC 706 * @tc.require: AR000BVDGI AR000CQE0M 707 * @tc.author: zhuwentao 708 */ 709 HWTEST_F(DistributedDBCommunicatorSendReceiveTest, SendAndReceiveWithExtendHead001, TestSize.Level1) 710 { 711 // Preset 712 string srcTargetForAA; 713 Message *recvMsgForAA = nullptr; 714 string srcTargetForBA; 715 Message *recvMsgForBA = nullptr; 716 TimeSync::RegisterTransformFunc(); __anon922778e01002(const std::string &srcTarget, Message *inMsg) 717 g_commAA->RegOnMessageCallback([&srcTargetForAA, &recvMsgForAA](const std::string &srcTarget, Message *inMsg) { 718 srcTargetForAA = srcTarget; 719 recvMsgForAA = inMsg; 720 }, nullptr); __anon922778e01102(const std::string &srcTarget, Message *inMsg) 721 g_commBA->RegOnMessageCallback([&srcTargetForBA, &recvMsgForBA](const std::string &srcTarget, Message *inMsg) { 722 srcTargetForBA = srcTarget; 723 recvMsgForBA = inMsg; 724 }, nullptr); 725 726 /** 727 * @tc.steps: step1. connect device A with device B 728 */ 729 AdapterStub::ConnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 730 731 /** 732 * @tc.steps: step2. device A send ApplayerFrameMessage to device B using communicator AA with extednHead 733 * @tc.expected: step2. communicator BA received the message 734 */ 735 Message *msgForAA = BuildAppLayerFrameMessage(); 736 ASSERT_NE(msgForAA, nullptr); 737 SendConfig conf = {false, true, 0, {"appId", "storeId", "userId", "deviceB"}}; 738 int errCode = g_commAA->SendMessage(DEVICE_NAME_B, msgForAA, conf); 739 EXPECT_EQ(errCode, E_OK); 740 std::this_thread::sleep_for(std::chrono::milliseconds(200)); // sleep 200 ms 741 EXPECT_EQ(srcTargetForBA, DEVICE_NAME_A); 742 ASSERT_NE(recvMsgForBA, nullptr); 743 delete recvMsgForBA; 744 recvMsgForBA = nullptr; 745 DistributedDB::ProtocolProto::UnRegTransformFunction(DistributedDB::TIME_SYNC_MESSAGE); 746 // CleanUp 747 AdapterStub::DisconnectAdapterStub(g_envDeviceA.adapterHandle, g_envDeviceB.adapterHandle); 748 }