1cc290419Sopenharmony_ci/* 2cc290419Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3cc290419Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4cc290419Sopenharmony_ci * you may not use this file except in compliance with the License. 5cc290419Sopenharmony_ci * You may obtain a copy of the License at 6cc290419Sopenharmony_ci * 7cc290419Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8cc290419Sopenharmony_ci * 9cc290419Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10cc290419Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11cc290419Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12cc290419Sopenharmony_ci * See the License for the specific language governing permissions and 13cc290419Sopenharmony_ci * limitations under the License. 14cc290419Sopenharmony_ci */ 15cc290419Sopenharmony_ci 16cc290419Sopenharmony_ci#include "uart_test.h" 17cc290419Sopenharmony_ci 18cc290419Sopenharmony_ci#include <random> 19cc290419Sopenharmony_ci 20cc290419Sopenharmony_ciusing namespace testing::ext; 21cc290419Sopenharmony_ciusing ::testing::_; 22cc290419Sopenharmony_ciusing ::testing::AnyNumber; 23cc290419Sopenharmony_ciusing ::testing::Return; 24cc290419Sopenharmony_ciusing namespace testing; 25cc290419Sopenharmony_ci 26cc290419Sopenharmony_cinamespace Hdc { 27cc290419Sopenharmony_ciclass HdcUARTBaseTest : public testing::Test { 28cc290419Sopenharmony_cipublic: 29cc290419Sopenharmony_ci static void SetUpTestCase(void); 30cc290419Sopenharmony_ci static void TearDownTestCase(void); 31cc290419Sopenharmony_ci void SetUp(); 32cc290419Sopenharmony_ci void TearDown(); 33cc290419Sopenharmony_ci std::default_random_engine rnd; 34cc290419Sopenharmony_ci 35cc290419Sopenharmony_ci bool MakeData(std::vector<uint8_t> &data, UartHead &head); 36cc290419Sopenharmony_ci bool MakeRndData(std::vector<uint8_t> &data, uint32_t sessionId); 37cc290419Sopenharmony_ci bool MakeDemoData(std::vector<uint8_t> &data, uint32_t sessionId); 38cc290419Sopenharmony_ci 39cc290419Sopenharmony_ci static constexpr uint32_t SERVER_ID = 1235; 40cc290419Sopenharmony_ci static constexpr uint32_t DAEMON_SESSION_ID = 1236; 41cc290419Sopenharmony_ci static constexpr uint32_t PACKAGE_INDEX = 1237; 42cc290419Sopenharmony_ci std::unique_ptr<HdcUART> serverHdcUart; 43cc290419Sopenharmony_ci std::unique_ptr<HdcSession> server; 44cc290419Sopenharmony_ci std::unique_ptr<HdcUART> daemonHdcUart; 45cc290419Sopenharmony_ci std::unique_ptr<HdcSession> daemon; 46cc290419Sopenharmony_ci const std::string testString = "HDC_UART_TEST"; 47cc290419Sopenharmony_ci 48cc290419Sopenharmony_ci class MockHdcSessionBase : public HdcSessionBase { 49cc290419Sopenharmony_ci explicit MockHdcSessionBase(bool serverOrDaemon) : HdcSessionBase(serverOrDaemon) {}; 50cc290419Sopenharmony_ci MOCK_METHOD1(FreeSession, void(const uint32_t)); 51cc290419Sopenharmony_ci } mockSessionBase; 52cc290419Sopenharmony_ci 53cc290419Sopenharmony_ci class MockBaseInterface : public ExternInterface { 54cc290419Sopenharmony_ci public: 55cc290419Sopenharmony_ci std::vector<uint8_t> expectUserData; 56cc290419Sopenharmony_ci 57cc290419Sopenharmony_ci MOCK_METHOD3(UvTcpInit, int(uv_loop_t *, uv_tcp_t *, int)); 58cc290419Sopenharmony_ci MOCK_METHOD3(UvRead, int(uv_stream_t *, uv_alloc_cb, uv_read_cb)); 59cc290419Sopenharmony_ci MOCK_METHOD3(SendToStream, int(uv_stream_t *, const uint8_t *, const int)); 60cc290419Sopenharmony_ci } mockInterface; 61cc290419Sopenharmony_ci 62cc290419Sopenharmony_ci // this mock use to test SendUARTBlock 63cc290419Sopenharmony_ci // it will check from SendUARTRaw for data format and content 64cc290419Sopenharmony_ci class MockHdcUARTBase : public HdcUARTBase { 65cc290419Sopenharmony_ci public: 66cc290419Sopenharmony_ci std::vector<uint8_t> expectRawData; 67cc290419Sopenharmony_ci MOCK_METHOD2(SendUartSoftReset, void(HSession, uint32_t)); 68cc290419Sopenharmony_ci MOCK_METHOD1(ResetOldSession, void(uint32_t)); 69cc290419Sopenharmony_ci MOCK_METHOD3(RequestSendPackage, void(uint8_t *, const size_t, bool)); 70cc290419Sopenharmony_ci MOCK_METHOD1(ProcessResponsePackage, void(const UartHead &)); 71cc290419Sopenharmony_ci MOCK_METHOD3(ResponseUartTrans, void(uint32_t, uint32_t, UartProtocolOption)); 72cc290419Sopenharmony_ci MOCK_METHOD3(UartToHdcProtocol, int(uv_stream_t *, uint8_t *, int)); 73cc290419Sopenharmony_ci MOCK_METHOD1(OnTransferError, void(const HSession)); 74cc290419Sopenharmony_ci MOCK_METHOD2(GetSession, HSession(uint32_t, bool)); 75cc290419Sopenharmony_ci MOCK_METHOD1(ClearUARTOutMap, void(uint32_t)); 76cc290419Sopenharmony_ci 77cc290419Sopenharmony_ci MockHdcUARTBase(HdcSessionBase &mockSessionBaseIn, MockBaseInterface &interfaceIn) 78cc290419Sopenharmony_ci : HdcUARTBase(mockSessionBaseIn, interfaceIn) {}; 79cc290419Sopenharmony_ci } mockUARTBase; 80cc290419Sopenharmony_ci#if HDC_HOST 81cc290419Sopenharmony_ci static constexpr bool serverOrDaemon = true; 82cc290419Sopenharmony_ci#else 83cc290419Sopenharmony_ci static constexpr bool serverOrDaemon = false; 84cc290419Sopenharmony_ci#endif 85cc290419Sopenharmony_ci HdcUARTBaseTest() 86cc290419Sopenharmony_ci : mockSessionBase(serverOrDaemon), mockUARTBase(mockSessionBase, mockInterface) 87cc290419Sopenharmony_ci { 88cc290419Sopenharmony_ci } 89cc290419Sopenharmony_ci const std::vector<size_t> testPackageSize = { 90cc290419Sopenharmony_ci 0u, 91cc290419Sopenharmony_ci 1u, 92cc290419Sopenharmony_ci MAX_UART_SIZE_IOBUF - 1u, 93cc290419Sopenharmony_ci MAX_UART_SIZE_IOBUF, 94cc290419Sopenharmony_ci MAX_UART_SIZE_IOBUF + 1u, 95cc290419Sopenharmony_ci MAX_UART_SIZE_IOBUF * 2u - 1u, 96cc290419Sopenharmony_ci MAX_UART_SIZE_IOBUF * 2u, 97cc290419Sopenharmony_ci MAX_UART_SIZE_IOBUF * 2u + 1u, 98cc290419Sopenharmony_ci MAX_UART_SIZE_IOBUF * 3u + 1u, 99cc290419Sopenharmony_ci MAX_UART_SIZE_IOBUF * 4u + 1u, 100cc290419Sopenharmony_ci }; 101cc290419Sopenharmony_ci}; 102cc290419Sopenharmony_ci 103cc290419Sopenharmony_civoid HdcUARTBaseTest::SetUpTestCase() 104cc290419Sopenharmony_ci{ 105cc290419Sopenharmony_ci#ifdef UT_DEBUG 106cc290419Sopenharmony_ci Hdc::Base::SetLogLevel(LOG_ALL); 107cc290419Sopenharmony_ci#else 108cc290419Sopenharmony_ci Hdc::Base::SetLogLevel(LOG_OFF); 109cc290419Sopenharmony_ci#endif 110cc290419Sopenharmony_ci} 111cc290419Sopenharmony_ci 112cc290419Sopenharmony_civoid HdcUARTBaseTest::TearDownTestCase() {} 113cc290419Sopenharmony_ci 114cc290419Sopenharmony_civoid HdcUARTBaseTest::SetUp() 115cc290419Sopenharmony_ci{ 116cc290419Sopenharmony_ci serverHdcUart = std::make_unique<HdcUART>(); 117cc290419Sopenharmony_ci server = std::make_unique<HdcSession>(); 118cc290419Sopenharmony_ci server->serverOrDaemon = true; 119cc290419Sopenharmony_ci server->sessionId = SERVER_ID; 120cc290419Sopenharmony_ci server->hUART = serverHdcUart.get(); 121cc290419Sopenharmony_ci 122cc290419Sopenharmony_ci daemonHdcUart = std::make_unique<HdcUART>(); 123cc290419Sopenharmony_ci daemon = std::make_unique<HdcSession>(); 124cc290419Sopenharmony_ci daemon->serverOrDaemon = false; 125cc290419Sopenharmony_ci daemon->sessionId = DAEMON_SESSION_ID; 126cc290419Sopenharmony_ci daemon->hUART = daemonHdcUart.get(); 127cc290419Sopenharmony_ci 128cc290419Sopenharmony_ci mockInterface.expectUserData.clear(); 129cc290419Sopenharmony_ci} 130cc290419Sopenharmony_ci 131cc290419Sopenharmony_civoid HdcUARTBaseTest::TearDown() {} 132cc290419Sopenharmony_ci 133cc290419Sopenharmony_cibool HdcUARTBaseTest::MakeRndData(std::vector<uint8_t> &data, uint32_t sessionId) 134cc290419Sopenharmony_ci{ 135cc290419Sopenharmony_ci UartHead head; 136cc290419Sopenharmony_ci head.option = PKG_OPTION_TAIL; 137cc290419Sopenharmony_ci head.sessionId = sessionId; 138cc290419Sopenharmony_ci head.packageIndex = PACKAGE_INDEX; 139cc290419Sopenharmony_ci 140cc290419Sopenharmony_ci if (data.empty()) { 141cc290419Sopenharmony_ci const int MaxTestBufSize = MAX_UART_SIZE_IOBUF * 2 + 2; 142cc290419Sopenharmony_ci data.resize(MaxTestBufSize); 143cc290419Sopenharmony_ci } 144cc290419Sopenharmony_ci const constexpr int mod = 100; 145cc290419Sopenharmony_ci std::generate(data.begin(), data.end(), [&]() { return rnd() % mod; }); 146cc290419Sopenharmony_ci return MakeData(data, head); 147cc290419Sopenharmony_ci} 148cc290419Sopenharmony_ci 149cc290419Sopenharmony_cibool HdcUARTBaseTest::MakeDemoData(std::vector<uint8_t> &data, uint32_t sessionId) 150cc290419Sopenharmony_ci{ 151cc290419Sopenharmony_ci UartHead head; 152cc290419Sopenharmony_ci head.option = PKG_OPTION_TAIL; 153cc290419Sopenharmony_ci head.sessionId = sessionId; 154cc290419Sopenharmony_ci head.packageIndex = packageIndex; 155cc290419Sopenharmony_ci 156cc290419Sopenharmony_ci data.resize(sizeof(UartHead) + testString.size()); 157cc290419Sopenharmony_ci head.dataSize = testString.size(); 158cc290419Sopenharmony_ci 159cc290419Sopenharmony_ci return MakeData(data, head); 160cc290419Sopenharmony_ci} 161cc290419Sopenharmony_ci 162cc290419Sopenharmony_cibool HdcUARTBaseTest::MakeData(std::vector<uint8_t> &data, UartHead &head) 163cc290419Sopenharmony_ci{ 164cc290419Sopenharmony_ci // head 165cc290419Sopenharmony_ci if (memcpy_s(data.data(), data.size(), &head, sizeof(UartHead)) != EOK) { 166cc290419Sopenharmony_ci return false; 167cc290419Sopenharmony_ci } 168cc290419Sopenharmony_ci 169cc290419Sopenharmony_ci // data 170cc290419Sopenharmony_ci unsigned char *dataPtr = data.data() + sizeof(UartHead); 171cc290419Sopenharmony_ci size_t dataSize = data.size() - sizeof(UartHead); 172cc290419Sopenharmony_ci if (memcpy_s(dataPtr, dataSize, testString.data(), testString.size()) != EOK) { 173cc290419Sopenharmony_ci return false; 174cc290419Sopenharmony_ci } 175cc290419Sopenharmony_ci 176cc290419Sopenharmony_ci return true; 177cc290419Sopenharmony_ci} 178cc290419Sopenharmony_ci 179cc290419Sopenharmony_ci/* 180cc290419Sopenharmony_ci * @tc.name: SendUARTRaw 181cc290419Sopenharmony_ci * @tc.desc: Virtual function verification 182cc290419Sopenharmony_ci * @tc.type: FUNC 183cc290419Sopenharmony_ci */ 184cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, SendUARTRaw, TestSize.Level1) 185cc290419Sopenharmony_ci{ 186cc290419Sopenharmony_ci HSession hSession = nullptr; 187cc290419Sopenharmony_ci unsigned char dummyData[] = "1234567980"; 188cc290419Sopenharmony_ci uint8_t *dummyPtr = static_cast<unsigned char *>(&dummyData[0]); 189cc290419Sopenharmony_ci int dummySize = sizeof(dummyData); 190cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, GetSession).Times(1); 191cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.SendUARTRaw(hSession, dummyPtr, dummySize), 0); 192cc290419Sopenharmony_ci} 193cc290419Sopenharmony_ci 194cc290419Sopenharmony_ci/* 195cc290419Sopenharmony_ci * @tc.name: ResetOldSession 196cc290419Sopenharmony_ci * @tc.desc: Virtual function verification 197cc290419Sopenharmony_ci * @tc.type: FUNC 198cc290419Sopenharmony_ci */ 199cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, ResetOldSession, TestSize.Level1) 200cc290419Sopenharmony_ci{ 201cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ResetOldSession).WillRepeatedly([&](uint32_t sessionId) { 202cc290419Sopenharmony_ci mockUARTBase.HdcUARTBase::ResetOldSession(sessionId); 203cc290419Sopenharmony_ci }); 204cc290419Sopenharmony_ci const uint32_t sessionId = 12345; 205cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ResetOldSession(sessionId)).Times(1); 206cc290419Sopenharmony_ci mockUARTBase.ResetOldSession(sessionId); 207cc290419Sopenharmony_ci} 208cc290419Sopenharmony_ci 209cc290419Sopenharmony_ci/* 210cc290419Sopenharmony_ci * @tc.name: SendUartSoftReset 211cc290419Sopenharmony_ci * @tc.desc: Virtual function verification 212cc290419Sopenharmony_ci * @tc.type: FUNC 213cc290419Sopenharmony_ci */ 214cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, SendUartSoftReset, TestSize.Level1) 215cc290419Sopenharmony_ci{ 216cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, SendUartSoftReset) 217cc290419Sopenharmony_ci .WillRepeatedly([&](HSession hUART, uint32_t sessionId) { 218cc290419Sopenharmony_ci mockUARTBase.HdcUARTBase::SendUartSoftReset(hUART, sessionId); 219cc290419Sopenharmony_ci }); 220cc290419Sopenharmony_ci HSession hSession = nullptr; 221cc290419Sopenharmony_ci uint32_t sessionId = 1234567980; 222cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, SendUartSoftReset(hSession, sessionId)).Times(1); 223cc290419Sopenharmony_ci mockUARTBase.SendUartSoftReset(hSession, sessionId); 224cc290419Sopenharmony_ci} 225cc290419Sopenharmony_ci 226cc290419Sopenharmony_ci/* 227cc290419Sopenharmony_ci * @tc.name: SendUARTBlock 228cc290419Sopenharmony_ci * @tc.desc: Check the data sub-package function, package content, header content. 229cc290419Sopenharmony_ci * @tc.type: FUNC 230cc290419Sopenharmony_ci */ 231cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, SendUARTBlock, TestSize.Level1) 232cc290419Sopenharmony_ci{ 233cc290419Sopenharmony_ci std::vector<uint8_t> sourceData(testPackageSize.back()); 234cc290419Sopenharmony_ci MakeRndData(sourceData, server->sessionId); 235cc290419Sopenharmony_ci ASSERT_GE(sourceData.size(), testPackageSize.back()); 236cc290419Sopenharmony_ci for (size_t i = 0; i < testPackageSize.size(); i++) { 237cc290419Sopenharmony_ci size_t maxSendSize = MAX_UART_SIZE_IOBUF - sizeof(UartHead); 238cc290419Sopenharmony_ci int sendTimes = 239cc290419Sopenharmony_ci (testPackageSize[i] / maxSendSize) + (testPackageSize[i] % maxSendSize > 0 ? 1 : 0); 240cc290419Sopenharmony_ci if (testPackageSize[i] == 0) { 241cc290419Sopenharmony_ci sendTimes = 1; // we allow send empty package 242cc290419Sopenharmony_ci } 243cc290419Sopenharmony_ci const uint8_t *sourceDataPoint = sourceData.data(); 244cc290419Sopenharmony_ci size_t sendOffset = 0; 245cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, RequestSendPackage(_, Le(MAX_UART_SIZE_IOBUF), true)) 246cc290419Sopenharmony_ci .Times(sendTimes) 247cc290419Sopenharmony_ci .WillRepeatedly(Invoke([&](uint8_t *data, const size_t length, bool queue) { 248cc290419Sopenharmony_ci // must big thean head 249cc290419Sopenharmony_ci ASSERT_GE(length, sizeof(UartHead)); 250cc290419Sopenharmony_ci 251cc290419Sopenharmony_ci // check head 252cc290419Sopenharmony_ci const void *pHead = static_cast<const void *>(data); 253cc290419Sopenharmony_ci const UartHead *pUARTHead = static_cast<const UartHead *>(pHead); 254cc290419Sopenharmony_ci 255cc290419Sopenharmony_ci // magic check 256cc290419Sopenharmony_ci ASSERT_EQ(pUARTHead->flag[0], 'H'); 257cc290419Sopenharmony_ci ASSERT_EQ(pUARTHead->flag[1], 'W'); 258cc290419Sopenharmony_ci 259cc290419Sopenharmony_ci // sessionId always should this one 260cc290419Sopenharmony_ci ASSERT_EQ(pUARTHead->sessionId, server->sessionId); 261cc290419Sopenharmony_ci 262cc290419Sopenharmony_ci // check data size in head 263cc290419Sopenharmony_ci ASSERT_EQ(pUARTHead->dataSize, length - sizeof(UartHead)); 264cc290419Sopenharmony_ci sendOffset += pUARTHead->dataSize; 265cc290419Sopenharmony_ci ASSERT_LE(sendOffset, testPackageSize[i]); 266cc290419Sopenharmony_ci 267cc290419Sopenharmony_ci // check data 268cc290419Sopenharmony_ci const uint8_t *pData = (data + sizeof(UartHead)); 269cc290419Sopenharmony_ci 270cc290419Sopenharmony_ci // expectData_ only have data info . not include head 271cc290419Sopenharmony_ci for (uint32_t i = 0; i < pUARTHead->dataSize; i++) { 272cc290419Sopenharmony_ci ASSERT_EQ(sourceDataPoint[i], pData[i]); 273cc290419Sopenharmony_ci } 274cc290419Sopenharmony_ci // after check ,move the pointer for next 275cc290419Sopenharmony_ci sourceDataPoint += pUARTHead->dataSize; 276cc290419Sopenharmony_ci 277cc290419Sopenharmony_ci printf("check %zu bytes\n", length); 278cc290419Sopenharmony_ci })); 279cc290419Sopenharmony_ci ASSERT_EQ(mockUARTBase.SendUARTData(server.get(), sourceData.data(), testPackageSize[i]), 280cc290419Sopenharmony_ci static_cast<int>(testPackageSize[i])); 281cc290419Sopenharmony_ci ASSERT_EQ(sendOffset, testPackageSize[i]); 282cc290419Sopenharmony_ci } 283cc290419Sopenharmony_ci} 284cc290419Sopenharmony_ci 285cc290419Sopenharmony_ci/* 286cc290419Sopenharmony_ci * @tc.name: UartSendToHdcStream 287cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the UartSendToHdcStream function 288cc290419Sopenharmony_ci * buf does not reach the head length 289cc290419Sopenharmony_ci * @tc.type: FUNC 290cc290419Sopenharmony_ci */ 291cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, UartSendToHdcStreamLessBuff, TestSize.Level1) 292cc290419Sopenharmony_ci{ 293cc290419Sopenharmony_ci std::vector<uint8_t> data; 294cc290419Sopenharmony_ci MakeRndData(data, server->sessionId); 295cc290419Sopenharmony_ci 296cc290419Sopenharmony_ci for (unsigned int i = 0; i < sizeof(UartHead); i++) { 297cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ResponseUartTrans).Times(0); 298cc290419Sopenharmony_ci ASSERT_EQ(mockUARTBase.UartSendToHdcStream(server.get(), data.data(), i), true); 299cc290419Sopenharmony_ci } 300cc290419Sopenharmony_ci for (unsigned int i = 0; i < sizeof(UartHead); i++) { 301cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ResponseUartTrans).Times(0); 302cc290419Sopenharmony_ci ASSERT_EQ(mockUARTBase.UartSendToHdcStream(daemon.get(), data.data(), i), true); 303cc290419Sopenharmony_ci } 304cc290419Sopenharmony_ci} 305cc290419Sopenharmony_ci 306cc290419Sopenharmony_ci/* 307cc290419Sopenharmony_ci * @tc.name: UartSendToHdcStream 308cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the UartSendToHdcStream function 309cc290419Sopenharmony_ci * magic head is not correct 310cc290419Sopenharmony_ci * @tc.type: FUNC 311cc290419Sopenharmony_ci */ 312cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, UartSendToHdcStreamBadMagic, TestSize.Level1) 313cc290419Sopenharmony_ci{ 314cc290419Sopenharmony_ci std::vector<uint8_t> sourceData(testPackageSize.back()); 315cc290419Sopenharmony_ci std::generate(sourceData.begin(), sourceData.end(), [&]() { return rnd() % 100; }); 316cc290419Sopenharmony_ci for (size_t i = 0; i < testPackageSize.size() and testPackageSize[i] >= sizeof(UartHead); i++) { 317cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ResponseUartTrans(_, _, PKG_OPTION_NAK)).Times(1); 318cc290419Sopenharmony_ci ASSERT_EQ( 319cc290419Sopenharmony_ci mockUARTBase.UartSendToHdcStream(server.get(), sourceData.data(), testPackageSize[i]), 320cc290419Sopenharmony_ci false); 321cc290419Sopenharmony_ci } 322cc290419Sopenharmony_ci 323cc290419Sopenharmony_ci for (size_t i = 0; i < testPackageSize.size() and testPackageSize[i] >= sizeof(UartHead); i++) { 324cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ResponseUartTrans(_, _, PKG_OPTION_NAK)) 325cc290419Sopenharmony_ci .Times(testPackageSize[i] > sizeof(UartHead) ? 1 : 0); 326cc290419Sopenharmony_ci ASSERT_EQ( 327cc290419Sopenharmony_ci mockUARTBase.UartSendToHdcStream(daemon.get(), sourceData.data(), testPackageSize[i]), 328cc290419Sopenharmony_ci false); 329cc290419Sopenharmony_ci } 330cc290419Sopenharmony_ci} 331cc290419Sopenharmony_ci 332cc290419Sopenharmony_ci/* 333cc290419Sopenharmony_ci * @tc.name: UartSendToHdcStream 334cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the UartSendToHdcStream function 335cc290419Sopenharmony_ci * head buffer merge multiple times 336cc290419Sopenharmony_ci * @tc.type: FUNC 337cc290419Sopenharmony_ci */ 338cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, UartSendToHdcStreamAppend, TestSize.Level1) 339cc290419Sopenharmony_ci{ 340cc290419Sopenharmony_ci std::vector<uint8_t> data; 341cc290419Sopenharmony_ci ASSERT_TRUE(MakeDemoData(data, server->sessionId)); 342cc290419Sopenharmony_ci 343cc290419Sopenharmony_ci // send head one by one 344cc290419Sopenharmony_ci for (unsigned int i = 0; i < sizeof(UartHead); i++) { 345cc290419Sopenharmony_ci ASSERT_TRUE(mockUARTBase.UartSendToHdcStream(server.get(), &data.data()[i], 346cc290419Sopenharmony_ci sizeof(data.data()[i]))); 347cc290419Sopenharmony_ci } 348cc290419Sopenharmony_ci 349cc290419Sopenharmony_ci // send content data one by one 350cc290419Sopenharmony_ci#if HDC_HOST 351cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, UartToHdcProtocol).Times(0); 352cc290419Sopenharmony_ci#else 353cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, SendToStream).Times(0); 354cc290419Sopenharmony_ci#endif 355cc290419Sopenharmony_ci for (unsigned int i = sizeof(UartHead); i < data.size(); i++) { 356cc290419Sopenharmony_ci ASSERT_TRUE(mockUARTBase.UartSendToHdcStream(server.get(), &data.data()[i], 357cc290419Sopenharmony_ci sizeof(data.data()[i]))); 358cc290419Sopenharmony_ci if (i + 1 == data.size()) { 359cc290419Sopenharmony_ci // if this is the last one , buf will clear after send 360cc290419Sopenharmony_ci } else { 361cc290419Sopenharmony_ci } 362cc290419Sopenharmony_ci } 363cc290419Sopenharmony_ci} 364cc290419Sopenharmony_ci 365cc290419Sopenharmony_ci/* 366cc290419Sopenharmony_ci * @tc.name: UartSendToHdcStream 367cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the UartSendToHdcStream function 368cc290419Sopenharmony_ci * soft reset when session id is not correct 369cc290419Sopenharmony_ci * @tc.type: FUNC 370cc290419Sopenharmony_ci */ 371cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, UartSendToHdcStreamDiffSession, TestSize.Level1) 372cc290419Sopenharmony_ci{ 373cc290419Sopenharmony_ci bool sendResult = false; 374cc290419Sopenharmony_ci 375cc290419Sopenharmony_ci std::vector<uint8_t> data; 376cc290419Sopenharmony_ci ASSERT_TRUE(MakeDemoData(data, server->sessionId)); 377cc290419Sopenharmony_ci 378cc290419Sopenharmony_ci std::vector<uint8_t> dataDiffSession; 379cc290419Sopenharmony_ci // here we make a server session 380cc290419Sopenharmony_ci uint32_t diffSessionId = server->sessionId + 1; 381cc290419Sopenharmony_ci ASSERT_TRUE(MakeDemoData(dataDiffSession, diffSessionId)); 382cc290419Sopenharmony_ci 383cc290419Sopenharmony_ci // same session 384cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, SendUartSoftReset(server.get(), server->sessionId)).Times(0); 385cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, UartToHdcProtocol).Times(1); 386cc290419Sopenharmony_ci 387cc290419Sopenharmony_ci sendResult = mockUARTBase.UartSendToHdcStream(server.get(), data.data(), data.size()); 388cc290419Sopenharmony_ci ASSERT_TRUE(sendResult); 389cc290419Sopenharmony_ci ASSERT_FALSE(server->hUART->resetIO); 390cc290419Sopenharmony_ci 391cc290419Sopenharmony_ci // diff session but not server serversession 392cc290419Sopenharmony_ci // SendUartSoftReset should only happend from server to daemon 393cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, SendUartSoftReset(daemon.get(), server->sessionId)).Times(0); 394cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, SendToStream).Times(0); 395cc290419Sopenharmony_ci sendResult = mockUARTBase.UartSendToHdcStream(daemon.get(), data.data(), data.size()); 396cc290419Sopenharmony_ci ASSERT_TRUE(sendResult); 397cc290419Sopenharmony_ci ASSERT_FALSE(server->hUART->resetIO); 398cc290419Sopenharmony_ci 399cc290419Sopenharmony_ci // diff session should set reset resetIO to true 400cc290419Sopenharmony_ci // and also call SendUartSoftReset 401cc290419Sopenharmony_ci // here we use daemonSession_ with server_->sessionId (it's different) 402cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, SendUartSoftReset(server.get(), diffSessionId)).Times(1); 403cc290419Sopenharmony_ci 404cc290419Sopenharmony_ci sendResult = mockUARTBase.UartSendToHdcStream(server.get(), dataDiffSession.data(), 405cc290419Sopenharmony_ci dataDiffSession.size()); 406cc290419Sopenharmony_ci ASSERT_FALSE(sendResult); 407cc290419Sopenharmony_ci ASSERT_TRUE(server->hUART->resetIO); 408cc290419Sopenharmony_ci} 409cc290419Sopenharmony_ci/* 410cc290419Sopenharmony_ci * @tc.name: ReadyForWorkThread 411cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the ReadyForWorkThread function 412cc290419Sopenharmony_ci * @tc.type: FUNC 413cc290419Sopenharmony_ci */ 414cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, ReadyForWorkThread, TestSize.Level1) 415cc290419Sopenharmony_ci{ 416cc290419Sopenharmony_ci HdcSession session; 417cc290419Sopenharmony_ci HdcSessionBase sessionBase(true); 418cc290419Sopenharmony_ci session.classInstance = &sessionBase; 419cc290419Sopenharmony_ci auto loop = &session.childLoop; 420cc290419Sopenharmony_ci auto tcp = &session.dataPipe[STREAM_WORK]; 421cc290419Sopenharmony_ci session.dataFd[STREAM_WORK] = rnd(); 422cc290419Sopenharmony_ci auto socket = session.dataFd[STREAM_WORK]; 423cc290419Sopenharmony_ci auto alloc = sessionBase.AllocCallback; 424cc290419Sopenharmony_ci auto cb = HdcUARTBase::ReadDataFromUARTStream; 425cc290419Sopenharmony_ci 426cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, UvTcpInit(loop, tcp, socket)).Times(1); 427cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, UvRead((uv_stream_t *)tcp, alloc, cb)).Times(1); 428cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.ReadyForWorkThread(&session), true); 429cc290419Sopenharmony_ci 430cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, UvTcpInit(loop, tcp, socket)).Times(1).WillOnce(Return(-1)); 431cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, UvRead).Times(0); 432cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.ReadyForWorkThread(&session), false); 433cc290419Sopenharmony_ci 434cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, UvTcpInit(loop, tcp, socket)).Times(1); 435cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, UvRead).Times(1).WillOnce(Return(-1)); 436cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.ReadyForWorkThread(&session), false); 437cc290419Sopenharmony_ci} 438cc290419Sopenharmony_ci 439cc290419Sopenharmony_ci/* 440cc290419Sopenharmony_ci * @tc.name: ReadDataFromUARTStream 441cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the ReadDataFromUARTStream function 442cc290419Sopenharmony_ci * @tc.type: FUNC 443cc290419Sopenharmony_ci */ 444cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, ReadDataFromUARTStream, TestSize.Level1) 445cc290419Sopenharmony_ci{ 446cc290419Sopenharmony_ci uv_stream_t uvStream; 447cc290419Sopenharmony_ci HdcSession hdcSession; 448cc290419Sopenharmony_ci HdcUART uart; 449cc290419Sopenharmony_ci constexpr uint32_t testSessionId = 0x1234; 450cc290419Sopenharmony_ci hdcSession.sessionId = testSessionId; 451cc290419Sopenharmony_ci uint8_t dummyArray[] = {1, 2, 3, 4}; 452cc290419Sopenharmony_ci uart.streamSize = sizeof(dummyArray); 453cc290419Sopenharmony_ci uint8_t *dummPtr = dummyArray; 454cc290419Sopenharmony_ci ssize_t dummySize = sizeof(dummyArray); 455cc290419Sopenharmony_ci class MockHdcSessionBase : public HdcSessionBase { 456cc290419Sopenharmony_ci public: 457cc290419Sopenharmony_ci MOCK_METHOD3(FetchIOBuf, int(HSession, uint8_t *, int)); 458cc290419Sopenharmony_ci explicit MockHdcSessionBase(bool server) : HdcSessionBase(server) {} 459cc290419Sopenharmony_ci } mockSession(true); 460cc290419Sopenharmony_ci hdcSession.classInstance = static_cast<void *>(&mockSession); 461cc290419Sopenharmony_ci hdcSession.classModule = &mockUARTBase; 462cc290419Sopenharmony_ci hdcSession.ioBuf = dummPtr; 463cc290419Sopenharmony_ci hdcSession.hUART = &uart; 464cc290419Sopenharmony_ci 465cc290419Sopenharmony_ci uvStream.data = static_cast<void *>(&hdcSession); 466cc290419Sopenharmony_ci 467cc290419Sopenharmony_ci EXPECT_CALL(mockSession, FetchIOBuf(&hdcSession, dummPtr, dummySize)).Times(1); 468cc290419Sopenharmony_ci HdcUARTBase::ReadDataFromUARTStream(&uvStream, dummySize, nullptr); 469cc290419Sopenharmony_ci 470cc290419Sopenharmony_ci uart.streamSize = sizeof(dummyArray); 471cc290419Sopenharmony_ci EXPECT_CALL(mockSession, FetchIOBuf(&hdcSession, dummPtr, dummySize)) 472cc290419Sopenharmony_ci .Times(1) 473cc290419Sopenharmony_ci .WillOnce(Return(-1)); 474cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ResponseUartTrans(_, _, PKG_OPTION_FREE)).Times(1); 475cc290419Sopenharmony_ci HdcUARTBase::ReadDataFromUARTStream(&uvStream, dummySize, nullptr); 476cc290419Sopenharmony_ci} 477cc290419Sopenharmony_ci 478cc290419Sopenharmony_ci/* 479cc290419Sopenharmony_ci * @tc.name: UartToHdcProtocol 480cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the UartToHdcProtocol function 481cc290419Sopenharmony_ci * @tc.type: FUNC 482cc290419Sopenharmony_ci */ 483cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, UartToHdcProtocol, TestSize.Level1) 484cc290419Sopenharmony_ci{ 485cc290419Sopenharmony_ci uv_stream_t stream; 486cc290419Sopenharmony_ci HdcSession session; 487cc290419Sopenharmony_ci const int MaxTestBufSize = MAX_UART_SIZE_IOBUF * 2 + 2; 488cc290419Sopenharmony_ci std::vector<uint8_t> data(MaxTestBufSize); 489cc290419Sopenharmony_ci std::generate(data.begin(), data.end(), [&]() { return rnd() % 100; }); 490cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, UartToHdcProtocol) 491cc290419Sopenharmony_ci .WillRepeatedly([&](uv_stream_t *stream, uint8_t *data, int dataSize) { 492cc290419Sopenharmony_ci return mockUARTBase.HdcUARTBase::UartToHdcProtocol(stream, data, dataSize); 493cc290419Sopenharmony_ci }); 494cc290419Sopenharmony_ci 495cc290419Sopenharmony_ci stream.data = &session; 496cc290419Sopenharmony_ci 497cc290419Sopenharmony_ci // have socket 498cc290419Sopenharmony_ci ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, session.dataFd), 0); 499cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.UartToHdcProtocol(&stream, data.data(), data.size()), 500cc290419Sopenharmony_ci signed(data.size())); 501cc290419Sopenharmony_ci std::string recvBuf; 502cc290419Sopenharmony_ci recvBuf.resize(data.size()); 503cc290419Sopenharmony_ci read(session.dataFd[STREAM_WORK], recvBuf.data(), recvBuf.size()); 504cc290419Sopenharmony_ci EXPECT_EQ(memcpy_s(recvBuf.data(), recvBuf.size(), data.data(), data.size()), 0); 505cc290419Sopenharmony_ci 506cc290419Sopenharmony_ci // close one of pair 507cc290419Sopenharmony_ci EXPECT_EQ(close(session.dataFd[STREAM_MAIN]), 0); 508cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.UartToHdcProtocol(&stream, data.data(), data.size()), ERR_IO_FAIL); 509cc290419Sopenharmony_ci 510cc290419Sopenharmony_ci // close two of pair 511cc290419Sopenharmony_ci EXPECT_EQ(close(session.dataFd[STREAM_WORK]), 0); 512cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.UartToHdcProtocol(&stream, data.data(), data.size()), ERR_IO_FAIL); 513cc290419Sopenharmony_ci} 514cc290419Sopenharmony_ci 515cc290419Sopenharmony_ci/* 516cc290419Sopenharmony_ci * @tc.name: ValidateUartPacket 517cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the ValidateUartPacket function 518cc290419Sopenharmony_ci * @tc.type: FUNC 519cc290419Sopenharmony_ci */ 520cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, ValidateUartPacket, TestSize.Level1) 521cc290419Sopenharmony_ci{ 522cc290419Sopenharmony_ci uint32_t sessionId = 0; 523cc290419Sopenharmony_ci uint32_t packageIndex = 0; 524cc290419Sopenharmony_ci constexpr uint32_t sessionIdTest = 1234; 525cc290419Sopenharmony_ci constexpr uint32_t dataSizeTest = MAX_UART_SIZE_IOBUF / 2; 526cc290419Sopenharmony_ci constexpr uint32_t packageIndexTest = 123; 527cc290419Sopenharmony_ci size_t pkgLenth = 0; 528cc290419Sopenharmony_ci UartHead testHead; 529cc290419Sopenharmony_ci testHead.flag[0] = PACKET_FLAG.at(0); 530cc290419Sopenharmony_ci testHead.flag[1] = PACKET_FLAG.at(1); 531cc290419Sopenharmony_ci uint8_t *bufPtr = reinterpret_cast<uint8_t *>(&testHead); 532cc290419Sopenharmony_ci testHead.sessionId = sessionIdTest; 533cc290419Sopenharmony_ci testHead.dataSize = dataSizeTest; 534cc290419Sopenharmony_ci testHead.packageIndex = packageIndexTest; 535cc290419Sopenharmony_ci UartHead *headPointer = nullptr; 536cc290419Sopenharmony_ci 537cc290419Sopenharmony_ci std::vector<uint8_t> buffer(MAX_UART_SIZE_IOBUF * 3); 538cc290419Sopenharmony_ci 539cc290419Sopenharmony_ci buffer.assign(bufPtr, bufPtr + sizeof(UartHead)); 540cc290419Sopenharmony_ci headPointer = (UartHead *)buffer.data(); 541cc290419Sopenharmony_ci headPointer->UpdateCheckSum(); 542cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ProcessResponsePackage).Times(AnyNumber()); 543cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ResponseUartTrans).Times(AnyNumber()); 544cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.ValidateUartPacket(buffer, sessionId, packageIndex, pkgLenth), 545cc290419Sopenharmony_ci RET_SUCCESS); 546cc290419Sopenharmony_ci 547cc290419Sopenharmony_ci testHead.flag[0] = PACKET_FLAG.at(0); 548cc290419Sopenharmony_ci buffer.assign(bufPtr, bufPtr + sizeof(UartHead)); 549cc290419Sopenharmony_ci headPointer = (UartHead *)buffer.data(); 550cc290419Sopenharmony_ci headPointer->UpdateCheckSum(); 551cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.ValidateUartPacket(buffer, sessionId, packageIndex, pkgLenth), 552cc290419Sopenharmony_ci RET_SUCCESS); 553cc290419Sopenharmony_ci 554cc290419Sopenharmony_ci testHead.flag[1] = PACKET_FLAG.at(1); 555cc290419Sopenharmony_ci buffer.assign(bufPtr, bufPtr + sizeof(UartHead)); 556cc290419Sopenharmony_ci headPointer = (UartHead *)buffer.data(); 557cc290419Sopenharmony_ci headPointer->UpdateCheckSum(); 558cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.ValidateUartPacket(buffer, sessionId, packageIndex, pkgLenth), 559cc290419Sopenharmony_ci RET_SUCCESS); 560cc290419Sopenharmony_ci EXPECT_EQ(sessionId, testHead.sessionId); 561cc290419Sopenharmony_ci EXPECT_EQ(pkgLenth, testHead.dataSize + sizeof(UartHead)); 562cc290419Sopenharmony_ci 563cc290419Sopenharmony_ci testHead.dataSize = MAX_UART_SIZE_IOBUF * 2; 564cc290419Sopenharmony_ci buffer.assign(bufPtr, bufPtr + sizeof(UartHead)); 565cc290419Sopenharmony_ci buffer.resize(testHead.dataSize + sizeof(UartHead)); 566cc290419Sopenharmony_ci headPointer = (UartHead *)buffer.data(); 567cc290419Sopenharmony_ci headPointer->UpdateCheckSum(); 568cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.ValidateUartPacket(buffer, sessionId, packageIndex, pkgLenth), 569cc290419Sopenharmony_ci ERR_BUF_OVERFLOW); 570cc290419Sopenharmony_ci 571cc290419Sopenharmony_ci testHead.dataSize = MAX_UART_SIZE_IOBUF * 1; 572cc290419Sopenharmony_ci buffer.assign(bufPtr, bufPtr + sizeof(UartHead)); 573cc290419Sopenharmony_ci buffer.resize(testHead.dataSize + sizeof(UartHead)); 574cc290419Sopenharmony_ci headPointer = (UartHead *)buffer.data(); 575cc290419Sopenharmony_ci headPointer->UpdateCheckSum(); 576cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.ValidateUartPacket(buffer, sessionId, packageIndex, pkgLenth), 577cc290419Sopenharmony_ci ERR_BUF_OVERFLOW); 578cc290419Sopenharmony_ci 579cc290419Sopenharmony_ci testHead.dataSize = MAX_UART_SIZE_IOBUF / 2; 580cc290419Sopenharmony_ci buffer.assign(bufPtr, bufPtr + sizeof(UartHead)); 581cc290419Sopenharmony_ci buffer.resize(testHead.dataSize + sizeof(UartHead)); 582cc290419Sopenharmony_ci headPointer = (UartHead *)buffer.data(); 583cc290419Sopenharmony_ci headPointer->UpdateCheckSum(); 584cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.ValidateUartPacket(buffer, sessionId, packageIndex, pkgLenth), 585cc290419Sopenharmony_ci RET_SUCCESS); 586cc290419Sopenharmony_ci EXPECT_EQ(sessionId, testHead.sessionId); 587cc290419Sopenharmony_ci EXPECT_EQ(pkgLenth, testHead.dataSize + sizeof(UartHead)); 588cc290419Sopenharmony_ci 589cc290419Sopenharmony_ci testHead.option = PKG_OPTION_RESET; 590cc290419Sopenharmony_ci testHead.dataSize = MAX_UART_SIZE_IOBUF - sizeof(UartHead); 591cc290419Sopenharmony_ci buffer.assign(bufPtr, bufPtr + sizeof(UartHead)); 592cc290419Sopenharmony_ci buffer.resize(testHead.dataSize + sizeof(UartHead)); 593cc290419Sopenharmony_ci headPointer = (UartHead *)buffer.data(); 594cc290419Sopenharmony_ci headPointer->UpdateCheckSum(); 595cc290419Sopenharmony_ci 596cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ResetOldSession(sessionIdTest)).Times(1); 597cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.ValidateUartPacket(buffer, sessionId, packageIndex, pkgLenth), 598cc290419Sopenharmony_ci ERR_IO_SOFT_RESET); 599cc290419Sopenharmony_ci 600cc290419Sopenharmony_ci testHead.option = PKG_OPTION_ACK; 601cc290419Sopenharmony_ci testHead.dataSize = MAX_UART_SIZE_IOBUF - sizeof(UartHead); 602cc290419Sopenharmony_ci buffer.assign(bufPtr, bufPtr + sizeof(UartHead)); 603cc290419Sopenharmony_ci buffer.resize(testHead.dataSize + sizeof(UartHead)); 604cc290419Sopenharmony_ci headPointer = (UartHead *)buffer.data(); 605cc290419Sopenharmony_ci headPointer->UpdateCheckSum(); 606cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ProcessResponsePackage).Times(1); 607cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.ValidateUartPacket(buffer, sessionId, packageIndex, pkgLenth), 608cc290419Sopenharmony_ci RET_SUCCESS); 609cc290419Sopenharmony_ci} 610cc290419Sopenharmony_ci 611cc290419Sopenharmony_ci/* 612cc290419Sopenharmony_ci * @tc.name: ExternInterface 613cc290419Sopenharmony_ci * @tc.desc: Too many free functions, forcing increased coverage , just check not crash or not 614cc290419Sopenharmony_ci * successed 615cc290419Sopenharmony_ci * @tc.type: FUNC 616cc290419Sopenharmony_ci */ 617cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, ExternInterface, TestSize.Level1) 618cc290419Sopenharmony_ci{ 619cc290419Sopenharmony_ci ExternInterface defaultInterface; 620cc290419Sopenharmony_ci uv_loop_t dummyLoop; 621cc290419Sopenharmony_ci uv_tcp_t server; 622cc290419Sopenharmony_ci uv_pipe_t dummyPip; 623cc290419Sopenharmony_ci uv_loop_init(&dummyLoop); 624cc290419Sopenharmony_ci uv_pipe_init(uv_default_loop(), &dummyPip, 0); 625cc290419Sopenharmony_ci 626cc290419Sopenharmony_ci defaultInterface.SetTcpOptions(nullptr); 627cc290419Sopenharmony_ci EXPECT_NE(defaultInterface.SendToStream(nullptr, nullptr, 0), 0); 628cc290419Sopenharmony_ci EXPECT_NE(defaultInterface.UvTcpInit(uv_default_loop(), &server, -1), 0); 629cc290419Sopenharmony_ci EXPECT_NE(defaultInterface.UvRead((uv_stream_t *)&dummyPip, nullptr, nullptr), 0); 630cc290419Sopenharmony_ci EXPECT_EQ(defaultInterface.StartWorkThread(nullptr, nullptr, nullptr, nullptr), 0); 631cc290419Sopenharmony_ci EXPECT_NE(defaultInterface.TimerUvTask(uv_default_loop(), nullptr, nullptr), 0); 632cc290419Sopenharmony_ci EXPECT_NE(defaultInterface.UvTimerStart(nullptr, nullptr, 0, 0), 0); 633cc290419Sopenharmony_ci EXPECT_NE(defaultInterface.DelayDo(uv_default_loop(), 0, 0, "", nullptr, nullptr), 0); 634cc290419Sopenharmony_ci defaultInterface.TryCloseHandle((uv_handle_t *)&dummyPip, nullptr); 635cc290419Sopenharmony_ci} 636cc290419Sopenharmony_ci 637cc290419Sopenharmony_ci/* 638cc290419Sopenharmony_ci * @tc.name: GetUartSpeed 639cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the GetUartSpeed function 640cc290419Sopenharmony_ci * successed 641cc290419Sopenharmony_ci * @tc.type: FUNC 642cc290419Sopenharmony_ci */ 643cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, GetUartSpeed, TestSize.Level1) 644cc290419Sopenharmony_ci{ 645cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.GetUartSpeed(UART_SPEED2400), B2400); 646cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.GetUartSpeed(UART_SPEED4800), B4800); 647cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.GetUartSpeed(UART_SPEED9600), B9600); 648cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.GetUartSpeed(UART_SPEED115200), B115200); 649cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.GetUartSpeed(UART_SPEED921600), B921600); 650cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.GetUartSpeed(-1), B921600); 651cc290419Sopenharmony_ci} 652cc290419Sopenharmony_ci 653cc290419Sopenharmony_ci/* 654cc290419Sopenharmony_ci * @tc.name: GetUartBits 655cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the GetUartSpeed function 656cc290419Sopenharmony_ci * successed 657cc290419Sopenharmony_ci * @tc.type: FUNC 658cc290419Sopenharmony_ci */ 659cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, GetUartBits, TestSize.Level1) 660cc290419Sopenharmony_ci{ 661cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.GetUartBits(UART_BIT1), CS7); 662cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.GetUartBits(UART_BIT2), CS8); 663cc290419Sopenharmony_ci EXPECT_EQ(mockUARTBase.GetUartBits(-1), CS8); 664cc290419Sopenharmony_ci} 665cc290419Sopenharmony_ci 666cc290419Sopenharmony_ci/* 667cc290419Sopenharmony_ci * @tc.name: ToPkgIdentityString 668cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the ToPkgIdentityString function 669cc290419Sopenharmony_ci * successed 670cc290419Sopenharmony_ci * @tc.type: FUNC 671cc290419Sopenharmony_ci */ 672cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, ToPkgIdentityString, TestSize.Level1) 673cc290419Sopenharmony_ci{ 674cc290419Sopenharmony_ci const uint32_t sessionId = 12345; 675cc290419Sopenharmony_ci const uint32_t packageIndex = 54321; 676cc290419Sopenharmony_ci 677cc290419Sopenharmony_ci UartHead head; 678cc290419Sopenharmony_ci head.sessionId = sessionId; 679cc290419Sopenharmony_ci head.packageIndex = packageIndex; 680cc290419Sopenharmony_ci EXPECT_STREQ(head.ToPkgIdentityString().c_str(), "Id:12345pkgIdx:54321"); 681cc290419Sopenharmony_ci EXPECT_STREQ(head.ToPkgIdentityString(true).c_str(), "R-Id:12345pkgIdx:54321"); 682cc290419Sopenharmony_ci} 683cc290419Sopenharmony_ci 684cc290419Sopenharmony_ci/* 685cc290419Sopenharmony_ci * @tc.name: HandleOutputPkg 686cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the HandleOutputPkg function 687cc290419Sopenharmony_ci * successed 688cc290419Sopenharmony_ci * @tc.type: FUNC 689cc290419Sopenharmony_ci */ 690cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, HandleOutputPkg, TestSize.Level1) 691cc290419Sopenharmony_ci{ 692cc290419Sopenharmony_ci const uint32_t sessionId = 12345; 693cc290419Sopenharmony_ci HdcUARTBase::HandleOutputPkg testPackage("key", sessionId, nullptr, 0); 694cc290419Sopenharmony_ci testPackage.sendTimePoint = std::chrono::steady_clock::now(); 695cc290419Sopenharmony_ci std::string debugString = testPackage.ToDebugString(); 696cc290419Sopenharmony_ci EXPECT_THAT(debugString, HasSubstr("pkgStatus")); 697cc290419Sopenharmony_ci EXPECT_THAT(debugString, Not(HasSubstr("sent"))); 698cc290419Sopenharmony_ci 699cc290419Sopenharmony_ci testPackage.pkgStatus = HdcUARTBase::PKG_WAIT_RESPONSE; 700cc290419Sopenharmony_ci debugString = testPackage.ToDebugString(); 701cc290419Sopenharmony_ci EXPECT_THAT(debugString, HasSubstr("pkgStatus")); 702cc290419Sopenharmony_ci EXPECT_THAT(debugString, HasSubstr("sent")); 703cc290419Sopenharmony_ci 704cc290419Sopenharmony_ci testPackage.response = true; 705cc290419Sopenharmony_ci debugString = testPackage.ToDebugString(); 706cc290419Sopenharmony_ci EXPECT_THAT(debugString, HasSubstr("pkgStatus")); 707cc290419Sopenharmony_ci EXPECT_THAT(debugString, HasSubstr("NAK")); 708cc290419Sopenharmony_ci 709cc290419Sopenharmony_ci testPackage.response = true; 710cc290419Sopenharmony_ci testPackage.ack = true; 711cc290419Sopenharmony_ci debugString = testPackage.ToDebugString(); 712cc290419Sopenharmony_ci EXPECT_THAT(debugString, HasSubstr("pkgStatus")); 713cc290419Sopenharmony_ci EXPECT_THAT(debugString, HasSubstr("ACK")); 714cc290419Sopenharmony_ci} 715cc290419Sopenharmony_ci 716cc290419Sopenharmony_ci/* 717cc290419Sopenharmony_ci * @tc.name: TransferStateMachine 718cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the TransferStateMachine function 719cc290419Sopenharmony_ci * successed 720cc290419Sopenharmony_ci * @tc.type: FUNC 721cc290419Sopenharmony_ci */ 722cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, TransferStateMachine, TestSize.Level1) 723cc290419Sopenharmony_ci{ 724cc290419Sopenharmony_ci HdcUARTBase::TransferStateMachine tsm; 725cc290419Sopenharmony_ci // case 1 timeout 726cc290419Sopenharmony_ci tsm.Request(); 727cc290419Sopenharmony_ci EXPECT_EQ(tsm.requested, true); 728cc290419Sopenharmony_ci EXPECT_EQ(tsm.timeout, false); 729cc290419Sopenharmony_ci tsm.Sent(); 730cc290419Sopenharmony_ci EXPECT_EQ(tsm.requested, true); 731cc290419Sopenharmony_ci EXPECT_EQ(tsm.timeout, true); 732cc290419Sopenharmony_ci tsm.Wait(); // not timeout 733cc290419Sopenharmony_ci EXPECT_EQ(tsm.requested, false); 734cc290419Sopenharmony_ci EXPECT_EQ(tsm.timeout, true); 735cc290419Sopenharmony_ci tsm.Wait(); // wait again until timeout 736cc290419Sopenharmony_ci EXPECT_EQ(tsm.timeout, false); 737cc290419Sopenharmony_ci 738cc290419Sopenharmony_ci // case 2 not timeout 739cc290419Sopenharmony_ci tsm.Request(); 740cc290419Sopenharmony_ci EXPECT_EQ(tsm.requested, true); 741cc290419Sopenharmony_ci EXPECT_EQ(tsm.timeout, false); 742cc290419Sopenharmony_ci tsm.Wait(); 743cc290419Sopenharmony_ci EXPECT_EQ(tsm.requested, false); 744cc290419Sopenharmony_ci EXPECT_EQ(tsm.timeout, false); 745cc290419Sopenharmony_ci} 746cc290419Sopenharmony_ci 747cc290419Sopenharmony_ci/* 748cc290419Sopenharmony_ci * @tc.name: TransferSlot 749cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the TransferSlot function 750cc290419Sopenharmony_ci * successed 751cc290419Sopenharmony_ci * @tc.type: FUNC 752cc290419Sopenharmony_ci */ 753cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, TransferSlot, TestSize.Level1) 754cc290419Sopenharmony_ci{ 755cc290419Sopenharmony_ci const uint32_t sessionId = 12345; 756cc290419Sopenharmony_ci HdcUARTBase::TransferSlot slot; 757cc290419Sopenharmony_ci slot.Free(sessionId); 758cc290419Sopenharmony_ci EXPECT_THAT(slot.hasWaitPkg, Not(Contains(sessionId))); 759cc290419Sopenharmony_ci slot.Wait(sessionId); 760cc290419Sopenharmony_ci EXPECT_THAT(slot.hasWaitPkg, Contains(sessionId)); 761cc290419Sopenharmony_ci slot.WaitFree(); 762cc290419Sopenharmony_ci EXPECT_THAT(slot.hasWaitPkg, Contains(sessionId)); 763cc290419Sopenharmony_ci} 764cc290419Sopenharmony_ci 765cc290419Sopenharmony_ci/* 766cc290419Sopenharmony_ci * @tc.name: HandleOutputPkgKeyFinder 767cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the HandleOutputPkgKeyFinder function 768cc290419Sopenharmony_ci * successed 769cc290419Sopenharmony_ci * @tc.type: FUNC 770cc290419Sopenharmony_ci */ 771cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, HandleOutputPkgKeyFinder, TestSize.Level1) 772cc290419Sopenharmony_ci{ 773cc290419Sopenharmony_ci vector<HdcUARTBase::HandleOutputPkg> outPkgs; // Pkg label, HOutPkg 774cc290419Sopenharmony_ci outPkgs.emplace_back("A", 0, nullptr, 0); 775cc290419Sopenharmony_ci outPkgs.emplace_back("B", 0, nullptr, 0); 776cc290419Sopenharmony_ci EXPECT_NE( 777cc290419Sopenharmony_ci std::find_if(outPkgs.begin(), outPkgs.end(), HdcUARTBase::HandleOutputPkgKeyFinder("A")), 778cc290419Sopenharmony_ci outPkgs.end()); 779cc290419Sopenharmony_ci EXPECT_NE( 780cc290419Sopenharmony_ci std::find_if(outPkgs.begin(), outPkgs.end(), HdcUARTBase::HandleOutputPkgKeyFinder("B")), 781cc290419Sopenharmony_ci outPkgs.end()); 782cc290419Sopenharmony_ci EXPECT_EQ( 783cc290419Sopenharmony_ci std::find_if(outPkgs.begin(), outPkgs.end(), HdcUARTBase::HandleOutputPkgKeyFinder("C")), 784cc290419Sopenharmony_ci outPkgs.end()); 785cc290419Sopenharmony_ci} 786cc290419Sopenharmony_ci 787cc290419Sopenharmony_ci/* 788cc290419Sopenharmony_ci * @tc.name: Restartession 789cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the Restartession function 790cc290419Sopenharmony_ci * successed 791cc290419Sopenharmony_ci * @tc.type: FUNC 792cc290419Sopenharmony_ci */ 793cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, StopSession, TestSize.Level1) 794cc290419Sopenharmony_ci{ 795cc290419Sopenharmony_ci const uint32_t sessionId = 12345; 796cc290419Sopenharmony_ci HdcSession session; 797cc290419Sopenharmony_ci session.sessionId = sessionId; 798cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ClearUARTOutMap(sessionId)).WillOnce(Return()); 799cc290419Sopenharmony_ci EXPECT_CALL(mockSessionBase, FreeSession(sessionId)).WillOnce(Return()); 800cc290419Sopenharmony_ci mockUARTBase.Restartession(&session); 801cc290419Sopenharmony_ci 802cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ClearUARTOutMap).Times(0); 803cc290419Sopenharmony_ci EXPECT_CALL(mockSessionBase, FreeSession).Times(0); 804cc290419Sopenharmony_ci mockUARTBase.Restartession(nullptr); 805cc290419Sopenharmony_ci} 806cc290419Sopenharmony_ci 807cc290419Sopenharmony_ci/* 808cc290419Sopenharmony_ci * @tc.name: StopSession 809cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the Restartession function 810cc290419Sopenharmony_ci * successed 811cc290419Sopenharmony_ci * @tc.type: FUNC 812cc290419Sopenharmony_ci */ 813cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, Restartession, TestSize.Level1) 814cc290419Sopenharmony_ci{ 815cc290419Sopenharmony_ci const uint32_t sessionId = 12345; 816cc290419Sopenharmony_ci HdcSession session; 817cc290419Sopenharmony_ci session.sessionId = sessionId; 818cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ClearUARTOutMap(sessionId)).WillOnce(Return()); 819cc290419Sopenharmony_ci EXPECT_CALL(mockSessionBase, FreeSession).Times(0); 820cc290419Sopenharmony_ci mockUARTBase.StopSession(&session); 821cc290419Sopenharmony_ci} 822cc290419Sopenharmony_ci 823cc290419Sopenharmony_ci/* 824cc290419Sopenharmony_ci * @tc.name: ResponseUartTrans 825cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the ResponseUartTrans function 826cc290419Sopenharmony_ci * successed 827cc290419Sopenharmony_ci * @tc.type: FUNC 828cc290419Sopenharmony_ci */ 829cc290419Sopenharmony_ciHWTEST_F(HdcUARTBaseTest, ResponseUartTrans, TestSize.Level1) 830cc290419Sopenharmony_ci{ 831cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, ResponseUartTrans) 832cc290419Sopenharmony_ci .WillRepeatedly([&](uint32_t sessionId, uint32_t packageIndex, UartProtocolOption option) { 833cc290419Sopenharmony_ci return mockUARTBase.HdcUARTBase::ResponseUartTrans(sessionId, packageIndex, option); 834cc290419Sopenharmony_ci }); 835cc290419Sopenharmony_ci const uint32_t sessionId = 12345; 836cc290419Sopenharmony_ci const uint32_t packageIndex = 54321; 837cc290419Sopenharmony_ci EXPECT_CALL(mockUARTBase, RequestSendPackage(_, sizeof(UartHead), false)); 838cc290419Sopenharmony_ci mockUARTBase.ResponseUartTrans(sessionId, packageIndex, PKG_OPTION_FREE); 839cc290419Sopenharmony_ci} 840cc290419Sopenharmony_ci} // namespace Hdc 841