1 /*
2 * Copyright (c) 2024 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
16 #define private public
17
18 #include <gtest/gtest.h>
19 #include <iostream>
20
21 #include "curl/curl.h"
22 #include "netstack_chr_client.h"
23 #include "netstack_chr_report.h"
24 #include "want.h"
25
26 namespace OHOS::NetStack {
27 namespace {
28 using namespace testing::ext;
29 static constexpr const char *REQUEST_URL = "https://127.0.0.1";
30
31 static constexpr const char *PROCESS_NAME_DEFAULT_VALUE = "CHR_UT";
32
33 static constexpr const int UID_DEFAULT_VALUE = 100;
34 static constexpr const long RESPONSE_CODE_DEFAULT_VALUE = 200;
35 static constexpr const curl_off_t TOTAL_TIME_DEFAULT_VALUE = 500000;
36 static constexpr const curl_off_t NAME_LOOK_UP_TIME_DEFAULT_VALUE = 10000;
37 static constexpr const curl_off_t CONNECT_TIME_DEFAULT_VALUE = 50000;
38 static constexpr const curl_off_t PRE_TRANSFER_TIME_DEFAULT_VALUE = 80000;
39 static constexpr const curl_off_t SIZE_UPLOAD_DEFAULT_VALUE = 30;
40 static constexpr const curl_off_t SIZE_DOWNLOAD_DEFAULT_VALUE = 60;
41 static constexpr const curl_off_t SPEED_DOWNLOAD_DEFAULT_VALUE = 440;
42 static constexpr const curl_off_t SPEED_UPLOAD_DEFAULT_VALUE = 180;
43 static constexpr const char *EFFECTIVE_METHOD_DEFAULT_VALUE = "POST";
44 static constexpr const curl_off_t START_TRANSFER_TIME_DEFAULT_VALUE = 500;
45 static constexpr const char *CONTENT_TYPE_DEFAULT_VALUE = "application/json; charset=utf-8";
46 static constexpr const curl_off_t REDIRECT_TIME_DEFAULT_VALUE = 0;
47 static constexpr const long REDIRECT_COUNT_DEFAULT_VALUE = 0;
48 static constexpr const long OS_ERROR_DEFAULT_VALUE = 0;
49 static constexpr const long SSL_VERIFYRESULT_DEFAULT_VALUE = 0;
50 static constexpr const curl_off_t APPCONNECT_TIME_DEFAULT_VALUE = 80000;
51 static constexpr const curl_off_t RETRY_AFTER_DEFAULT_VALUE = 0;
52 static constexpr const long PROXY_ERROR_DEFAULT_VALUE = 0;
53 static constexpr const curl_off_t QUEUE_TIME_DEFAULT_VALUE = 12000;
54 static constexpr const long CURL_CODE_DEFAULT_VALUE = 0;
55 static constexpr const long REQUEST_START_TIME_DEFAULT_VALUE = 1747359000000;
56
57 static constexpr const uint32_t UNACKED_DEFAULT_VALUE = 0;
58 static constexpr const uint32_t LAST_DATA_SENT_DEFAULT_VALUE = 1000;
59 static constexpr const uint32_t LAST_ACK_SENT_DEFAULT_VALUE = 0;
60 static constexpr const uint32_t LAST_DATA_RECV_DEFAULT_VALUE = 1000;
61 static constexpr const uint32_t LAST_ACK_RECV_DEFAULT_VALUE = 1000;
62 static constexpr const uint32_t RTT_DEFAULT_VALUE = 12000;
63 static constexpr const uint32_t RTTVAR_DEFAULT_VALUE = 4000;
64 static constexpr const uint16_t RETRANSMITS_DEFAULT_VALUE = 0;
65 static constexpr const uint32_t TOTAL_RETRANS_DEFAULT_VALUE = 0;
66 static constexpr const char *SRC_IP_DEFAULT_VALUE = "7.246.***.***";
67 static constexpr const char *DST_IP_DEFAULT_VALUE = "7.246.***.***";
68 static constexpr const uint16_t SRC_PORT_DEFAULT_VALUE = 54000;
69 static constexpr const uint16_t DST_PORT_DEFAULT_VALUE = 54000;
70
71 static constexpr const long RESPONSE_ERROR_CODE = 301;
72 static constexpr const long OS_ERROR_CODE = 1;
73 static constexpr const long PROXY_ERROR_CODE = 1;
74 static constexpr const long CURL_ERROR_CODE = 1;
75 static constexpr const curl_off_t SIZE_UPLOAD_TEST = 50000;
76 static constexpr const curl_off_t SIZE_DOWNLOAD_TEST = 50000;
77 static constexpr const curl_off_t TOTAL_TIME_TEST = 501000;
78
GetCurlHandle()79 CURL *GetCurlHandle()
80 {
81 CURL *handle = curl_easy_init();
82 curl_easy_setopt(handle, CURLOPT_URL, REQUEST_URL);
83 curl_easy_setopt(handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
84 return handle;
85 }
86 }
87
88 class NetStackChrClientTest : public testing::Test {
89 public:
SetUpTestCase()90 static void SetUpTestCase() {}
91
TearDownTestCase()92 static void TearDownTestCase() {}
93
SetUp()94 virtual void SetUp() {}
95
TearDown()96 virtual void TearDown() {}
97 };
98
FillNormalvalue(ChrClient::DataTransChrStats & chrStats)99 void FillNormalvalue(ChrClient::DataTransChrStats& chrStats)
100 {
101 chrStats.processName = PROCESS_NAME_DEFAULT_VALUE;
102
103 chrStats.httpInfo.uid = UID_DEFAULT_VALUE;
104 chrStats.httpInfo.responseCode = RESPONSE_CODE_DEFAULT_VALUE;
105 chrStats.httpInfo.totalTime = TOTAL_TIME_DEFAULT_VALUE;
106 chrStats.httpInfo.nameLookUpTime = NAME_LOOK_UP_TIME_DEFAULT_VALUE;
107 chrStats.httpInfo.connectTime = CONNECT_TIME_DEFAULT_VALUE;
108 chrStats.httpInfo.preTransferTime = PRE_TRANSFER_TIME_DEFAULT_VALUE;
109 chrStats.httpInfo.sizeUpload = SIZE_UPLOAD_DEFAULT_VALUE;
110 chrStats.httpInfo.sizeDownload = SIZE_DOWNLOAD_DEFAULT_VALUE;
111 chrStats.httpInfo.speedDownload = SPEED_DOWNLOAD_DEFAULT_VALUE;
112 chrStats.httpInfo.speedUpload = SPEED_UPLOAD_DEFAULT_VALUE;
113 chrStats.httpInfo.effectiveMethod = EFFECTIVE_METHOD_DEFAULT_VALUE;
114 chrStats.httpInfo.startTransferTime = START_TRANSFER_TIME_DEFAULT_VALUE;
115 chrStats.httpInfo.contentType = CONTENT_TYPE_DEFAULT_VALUE;
116 chrStats.httpInfo.redirectTime = REDIRECT_TIME_DEFAULT_VALUE;
117 chrStats.httpInfo.redirectCount = REDIRECT_COUNT_DEFAULT_VALUE;
118 chrStats.httpInfo.osError = OS_ERROR_DEFAULT_VALUE;
119 chrStats.httpInfo.sslVerifyResult= SSL_VERIFYRESULT_DEFAULT_VALUE;
120 chrStats.httpInfo.appconnectTime = APPCONNECT_TIME_DEFAULT_VALUE;
121 chrStats.httpInfo.retryAfter = RETRY_AFTER_DEFAULT_VALUE;
122 chrStats.httpInfo.proxyError = PROXY_ERROR_DEFAULT_VALUE;
123 chrStats.httpInfo.queueTime = QUEUE_TIME_DEFAULT_VALUE;
124 chrStats.httpInfo.curlCode = CURL_CODE_DEFAULT_VALUE;
125 chrStats.httpInfo.requestStartTime = REQUEST_START_TIME_DEFAULT_VALUE;
126
127 chrStats.tcpInfo.unacked = UNACKED_DEFAULT_VALUE;
128 chrStats.tcpInfo.lastDataSent = LAST_DATA_SENT_DEFAULT_VALUE;
129 chrStats.tcpInfo.lastAckSent = LAST_ACK_SENT_DEFAULT_VALUE;
130 chrStats.tcpInfo.lastDataRecv = LAST_DATA_RECV_DEFAULT_VALUE;
131 chrStats.tcpInfo.lastAckRecv = LAST_ACK_RECV_DEFAULT_VALUE;
132 chrStats.tcpInfo.rtt = RTT_DEFAULT_VALUE;
133 chrStats.tcpInfo.rttvar = RTTVAR_DEFAULT_VALUE;
134 chrStats.tcpInfo.retransmits = RETRANSMITS_DEFAULT_VALUE;
135 chrStats.tcpInfo.totalRetrans = TOTAL_RETRANS_DEFAULT_VALUE;
136 chrStats.tcpInfo.srcIp = SRC_IP_DEFAULT_VALUE;
137 chrStats.tcpInfo.dstIp = DST_IP_DEFAULT_VALUE;
138 chrStats.tcpInfo.srcPort = SRC_PORT_DEFAULT_VALUE;
139 chrStats.tcpInfo.dstPort = DST_PORT_DEFAULT_VALUE;
140 }
141
142 HWTEST_F(NetStackChrClientTest, NetStackChrClientTestResponseCode, TestSize.Level2)
143 {
144 CURL *handle = GetCurlHandle();
145 ChrClient::NetStackChrClient::GetInstance().GetDfxInfoFromCurlHandleAndReport(NULL, 0);
146 ChrClient::NetStackChrClient::GetInstance().GetDfxInfoFromCurlHandleAndReport(handle, 0);
147 ChrClient::DataTransChrStats dataTransChrStats{};
148 ChrClient::NetStackChrClient::GetInstance().GetHttpInfoFromCurl(handle, dataTransChrStats.httpInfo);
149 EXPECT_EQ(dataTransChrStats.httpInfo.responseCode, 0);
150 }
151
152 HWTEST_F(NetStackChrClientTest, NetStackChrClientTestPort, TestSize.Level2)
153 {
154 ChrClient::DataTransTcpInfo tcpInfo;
155 int sockfd = socket(AF_INET, SOCK_STREAM, 0);
156 if (sockfd >0) {
157 ChrClient::NetStackChrClient::GetInstance().GetTcpInfoFromSock(sockfd, tcpInfo);
158 EXPECT_EQ(tcpInfo.unacked, 0);
159 EXPECT_EQ(tcpInfo.srcPort, 0);
160 EXPECT_EQ(tcpInfo.dstPort, 0);
161 close(sockfd);
162 }
163 sockfd = socket(AF_INET6, SOCK_STREAM, 0);
164 if (sockfd > 0) {
165 ChrClient::NetStackChrClient::GetInstance().GetTcpInfoFromSock(sockfd, tcpInfo);
166 EXPECT_EQ(tcpInfo.unacked, 0);
167 EXPECT_EQ(tcpInfo.srcPort, 0);
168 EXPECT_EQ(tcpInfo.dstPort, 0);
169 close(sockfd);
170 }
171 }
172
173 HWTEST_F(NetStackChrClientTest, NetStackChrClientTestNotReport, TestSize.Level2)
174 {
175 ChrClient::NetStackChrReport netstackChrReport;
176 ChrClient::DataTransChrStats chrStats;
177 FillNormalvalue(chrStats);
178
179 int res = ChrClient::NetStackChrClient::GetInstance().ShouldReportHttpAbnormalEvent(chrStats.httpInfo);
180 EXPECT_EQ(res, -1);
181 }
182
183 HWTEST_F(NetStackChrClientTest, NetStackChrClientTestResponseCodeError, TestSize.Level2)
184 {
185 ChrClient::NetStackChrReport netstackChrReport;
186 ChrClient::DataTransChrStats chrStats;
187 FillNormalvalue(chrStats);
188
189 chrStats.httpInfo.responseCode = RESPONSE_ERROR_CODE;
190 int res = ChrClient::NetStackChrClient::GetInstance().ShouldReportHttpAbnormalEvent(chrStats.httpInfo);
191 EXPECT_EQ(res, 0);
192 }
193
194 HWTEST_F(NetStackChrClientTest, NetStackChrClientTestOSError, TestSize.Level2)
195 {
196 ChrClient::NetStackChrReport netstackChrReport;
197 ChrClient::DataTransChrStats chrStats;
198 FillNormalvalue(chrStats);
199
200 chrStats.httpInfo.osError = OS_ERROR_CODE;
201 int res = ChrClient::NetStackChrClient::GetInstance().ShouldReportHttpAbnormalEvent(chrStats.httpInfo);
202 EXPECT_EQ(res, 0);
203 }
204
205 HWTEST_F(NetStackChrClientTest, NetStackChrClientTestProxyError, TestSize.Level2)
206 {
207 ChrClient::NetStackChrReport netstackChrReport;
208 ChrClient::DataTransChrStats chrStats;
209 FillNormalvalue(chrStats);
210
211 chrStats.httpInfo.proxyError = PROXY_ERROR_CODE;
212 int res = ChrClient::NetStackChrClient::GetInstance().ShouldReportHttpAbnormalEvent(chrStats.httpInfo);
213 EXPECT_EQ(res, 0);
214 }
215
216 HWTEST_F(NetStackChrClientTest, NetStackChrClientTestCurlCodeError, TestSize.Level2)
217 {
218 ChrClient::NetStackChrReport netstackChrReport;
219 ChrClient::DataTransChrStats chrStats;
220 FillNormalvalue(chrStats);
221
222 chrStats.httpInfo.curlCode = CURL_ERROR_CODE;
223 int res = ChrClient::NetStackChrClient::GetInstance().ShouldReportHttpAbnormalEvent(chrStats.httpInfo);
224 EXPECT_EQ(res, 0);
225 }
226
227 HWTEST_F(NetStackChrClientTest, NetStackChrClientTestShortRequestButTimeout, TestSize.Level2)
228 {
229 ChrClient::NetStackChrReport netstackChrReport;
230 ChrClient::DataTransChrStats chrStats;
231 FillNormalvalue(chrStats);
232
233 chrStats.httpInfo.sizeUpload = SIZE_UPLOAD_TEST;
234 chrStats.httpInfo.sizeDownload = SIZE_DOWNLOAD_TEST;
235 chrStats.httpInfo.totalTime = TOTAL_TIME_TEST;
236 int res = ChrClient::NetStackChrClient::GetInstance().ShouldReportHttpAbnormalEvent(chrStats.httpInfo);
237 EXPECT_EQ(res, 0);
238 }
239
240 HWTEST_F(NetStackChrClientTest, NetStackChrClientTestTimeLimits, TestSize.Level2)
241 {
242 ChrClient::NetStackChrReport netstackChrReport;
243 ChrClient::DataTransChrStats chrStats;
244
245 netstackChrReport.ReportCommonEvent(chrStats);
246 int second_ret = netstackChrReport.ReportCommonEvent(chrStats);
247 EXPECT_EQ(second_ret, 1);
248 }
249 }