• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }