1/*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15#include "gtest/gtest.h"
16#include <securec.h>
17
18#include "network_mock.h"
19#include "softbus_errcode.h"
20#include "lnn_event_monitor_impl.h"
21#include "lnn_bt_monitor.c"
22#include "lnn_netlink_monitor.c"
23
24namespace OHOS {
25#define TEST_LEN          5
26#define TEST_LEN2         65
27#define TEST_LISTENER_ID  20
28#define TEST_LISTENER_ID2 (-1)
29#define TEST_STATE1       1
30#define TEST_STATE2       3
31#define TEST_STATE3       5
32#define TEST_STATE4       7
33#define TEST_ACL_STATE    0
34#define TEST_ACL_STATE2   1
35using namespace testing::ext;
36using namespace testing;
37class AdapterDsoftbusNetworkTest : public testing::Test {
38protected:
39    static void SetUpTestCase(void);
40    static void TearDownTestCase(void);
41    void SetUp();
42    void TearDown();
43};
44void AdapterDsoftbusNetworkTest::SetUpTestCase(void) { }
45void AdapterDsoftbusNetworkTest::TearDownTestCase(void) { }
46void AdapterDsoftbusNetworkTest::SetUp() { }
47void AdapterDsoftbusNetworkTest::TearDown() { }
48
49/*
50 * @tc.name: CreateNetlinkSocket
51 * @tc.desc: softbus network test
52 * @tc.type: FUNC
53 * @tc.require:
54 */
55HWTEST_F(AdapterDsoftbusNetworkTest, CreateNetlinkSocketTest001, TestSize.Level1)
56{
57    NiceMock<NetworkInterfaceMock> networkMock;
58    ON_CALL(networkMock, SoftBusSocketCreate).WillByDefault(Return(SOFTBUS_OK));
59    ON_CALL(networkMock, SoftBusSocketSetOpt).WillByDefault(Return(SOFTBUS_OK));
60    ON_CALL(networkMock, SoftBusSocketClose).WillByDefault(Return(SOFTBUS_OK));
61    ON_CALL(networkMock, SoftBusSocketBind).WillByDefault(Return(SOFTBUS_OK));
62    int32_t ret = CreateNetlinkSocket();
63    EXPECT_TRUE(ret == SOFTBUS_OK);
64    EXPECT_CALL(networkMock, SoftBusSocketCreate).WillOnce(Return(SOFTBUS_ERR)).WillRepeatedly(Return(SOFTBUS_OK));
65    ret = CreateNetlinkSocket();
66    EXPECT_TRUE(ret == SOFTBUS_ERR);
67    EXPECT_CALL(networkMock, SoftBusSocketSetOpt)
68        .WillOnce(Return(SOFTBUS_ERR))
69        .WillOnce(Return(SOFTBUS_ERR))
70        .WillRepeatedly(Return(SOFTBUS_OK));
71    ret = CreateNetlinkSocket();
72    EXPECT_TRUE(ret == SOFTBUS_ERR);
73    EXPECT_CALL(networkMock, SoftBusSocketBind).WillOnce(Return(SOFTBUS_ERR)).WillRepeatedly(Return(SOFTBUS_OK));
74    ret = CreateNetlinkSocket();
75    EXPECT_TRUE(ret == SOFTBUS_ERR);
76}
77
78/*
79 * @tc.name: ProcessAddrEvent
80 * @tc.desc: softbus network test
81 * @tc.type: FUNC
82 * @tc.require:
83 */
84HWTEST_F(AdapterDsoftbusNetworkTest, ProcessAddrEventTest001, TestSize.Level1)
85{
86    nlmsghdr nlh1 = {
87        .nlmsg_len = TEST_LEN,
88    };
89    NiceMock<NetworkInterfaceMock> networkMock;
90    ON_CALL(networkMock, LnnGetNetIfTypeByName).WillByDefault(Return(SOFTBUS_OK));
91    ON_CALL(networkMock, SoftBusSocketCreate).WillByDefault(Return(SOFTBUS_OK));
92    ON_CALL(networkMock, SoftBusSocketSetOpt).WillByDefault(Return(SOFTBUS_OK));
93    ON_CALL(networkMock, SoftBusSocketClose).WillByDefault(Return(SOFTBUS_OK));
94    ON_CALL(networkMock, SoftBusSocketBind).WillByDefault(Return(SOFTBUS_OK));
95    ON_CALL(networkMock, SoftBusSocketRecv).WillByDefault(Return(TEST_LISTENER_ID2));
96    ProcessAddrEvent(&nlh1);
97    nlmsghdr nlh2 = {
98        .nlmsg_len = TEST_LEN2,
99    };
100    ProcessAddrEvent(&nlh2);
101    EXPECT_TRUE(NetlinkOnConnectEvent(NETLINK, -1, nullptr) == SOFTBUS_OK);
102    EXPECT_TRUE(NetlinkOnDataEvent(NETLINK, SOFTBUS_SOCKET_OUT, -1) == SOFTBUS_INVALID_PARAM);
103    EXPECT_CALL(networkMock, SoftBusSocketRecv).WillOnce(Return(TEST_LEN)).WillRepeatedly(Return(TEST_LISTENER_ID2));
104    EXPECT_TRUE(NetlinkOnDataEvent(NETLINK, SOFTBUS_SOCKET_IN, 0) == SOFTBUS_SOCKET_EXCEPTION);
105}
106
107/*
108 * @tc.name: LnnOnBtStateChanged
109 * @tc.desc: softbus network test
110 * @tc.type: FUNC
111 * @tc.require:
112 */
113HWTEST_F(AdapterDsoftbusNetworkTest, LnnOnBtStateChangedTest001, TestSize.Level1)
114{
115    NiceMock<NetworkInterfaceMock> networkMock;
116    ON_CALL(networkMock, LnnAsyncCallbackHelper).WillByDefault(Return(SOFTBUS_OK));
117    ON_CALL(networkMock, SoftBusAddBtStateListener).WillByDefault(Return(TEST_LISTENER_ID));
118
119    int32_t listenerId = TEST_LISTENER_ID;
120    int32_t state = TEST_STATE1;
121    SoftBusBtAddr addr;
122    int32_t aclState = TEST_ACL_STATE;
123    LnnOnBtStateChanged(listenerId, state);
124    state = TEST_STATE2;
125    LnnOnBtStateChanged(listenerId, state);
126    state = TEST_STATE3;
127    LnnOnBtStateChanged(listenerId, state);
128    state = TEST_STATE4;
129    LnnOnBtStateChanged(listenerId, state);
130    EXPECT_CALL(networkMock, LnnAsyncCallbackHelper).WillRepeatedly(Return(SOFTBUS_ERR));
131    LnnOnBtStateChanged(listenerId, state);
132    LnnOnBtAclStateChanged(listenerId, &addr, aclState, 0);
133    aclState = TEST_ACL_STATE2;
134    LnnOnBtAclStateChanged(listenerId, &addr, aclState, 0);
135    aclState = TEST_STATE1;
136    LnnOnBtAclStateChanged(listenerId, &addr, aclState, 0);
137    int32_t ret = LnnInitBtStateMonitorImpl();
138    EXPECT_TRUE(ret == SOFTBUS_OK);
139    EXPECT_CALL(networkMock, SoftBusAddBtStateListener).WillRepeatedly(Return(TEST_LISTENER_ID2));
140    ret = LnnInitBtStateMonitorImpl();
141    EXPECT_TRUE(ret == SOFTBUS_ERR);
142}
143} // namespace OHOS