1 /*
2  * Copyright (c) 2023 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 #include <iostream>
17 #include <cstring>
18 #include "gtest/gtest.h"
19 #include "gmock/gmock.h"
20 #include "http_client_constant.h"
21 #include "netstack_log.h"
22 #include "netstack_common_utils.h"
23 
24 #define private public
25 #include "http_client_task.h"
26 #include "http_client.h"
27 #include "http_client_error.h"
28 #include <curl/curl.h>
29 #include "http_client_request.h"
30 #include "http_client_response.h"
31 #if HAS_NETMANAGER_BASE
32 #include "net_conn_client.h"
33 #include "network_security_config.h"
34 #endif
35 
36 using namespace OHOS::NetStack::HttpClient;
37 using namespace testing;
38 using namespace testing::ext;
39 
40 class HttpClientTaskTest : public testing::Test {
41 public:
SetUpTestCase()42     static void SetUpTestCase() {}
43 
TearDownTestCase()44     static void TearDownTestCase() {}
45 
SetUp()46     virtual void SetUp() {}
47 
TearDown()48     virtual void TearDown() {}
49 
50     void ProcesslTaskCb(std::shared_ptr<HttpClientTask> task);
51 };
52 
53 namespace {
54 using namespace std;
55 using namespace testing::ext;
56 
57 HWTEST_F(HttpClientTaskTest, GetHttpVersionTest001, TestSize.Level1)
58 {
59     HttpClientRequest httpReq;
60     std::string url = "https://www.baidu.com";
61     httpReq.SetURL(url);
62 
63     HttpSession &session = HttpSession::GetInstance();
64     auto task = session.CreateTask(httpReq);
65 
66     uint32_t httpVersionTest = task->GetHttpVersion(HttpProtocol::HTTP_NONE);
67     EXPECT_EQ(httpVersionTest, CURL_HTTP_VERSION_NONE);
68 }
69 
70 HWTEST_F(HttpClientTaskTest, GetHttpVersionTest002, TestSize.Level1)
71 {
72     HttpClientRequest httpReq;
73     std::string url = "https://www.baidu.com";
74     httpReq.SetURL(url);
75     HttpSession &session = HttpSession::GetInstance();
76     auto task = session.CreateTask(httpReq);
77 
78     uint32_t httpVersionTest = task->GetHttpVersion(HttpProtocol::HTTP1_1);
79     EXPECT_EQ(httpVersionTest, CURL_HTTP_VERSION_1_1);
80 }
81 
82 HWTEST_F(HttpClientTaskTest, GetHttpVersionTest003, TestSize.Level1)
83 {
84     HttpClientRequest httpReq;
85     std::string url = "https://www.baidu.com";
86     httpReq.SetURL(url);
87     HttpSession &session = HttpSession::GetInstance();
88     auto task = session.CreateTask(httpReq);
89 
90     uint32_t httpVersionTest = task->GetHttpVersion(HttpProtocol::HTTP2);
91     EXPECT_EQ(httpVersionTest, CURL_HTTP_VERSION_2_0);
92     httpVersionTest = task->GetHttpVersion(HttpProtocol::HTTP3);
93     EXPECT_EQ(httpVersionTest, CURL_HTTP_VERSION_3);
94 }
95 
96 HWTEST_F(HttpClientTaskTest, SetOtherCurlOptionTest001, TestSize.Level1)
97 {
98     HttpClientRequest httpReq;
99 
100     std::string url = "http://www.httpbin.org/get";
101     httpReq.SetURL(url);
102     httpReq.SetHttpProxyType(NOT_USE);
103     HttpProxy proxy;
104     proxy.host = "192.168.147.60";
105     proxy.port = 8888;
106     proxy.exclusions = "www.httpbin.org";
107     proxy.tunnel = false;
108     httpReq.SetHttpProxy(proxy);
109 
110     HttpSession &session = HttpSession::GetInstance();
111     auto task = session.CreateTask(httpReq);
112 
113     bool result = task->SetOtherCurlOption(task->curlHandle_);
114     EXPECT_TRUE(result);
115 }
116 
117 HWTEST_F(HttpClientTaskTest, SetOtherCurlOptionTest002, TestSize.Level1)
118 {
119     HttpClientRequest httpReq;
120 
121     std::string url = "http://www.httpbin.org/get";
122     httpReq.SetURL(url);
123     httpReq.SetHttpProxyType(NOT_USE);
124     HttpProxy proxy;
125     proxy.host = "192.168.147.60";
126     proxy.port = 8888;
127     proxy.tunnel = false;
128     httpReq.SetHttpProxy(proxy);
129 
130     HttpSession &session = HttpSession::GetInstance();
131     auto task = session.CreateTask(httpReq);
132 
133     EXPECT_TRUE(task->SetOtherCurlOption(task->curlHandle_));
134 }
135 
136 HWTEST_F(HttpClientTaskTest, SetOtherCurlOptionTest003, TestSize.Level1)
137 {
138     HttpClientRequest httpReq;
139 
140     std::string url = "http://www.httpbin.org/get";
141     httpReq.SetURL(url);
142     httpReq.SetHttpProxyType(NOT_USE);
143     HttpProxy proxy;
144     proxy.host = "192.168.147.60";
145     proxy.port = 8888;
146     proxy.tunnel = false;
147     httpReq.SetHttpProxy(proxy);
148 
149     HttpSession &session = HttpSession::GetInstance();
150     auto task = session.CreateTask(httpReq);
151 
152     EXPECT_TRUE(task->SetOtherCurlOption(task->curlHandle_));
153 }
154 
155 HWTEST_F(HttpClientTaskTest, SetOtherCurlOptionTest004, TestSize.Level1)
156 {
157     HttpClientRequest httpReq;
158 
159     std::string url = "http://www.httpbin.org/get";
160     httpReq.SetURL(url);
161     httpReq.SetHttpProxyType(NOT_USE);
162     HttpProxy proxy;
163     proxy.host = "192.168.147.60";
164     proxy.port = 8888;
165     proxy.exclusions = "www.httpbin.org";
166     proxy.tunnel = true;
167     httpReq.SetHttpProxy(proxy);
168 
169     HttpSession &session = HttpSession::GetInstance();
170     auto task = session.CreateTask(httpReq);
171 
172     EXPECT_TRUE(task->SetOtherCurlOption(task->curlHandle_));
173     curl_easy_cleanup(task->curlHandle_);
174     task->curlHandle_ = nullptr;
175 }
176 
177 HWTEST_F(HttpClientTaskTest, SetOtherCurlOptionTest005, TestSize.Level1)
178 {
179     HttpClientRequest httpReq;
180 
181     std::string url = "http://www.httpbin.org/get";
182     httpReq.SetURL(url);
183     httpReq.SetHttpProxyType(USE_SPECIFIED);
184     HttpProxy proxy;
185     proxy.host = "192.168.147.60";
186     proxy.port = 8888;
187     proxy.exclusions = "www.test.org";
188     proxy.tunnel = true;
189     httpReq.SetHttpProxy(proxy);
190 
191     HttpSession &session = HttpSession::GetInstance();
192     auto task = session.CreateTask(httpReq);
193     EXPECT_TRUE(task->SetOtherCurlOption(task->curlHandle_));
194     curl_easy_cleanup(task->curlHandle_);
195     task->curlHandle_ = nullptr;
196 }
197 
198 HWTEST_F(HttpClientTaskTest, SetUploadOptionsTest001, TestSize.Level1)
199 {
200     HttpClientRequest httpReq;
201     std::string url = "http://www.httpbin.org/put";
202     httpReq.SetURL(url);
203     std::string method = "PUT";
204     httpReq.SetMethod(method);
205 
206     HttpSession &session = HttpSession::GetInstance();
207     std::string filePath = "/bin/who";
208     auto task = session.CreateTask(httpReq, UPLOAD, filePath);
209 
210     EXPECT_TRUE(task->SetUploadOptions(task->curlHandle_));
211 }
212 
213 HWTEST_F(HttpClientTaskTest, SetUploadOptionsTest002, TestSize.Level1)
214 {
215     HttpClientRequest httpReq;
216     std::string url = "http://www.httpbin.org/put";
217     httpReq.SetURL(url);
218     std::string method = "PUT";
219     httpReq.SetMethod(method);
220 
221     HttpSession &session = HttpSession::GetInstance();
222     std::string filePath = "";
223     auto task = session.CreateTask(httpReq, UPLOAD, filePath);
224 
225     EXPECT_FALSE(task->SetUploadOptions(task->curlHandle_));
226 }
227 
228 HWTEST_F(HttpClientTaskTest, SetUploadOptionsTest003, TestSize.Level1)
229 {
230     HttpClientRequest httpReq;
231     std::string url = "http://www.httpbin.org/put";
232     httpReq.SetURL(url);
233     std::string method = "PUT";
234     httpReq.SetMethod(method);
235 
236     HttpSession &session = HttpSession::GetInstance();
237     std::string filePath = "unavailable";
238     auto task = session.CreateTask(httpReq, UPLOAD, filePath);
239 
240     EXPECT_FALSE(task->SetUploadOptions(task->curlHandle_));
241 }
242 
243 HWTEST_F(HttpClientTaskTest, SetCurlOptionsTest001, TestSize.Level1)
244 {
245     HttpClientRequest httpReq;
246     std::string url = "http://www.httpbin.org/get";
247     httpReq.SetURL(url);
248 
249     HttpSession &session = HttpSession::GetInstance();
250     auto task = session.CreateTask(httpReq);
251 
252     EXPECT_TRUE(task->SetCurlOptions());
253 }
254 
255 HWTEST_F(HttpClientTaskTest, SetCurlOptionsTest002, TestSize.Level1)
256 {
257     HttpClientRequest httpReq;
258     std::string url = "http://www.httpbin.org/get";
259     httpReq.SetURL(url);
260 
261     HttpSession &session = HttpSession::GetInstance();
262     auto task = session.CreateTask(httpReq);
263 
264     task->request_.SetMethod(HttpConstant::HTTP_METHOD_HEAD);
265 
266     EXPECT_TRUE(task->SetCurlOptions());
267 }
268 
269 HWTEST_F(HttpClientTaskTest, SetCurlOptionsTest003, TestSize.Level1)
270 {
271     HttpClientRequest httpReq;
272     std::string url = "http://www.httpbin.org/put";
273     httpReq.SetURL(url);
274     std::string method = "PUT";
275     httpReq.SetMethod(method);
276 
277     HttpSession &session = HttpSession::GetInstance();
278     std::string filePath = "/bin/who";
279     auto task = session.CreateTask(httpReq, UPLOAD, filePath);
280 
281     task->curlHandle_ = nullptr;
282     EXPECT_FALSE(task->SetCurlOptions());
283 }
284 
285 HWTEST_F(HttpClientTaskTest, SetCurlOptionsTest004, TestSize.Level1)
286 {
287     HttpClientRequest httpReq;
288     std::string url = "http://www.httpbin.org/get";
289     httpReq.SetURL(url);
290 
291     HttpSession &session = HttpSession::GetInstance();
292     auto task = session.CreateTask(httpReq);
293 
294     task->request_.SetMethod(HttpConstant::HTTP_METHOD_POST);
295 
296     EXPECT_TRUE(task->SetCurlOptions());
297 }
298 
299 HWTEST_F(HttpClientTaskTest, SetCurlOptionsTest005, TestSize.Level1)
300 {
301     HttpClientRequest httpReq;
302     std::string url = "http://www.httpbin.org/get";
303     httpReq.SetURL(url);
304 
305     HttpSession &session = HttpSession::GetInstance();
306     auto task = session.CreateTask(httpReq);
307 
308     task->curlHandle_ = nullptr;
309 
310     EXPECT_FALSE(task->SetCurlOptions());
311 }
312 
313 HWTEST_F(HttpClientTaskTest, SetCurlOptionsTest006, TestSize.Level1)
314 {
315     HttpClientRequest httpReq;
316     std::string url = "http://www.httpbin.org/get";
317     httpReq.SetURL(url);
318 
319     HttpSession &session = HttpSession::GetInstance();
320     auto task = session.CreateTask(httpReq);
321 
322     task->curlHandle_ = nullptr;
323     std::string headerStr = "Connection:keep-alive";
324     task->curlHeaderList_ = curl_slist_append(task->curlHeaderList_, headerStr.c_str());
325 
326     EXPECT_FALSE(task->SetCurlOptions());
327 }
328 
329 HWTEST_F(HttpClientTaskTest, GetType001, TestSize.Level1)
330 {
331     HttpClientRequest httpReq;
332     std::string url = "https://www.baidu.com";
333     httpReq.SetURL(url);
334 
335     HttpSession &session = HttpSession::GetInstance();
336     auto task = session.CreateTask(httpReq);
337 
338     EXPECT_EQ(TaskType::DEFAULT, task->GetType());
339 }
340 
341 HWTEST_F(HttpClientTaskTest, GetFilePathTest001, TestSize.Level1)
342 {
343     HttpClientRequest httpReq;
344     std::string url = "http://www.httpbin.org/put";
345     httpReq.SetURL(url);
346     std::string method = "PUT";
347     httpReq.SetMethod(method);
348 
349     HttpSession &session = HttpSession::GetInstance();
350     std::string filePath = "/bin/who";
351     auto task = session.CreateTask(httpReq, UPLOAD, filePath);
352 
353     EXPECT_EQ(task->GetFilePath(), "/bin/who");
354 }
355 HWTEST_F(HttpClientTaskTest, GetTaskIdTest001, TestSize.Level1)
356 {
357     HttpClientRequest httpReq;
358     std::string url = "http://www.httpbin.org/get";
359     httpReq.SetURL(url);
360 
361     HttpSession &session = HttpSession::GetInstance();
362     auto task = session.CreateTask(httpReq);
363 
364     unsigned int taskId = task->GetTaskId();
365     EXPECT_TRUE(taskId >= 0);
366 }
367 
368 HWTEST_F(HttpClientTaskTest, OnSuccessTest001, TestSize.Level1)
369 {
370     HttpClientRequest httpReq;
371     std::string url = "https://www.baidu.com";
372     httpReq.SetURL(url);
373 
374     HttpSession &session = HttpSession::GetInstance();
375     auto task = session.CreateTask(httpReq);
__anone15c4ce60202(const HttpClientRequest &request, const HttpClientResponse &response) 376     task->OnSuccess([task](const HttpClientRequest &request, const HttpClientResponse &response) {});
377 
378     EXPECT_TRUE(task->onSucceeded_ != nullptr);
379 }
380 
381 HWTEST_F(HttpClientTaskTest, OnCancelTest001, TestSize.Level1)
382 {
383     HttpClientRequest httpReq;
384     std::string url = "http://www.httpbin.org/get";
385     httpReq.SetURL(url);
386 
387     HttpSession &session = HttpSession::GetInstance();
388     auto task = session.CreateTask(httpReq);
389 
__anone15c4ce60302(const HttpClientRequest &request, const HttpClientResponse &response) 390     task->OnCancel([](const HttpClientRequest &request, const HttpClientResponse &response) {});
391 
392     EXPECT_TRUE(task->onCanceled_ != nullptr);
393 }
394 
395 HWTEST_F(HttpClientTaskTest, OnFailTest001, TestSize.Level1)
396 {
397     HttpClientRequest httpReq;
398     std::string url = "http://www.httpbin.org/get";
399     httpReq.SetURL(url);
400 
401     HttpSession &session = HttpSession::GetInstance();
402     auto task = session.CreateTask(httpReq);
403 
404     task->OnFail(
__anone15c4ce60402(const HttpClientRequest &request, const HttpClientResponse &response, const HttpClientError &error) 405         [](const HttpClientRequest &request, const HttpClientResponse &response, const HttpClientError &error) {});
406 
407     EXPECT_TRUE(task->onFailed_ != nullptr);
408 }
409 
410 HWTEST_F(HttpClientTaskTest, OnDataReceiveTest001, TestSize.Level1)
411 {
412     HttpClientRequest httpReq;
413     std::string url = "http://www.httpbin.org/get";
414     httpReq.SetURL(url);
415 
416     HttpSession &session = HttpSession::GetInstance();
417     auto task = session.CreateTask(httpReq);
418 
__anone15c4ce60502(const HttpClientRequest &request, const uint8_t *data, size_t length) 419     task->OnDataReceive([](const HttpClientRequest &request, const uint8_t *data, size_t length) {});
420 
421     EXPECT_TRUE(task->onDataReceive_ != nullptr);
422 }
423 
424 HWTEST_F(HttpClientTaskTest, OnProgressTest001, TestSize.Level1)
425 {
426     HttpClientRequest httpReq;
427     std::string url = "http://www.httpbin.org/get";
428     httpReq.SetURL(url);
429 
430     HttpSession &session = HttpSession::GetInstance();
431     auto task = session.CreateTask(httpReq);
432 
433     task->OnProgress(
__anone15c4ce60602(const HttpClientRequest &request, u_long dltotal, u_long dlnow, u_long ultotal, u_long ulnow) 434         [](const HttpClientRequest &request, u_long dltotal, u_long dlnow, u_long ultotal, u_long ulnow) {});
435 
436     EXPECT_TRUE(task->onProgress_ != nullptr);
437 }
438 
439 HWTEST_F(HttpClientTaskTest, DataReceiveCallbackTest001, TestSize.Level1)
440 {
441     HttpClientRequest httpReq;
442     std::string url = "https://www.baidu.com";
443     const char *data = "https://www.baidu.com";
444     httpReq.SetURL(url);
445 
446     HttpSession &session = HttpSession::GetInstance();
447     auto task = session.CreateTask(httpReq);
448 
449     auto *userData = task.get();
450     size_t size = 10;
451     size_t memBytes = 1;
452 
__anone15c4ce60702(const HttpClientRequest &request, const uint8_t *data, size_t length) 453     task->OnDataReceive([](const HttpClientRequest &request, const uint8_t *data, size_t length) {});
454     size_t result = task->DataReceiveCallback(data, size, memBytes, userData);
455 
456     EXPECT_EQ(result, size * memBytes);
457 }
458 
459 HWTEST_F(HttpClientTaskTest, DataReceiveCallbackTest002, TestSize.Level1)
460 {
461     HttpClientRequest httpReq;
462     std::string url = "https://www.baidu.com";
463     const char *data = "https://www.baidu.com";
464     httpReq.SetURL(url);
465 
466     HttpSession &session = HttpSession::GetInstance();
467     auto task = session.CreateTask(httpReq);
468 
469     auto *userData = task.get();
470     size_t size = 10;
471     size_t memBytes = 1;
472     size_t result = task->DataReceiveCallback(data, size, memBytes, userData);
473 
474     EXPECT_EQ(result, size * memBytes);
475 }
476 
477 HWTEST_F(HttpClientTaskTest, DataReceiveCallbackTest003, TestSize.Level1)
478 {
479     HttpClientRequest httpReq;
480     std::string url = "http://www.httpbin.org/get";
481     const char *data = "http://www.httpbin.org/get";
482     httpReq.SetURL(url);
483 
484     HttpSession &session = HttpSession::GetInstance();
485     auto task = session.CreateTask(httpReq);
486 
487     auto *userData = task.get();
488     size_t size = 10;
489     size_t memBytes = 1;
490     task->canceled_ = true;
491     size_t result = task->DataReceiveCallback(data, size, memBytes, userData);
492 
493     EXPECT_EQ(result, 0);
494     task->canceled_ = false;
495 }
496 
497 HWTEST_F(HttpClientTaskTest, ProgressCallbackTest001, TestSize.Level1)
498 {
499     HttpClientRequest httpReq;
500     std::string url = "https://www.baidu.com";
501     httpReq.SetURL(url);
502 
503     HttpSession &session = HttpSession::GetInstance();
504     auto task = session.CreateTask(httpReq);
505 
506     auto *userData = task.get();
507     curl_off_t dltotal = 100;
508     curl_off_t dlnow = 50;
509     curl_off_t ultotal = 200;
510     curl_off_t ulnow = 100;
511     int result;
512 
513     result = task->ProgressCallback(userData, dltotal, dlnow, ultotal, ulnow);
514     EXPECT_EQ(result, 0);
515 }
516 
517 HWTEST_F(HttpClientTaskTest, ProgressCallbackTest002, TestSize.Level1)
518 {
519     HttpClientRequest httpReq;
520     std::string url = "https://www.baidu.com";
521     httpReq.SetURL(url);
522 
523     HttpSession &session = HttpSession::GetInstance();
524     auto task = session.CreateTask(httpReq);
525 
526     auto *userData = task.get();
527     curl_off_t dltotal = 100;
528     curl_off_t dlnow = 50;
529     curl_off_t ultotal = 200;
530     curl_off_t ulnow = 100;
531     int result;
532 
533     task->Cancel();
534     result = task->ProgressCallback(userData, dltotal, dlnow, ultotal, ulnow);
535     EXPECT_EQ(result, CURLE_ABORTED_BY_CALLBACK);
536 }
537 
538 HWTEST_F(HttpClientTaskTest, ProgressCallbackTest003, TestSize.Level1)
539 {
540     HttpClientRequest httpReq;
541     std::string url = "https://www.baidu.com";
542     httpReq.SetURL(url);
543 
544     HttpSession &session = HttpSession::GetInstance();
545     auto task = session.CreateTask(httpReq);
546 
547     auto *userData = task.get();
548     curl_off_t dltotal = 100;
549     curl_off_t dlnow = 50;
550     curl_off_t ultotal = 200;
551     curl_off_t ulnow = 100;
552 
553     int result = task->ProgressCallback(userData, dltotal, dlnow, ultotal, ulnow);
554     EXPECT_EQ(result, 0);
555 }
556 
557 HWTEST_F(HttpClientTaskTest, HeaderReceiveCallbackTest001, TestSize.Level1)
558 {
559     HttpClientRequest httpReq;
560     std::string url = "https://www.baidu.com";
561     httpReq.SetURL(url);
562 
563     HttpSession &session = HttpSession::GetInstance();
564     auto task = session.CreateTask(httpReq);
565 
566     auto *userData = task.get();
567     const char *data = "Test Header";
568     size_t size = 5;
569     size_t memBytes = 2;
570     size_t result = task->HeaderReceiveCallback(data, size, memBytes, userData);
571     EXPECT_EQ(result, size * memBytes);
572 }
573 
574 HWTEST_F(HttpClientTaskTest, HeaderReceiveCallbackTest002, TestSize.Level1)
575 {
576     HttpClientRequest httpReq;
577     std::string url = "https://www.baidu.com";
578     httpReq.SetURL(url);
579 
580     HttpSession &session = HttpSession::GetInstance();
581     auto task = session.CreateTask(httpReq);
582 
583     auto *userData = task.get();
584 
585     const char *data = "Test Header";
586     size_t size = HttpConstant::MAX_DATA_LIMIT + 1;
587     size_t memBytes = 1;
588     size_t result = task->HeaderReceiveCallback(data, size, memBytes, userData);
589     EXPECT_EQ(result, 0);
590 }
591 
592 HWTEST_F(HttpClientTaskTest, HeaderReceiveCallbackTest003, TestSize.Level1)
593 {
594     HttpClientRequest httpReq;
595     std::string url = "http://www.httpbin.org/get";
596     httpReq.SetURL(url);
597 
598     HttpSession &session = HttpSession::GetInstance();
599     auto task = session.CreateTask(httpReq);
600 
601     auto *userData = task.get();
602 
603     const char *data = "Test Header";
604     size_t size = 5;
605     size_t memBytes = 2;
606     size_t result = task->HeaderReceiveCallback(data, size, memBytes, userData);
607     EXPECT_EQ(result, size * memBytes);
608 }
609 
610 HWTEST_F(HttpClientTaskTest, ProcessResponseCodeTest001, TestSize.Level1)
611 {
612     HttpClientRequest httpReq;
613     std::string url = "https://www.baidu.com";
614     httpReq.SetURL(url);
615 
616     HttpSession &session = HttpSession::GetInstance();
617     auto task = session.CreateTask(httpReq);
618     task->Start();
619 
620     while (task->GetStatus() != TaskStatus::IDLE) {
621         std::this_thread::sleep_for(std::chrono::milliseconds(100));
622     }
623     EXPECT_TRUE(task->ProcessResponseCode());
624 }
625 
626 HWTEST_F(HttpClientTaskTest, ProcessResponseTest001, TestSize.Level1)
627 {
628     HttpClientRequest httpReq;
629     std::string url = "https://www.baidu.com";
630     httpReq.SetURL(url);
631 
632     HttpSession &session = HttpSession::GetInstance();
633     auto task = session.CreateTask(httpReq);
634 
635     CURLMsg msg;
636     msg.data.result = CURLE_ABORTED_BY_CALLBACK;
__anone15c4ce60802(const HttpClientRequest &request, const HttpClientResponse &response) 637     task->OnCancel([](const HttpClientRequest &request, const HttpClientResponse &response) {});
638     task->ProcessResponse(&msg);
639     EXPECT_TRUE(task->onCanceled_);
640 
641     msg.data.result = CURLE_FAILED_INIT;
642     task->OnFail(
__anone15c4ce60902(const HttpClientRequest &request, const HttpClientResponse &response, const HttpClientError &error) 643         [](const HttpClientRequest &request, const HttpClientResponse &response, const HttpClientError &error) {});
644     task->ProcessResponse(&msg);
645     EXPECT_TRUE(task->onFailed_);
646 
647     msg.data.result = CURLE_OK;
648     task->response_.SetResponseCode(ResponseCode::NOT_MODIFIED);
__anone15c4ce60a02(const HttpClientRequest &request, const HttpClientResponse &response) 649     task->OnSuccess([task](const HttpClientRequest &request, const HttpClientResponse &response) {});
650     task->ProcessResponse(&msg);
651     EXPECT_TRUE(task->onSucceeded_);
652 
653     task->curlHandle_ = nullptr;
654     task->OnFail(
__anone15c4ce60b02(const HttpClientRequest &request, const HttpClientResponse &response, const HttpClientError &error) 655         [](const HttpClientRequest &request, const HttpClientResponse &response, const HttpClientError &error) {});
656     task->ProcessResponse(&msg);
657     EXPECT_TRUE(task->onFailed_);
658 }
659 
660 HWTEST_F(HttpClientTaskTest, SetResponseTest001, TestSize.Level1)
661 {
662     HttpClientRequest httpReq;
663     std::string url = "https://www.baidu.com";
664     httpReq.SetURL(url);
665 
666     HttpSession &session = HttpSession::GetInstance();
667     auto task = session.CreateTask(httpReq);
668 
669     HttpClientResponse resp;
670     resp.result_ = "result1";
671     task->SetResponse(resp);
672 
673     EXPECT_EQ(task->response_.result_, "result1");
674 }
675 
676 HWTEST_F(HttpClientTaskTest, GetHttpProxyInfoTest001, TestSize.Level1)
677 {
678     HttpClientRequest httpReq;
679 
680     std::string url = "http://www.httpbin.org/get";
681     httpReq.SetURL(url);
682     httpReq.SetHttpProxyType(USE_SPECIFIED);
683     HttpProxy proxy;
684     proxy.host = "192.168.147.60";
685     proxy.port = 8888;
686     proxy.exclusions = "www.httpbin.org";
687     proxy.tunnel = false;
688     httpReq.SetHttpProxy(proxy);
689 
690     HttpSession &session = HttpSession::GetInstance();
691     auto task = session.CreateTask(httpReq);
692 
693     std::string host;
694     std::string exclusions;
695     int32_t port = 0;
696     bool tunnel = false;
697     task->GetHttpProxyInfo(host, port, exclusions, tunnel);
698 
699     EXPECT_EQ(host, "192.168.147.60");
700     EXPECT_EQ(port, 8888);
701     EXPECT_EQ(exclusions, "www.httpbin.org");
702     EXPECT_FALSE(tunnel);
703 }
704 
705 HWTEST_F(HttpClientTaskTest, GetHttpProxyInfoTest002, TestSize.Level1)
706 {
707     HttpClientRequest httpReq;
708 
709     std::string url = "http://www.httpbin.org/get";
710     httpReq.SetURL(url);
711     httpReq.SetHttpProxyType(NOT_USE);
712     HttpProxy proxy;
713     proxy.host = "192.168.147.60";
714     proxy.port = 8888;
715     proxy.exclusions = "www.httpbin.org";
716     proxy.tunnel = false;
717     httpReq.SetHttpProxy(proxy);
718 
719     HttpSession &session = HttpSession::GetInstance();
720     auto task = session.CreateTask(httpReq);
721 
722     std::string host;
723     std::string  exclusions;
724     int32_t port = 0;
725     bool tunnel = false;
726     task->GetHttpProxyInfo(host, port, exclusions, tunnel);
727 
728     EXPECT_EQ(host, "");
729     EXPECT_EQ(port, 0);
730     EXPECT_EQ(exclusions, "");
731     EXPECT_FALSE(tunnel);
732 }
733 
734 HWTEST_F(HttpClientTaskTest, SetStatus001, TestSize.Level1)
735 {
736     HttpClientRequest httpReq;
737     std::string url = "http://www.httpbin.org/get";
738     httpReq.SetURL(url);
739 
740     HttpSession &session = HttpSession::GetInstance();
741     auto task = session.CreateTask(httpReq);
742 
743     task->SetStatus(RUNNING);
744     EXPECT_EQ(RUNNING, task->GetStatus());
745 }
746 
747 HWTEST_F(HttpClientTaskTest, GetStatusTest001, TestSize.Level1)
748 {
749     HttpClientRequest httpReq;
750     std::string url = "http://www.httpbin.org/get";
751     httpReq.SetURL(url);
752 
753     HttpSession &session = HttpSession::GetInstance();
754     auto task = session.CreateTask(httpReq);
755 
756     EXPECT_EQ(IDLE, task->GetStatus());
757 }
758 
759 HWTEST_F(HttpClientTaskTest, GetStatusTest002, TestSize.Level1)
760 {
761     HttpClientRequest httpReq;
762     std::string url = "https://www.baidu.com";
763     httpReq.SetURL(url);
764 
765     HttpSession &session = HttpSession::GetInstance();
766     auto task = session.CreateTask(httpReq);
767 
768     task->SetStatus(TaskStatus::RUNNING);
769 
770     EXPECT_EQ(task->GetStatus(), RUNNING);
771 }
772 
773 HWTEST_F(HttpClientTaskTest, StartTest001, TestSize.Level1)
774 {
775     HttpClientRequest httpReq;
776     std::string url = "http://www.baidu.com";
777     httpReq.SetURL(url);
778 
779     HttpSession &session = HttpSession::GetInstance();
780     auto task = session.CreateTask(httpReq);
781 
782     task->SetStatus(TaskStatus::RUNNING);
783     bool result = task->Start();
784     EXPECT_FALSE(result);
785 }
786 
787 HWTEST_F(HttpClientTaskTest, StartTest002, TestSize.Level1)
788 {
789     HttpClientRequest httpReq;
790     std::string url = "http://www.baidu.com";
791     httpReq.SetURL(url);
792 
793     HttpSession &session = HttpSession::GetInstance();
794     auto task = session.CreateTask(httpReq);
795 
796     task->error_.SetErrorCode(HttpErrorCode::HTTP_UNSUPPORTED_PROTOCOL);
797     bool result = task->Start();
798     EXPECT_FALSE(result);
799 }
800 
801 HWTEST_F(HttpClientTaskTest, CancelTest001, TestSize.Level1)
802 {
803     HttpClientRequest httpReq;
804     std::string url = "https://www.baidu.com";
805     httpReq.SetURL(url);
806 
807     HttpSession &session = HttpSession::GetInstance();
808     auto task = session.CreateTask(httpReq);
809 
810     task->Cancel();
811     EXPECT_TRUE(task->canceled_);
812 }
813 
814 HWTEST_F(HttpClientTaskTest, SetServerSSLCertOption001, TestSize.Level1)
815 {
816     HttpClientRequest httpReq;
817     std::string url = "https://www.baidu.com";
818     httpReq.SetURL(url);
819 
820     HttpSession &session = HttpSession::GetInstance();
821     auto task = session.CreateTask(httpReq);
822 
823     bool result = task->SetServerSSLCertOption(task->curlHandle_);
824     EXPECT_TRUE(result);
825 }
826 
827 #if HAS_NETMANAGER_BASE
828 HWTEST_F(HttpClientTaskTest, SetServerSSLCertOption_ShouldReturnTrue_WhenGetPinSetForHostNameReturnsZeroAndPinsIsEmpty,
829          TestSize.Level2)
830 {
831     auto configInstance = OHOS::NetManagerStandard::NetworkSecurityConfig::GetInstance();
832     OHOS::NetManagerStandard::DomainConfig config = {};
833     OHOS::NetManagerStandard::Domain domain;
834     domain.domainName_ = "https://www.example.com";
835     domain.includeSubDomains_ = false;
836     config.domains_.push_back(domain);
837     OHOS::NetManagerStandard::Pin pin;
838     pin.digestAlgorithm_ = "TEST";
839     pin.digest_ = "TEST";
840     config.pinSet_.pins_.push_back(pin);
841     configInstance.domainConfigs_.push_back(config);
842     HttpClientRequest httpReq;
843     std::string url = "https://www.example.com";
844     httpReq.SetURL(url);
845     HttpSession &session = HttpSession::GetInstance();
846     auto task = session.CreateTask(httpReq);
847     EXPECT_TRUE(task->SetServerSSLCertOption(task->curlHandle_));
848 }
849 #endif
850 
851 class MockCurl {
852 public:
853     MOCK_METHOD0(easy_init, CURL *());
854 };
855 
856 HWTEST_F(HttpClientTaskTest, HttpClientTask_ShouldNotCreate_WhenCurlInitFails, TestSize.Level0)
857 {
858     MockCurl mockCurl;
859     ON_CALL(mockCurl, easy_init).WillByDefault(Return(nullptr));
860 
861     HttpClientRequest request;
862     HttpClientTask httpClientTask(request);
863     ASSERT_EQ(httpClientTask.GetStatus(), IDLE);
864     ASSERT_EQ(httpClientTask.GetType(), DEFAULT);
865     ASSERT_EQ(httpClientTask.canceled_, false);
866 
867     HttpSession &session = HttpSession::GetInstance();
868     auto httpClientTask2 = session.CreateTask(request, UPLOAD, "testFakePath");
869     ASSERT_EQ(httpClientTask2->GetType(), UPLOAD);
870 }
871 } // namespace
872