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