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 "host_uart_test.h" 17cc290419Sopenharmony_ci 18cc290419Sopenharmony_ci#include <chrono> 19cc290419Sopenharmony_ci#include <random> 20cc290419Sopenharmony_ci#include <thread> 21cc290419Sopenharmony_ci 22cc290419Sopenharmony_ci#include "server.h" 23cc290419Sopenharmony_ci 24cc290419Sopenharmony_ciusing namespace std::chrono; 25cc290419Sopenharmony_ciusing namespace std::chrono_literals; 26cc290419Sopenharmony_ciusing namespace testing::ext; 27cc290419Sopenharmony_ciusing namespace testing; 28cc290419Sopenharmony_ci 29cc290419Sopenharmony_cinamespace Hdc { 30cc290419Sopenharmony_ciclass HdcHostUARTTest : public testing::Test { 31cc290419Sopenharmony_cipublic: 32cc290419Sopenharmony_ci static void SetUpTestCase(void); 33cc290419Sopenharmony_ci static void TearDownTestCase(void); 34cc290419Sopenharmony_ci void SetUp(); 35cc290419Sopenharmony_ci void TearDown(); 36cc290419Sopenharmony_ci 37cc290419Sopenharmony_ci constexpr static int PAIR = 2; 38cc290419Sopenharmony_ci constexpr static int SENDER = 0; 39cc290419Sopenharmony_ci constexpr static int RECEIVER = 1; 40cc290419Sopenharmony_ci 41cc290419Sopenharmony_ci std::default_random_engine rnd; 42cc290419Sopenharmony_ci const std::string nullDevPath = "/dev/null"; 43cc290419Sopenharmony_ci class MockHdcServer : public HdcServer { 44cc290419Sopenharmony_ci MockHdcServer() : HdcServer(true) {}; 45cc290419Sopenharmony_ci MOCK_METHOD3(AdminDaemonMap, string(uint8_t, const string &, HDaemonInfo &)); 46cc290419Sopenharmony_ci MOCK_METHOD1(EnumUARTDeviceRegister, void(UartKickoutZombie)); 47cc290419Sopenharmony_ci MOCK_METHOD4(MallocSession, HSession(bool, const ConnType, void *, uint32_t)); 48cc290419Sopenharmony_ci MOCK_METHOD1(FreeSession, void(const uint32_t)); 49cc290419Sopenharmony_ci MOCK_METHOD3(AdminSession, HSession(const uint8_t, const uint32_t, HSession)); 50cc290419Sopenharmony_ci MOCK_METHOD2(EchoToClientsForSession, void(uint32_t, const string &)); 51cc290419Sopenharmony_ci } mockServer; 52cc290419Sopenharmony_ci 53cc290419Sopenharmony_ci class MockBaseInterface : public ExternInterface { 54cc290419Sopenharmony_ci public: 55cc290419Sopenharmony_ci MOCK_METHOD4(StartWorkThread, int(uv_loop_t *, uv_work_cb, uv_after_work_cb, void *)); 56cc290419Sopenharmony_ci MOCK_METHOD2(TryCloseHandle, void(const uv_handle_t *, uv_close_cb)); 57cc290419Sopenharmony_ci MOCK_METHOD3(TimerUvTask, bool(uv_loop_t *, void *, uv_timer_cb)); 58cc290419Sopenharmony_ci MOCK_METHOD3(SendToStream, int(uv_stream_t *, const uint8_t *, const int)); 59cc290419Sopenharmony_ci MOCK_METHOD3(SendToPollFd, int(int, const uint8_t *, const int)); 60cc290419Sopenharmony_ci MOCK_METHOD6(DelayDo, bool(uv_loop_t *, const int, const uint8_t, string, void *, DelayCB)); 61cc290419Sopenharmony_ci MOCK_METHOD4(UvTimerStart, bool(uv_timer_t *, uv_timer_cb, uint64_t, uint64_t)); 62cc290419Sopenharmony_ci } mockInterface; 63cc290419Sopenharmony_ci 64cc290419Sopenharmony_ci class MockHdcHostUART : public HdcHostUART { 65cc290419Sopenharmony_ci public: 66cc290419Sopenharmony_ci explicit MockHdcHostUART(HdcServer &daemonIn, 67cc290419Sopenharmony_ci ExternInterface &externInterface = HdcUARTBase::defaultInterface) 68cc290419Sopenharmony_ci : HdcHostUART(daemonIn, externInterface) 69cc290419Sopenharmony_ci { 70cc290419Sopenharmony_ci } 71cc290419Sopenharmony_ci MOCK_METHOD0(StartupUARTWork, RetErrCode()); 72cc290419Sopenharmony_ci MOCK_METHOD0(UartWriteThread, void()); 73cc290419Sopenharmony_ci MOCK_METHOD1(CloseSerialPort, void(const HUART)); 74cc290419Sopenharmony_ci MOCK_METHOD1(EnumSerialPort, bool(bool &)); 75cc290419Sopenharmony_ci MOCK_METHOD0(Stop, void()); 76cc290419Sopenharmony_ci MOCK_METHOD3(UpdateUARTDaemonInfo, void(const std::string &, HSession, ConnStatus)); 77cc290419Sopenharmony_ci MOCK_METHOD1(StartUartReadThread, bool(HSession)); 78cc290419Sopenharmony_ci MOCK_METHOD0(StartUartSendThread, bool()); 79cc290419Sopenharmony_ci MOCK_METHOD0(WatchUartDevPlugin, void()); 80cc290419Sopenharmony_ci MOCK_METHOD1(OpenSerialPort, int(const std::string &)); 81cc290419Sopenharmony_ci MOCK_METHOD1(UartReadThread, void(HSession)); 82cc290419Sopenharmony_ci MOCK_METHOD3(SendUARTRaw, bool(HSession, uint8_t *, const size_t)); 83cc290419Sopenharmony_ci MOCK_METHOD3(RequestSendPackage, void(uint8_t *, const size_t, bool)); 84cc290419Sopenharmony_ci MOCK_METHOD1(UartSendThread, void(HSession)); 85cc290419Sopenharmony_ci MOCK_METHOD0(SendPkgInUARTOutMap, void()); 86cc290419Sopenharmony_ci MOCK_METHOD1(IsDeviceOpened, bool(const HdcUART &)); 87cc290419Sopenharmony_ci MOCK_METHOD3(ReadUartDev, ssize_t(std::vector<uint8_t> &, size_t, HdcUART &)); 88cc290419Sopenharmony_ci MOCK_METHOD1(NeedStop, bool(const HSession)); 89cc290419Sopenharmony_ci MOCK_METHOD2(PackageProcess, size_t(vector<uint8_t> &, HSession hSession)); 90cc290419Sopenharmony_ci MOCK_METHOD1(OnTransferError, void(const HSession)); 91cc290419Sopenharmony_ci MOCK_METHOD1(ClearUARTOutMap, void(uint32_t)); 92cc290419Sopenharmony_ci } mockHostUART; 93cc290419Sopenharmony_ci 94cc290419Sopenharmony_ci HdcSession mySession; 95cc290419Sopenharmony_ci HdcUART myUART; 96cc290419Sopenharmony_ci const int testSerialHandle = 0x1234; 97cc290419Sopenharmony_ci const std::string testSerialPortName = "COMX"; 98cc290419Sopenharmony_ci 99cc290419Sopenharmony_ci HdcHostUARTTest() : mockHostUART(mockServer, mockInterface) 100cc290419Sopenharmony_ci { 101cc290419Sopenharmony_ci myUART.serialPort = testSerialPortName; 102cc290419Sopenharmony_ci myUART.devUartHandle = testSerialHandle; 103cc290419Sopenharmony_ci mySession.hUART = &myUART; 104cc290419Sopenharmony_ci mySession.classModule = &mockHostUART; 105cc290419Sopenharmony_ci mySession.classInstance = &mockServer; 106cc290419Sopenharmony_ci }; 107cc290419Sopenharmony_ci}; 108cc290419Sopenharmony_ci 109cc290419Sopenharmony_civoid HdcHostUARTTest::SetUpTestCase() 110cc290419Sopenharmony_ci{ 111cc290419Sopenharmony_ci#ifdef UT_DEBUG 112cc290419Sopenharmony_ci Hdc::Base::SetLogLevel(LOG_ALL); 113cc290419Sopenharmony_ci#else 114cc290419Sopenharmony_ci Hdc::Base::SetLogLevel(LOG_OFF); 115cc290419Sopenharmony_ci#endif 116cc290419Sopenharmony_ci} 117cc290419Sopenharmony_ci 118cc290419Sopenharmony_civoid HdcHostUARTTest::TearDownTestCase() {} 119cc290419Sopenharmony_ci 120cc290419Sopenharmony_civoid HdcHostUARTTest::SetUp() 121cc290419Sopenharmony_ci{ 122cc290419Sopenharmony_ci // The destructor will call these 123cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, Stop).Times(AnyNumber()); 124cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, TryCloseHandle).Times(AnyNumber()); 125cc290419Sopenharmony_ci} 126cc290419Sopenharmony_ci 127cc290419Sopenharmony_civoid HdcHostUARTTest::TearDown() 128cc290419Sopenharmony_ci{ 129cc290419Sopenharmony_ci // session will close mockDaemon.loopMain ,so we dont need close it in UT 130cc290419Sopenharmony_ci 131cc290419Sopenharmony_ci // ~HdcHostUART will call close 132cc290419Sopenharmony_ci} 133cc290419Sopenharmony_ci 134cc290419Sopenharmony_ci/* 135cc290419Sopenharmony_ci * @tc.name: HdcHostUART 136cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the HdcHostUART function 137cc290419Sopenharmony_ci * @tc.type: FUNC 138cc290419Sopenharmony_ci */ 139cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, HdcHostUART, TestSize.Level1) 140cc290419Sopenharmony_ci{ 141cc290419Sopenharmony_ci HdcHostUART hostUart(mockServer); 142cc290419Sopenharmony_ci EXPECT_EQ(hostUart.uartOpened, false); 143cc290419Sopenharmony_ci EXPECT_EQ(hostUart.baudRate, 0u); 144cc290419Sopenharmony_ci EXPECT_EQ(hostUart.mapIgnoreDevice.empty(), true); 145cc290419Sopenharmony_ci EXPECT_EQ(hostUart.serialPortInfo.empty(), true); 146cc290419Sopenharmony_ci 147cc290419Sopenharmony_ci hostUart.devUartWatcher.data = this; 148cc290419Sopenharmony_ci uv_timer_start( 149cc290419Sopenharmony_ci &hostUart.devUartWatcher, 150cc290419Sopenharmony_ci [](uv_timer_s *timer) { 151cc290419Sopenharmony_ci EXPECT_NE(timer->data, nullptr); 152cc290419Sopenharmony_ci timer->data = nullptr; 153cc290419Sopenharmony_ci }, 154cc290419Sopenharmony_ci 100, 0); 155cc290419Sopenharmony_ci 156cc290419Sopenharmony_ci std::this_thread::sleep_for(200ms); 157cc290419Sopenharmony_ci uv_run(&mockServer.loopMain, UV_RUN_NOWAIT); 158cc290419Sopenharmony_ci 159cc290419Sopenharmony_ci EXPECT_EQ(hostUart.devUartWatcher.data, nullptr); 160cc290419Sopenharmony_ci EXPECT_EQ(hostUart.semUartDevCheck.try_lock(), true); 161cc290419Sopenharmony_ci 162cc290419Sopenharmony_ci EXPECT_NE(uv_has_ref(reinterpret_cast<uv_handle_t *>(&hostUart.devUartWatcher)), 0); 163cc290419Sopenharmony_ci} 164cc290419Sopenharmony_ci 165cc290419Sopenharmony_ci/* 166cc290419Sopenharmony_ci * @tc.name: Initial 167cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the Initial function 168cc290419Sopenharmony_ci * @tc.type: FUNC 169cc290419Sopenharmony_ci */ 170cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, Initial, TestSize.Level1) 171cc290419Sopenharmony_ci{ 172cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, StartupUARTWork).Times(1); 173cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.Initial(), 0); 174cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.uartOpened, false); 175cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.stopped, false); 176cc290419Sopenharmony_ci} 177cc290419Sopenharmony_ci 178cc290419Sopenharmony_ci/* 179cc290419Sopenharmony_ci * @tc.name: Stop 180cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the Stop function 181cc290419Sopenharmony_ci * @tc.type: FUNC 182cc290419Sopenharmony_ci */ 183cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, Stop, TestSize.Level1) 184cc290419Sopenharmony_ci{ 185cc290419Sopenharmony_ci ON_CALL(mockHostUART, Stop).WillByDefault(Invoke([&]() { 186cc290419Sopenharmony_ci return mockHostUART.HdcHostUART::Stop(); 187cc290419Sopenharmony_ci })); 188cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, Stop).Times(1); 189cc290419Sopenharmony_ci EXPECT_CALL( 190cc290419Sopenharmony_ci mockInterface, 191cc290419Sopenharmony_ci TryCloseHandle(reinterpret_cast<uv_handle_t *>(&mockHostUART.devUartWatcher), nullptr)) 192cc290419Sopenharmony_ci .Times(1); 193cc290419Sopenharmony_ci mockHostUART.Stop(); 194cc290419Sopenharmony_ci 195cc290419Sopenharmony_ci // unable stop twice 196cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, Stop).Times(1); 197cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, TryCloseHandle).Times(0); 198cc290419Sopenharmony_ci mockHostUART.Stop(); 199cc290419Sopenharmony_ci} 200cc290419Sopenharmony_ci 201cc290419Sopenharmony_ci/* 202cc290419Sopenharmony_ci * @tc.name: ConnectDaemonByUart 203cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the ConnectDaemonByUart function 204cc290419Sopenharmony_ci * @tc.type: FUNC 205cc290419Sopenharmony_ci */ 206cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, ConnectDaemonByUart, TestSize.Level1) 207cc290419Sopenharmony_ci{ 208cc290419Sopenharmony_ci mockHostUART.uartOpened = true; 209cc290419Sopenharmony_ci 210cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo(mySession.connectKey, &mySession, STATUS_READY)) 211cc290419Sopenharmony_ci .Times(1); 212cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, StartUartReadThread(&mySession)).Times(1).WillOnce(Return(true)); 213cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, StartWorkThread(&mockServer.loopMain, mockServer.SessionWorkThread, 214cc290419Sopenharmony_ci Base::FinishWorkThread, &mySession)) 215cc290419Sopenharmony_ci .Times(1); 216cc290419Sopenharmony_ci EXPECT_CALL( 217cc290419Sopenharmony_ci mockInterface, 218cc290419Sopenharmony_ci SendToPollFd(mySession.ctrlFd[STREAM_MAIN], _, _)) 219cc290419Sopenharmony_ci .Times(1); 220cc290419Sopenharmony_ci mySession.childLoop.active_handles = 1; 221cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.ConnectDaemonByUart(&mySession), &mySession); 222cc290419Sopenharmony_ci 223cc290419Sopenharmony_ci // delay case 224cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo(mySession.connectKey, &mySession, STATUS_READY)) 225cc290419Sopenharmony_ci .Times(1); 226cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, StartUartReadThread(&mySession)).Times(1).WillOnce(Return(true)); 227cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, StartWorkThread(&mockServer.loopMain, mockServer.SessionWorkThread, 228cc290419Sopenharmony_ci Base::FinishWorkThread, &mySession)) 229cc290419Sopenharmony_ci .Times(1); 230cc290419Sopenharmony_ci EXPECT_CALL( 231cc290419Sopenharmony_ci mockInterface, 232cc290419Sopenharmony_ci SendToPollFd(mySession.ctrlFd[STREAM_MAIN], _, _)) 233cc290419Sopenharmony_ci .Times(1); 234cc290419Sopenharmony_ci 235cc290419Sopenharmony_ci mySession.childLoop.active_handles = 0; 236cc290419Sopenharmony_ci std::thread mockActiveHandles([&]() { 237cc290419Sopenharmony_ci std::this_thread::sleep_for(1000ms); 238cc290419Sopenharmony_ci mySession.childLoop.active_handles = 1; 239cc290419Sopenharmony_ci }); 240cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.ConnectDaemonByUart(&mySession), &mySession); 241cc290419Sopenharmony_ci mockActiveHandles.join(); 242cc290419Sopenharmony_ci} 243cc290419Sopenharmony_ci 244cc290419Sopenharmony_ci/* 245cc290419Sopenharmony_ci * @tc.name: ConnectDaemonByUart 246cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the ConnectDaemonByUart function 247cc290419Sopenharmony_ci * @tc.type: FUNC 248cc290419Sopenharmony_ci */ 249cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, ConnectDaemonByUartFail, TestSize.Level1) 250cc290419Sopenharmony_ci{ 251cc290419Sopenharmony_ci mockHostUART.uartOpened = false; 252cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.ConnectDaemonByUart(&mySession), nullptr); 253cc290419Sopenharmony_ci 254cc290419Sopenharmony_ci mockHostUART.uartOpened = true; 255cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo(mySession.connectKey, &mySession, STATUS_READY)) 256cc290419Sopenharmony_ci .Times(1); 257cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, StartUartReadThread).Times(1).WillOnce(Return(false)); 258cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.ConnectDaemonByUart(&mySession), nullptr); 259cc290419Sopenharmony_ci} 260cc290419Sopenharmony_ci 261cc290419Sopenharmony_ci/* 262cc290419Sopenharmony_ci * @tc.name: UvWatchUartDevPlugin 263cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the UvWatchUartDevPlugin function 264cc290419Sopenharmony_ci * @tc.type: FUNC 265cc290419Sopenharmony_ci */ 266cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, UvWatchUartDevPlugin, TestSize.Level1) 267cc290419Sopenharmony_ci{ 268cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, WatchUartDevPlugin).Times(0); 269cc290419Sopenharmony_ci HdcHostUART::UvWatchUartDevPlugin(nullptr); 270cc290419Sopenharmony_ci 271cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, WatchUartDevPlugin()).Times(1); 272cc290419Sopenharmony_ci uv_timer_t handle; 273cc290419Sopenharmony_ci handle.data = &mockHostUART; 274cc290419Sopenharmony_ci HdcHostUART::UvWatchUartDevPlugin(&handle); 275cc290419Sopenharmony_ci 276cc290419Sopenharmony_ci handle.data = nullptr; 277cc290419Sopenharmony_ci HdcHostUART::UvWatchUartDevPlugin(&handle); 278cc290419Sopenharmony_ci} 279cc290419Sopenharmony_ci 280cc290419Sopenharmony_ci/* 281cc290419Sopenharmony_ci * @tc.name: WatchUartDevPlugin 282cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the WatchUartDevPlugin function 283cc290419Sopenharmony_ci * @tc.type: FUNC 284cc290419Sopenharmony_ci */ 285cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, WatchUartDevPluginHaveSerialDaemon, TestSize.Level1) 286cc290419Sopenharmony_ci{ 287cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, WatchUartDevPlugin).WillRepeatedly([&]() { 288cc290419Sopenharmony_ci mockHostUART.HdcHostUART::WatchUartDevPlugin(); 289cc290419Sopenharmony_ci }); 290cc290419Sopenharmony_ci // case 1 EnumSerialPort failed 291cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, EnumSerialPort).WillOnce(Return(false)); 292cc290419Sopenharmony_ci EXPECT_CALL(mockServer, AdminDaemonMap).Times(0); 293cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo).Times(0); 294cc290419Sopenharmony_ci mockHostUART.WatchUartDevPlugin(); 295cc290419Sopenharmony_ci 296cc290419Sopenharmony_ci // case 2 EnumSerialPort not fail but no port change 297cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, EnumSerialPort) 298cc290419Sopenharmony_ci .WillOnce(DoAll(SetArgReferee<0>(false), Return(true))); 299cc290419Sopenharmony_ci EXPECT_CALL(mockServer, AdminDaemonMap).Times(0); 300cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo).Times(0); 301cc290419Sopenharmony_ci mockHostUART.WatchUartDevPlugin(); 302cc290419Sopenharmony_ci} 303cc290419Sopenharmony_ci 304cc290419Sopenharmony_ci/* 305cc290419Sopenharmony_ci * @tc.name: WatchUartDevPlugin 306cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the WatchUartDevPlugin function 307cc290419Sopenharmony_ci * @tc.type: FUNC 308cc290419Sopenharmony_ci */ 309cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, WatchUartDevPluginHaveSomePort, TestSize.Level1) 310cc290419Sopenharmony_ci{ 311cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, WatchUartDevPlugin).WillRepeatedly([&]() { 312cc290419Sopenharmony_ci mockHostUART.HdcHostUART::WatchUartDevPlugin(); 313cc290419Sopenharmony_ci }); 314cc290419Sopenharmony_ci 315cc290419Sopenharmony_ci // case 3 EnumSerialPort return two port, not port removed 316cc290419Sopenharmony_ci // one port is not connected , the other is connected 317cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, EnumSerialPort).WillOnce(DoAll(SetArgReferee<0>(true), Return(true))); 318cc290419Sopenharmony_ci mockHostUART.serialPortInfo.clear(); 319cc290419Sopenharmony_ci mockHostUART.serialPortInfo.emplace_back("COMX"); 320cc290419Sopenharmony_ci mockHostUART.serialPortInfo.emplace_back("COMY"); 321cc290419Sopenharmony_ci mockHostUART.connectedPorts.clear(); 322cc290419Sopenharmony_ci mockHostUART.connectedPorts.emplace("COMY"); 323cc290419Sopenharmony_ci EXPECT_CALL(mockServer, AdminDaemonMap(OP_QUERY, "COMX", _)) 324cc290419Sopenharmony_ci .WillOnce(DoAll(SetArgReferee<2>(nullptr), Return(""))); 325cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo("COMX", nullptr, STATUS_READY)).Times(1); 326cc290419Sopenharmony_ci EXPECT_CALL(mockServer, AdminDaemonMap(OP_QUERY, "COMY", _)) 327cc290419Sopenharmony_ci .WillOnce(DoAll(SetArgReferee<2>(nullptr), Return(""))); 328cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo("COMY", nullptr, STATUS_READY)).Times(0); 329cc290419Sopenharmony_ci mockHostUART.WatchUartDevPlugin(); 330cc290419Sopenharmony_ci} 331cc290419Sopenharmony_ci 332cc290419Sopenharmony_ci/* 333cc290419Sopenharmony_ci * @tc.name: WatchUartDevPlugin 334cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the WatchUartDevPlugin function 335cc290419Sopenharmony_ci * @tc.type: FUNC 336cc290419Sopenharmony_ci */ 337cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, WatchUartDevPluginHaveRemovedPort, TestSize.Level1) 338cc290419Sopenharmony_ci{ 339cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, WatchUartDevPlugin).WillRepeatedly([&]() { 340cc290419Sopenharmony_ci mockHostUART.HdcHostUART::WatchUartDevPlugin(); 341cc290419Sopenharmony_ci }); 342cc290419Sopenharmony_ci 343cc290419Sopenharmony_ci // case 4 EnumSerialPort return two port, and one port removed 344cc290419Sopenharmony_ci // one port is not connected , the other is connected 345cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, EnumSerialPort).WillOnce(DoAll(SetArgReferee<0>(true), Return(true))); 346cc290419Sopenharmony_ci mockHostUART.serialPortInfo.clear(); 347cc290419Sopenharmony_ci mockHostUART.serialPortInfo.emplace_back("COMX"); 348cc290419Sopenharmony_ci mockHostUART.serialPortInfo.emplace_back("COMY"); 349cc290419Sopenharmony_ci mockHostUART.connectedPorts.clear(); 350cc290419Sopenharmony_ci mockHostUART.connectedPorts.emplace("COMY"); 351cc290419Sopenharmony_ci mockHostUART.serialPortRemoved.clear(); 352cc290419Sopenharmony_ci mockHostUART.serialPortRemoved.emplace_back("COMZ"); 353cc290419Sopenharmony_ci 354cc290419Sopenharmony_ci HdcDaemonInformation di; 355cc290419Sopenharmony_ci EXPECT_CALL(mockServer, AdminDaemonMap(OP_QUERY, "COMX", _)) 356cc290419Sopenharmony_ci .WillOnce(DoAll(SetArgReferee<2>(nullptr), Return(""))); 357cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo("COMX", nullptr, STATUS_READY)).Times(1); 358cc290419Sopenharmony_ci EXPECT_CALL(mockServer, AdminDaemonMap(OP_QUERY, "COMY", _)) 359cc290419Sopenharmony_ci .WillOnce(DoAll(SetArgReferee<2>(nullptr), Return(""))); 360cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo("COMY", nullptr, STATUS_READY)).Times(0); 361cc290419Sopenharmony_ci EXPECT_CALL(mockServer, AdminDaemonMap(OP_QUERY, "COMZ", _)) 362cc290419Sopenharmony_ci .WillOnce(DoAll(SetArgReferee<2>(&di), Return(""))); 363cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo("COMZ", nullptr, STATUS_READY)).Times(0); 364cc290419Sopenharmony_ci mockHostUART.WatchUartDevPlugin(); 365cc290419Sopenharmony_ci} 366cc290419Sopenharmony_ci 367cc290419Sopenharmony_ci/* 368cc290419Sopenharmony_ci * @tc.name: UpdateUARTDaemonInfo 369cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the UpdateUARTDaemonInfo function 370cc290419Sopenharmony_ci * @tc.type: FUNC 371cc290419Sopenharmony_ci */ 372cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, UpdateUARTDaemonInfo, TestSize.Level1) 373cc290419Sopenharmony_ci{ 374cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo) 375cc290419Sopenharmony_ci .WillRepeatedly( 376cc290419Sopenharmony_ci [&](const std::string &connectKey, HSession hSession, ConnStatus connStatus) { 377cc290419Sopenharmony_ci mockHostUART.HdcHostUART::UpdateUARTDaemonInfo(connectKey, hSession, connStatus); 378cc290419Sopenharmony_ci }); 379cc290419Sopenharmony_ci 380cc290419Sopenharmony_ci // case 1 STATUS_UNKNOW 381cc290419Sopenharmony_ci HdcDaemonInformation diNew; 382cc290419Sopenharmony_ci EXPECT_CALL(mockServer, 383cc290419Sopenharmony_ci AdminDaemonMap(OP_REMOVE, testSerialPortName, 384cc290419Sopenharmony_ci Field(&HdcDaemonInformation::connectKey, testSerialPortName))) 385cc290419Sopenharmony_ci .Times(1) 386cc290419Sopenharmony_ci .WillOnce(DoAll(SetArgReferee<2>(nullptr), Return(""))); 387cc290419Sopenharmony_ci 388cc290419Sopenharmony_ci mockHostUART.UpdateUARTDaemonInfo(myUART.serialPort, &mySession, STATUS_UNKNOW); 389cc290419Sopenharmony_ci 390cc290419Sopenharmony_ci // case 2 STATUS_CONNECTED 391cc290419Sopenharmony_ci HdcDaemonInformation diDummy; 392cc290419Sopenharmony_ci EXPECT_CALL(mockServer, AdminDaemonMap(OP_QUERY, testSerialPortName, _)) 393cc290419Sopenharmony_ci .Times(1) 394cc290419Sopenharmony_ci .WillOnce(DoAll(SetArgReferee<2>(&diDummy), Return(""))); 395cc290419Sopenharmony_ci 396cc290419Sopenharmony_ci EXPECT_CALL(mockServer, 397cc290419Sopenharmony_ci AdminDaemonMap(OP_UPDATE, testSerialPortName, 398cc290419Sopenharmony_ci Field(&HdcDaemonInformation::connectKey, testSerialPortName))) 399cc290419Sopenharmony_ci .Times(1) 400cc290419Sopenharmony_ci .WillOnce(DoAll(SetArgReferee<2>(nullptr), Return(""))); 401cc290419Sopenharmony_ci 402cc290419Sopenharmony_ci mockHostUART.UpdateUARTDaemonInfo(myUART.serialPort, &mySession, STATUS_CONNECTED); 403cc290419Sopenharmony_ci} 404cc290419Sopenharmony_ci 405cc290419Sopenharmony_ci/* 406cc290419Sopenharmony_ci * @tc.name: StartUartReadThread 407cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the StartUartReadThread function 408cc290419Sopenharmony_ci * @tc.type: FUNC 409cc290419Sopenharmony_ci */ 410cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, StartUartReadThread, TestSize.Level1) 411cc290419Sopenharmony_ci{ 412cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, StartUartReadThread).WillOnce(Invoke([&](HSession hSession) { 413cc290419Sopenharmony_ci return mockHostUART.HdcHostUART::StartUartReadThread(hSession); 414cc290419Sopenharmony_ci })); 415cc290419Sopenharmony_ci 416cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UartReadThread(&mySession)).Times(1); 417cc290419Sopenharmony_ci mockHostUART.StartUartReadThread(&mySession); 418cc290419Sopenharmony_ci if (mySession.hUART->readThread.joinable()) { 419cc290419Sopenharmony_ci mySession.hUART->readThread.join(); 420cc290419Sopenharmony_ci } 421cc290419Sopenharmony_ci} 422cc290419Sopenharmony_ci 423cc290419Sopenharmony_ci/* 424cc290419Sopenharmony_ci * @tc.name: ConnectMyNeed 425cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the ConnectMyNeed function 426cc290419Sopenharmony_ci * @tc.type: FUNC 427cc290419Sopenharmony_ci */ 428cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, ConnectMyNeed, TestSize.Level1) 429cc290419Sopenharmony_ci{ 430cc290419Sopenharmony_ci HdcUART newUART; 431cc290419Sopenharmony_ci mySession.hUART = &newUART; 432cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo(myUART.serialPort, nullptr, STATUS_READY)) 433cc290419Sopenharmony_ci .Times(1); 434cc290419Sopenharmony_ci EXPECT_CALL(mockServer, MallocSession(true, CONN_SERIAL, &mockHostUART, 0)) 435cc290419Sopenharmony_ci .Times(1) 436cc290419Sopenharmony_ci .WillOnce(Return(&mySession)); 437cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, UvTimerStart(Field(&uv_timer_t::data, &mySession), 438cc290419Sopenharmony_ci &mockServer.UartPreConnect, UV_TIMEOUT, UV_REPEAT)) 439cc290419Sopenharmony_ci .Times(1) 440cc290419Sopenharmony_ci .WillOnce(Return(RET_SUCCESS)); 441cc290419Sopenharmony_ci 442cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.ConnectMyNeed(&myUART, myUART.serialPort), true); 443cc290419Sopenharmony_ci 444cc290419Sopenharmony_ci EXPECT_EQ(newUART.devUartHandle, testSerialHandle); 445cc290419Sopenharmony_ci EXPECT_EQ(newUART.serialPort, testSerialPortName); 446cc290419Sopenharmony_ci} 447cc290419Sopenharmony_ci 448cc290419Sopenharmony_ci/* 449cc290419Sopenharmony_ci * @tc.name: ConnectMyNeed 450cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the ConnectMyNeed function 451cc290419Sopenharmony_ci * @tc.type: FUNC 452cc290419Sopenharmony_ci */ 453cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, ConnectMyNeedFail, TestSize.Level1) 454cc290419Sopenharmony_ci{ 455cc290419Sopenharmony_ci HdcUART newUART; 456cc290419Sopenharmony_ci mySession.hUART = &newUART; 457cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UpdateUARTDaemonInfo(myUART.serialPort, nullptr, STATUS_READY)) 458cc290419Sopenharmony_ci .Times(1); 459cc290419Sopenharmony_ci EXPECT_CALL(mockServer, MallocSession(true, CONN_SERIAL, &mockHostUART, 0)) 460cc290419Sopenharmony_ci .Times(1) 461cc290419Sopenharmony_ci .WillOnce(Return(&mySession)); 462cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, UvTimerStart(Field(&uv_timer_t::data, &mySession), 463cc290419Sopenharmony_ci &mockServer.UartPreConnect, UV_TIMEOUT, UV_REPEAT)) 464cc290419Sopenharmony_ci .Times(1) 465cc290419Sopenharmony_ci .WillOnce(Return(-1)); 466cc290419Sopenharmony_ci 467cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.ConnectMyNeed(&myUART), false); 468cc290419Sopenharmony_ci 469cc290419Sopenharmony_ci EXPECT_EQ(newUART.devUartHandle, testSerialHandle); 470cc290419Sopenharmony_ci EXPECT_EQ(newUART.serialPort, testSerialPortName); 471cc290419Sopenharmony_ci} 472cc290419Sopenharmony_ci 473cc290419Sopenharmony_ci/* 474cc290419Sopenharmony_ci * @tc.name: StartupUARTWork 475cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the StartupUARTWork function 476cc290419Sopenharmony_ci * @tc.type: FUNC 477cc290419Sopenharmony_ci */ 478cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, StartupUARTWork, TestSize.Level1) 479cc290419Sopenharmony_ci{ 480cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, StartupUARTWork).WillRepeatedly([&]() { 481cc290419Sopenharmony_ci return mockHostUART.HdcHostUART::StartupUARTWork(); 482cc290419Sopenharmony_ci }); 483cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, UvTimerStart(Field(&uv_timer_t::data, &mockHostUART), 484cc290419Sopenharmony_ci mockHostUART.UvWatchUartDevPlugin, _, _)) 485cc290419Sopenharmony_ci .Times(1) 486cc290419Sopenharmony_ci .WillOnce(Return(0)); 487cc290419Sopenharmony_ci 488cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, StartUartSendThread()).Times(1).WillOnce(Return(false)); 489cc290419Sopenharmony_ci 490cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.StartupUARTWork(), ERR_GENERIC); 491cc290419Sopenharmony_ci 492cc290419Sopenharmony_ci EXPECT_CALL(mockInterface, UvTimerStart(Field(&uv_timer_t::data, &mockHostUART), 493cc290419Sopenharmony_ci mockHostUART.UvWatchUartDevPlugin, _, _)) 494cc290419Sopenharmony_ci .Times(1) 495cc290419Sopenharmony_ci .WillOnce(Return(-1)); 496cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.StartupUARTWork(), ERR_GENERIC); 497cc290419Sopenharmony_ci} 498cc290419Sopenharmony_ci 499cc290419Sopenharmony_ciMATCHER_P(EqUartHead, otherUartHead, "Equality matcher for type UartHead") 500cc290419Sopenharmony_ci{ 501cc290419Sopenharmony_ci UartHead *argUartHead = reinterpret_cast<UartHead *>(arg); 502cc290419Sopenharmony_ci return *argUartHead == *otherUartHead; 503cc290419Sopenharmony_ci} 504cc290419Sopenharmony_ci 505cc290419Sopenharmony_ci/* 506cc290419Sopenharmony_ci * @tc.name: SendUartSoftReset 507cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the SendUartSoftReset function 508cc290419Sopenharmony_ci * @tc.type: FUNC 509cc290419Sopenharmony_ci */ 510cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, SendUartSoftReset, TestSize.Level1) 511cc290419Sopenharmony_ci{ 512cc290419Sopenharmony_ci UartHead resetPackage; 513cc290419Sopenharmony_ci constexpr uint32_t sessionId = 1234; 514cc290419Sopenharmony_ci resetPackage.option = PKG_OPTION_RESET; 515cc290419Sopenharmony_ci resetPackage.dataSize = sizeof(UartHead); 516cc290419Sopenharmony_ci resetPackage.sessionId = sessionId; 517cc290419Sopenharmony_ci 518cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, 519cc290419Sopenharmony_ci RequestSendPackage(EqUartHead(&resetPackage), sizeof(UartHead), false)) 520cc290419Sopenharmony_ci .Times(1); 521cc290419Sopenharmony_ci mockHostUART.SendUartSoftReset(&mySession, sessionId); 522cc290419Sopenharmony_ci} 523cc290419Sopenharmony_ci 524cc290419Sopenharmony_ci/* 525cc290419Sopenharmony_ci * @tc.name: KickoutZombie 526cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the KickoutZombie function 527cc290419Sopenharmony_ci * @tc.type: FUNC 528cc290419Sopenharmony_ci */ 529cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, KickoutZombie, TestSize.Level1) 530cc290419Sopenharmony_ci{ 531cc290419Sopenharmony_ci mockHostUART.KickoutZombie(nullptr); 532cc290419Sopenharmony_ci 533cc290419Sopenharmony_ci mySession.isDead = true; 534cc290419Sopenharmony_ci mockHostUART.KickoutZombie(&mySession); 535cc290419Sopenharmony_ci mySession.isDead = false; 536cc290419Sopenharmony_ci 537cc290419Sopenharmony_ci myUART.devUartHandle = -1; 538cc290419Sopenharmony_ci mockHostUART.KickoutZombie(&mySession); 539cc290419Sopenharmony_ci myUART.devUartHandle = 0; 540cc290419Sopenharmony_ci 541cc290419Sopenharmony_ci EXPECT_CALL(mockServer, FreeSession(mySession.sessionId)).Times(1); 542cc290419Sopenharmony_ci mockHostUART.KickoutZombie(&mySession); 543cc290419Sopenharmony_ci} 544cc290419Sopenharmony_ci 545cc290419Sopenharmony_ci/* 546cc290419Sopenharmony_ci * @tc.name: StartUartSendThread 547cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the StartUartSendThread function 548cc290419Sopenharmony_ci * @tc.type: FUNC 549cc290419Sopenharmony_ci */ 550cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, StartUartSendThread, TestSize.Level1) 551cc290419Sopenharmony_ci{ 552cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, StartUartSendThread).WillRepeatedly([&]() { 553cc290419Sopenharmony_ci return mockHostUART.HdcHostUART::StartUartSendThread(); 554cc290419Sopenharmony_ci }); 555cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UartWriteThread).Times(1); 556cc290419Sopenharmony_ci EXPECT_TRUE(mockHostUART.StartUartSendThread()); 557cc290419Sopenharmony_ci std::this_thread::sleep_for(500ms); 558cc290419Sopenharmony_ci} 559cc290419Sopenharmony_ci 560cc290419Sopenharmony_ci/* 561cc290419Sopenharmony_ci * @tc.name: NeedStop 562cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the NeedStop function 563cc290419Sopenharmony_ci * @tc.type: FUNC 564cc290419Sopenharmony_ci */ 565cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, NeedStop, TestSize.Level1) 566cc290419Sopenharmony_ci{ 567cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, NeedStop).WillRepeatedly([&](const HSession hSession) { 568cc290419Sopenharmony_ci return mockHostUART.HdcHostUART::NeedStop(hSession); 569cc290419Sopenharmony_ci }); 570cc290419Sopenharmony_ci mockHostUART.uartOpened = true; 571cc290419Sopenharmony_ci mySession.isDead = false; 572cc290419Sopenharmony_ci mySession.ref = 1; 573cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.NeedStop(&mySession), false); 574cc290419Sopenharmony_ci 575cc290419Sopenharmony_ci mockHostUART.uartOpened = true; 576cc290419Sopenharmony_ci mySession.isDead = false; 577cc290419Sopenharmony_ci mySession.ref = 0; 578cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.NeedStop(&mySession), false); 579cc290419Sopenharmony_ci 580cc290419Sopenharmony_ci mockHostUART.uartOpened = true; 581cc290419Sopenharmony_ci mySession.isDead = true; 582cc290419Sopenharmony_ci mySession.ref = 1; 583cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.NeedStop(&mySession), false); 584cc290419Sopenharmony_ci 585cc290419Sopenharmony_ci mockHostUART.uartOpened = true; 586cc290419Sopenharmony_ci mySession.isDead = true; 587cc290419Sopenharmony_ci mySession.ref = 0; 588cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.NeedStop(&mySession), true); 589cc290419Sopenharmony_ci 590cc290419Sopenharmony_ci mockHostUART.uartOpened = false; 591cc290419Sopenharmony_ci mySession.isDead = false; 592cc290419Sopenharmony_ci mySession.ref = 1; 593cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.NeedStop(&mySession), true); 594cc290419Sopenharmony_ci} 595cc290419Sopenharmony_ci 596cc290419Sopenharmony_ci/* 597cc290419Sopenharmony_ci * @tc.name: IsDeviceOpened 598cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the IsDeviceOpened function 599cc290419Sopenharmony_ci * @tc.type: FUNC 600cc290419Sopenharmony_ci */ 601cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, IsDeviceOpened, TestSize.Level1) 602cc290419Sopenharmony_ci{ 603cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, IsDeviceOpened).WillRepeatedly([&](const HdcUART &uart) { 604cc290419Sopenharmony_ci return mockHostUART.HdcHostUART::IsDeviceOpened(uart); 605cc290419Sopenharmony_ci }); 606cc290419Sopenharmony_ci myUART.devUartHandle = -1; 607cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.IsDeviceOpened(myUART), false); 608cc290419Sopenharmony_ci 609cc290419Sopenharmony_ci myUART.devUartHandle = -2; 610cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.IsDeviceOpened(myUART), false); 611cc290419Sopenharmony_ci 612cc290419Sopenharmony_ci myUART.devUartHandle = 0; 613cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.IsDeviceOpened(myUART), true); 614cc290419Sopenharmony_ci 615cc290419Sopenharmony_ci myUART.devUartHandle = 1; 616cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.IsDeviceOpened(myUART), true); 617cc290419Sopenharmony_ci} 618cc290419Sopenharmony_ci 619cc290419Sopenharmony_ci/* 620cc290419Sopenharmony_ci * @tc.name: UartWriteThread 621cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the UartWriteThread function 622cc290419Sopenharmony_ci * @tc.type: FUNC 623cc290419Sopenharmony_ci */ 624cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, UartWriteThread, TestSize.Level1) 625cc290419Sopenharmony_ci{ 626cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UartWriteThread).WillOnce(Invoke([&]() { 627cc290419Sopenharmony_ci return mockHostUART.HdcHostUART::UartWriteThread(); 628cc290419Sopenharmony_ci })); 629cc290419Sopenharmony_ci 630cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, SendPkgInUARTOutMap).Times(0); 631cc290419Sopenharmony_ci auto sendThread = std::thread(&HdcHostUART::UartWriteThread, &mockHostUART); 632cc290419Sopenharmony_ci std::this_thread::sleep_for(1000ms); 633cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, SendPkgInUARTOutMap).Times(1); 634cc290419Sopenharmony_ci mockHostUART.transfer.Request(); 635cc290419Sopenharmony_ci std::this_thread::sleep_for(200ms); 636cc290419Sopenharmony_ci mockHostUART.stopped = true; 637cc290419Sopenharmony_ci mockHostUART.transfer.Request(); 638cc290419Sopenharmony_ci sendThread.join(); 639cc290419Sopenharmony_ci} 640cc290419Sopenharmony_ci 641cc290419Sopenharmony_ci/* 642cc290419Sopenharmony_ci * @tc.name: UartReadThread 643cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the UartReadThread function 644cc290419Sopenharmony_ci * @tc.type: FUNC 645cc290419Sopenharmony_ci */ 646cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, UartReadThread, TestSize.Level1) 647cc290419Sopenharmony_ci{ 648cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, UartReadThread).WillRepeatedly(Invoke([&](HSession hSession) { 649cc290419Sopenharmony_ci return mockHostUART.HdcHostUART::UartReadThread(hSession); 650cc290419Sopenharmony_ci })); 651cc290419Sopenharmony_ci 652cc290419Sopenharmony_ci // case 1 need stop 653cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, NeedStop).WillOnce(Return(true)); 654cc290419Sopenharmony_ci auto readThread = std::thread(&HdcHostUART::UartReadThread, &mockHostUART, &mySession); 655cc290419Sopenharmony_ci readThread.join(); 656cc290419Sopenharmony_ci 657cc290419Sopenharmony_ci // case 2 ReadUartDev return -1 will cause OnTransferError 658cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, NeedStop).WillOnce(Return(false)).WillOnce(Return(true)); 659cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, ReadUartDev).WillOnce(Return(-1)); 660cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, OnTransferError).Times(1); 661cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, PackageProcess).Times(0); 662cc290419Sopenharmony_ci auto readThread2 = std::thread(&HdcHostUART::UartReadThread, &mockHostUART, &mySession); 663cc290419Sopenharmony_ci readThread2.join(); 664cc290419Sopenharmony_ci 665cc290419Sopenharmony_ci // case 3 ReadUartDev retturn 0 will timeout, try again 666cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, NeedStop).WillOnce(Return(false)).WillOnce(Return(true)); 667cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, ReadUartDev).WillOnce(Return(0)); 668cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, OnTransferError).Times(0); 669cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, PackageProcess).Times(0); 670cc290419Sopenharmony_ci auto readThread3 = std::thread(&HdcHostUART::UartReadThread, &mockHostUART, &mySession); 671cc290419Sopenharmony_ci readThread3.join(); 672cc290419Sopenharmony_ci 673cc290419Sopenharmony_ci // case 4 ReadUartDev return sizeof(UartHead) 674cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, NeedStop).WillOnce(Return(false)).WillOnce(Return(true)); 675cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, ReadUartDev) 676cc290419Sopenharmony_ci .WillOnce(Invoke([&](std::vector<uint8_t> &readBuf, size_t expectedSize, HdcUART &uart) { 677cc290419Sopenharmony_ci readBuf.resize(sizeof(UartHead)); 678cc290419Sopenharmony_ci return readBuf.size(); 679cc290419Sopenharmony_ci })); 680cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, OnTransferError).Times(0); 681cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, PackageProcess).WillOnce(Return(0)); 682cc290419Sopenharmony_ci auto readThread4 = std::thread(&HdcHostUART::UartReadThread, &mockHostUART, &mySession); 683cc290419Sopenharmony_ci readThread4.join(); 684cc290419Sopenharmony_ci 685cc290419Sopenharmony_ci // case 5 ReadUartDev return more than sizeof(UartHead) 686cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, NeedStop).WillOnce(Return(false)).WillOnce(Return(true)); 687cc290419Sopenharmony_ci const size_t testDataSize = sizeof(UartHead) * 2; 688cc290419Sopenharmony_ci 689cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, ReadUartDev) 690cc290419Sopenharmony_ci .WillOnce(Invoke([&](std::vector<uint8_t> &readBuf, size_t expectedSize, HdcUART &uart) { 691cc290419Sopenharmony_ci readBuf.resize(testDataSize); 692cc290419Sopenharmony_ci return readBuf.size(); 693cc290419Sopenharmony_ci })); 694cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, OnTransferError).Times(0); 695cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, PackageProcess).WillOnce(Return(0)); 696cc290419Sopenharmony_ci auto readThread5 = std::thread(&HdcHostUART::UartReadThread, &mockHostUART, &mySession); 697cc290419Sopenharmony_ci readThread5.join(); 698cc290419Sopenharmony_ci} 699cc290419Sopenharmony_ci 700cc290419Sopenharmony_ci/* 701cc290419Sopenharmony_ci * @tc.name: WaitUartIdle 702cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the WaitUartIdle function 703cc290419Sopenharmony_ci * @tc.type: FUNC 704cc290419Sopenharmony_ci */ 705cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, WaitUartIdle, TestSize.Level1) 706cc290419Sopenharmony_ci{ 707cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, ReadUartDev(_, 1, Ref(myUART))).WillOnce(Return(0)); 708cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.WaitUartIdle(myUART), true); 709cc290419Sopenharmony_ci 710cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, ReadUartDev(_, 1, Ref(myUART))) 711cc290419Sopenharmony_ci .WillOnce(Return(1)) 712cc290419Sopenharmony_ci .WillOnce(Return(0)); 713cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.WaitUartIdle(myUART), true); 714cc290419Sopenharmony_ci 715cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, ReadUartDev(_, 1, Ref(myUART))) 716cc290419Sopenharmony_ci .WillOnce(Return(1)) 717cc290419Sopenharmony_ci .WillOnce(Return(1)); 718cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.WaitUartIdle(myUART), false); 719cc290419Sopenharmony_ci} 720cc290419Sopenharmony_ci 721cc290419Sopenharmony_ci/* 722cc290419Sopenharmony_ci * @tc.name: ConnectDaemon 723cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the ConnectDaemon function 724cc290419Sopenharmony_ci * @tc.type: FUNC 725cc290419Sopenharmony_ci */ 726cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, ConnectDaemon, TestSize.Level1) 727cc290419Sopenharmony_ci{ 728cc290419Sopenharmony_ci std::string connectKey = "dummykey"; 729cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, OpenSerialPort(connectKey)).WillOnce(Return(0)); 730cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.ConnectDaemon(connectKey), nullptr); 731cc290419Sopenharmony_ci} 732cc290419Sopenharmony_ci 733cc290419Sopenharmony_ci/* 734cc290419Sopenharmony_ci * @tc.name: GetSession 735cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the GetSession function 736cc290419Sopenharmony_ci * @tc.type: FUNC 737cc290419Sopenharmony_ci */ 738cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, GetSession, TestSize.Level1) 739cc290419Sopenharmony_ci{ 740cc290419Sopenharmony_ci constexpr uint32_t sessionId = 1234; 741cc290419Sopenharmony_ci HdcSession mySession; 742cc290419Sopenharmony_ci HdcUART myUART; 743cc290419Sopenharmony_ci mySession.hUART = &myUART; 744cc290419Sopenharmony_ci EXPECT_CALL(mockServer, AdminSession(OP_QUERY, sessionId, nullptr)) 745cc290419Sopenharmony_ci .Times(1) 746cc290419Sopenharmony_ci .WillOnce(Return(&mySession)); 747cc290419Sopenharmony_ci mockHostUART.GetSession(sessionId, false); 748cc290419Sopenharmony_ci} 749cc290419Sopenharmony_ci 750cc290419Sopenharmony_ci/* 751cc290419Sopenharmony_ci * @tc.name: CloseSerialPort 752cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the CloseSerialPort function 753cc290419Sopenharmony_ci * @tc.type: FUNC 754cc290419Sopenharmony_ci */ 755cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, CloseSerialPort, TestSize.Level1) 756cc290419Sopenharmony_ci{ 757cc290419Sopenharmony_ci myUART.devUartHandle = -1; 758cc290419Sopenharmony_ci mockHostUART.CloseSerialPort(&myUART); 759cc290419Sopenharmony_ci EXPECT_EQ(myUART.devUartHandle, -1); 760cc290419Sopenharmony_ci} 761cc290419Sopenharmony_ci 762cc290419Sopenharmony_ci/* 763cc290419Sopenharmony_ci * @tc.name: GetPortFromKey 764cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the GetPortFromKey function 765cc290419Sopenharmony_ci * @tc.type: FUNC 766cc290419Sopenharmony_ci */ 767cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, GetPortFromKey, TestSize.Level1) 768cc290419Sopenharmony_ci{ 769cc290419Sopenharmony_ci std::string portName; 770cc290419Sopenharmony_ci uint32_t baudRate; 771cc290419Sopenharmony_ci const uint32_t baudRateTest = 111u; 772cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.GetPortFromKey("COM1", portName, baudRate), true); 773cc290419Sopenharmony_ci EXPECT_STREQ(portName.c_str(), "COM1"); 774cc290419Sopenharmony_ci EXPECT_EQ(baudRate, mockHostUART.DEFAULT_BAUD_RATE_VALUE); 775cc290419Sopenharmony_ci 776cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.GetPortFromKey("COM1,aaa", portName, baudRate), false); 777cc290419Sopenharmony_ci 778cc290419Sopenharmony_ci EXPECT_EQ(mockHostUART.GetPortFromKey("COM1,111", portName, baudRate), true); 779cc290419Sopenharmony_ci EXPECT_STREQ(portName.c_str(), "COM1"); 780cc290419Sopenharmony_ci EXPECT_EQ(baudRate, baudRateTest); 781cc290419Sopenharmony_ci} 782cc290419Sopenharmony_ci 783cc290419Sopenharmony_ci/* 784cc290419Sopenharmony_ci * @tc.name: Restartession 785cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the Restartession function 786cc290419Sopenharmony_ci * successed 787cc290419Sopenharmony_ci * @tc.type: FUNC 788cc290419Sopenharmony_ci */ 789cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, Restartession, TestSize.Level1) 790cc290419Sopenharmony_ci{ 791cc290419Sopenharmony_ci const uint32_t sessionId = 12345; 792cc290419Sopenharmony_ci mySession.sessionId = sessionId; 793cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, CloseSerialPort(mySession.hUART)).WillOnce(Return()); 794cc290419Sopenharmony_ci EXPECT_CALL(mockServer, EchoToClientsForSession(sessionId, _)).WillOnce(Return()); 795cc290419Sopenharmony_ci mockHostUART.Restartession(&mySession); 796cc290419Sopenharmony_ci} 797cc290419Sopenharmony_ci 798cc290419Sopenharmony_ci/* 799cc290419Sopenharmony_ci * @tc.name: StopSession 800cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the StopSession function 801cc290419Sopenharmony_ci * successed 802cc290419Sopenharmony_ci * @tc.type: FUNC 803cc290419Sopenharmony_ci */ 804cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, StopSession, TestSize.Level1) 805cc290419Sopenharmony_ci{ 806cc290419Sopenharmony_ci EXPECT_EQ(mySession.hUART->ioCancel, false); 807cc290419Sopenharmony_ci mockHostUART.StopSession(nullptr); 808cc290419Sopenharmony_ci EXPECT_EQ(mySession.hUART->ioCancel, false); 809cc290419Sopenharmony_ci mockHostUART.StopSession(&mySession); 810cc290419Sopenharmony_ci EXPECT_EQ(mySession.hUART->ioCancel, true); 811cc290419Sopenharmony_ci} 812cc290419Sopenharmony_ci 813cc290419Sopenharmony_ci/* 814cc290419Sopenharmony_ci * @tc.name: OnTransferError 815cc290419Sopenharmony_ci * @tc.desc: Check the behavior of the OnTransferError function 816cc290419Sopenharmony_ci * @tc.type: FUNC 817cc290419Sopenharmony_ci */ 818cc290419Sopenharmony_ciHWTEST_F(HdcHostUARTTest, OnTransferError, TestSize.Level1) 819cc290419Sopenharmony_ci{ 820cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, OnTransferError).WillRepeatedly(Invoke([&](const HSession session) { 821cc290419Sopenharmony_ci return mockHostUART.HdcHostUART::OnTransferError(session); 822cc290419Sopenharmony_ci })); 823cc290419Sopenharmony_ci mockHostUART.OnTransferError(nullptr); 824cc290419Sopenharmony_ci const uint32_t sessionId = mySession.sessionId; 825cc290419Sopenharmony_ci 826cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, IsDeviceOpened(Ref(*mySession.hUART))).WillOnce(Return(true)); 827cc290419Sopenharmony_ci EXPECT_CALL(mockServer, EchoToClientsForSession(sessionId, _)).WillOnce(Return()); 828cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, CloseSerialPort(mySession.hUART)).WillOnce(Return()); 829cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, 830cc290419Sopenharmony_ci UpdateUARTDaemonInfo(mySession.connectKey, &mySession, STATUS_OFFLINE)) 831cc290419Sopenharmony_ci .WillOnce(Return()); 832cc290419Sopenharmony_ci EXPECT_CALL(mockServer, FreeSession(sessionId)).WillOnce(Return()); 833cc290419Sopenharmony_ci EXPECT_CALL(mockHostUART, ClearUARTOutMap(sessionId)).WillOnce(Return()); 834cc290419Sopenharmony_ci mockHostUART.OnTransferError(&mySession); 835cc290419Sopenharmony_ci} 836cc290419Sopenharmony_ci} // namespace Hdc 837