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