• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "download/downloader.h"
17 #include "monitor/download_monitor.h"
18 #include "http/http_media_downloader.h"
19 #include "utils/media_cached_buffer.h"
20 #include "download/network_client/http_curl_client.h"
21 #include "gtest/gtest.h"
22 
23 using namespace std;
24 using namespace testing::ext;
25 
26 namespace OHOS {
27 namespace Media {
28 namespace Plugins {
29 namespace HttpPlugin {
30 class DownloaderUnitTest : public testing::Test {
31 public:
32     static void SetUpTestCase(void);
33     static void TearDownTestCase(void);
34     void SetUp(void);
35     void TearDown(void);
36 protected:
37     std::shared_ptr<Downloader> downloader;
38 };
39 
40 constexpr int START_POS = 10;
41 constexpr int ONE_KILO = 1024;
42 constexpr int FIR_BUFFER = 128;
43 constexpr long LIVE_CONTENT_LENGTH = 2147483646;
44 
SetUpTestCase(void)45 void DownloaderUnitTest::SetUpTestCase(void)
46 {
47 }
48 
TearDownTestCase(void)49 void DownloaderUnitTest::TearDownTestCase(void)
50 {
51 }
52 
SetUp(void)53 void DownloaderUnitTest::SetUp(void)
54 {
55     downloader = std::make_shared<Downloader>("test");
56 }
57 
TearDown(void)58 void DownloaderUnitTest::TearDown(void)
59 {
60     downloader.reset();
61 }
62 
63 HWTEST_F(DownloaderUnitTest, ClearMiddleReadFragment, TestSize.Level0)
64 {
65     CacheMediaChunkBuffer cachedMediaBuffer;
66     ASSERT_EQ(true, cachedMediaBuffer.Init(MAX_CACHE_BUFFER_SIZE, CHUNK_SIZE));
67     EXPECT_FALSE(cachedMediaBuffer.ClearMiddleReadFragment(10, 1000));
68     cachedMediaBuffer.IsReadSplit(100);
69 }
70 
71 HWTEST_F(DownloaderUnitTest, Downloader_Construct_nullptr, TestSize.Level0)
72 {
73     EXPECT_NE(downloader->client_, nullptr);
74 }
75 
76 HWTEST_F(DownloaderUnitTest, Retry_1, TestSize.Level1)
77 {
78     std::map<std::string, std::string> httpHeader;
79     RequestInfo requestInfo;
80     requestInfo.url = "http";
81     requestInfo.httpHeader = httpHeader;
82     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e80102(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 83                                   std::shared_ptr<DownloadRequest>& request) {
84     };
__anon2af147e80202(uint8_t*&& data, uint32_t&& len, bool notblock) 85     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
86         return len;
87     };
88     std::shared_ptr<DownloadRequest> Request_ =
89         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
90     EXPECT_FALSE(downloader->Retry(Request_));
91 }
92 
93 HWTEST_F(DownloaderUnitTest, Retry_2, TestSize.Level1)
94 {
95     std::map<std::string, std::string> httpHeader;
96     RequestInfo requestInfo;
97     requestInfo.url = "http";
98     requestInfo.httpHeader = httpHeader;
99     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e80302(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 100                                   std::shared_ptr<DownloadRequest>& request) {
101     };
__anon2af147e80402(uint8_t*&& data, uint32_t&& len, bool notblock) 102     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
103         return len;
104     };
105     std::shared_ptr<DownloadRequest> Request_ =
106         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
107     downloader->isAppBackground_ = true;
108     EXPECT_TRUE(downloader->Retry(Request_));
109 }
110 
111 HWTEST_F(DownloaderUnitTest, Retry_3, TestSize.Level1)
112 {
113     std::map<std::string, std::string> httpHeader;
114     RequestInfo requestInfo;
115     requestInfo.url = "http";
116     requestInfo.httpHeader = httpHeader;
117     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e80502(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 118                                   std::shared_ptr<DownloadRequest>& request) {
119     };
__anon2af147e80602(uint8_t*&& data, uint32_t&& len, bool notblock) 120     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
121         return len;
122     };
123     std::shared_ptr<DownloadRequest> Request_ =
124         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
125     downloader->isDestructor_ = true;
126     EXPECT_FALSE(downloader->Retry(Request_));
127 }
128 
129 HWTEST_F(DownloaderUnitTest, Retry_4, TestSize.Level1)
130 {
131     std::map<std::string, std::string> httpHeader;
132     RequestInfo requestInfo;
133     requestInfo.url = "http";
134     requestInfo.httpHeader = httpHeader;
135     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e80702(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 136                                   std::shared_ptr<DownloadRequest>& request) {
137     };
__anon2af147e80802(uint8_t*&& data, uint32_t&& len, bool notblock) 138     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
139         return len;
140     };
141     std::shared_ptr<DownloadRequest> Request_ =
142         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
143     downloader->isDestructor_ = false;
144     EXPECT_FALSE(downloader->Retry(Request_));
145 }
146 
147 HWTEST_F(DownloaderUnitTest, Retry_5, TestSize.Level1)
148 {
149     std::map<std::string, std::string> httpHeader;
150     RequestInfo requestInfo;
151     requestInfo.url = "http";
152     requestInfo.httpHeader = httpHeader;
153     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e80902(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 154                                   std::shared_ptr<DownloadRequest>& request) {
155     };
__anon2af147e80a02(uint8_t*&& data, uint32_t&& len, bool notblock) 156     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
157         return len;
158     };
159     std::shared_ptr<DownloadRequest> Request_ =
160         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
161     downloader->isDestructor_ = false;
162     downloader->shouldStartNextRequest = false;
163     EXPECT_TRUE(downloader->Retry(Request_));
164 }
165 
166 HWTEST_F(DownloaderUnitTest, Retry_6, TestSize.Level1)
167 {
168     std::map<std::string, std::string> httpHeader;
169     RequestInfo requestInfo;
170     requestInfo.url = "http";
171     requestInfo.httpHeader = httpHeader;
172     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e80b02(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 173                                   std::shared_ptr<DownloadRequest>& request) {
174     };
__anon2af147e80c02(uint8_t*&& data, uint32_t&& len, bool notblock) 175     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
176         return len;
177     };
178     std::shared_ptr<DownloadRequest> Request_ =
179         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
180     downloader->isDestructor_ = false;
181     downloader->shouldStartNextRequest = false;
182     downloader->currentRequest_ = std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
183     EXPECT_TRUE(downloader->Retry(Request_));
184 }
185 
TestLastCheck(CacheMediaChunkBuffer & cachedMediaBuffer)186 bool TestLastCheck(CacheMediaChunkBuffer& cachedMediaBuffer)
187 {
188     auto& fragmentCacheBuffer = cachedMediaBuffer.impl_->fragmentCacheBuffer_;
189     auto pos = fragmentCacheBuffer.begin();
190     while (pos != fragmentCacheBuffer.end()) {
191         cachedMediaBuffer.impl_->lruCache_.Delete(pos->offsetBegin);
192         cachedMediaBuffer.impl_->totalReadSize_ -= pos->totalReadSize;
193         cachedMediaBuffer.impl_->freeChunks_.splice(cachedMediaBuffer.impl_->freeChunks_.end(), pos->chunks);
194         pos = fragmentCacheBuffer.erase(pos);
195     }
196 
197     auto success = cachedMediaBuffer.impl_->Check();
198     if (!success) {
199         cachedMediaBuffer.Dump(0);
200     }
201     return success;
202 }
203 
TestCheck(CacheMediaChunkBuffer & cachedMediaBuffer)204 bool TestCheck(CacheMediaChunkBuffer& cachedMediaBuffer)
205 {
206     auto success = cachedMediaBuffer.impl_->Check();
207     if (!success) {
208         cachedMediaBuffer.Dump(0);
209     }
210     return success;
211 }
212 
213 HWTEST_F(DownloaderUnitTest, cachedMediaBuffer, TestSize.Level1)
214 {
215     CacheMediaChunkBuffer cachedMediaBuffer;
216     ASSERT_EQ(true, cachedMediaBuffer.Init(MAX_CACHE_BUFFER_SIZE, CHUNK_SIZE));
217     EXPECT_EQ(0u, cachedMediaBuffer.GetBufferSize(0));
218     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(0));
219 
220     constexpr int64_t mediaSize = ONE_KILO * ONE_KILO * 3;
221     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
222     size_t writeLen = ONE_KILO;
223     size_t* data = (size_t*)mp4Data.get();
224     for (size_t i = 0; i < mediaSize / sizeof(size_t); i++) {
225         data[i] = i;
226     }
227 
228     int64_t offset1 = 0;
229     ASSERT_EQ(writeLen, cachedMediaBuffer.Write(mp4Data.get(), offset1, writeLen));
230     EXPECT_EQ(writeLen, cachedMediaBuffer.GetBufferSize(offset1));
231     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(offset1));
232 
233     int64_t offset2 = (int64_t)writeLen * 3;
234     ASSERT_EQ(writeLen, cachedMediaBuffer.Write(mp4Data.get(), offset2, writeLen));
235     EXPECT_EQ(writeLen, cachedMediaBuffer.GetBufferSize(offset1));
236     EXPECT_EQ((size_t)offset2, cachedMediaBuffer.GetNextBufferOffset(offset1));
237     EXPECT_EQ((size_t)offset2, cachedMediaBuffer.GetNextBufferOffset(offset1 + writeLen - 3));
238 
239     cachedMediaBuffer.Dump(0);
240     EXPECT_EQ((size_t)offset2, cachedMediaBuffer.GetNextBufferOffset(offset1 + writeLen));
241     EXPECT_EQ((size_t)offset2, cachedMediaBuffer.GetNextBufferOffset(offset1 + writeLen + 1));
242     EXPECT_EQ((size_t)offset2, cachedMediaBuffer.GetNextBufferOffset(offset2 - 2));
243 
244     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(offset2));
245     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(offset2 + writeLen));
246 }
247 
248 HWTEST_F(DownloaderUnitTest, LargeOffsetSpan, TestSize.Level1)
249 {
250     CacheMediaChunkBuffer cachedMediaBuffer;
251     cachedMediaBuffer.SetIsLargeOffsetSpan(true);
252     ASSERT_EQ(false, cachedMediaBuffer.Init(0, CHUNK_SIZE));
253     ASSERT_EQ(true, cachedMediaBuffer.Init(MAX_CACHE_BUFFER_SIZE, CHUNK_SIZE));
254     ASSERT_EQ(false, cachedMediaBuffer.Init(MAX_CACHE_BUFFER_SIZE, CHUNK_SIZE));
255     ASSERT_EQ(MAX_CACHE_BUFFER_SIZE, cachedMediaBuffer.GetFreeSize());
256 
257     constexpr int64_t mediaSize = ONE_KILO * ONE_KILO * 15;
258     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
259 
260     size_t offset = 0;
261     size_t writeLen = ONE_KILO * 50;
262     uint32_t buffer[ONE_KILO * 30] = {0};
263     size_t readSize = ONE_KILO * 20;
264     for (int i = 0; i < 20; ++i) {
265         ASSERT_EQ(writeLen, cachedMediaBuffer.Write(mp4Data.get() + offset, offset, writeLen));
266         EXPECT_EQ(true, cachedMediaBuffer.Check());
267         ASSERT_EQ(readSize, cachedMediaBuffer.Read(buffer, offset, readSize));
268         offset += ONE_KILO * 100;
269     }
270     EXPECT_EQ(true, cachedMediaBuffer.Check());
271     ASSERT_EQ(0, cachedMediaBuffer.Read(buffer, offset, readSize));
272     EXPECT_EQ(false, cachedMediaBuffer.ClearChunksOfFragment(ONE_KILO * 500));
273     EXPECT_EQ(true, cachedMediaBuffer.ClearChunksOfFragment(ONE_KILO * 1133));
274     EXPECT_EQ(true, cachedMediaBuffer.ClearFragmentBeforeOffset(ONE_KILO * 1401));
275     cachedMediaBuffer.Dump(0);
276     EXPECT_EQ(false, cachedMediaBuffer.Seek(ONE_KILO * 1300));
277     EXPECT_EQ(true, cachedMediaBuffer.Seek(ONE_KILO * 1700));
278     size_t offset1 = ONE_KILO * 1560;
279     ASSERT_EQ(CHUNK_SIZE, cachedMediaBuffer.Write(mp4Data.get() + offset1, offset1, CHUNK_SIZE));
280     EXPECT_EQ(false, cachedMediaBuffer.ClearMiddleReadFragment(ONE_KILO * 1500, ONE_KILO * 1800));
281     EXPECT_EQ(true, cachedMediaBuffer.Seek(ONE_KILO * 1700));
282     ASSERT_EQ(true, TestLastCheck(cachedMediaBuffer));
283 }
284 
285 HWTEST_F(DownloaderUnitTest, HLSReadSplitChunk, TestSize.Level1)
286 {
287     std::shared_ptr<CacheMediaChunkBufferHlsImpl> cachedMediaBuffer = std::make_shared<CacheMediaChunkBufferHlsImpl>();
288     constexpr size_t totalSize = CHUNK_SIZE * 400;
289     ASSERT_EQ(true, cachedMediaBuffer->Init(totalSize, CHUNK_SIZE));
290     ASSERT_EQ(totalSize, cachedMediaBuffer->GetFreeSize());
291 
292     constexpr int64_t mediaSize = CHUNK_SIZE * 400;
293     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
294 
295     size_t offset = 0;
296     size_t writeLen = CHUNK_SIZE * 8;
297     uint32_t buffer[CHUNK_SIZE * 2] = {0};
298     size_t readSize = CHUNK_SIZE * 3;
299     for (int i = 0; i < 20; ++i) {
300         ASSERT_EQ(writeLen, cachedMediaBuffer->Write(mp4Data.get() + offset, offset, writeLen));
301         ASSERT_EQ(readSize, cachedMediaBuffer->Read(buffer, offset, readSize));
302         ASSERT_EQ(readSize, cachedMediaBuffer->Read(buffer, offset + CHUNK_SIZE * 5, readSize));
303         offset += CHUNK_SIZE * 10;
304     }
305     size_t readSize1 = CHUNK_SIZE * 2;
306     for (int i = 0; i < 20; ++i) {
307         ASSERT_EQ(writeLen, cachedMediaBuffer->Write(mp4Data.get() + offset, offset, writeLen));
308         ASSERT_EQ(readSize1, cachedMediaBuffer->Read(buffer, offset, readSize1));
309         ASSERT_EQ(readSize1, cachedMediaBuffer->Read(buffer, offset + CHUNK_SIZE * 5 + 1, readSize1));
310         offset += CHUNK_SIZE * 10;
311     }
312 
313     size_t offset1 = CHUNK_SIZE * 9;
314     size_t writeLen1 = CHUNK_SIZE;
315     ASSERT_EQ(writeLen1, cachedMediaBuffer->Write(mp4Data.get() + offset1, offset1, writeLen1));
316     EXPECT_EQ(true, cachedMediaBuffer->Check());
317 }
318 
319 HWTEST_F(DownloaderUnitTest, HLSFreeChunk, TestSize.Level1)
320 {
321     std::shared_ptr<CacheMediaChunkBufferHlsImpl> cachedMediaBuffer = std::make_shared<CacheMediaChunkBufferHlsImpl>();
322     constexpr size_t chunkSize = 512;
323     constexpr size_t totalSize = chunkSize * 200;
324     ASSERT_EQ(true, cachedMediaBuffer->Init(totalSize, chunkSize));
325     ASSERT_EQ(totalSize, cachedMediaBuffer->GetFreeSize());
326 
327     constexpr int64_t mediaSize = chunkSize * 400;
328     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
329 
330     size_t offset = 0;
331     size_t writeLen = chunkSize * 10;
332     for (int i = 0; i < 20; ++i) {
333         ASSERT_EQ(writeLen, cachedMediaBuffer->Write(mp4Data.get() + offset, offset, writeLen));
334         offset += chunkSize * 11;
335     }
336 
337     ASSERT_EQ(chunkSize, cachedMediaBuffer->Write(mp4Data.get() + offset, offset, chunkSize));
338     offset += chunkSize * 11;
339     ASSERT_EQ(0, cachedMediaBuffer->Write(mp4Data.get() + offset, offset, writeLen));
340     EXPECT_EQ(true, cachedMediaBuffer->Check());
341 }
342 
343 HWTEST_F(DownloaderUnitTest, HTTPFreeChunk0, TestSize.Level1)
344 {
345     std::shared_ptr<CacheMediaChunkBufferImpl> cachedMediaBuffer = std::make_shared<CacheMediaChunkBufferImpl>();
346     constexpr size_t chunkSize = 512;
347     constexpr size_t totalSize = chunkSize * 128;
348     ASSERT_EQ(true, cachedMediaBuffer->Init(totalSize, chunkSize));
349     ASSERT_EQ(totalSize, cachedMediaBuffer->GetFreeSize());
350 
351     constexpr int64_t mediaSize = chunkSize * 400;
352     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
353 
354     size_t offset = 0;
355     size_t writeLen = chunkSize * 10;
356     for (int i = 0; i < 20; ++i) {
357         ASSERT_EQ(writeLen, cachedMediaBuffer->Write(mp4Data.get() + offset, offset, writeLen));
358         offset += chunkSize * 11;
359     }
360 
361     size_t writeLen1 = chunkSize * 9;
362     ASSERT_EQ(writeLen1, cachedMediaBuffer->Write(mp4Data.get() + offset, offset, writeLen1));
363     offset += chunkSize * 11;
364     ASSERT_EQ(writeLen1, cachedMediaBuffer->Write(mp4Data.get() + offset, offset, writeLen1));
365     EXPECT_EQ(true, cachedMediaBuffer->Check());
366 }
367 
368 HWTEST_F(DownloaderUnitTest, HTTPFreeChunk1, TestSize.Level1)
369 {
370     std::shared_ptr<CacheMediaChunkBufferImpl> cachedMediaBuffer = std::make_shared<CacheMediaChunkBufferImpl>();
371     constexpr size_t chunkSize = 512;
372     constexpr size_t totalSize = chunkSize * 128;
373     ASSERT_EQ(true, cachedMediaBuffer->Init(totalSize, chunkSize));
374     ASSERT_EQ(totalSize, cachedMediaBuffer->GetFreeSize());
375 
376     constexpr int64_t mediaSize = chunkSize * 400;
377     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
378 
379     size_t offset = 0;
380     size_t writeLen = chunkSize * 45;
381     for (int i = 0; i < 3; ++i) {
382         ASSERT_EQ(writeLen, cachedMediaBuffer->Write(mp4Data.get() + offset, offset, writeLen));
383         offset += chunkSize * 60;
384     }
385 
386     EXPECT_EQ(true, cachedMediaBuffer->Check());
387 }
388 
389 HWTEST_F(DownloaderUnitTest, HTTPFreeChunk2, TestSize.Level1)
390 {
391     std::shared_ptr<CacheMediaChunkBufferImpl> cachedMediaBuffer = std::make_shared<CacheMediaChunkBufferImpl>();
392     constexpr size_t chunkSize = 512;
393     constexpr size_t totalSize = chunkSize * 128;
394     ASSERT_EQ(true, cachedMediaBuffer->Init(totalSize, chunkSize));
395     ASSERT_EQ(totalSize, cachedMediaBuffer->GetFreeSize());
396 
397     constexpr int64_t mediaSize = chunkSize * 400;
398     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
399 
400     size_t offset = 0;
401     size_t writeLen = chunkSize * 40;
402     uint32_t buffer[ONE_KILO * 30] = {0};
403     size_t readSize = chunkSize * 10;
404     for (int i = 0; i < 4; ++i) {
405         ASSERT_EQ(writeLen, cachedMediaBuffer->Write(mp4Data.get() + offset, offset, writeLen));
406         ASSERT_EQ(readSize, cachedMediaBuffer->Read(buffer, offset, readSize));
407         readSize += chunkSize * 10;
408         offset += chunkSize * 60;
409     }
410 
411     EXPECT_EQ(true, cachedMediaBuffer->Check());
412 }
413 
414 HWTEST_F(DownloaderUnitTest, WriteMerger, TestSize.Level1)
415 {
416     CacheMediaChunkBuffer cachedMediaBuffer;
417     ASSERT_EQ(true, cachedMediaBuffer.Init(MAX_CACHE_BUFFER_SIZE, CHUNK_SIZE));
418     EXPECT_EQ(0u, cachedMediaBuffer.GetBufferSize(0));
419 
420     constexpr int64_t mediaSize = ONE_KILO * ONE_KILO * 5;
421     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
422 
423     size_t writeLen0 = ONE_KILO * 15;
424     size_t offset0 = ONE_KILO * 10;
425     ASSERT_EQ(writeLen0, cachedMediaBuffer.Write(mp4Data.get() + offset0, offset0, writeLen0));
426     EXPECT_EQ(true, cachedMediaBuffer.Check());
427 
428     size_t writeLen1 = ONE_KILO * 10;
429     size_t offset1 = ONE_KILO * 30;
430     ASSERT_EQ(writeLen1, cachedMediaBuffer.Write(mp4Data.get() + offset1, offset1, writeLen1));
431     EXPECT_EQ(true, cachedMediaBuffer.Check());
432 
433     size_t writeLen2 = ONE_KILO * 30;
434     size_t offset2 = ONE_KILO * 5;
435     ASSERT_EQ(writeLen2, cachedMediaBuffer.Write(mp4Data.get() + offset2, offset2, writeLen2));
436     EXPECT_EQ(true, cachedMediaBuffer.Check());
437 
438     auto fragmentInfo = cachedMediaBuffer.impl_->fragmentCacheBuffer_.front();
439     ASSERT_EQ(offset2, fragmentInfo.offsetBegin);
440     ASSERT_EQ(writeLen1 + offset1 - offset2, fragmentInfo.dataLength);
441     EXPECT_EQ(true, cachedMediaBuffer.impl_->DumpAndCheckInner());
442     ASSERT_EQ(true, TestLastCheck(cachedMediaBuffer));
443 }
444 
445 HWTEST_F(DownloaderUnitTest, DeleteOtherHasReadFragmentCache, TestSize.Level1)
446 {
447     CacheMediaChunkBuffer cachedMediaBuffer;
448     uint64_t totalSize = FIR_BUFFER * ONE_KILO;
449     uint32_t chunkSize = FIR_BUFFER;
450     EXPECT_EQ(true, cachedMediaBuffer.Init(totalSize, chunkSize));
451 
452     int64_t mediaSize = ONE_KILO * 8;
453     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
454     size_t* data = (size_t*)mp4Data.get();
455     for (size_t i = 0; i < mediaSize / sizeof(size_t); i++) {
456         data[i] = i;
457     }
458 
459     size_t writeLen = FIR_BUFFER * 2;
460     int64_t offset1 = 0;
461     ASSERT_EQ(writeLen, cachedMediaBuffer.Write(mp4Data.get(), offset1, writeLen));
462     EXPECT_EQ(true, cachedMediaBuffer.Check());
463 
464     int64_t offset2 = FIR_BUFFER * 10;
465     size_t writeLen2 = FIR_BUFFER * 2;
466     ASSERT_EQ(writeLen2, cachedMediaBuffer.Write(mp4Data.get() + offset2, offset2, writeLen2));
467     EXPECT_EQ(true, cachedMediaBuffer.Check());
468 
469     int64_t offset3 = FIR_BUFFER * 15;
470     size_t writeLen3 = FIR_BUFFER * 2;
471     ASSERT_EQ(writeLen3, cachedMediaBuffer.Write(mp4Data.get() + offset3, offset3, writeLen3));
472     EXPECT_EQ(true, cachedMediaBuffer.Check());
473 
474     uint32_t buffer[ONE_KILO * 2] = {0};
475     size_t readSize = 128u;
476     ASSERT_EQ(readSize, cachedMediaBuffer.Read(buffer, offset2, readSize));
477     ASSERT_EQ(writeLen, cachedMediaBuffer.Read(buffer, offset1, writeLen));
478     EXPECT_EQ(true, cachedMediaBuffer.Check());
479 
480     int64_t offset5 = writeLen;
481     size_t writeLen5 = FIR_BUFFER * 3;
482     ASSERT_EQ(writeLen5, cachedMediaBuffer.Write(mp4Data.get() + offset5, offset5, writeLen5));
483     EXPECT_EQ(true, cachedMediaBuffer.Check());
484 
485     ASSERT_EQ(writeLen, cachedMediaBuffer.Read(buffer, offset1 + writeLen, writeLen));
486     EXPECT_EQ(true, cachedMediaBuffer.Check());
487 
488     int64_t offset7 = writeLen5 + offset5;
489     size_t writeLen7 = FIR_BUFFER;
490     ASSERT_EQ(writeLen7, cachedMediaBuffer.Write(mp4Data.get() + offset7, offset7, writeLen7));
491     EXPECT_EQ(true, cachedMediaBuffer.Check());
492 }
493 
494 HWTEST_F(DownloaderUnitTest, ReadSplitChunk_0, TestSize.Level1)
495 {
496     CacheMediaChunkBuffer cachedMediaBuffer;
497     constexpr uint32_t chunkNum = 2 * 15 * 100;
498     constexpr uint32_t chunKSizePer = 512;
499     uint64_t totalSize = chunKSizePer * chunkNum;
500     uint32_t chunkSize = chunKSizePer;
501     ASSERT_EQ(true, cachedMediaBuffer.Init(totalSize, chunkSize));
502     EXPECT_EQ(0u, cachedMediaBuffer.GetBufferSize(0));
503     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(0));
504     constexpr int64_t mediaSize = ONE_KILO * (chunkNum + 1);
505     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
506     size_t writeLen1 = chunKSizePer * 20 + 8;
507     int64_t offset1 = 0;
508     ASSERT_EQ(writeLen1, cachedMediaBuffer.Write(mp4Data.get(), offset1, writeLen1));
509     EXPECT_EQ(writeLen1, cachedMediaBuffer.GetBufferSize(offset1));
510     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(offset1));
511     auto fragmentInfo = cachedMediaBuffer.impl_->fragmentCacheBuffer_.front();
512     EXPECT_EQ(0, fragmentInfo.chunks.front()->offset);
513     size_t readLen2 = chunkSize - 8;
514     char buffer[chunKSizePer * chunkNum] = {0};
515     EXPECT_EQ(readLen2, cachedMediaBuffer.Read(buffer, offset1, readLen2));
516     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset1, readLen2));
517     cachedMediaBuffer.Dump(0);
518     int64_t chunkOffsetReadBegin = 16;
519     size_t readLen3 = 512 + 8;
520     int64_t offset3 = chunKSizePer * 2 * 6 + chunkOffsetReadBegin;
521     EXPECT_EQ(true, cachedMediaBuffer.Seek(offset3));
522     EXPECT_EQ(readLen3, cachedMediaBuffer.Read(buffer, offset3, readLen3));
523     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset3, readLen3));
524 
525     fragmentInfo = cachedMediaBuffer.impl_->fragmentCacheBuffer_.front();
526     EXPECT_EQ(offset1 + (int64_t)readLen2, fragmentInfo.accessLength);
527     EXPECT_EQ((int64_t)readLen2, fragmentInfo.accessLength);
528     EXPECT_EQ(0, fragmentInfo.offsetBegin);
529     EXPECT_EQ(offset3, fragmentInfo.dataLength); // changed
530     EXPECT_EQ(*fragmentInfo.chunks.begin(), *fragmentInfo.accessPos);
531 
532     fragmentInfo = cachedMediaBuffer.impl_->fragmentCacheBuffer_.back();
533     EXPECT_EQ((int64_t)readLen3, fragmentInfo.accessLength);
534     EXPECT_EQ(offset3, fragmentInfo.offsetBegin);
535     EXPECT_EQ((int64_t)writeLen1 - offset3, fragmentInfo.dataLength); // changed
536     EXPECT_EQ(*std::next(fragmentInfo.chunks.begin()), *fragmentInfo.accessPos);
537     cachedMediaBuffer.Dump(0);
538     ASSERT_EQ(true, TestCheck(cachedMediaBuffer));
539 
540     EXPECT_EQ((size_t)offset3, cachedMediaBuffer.Read(buffer, offset1, (size_t)offset3));
541     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset1, (size_t)offset3));
542 
543     EXPECT_EQ(writeLen1 - (size_t)offset3, cachedMediaBuffer.Read(buffer, offset3, writeLen1 - (size_t)offset3));
544     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset3, writeLen1 - (size_t)offset3));
545     ASSERT_EQ(true, TestLastCheck(cachedMediaBuffer));
546 }
547 
548 HWTEST_F(DownloaderUnitTest, ReadSplitChunk_1, TestSize.Level1)
549 {
550     CacheMediaChunkBuffer cachedMediaBuffer;
551     constexpr uint32_t chunkNum = 2 * 15 * 100;
552     constexpr uint32_t chunKSizePer = 512;
553     uint64_t totalSize = chunKSizePer * chunkNum;
554     uint32_t chunkSize = chunKSizePer;
555     ASSERT_EQ(true, cachedMediaBuffer.Init(totalSize, chunkSize));
556     EXPECT_EQ(0u, cachedMediaBuffer.GetBufferSize(0));
557     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(0));
558 
559     constexpr int64_t mediaSize = ONE_KILO * (chunkNum + 1);
560     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
561     size_t writeLen1 = chunKSizePer * 20 + 8;
562     int64_t offset1 = 0;
563     ASSERT_EQ(writeLen1, cachedMediaBuffer.Write(mp4Data.get(), offset1, writeLen1));
564     EXPECT_EQ(writeLen1, cachedMediaBuffer.GetBufferSize(offset1));
565     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(offset1));
566     auto fragmentInfo = cachedMediaBuffer.impl_->fragmentCacheBuffer_.front();
567     EXPECT_EQ(0, fragmentInfo.chunks.front()->offset);
568 
569     size_t readLen2 = chunkSize - 8;
570     char buffer[chunKSizePer * chunkNum] = {0};
571     EXPECT_EQ(readLen2, cachedMediaBuffer.Read(buffer, offset1, readLen2));
572 
573     cachedMediaBuffer.Dump(0);
574 
575     int64_t chunkOffsetReadBegin = 0;
576     size_t readLen3 = 512 + 8;
577     int64_t offset3 = chunKSizePer * 2 * 6 + chunkOffsetReadBegin;
578     EXPECT_EQ(true, cachedMediaBuffer.Seek(offset3));
579     EXPECT_EQ(readLen3, cachedMediaBuffer.Read(buffer, offset3, readLen3));
580     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset3, readLen3));
581 
582     fragmentInfo = cachedMediaBuffer.impl_->fragmentCacheBuffer_.front();
583     EXPECT_EQ(offset1 + (int64_t)readLen2, fragmentInfo.accessLength);
584     EXPECT_EQ((int64_t)readLen2, fragmentInfo.accessLength);
585     EXPECT_EQ(0, fragmentInfo.offsetBegin);
586     EXPECT_EQ(offset3, fragmentInfo.dataLength);
587     EXPECT_EQ(*fragmentInfo.chunks.begin(), *fragmentInfo.accessPos);
588 
589     fragmentInfo = cachedMediaBuffer.impl_->fragmentCacheBuffer_.back();
590     EXPECT_EQ((int64_t)readLen3, fragmentInfo.accessLength);
591     EXPECT_EQ(offset3, fragmentInfo.offsetBegin);
592     EXPECT_EQ((int64_t)writeLen1 - offset3, fragmentInfo.dataLength);
593     EXPECT_EQ(*std::next(fragmentInfo.chunks.begin()), *fragmentInfo.accessPos);
594     cachedMediaBuffer.Dump(0);
595     ASSERT_EQ(true, TestCheck(cachedMediaBuffer));
596 
597     EXPECT_EQ((size_t)offset3, cachedMediaBuffer.Read(buffer, offset1, (size_t)offset3));
598     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset1, (size_t)offset3));
599 
600     EXPECT_EQ(writeLen1 - (size_t)offset3, cachedMediaBuffer.Read(buffer, offset3, writeLen1 - (size_t)offset3));
601     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset3, writeLen1 - (size_t)offset3));
602     ASSERT_EQ(true, TestLastCheck(cachedMediaBuffer));
603 }
604 
605 HWTEST_F(DownloaderUnitTest, ReadSplitChunk_2, TestSize.Level1)
606 {
607     CacheMediaChunkBuffer cachedMediaBuffer;
608     constexpr uint32_t chunkNum = 2 * 15 * 100;
609     constexpr uint32_t chunKSizePer = 512;
610     uint64_t totalSize = chunKSizePer * chunkNum;
611     uint32_t chunkSize = chunKSizePer;
612     ASSERT_EQ(true, cachedMediaBuffer.Init(totalSize, chunkSize));
613     EXPECT_EQ(0u, cachedMediaBuffer.GetBufferSize(0));
614     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(0));
615 
616     constexpr int64_t mediaSize = ONE_KILO * (chunkNum + 1);
617     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
618 
619     size_t writeLen1 = chunKSizePer * 20 + 8;
620     int64_t offset1 = 0;
621     ASSERT_EQ(writeLen1, cachedMediaBuffer.Write(mp4Data.get(), offset1, writeLen1));
622     EXPECT_EQ(writeLen1, cachedMediaBuffer.GetBufferSize(offset1));
623     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(offset1));
624     auto fragmentInfo = cachedMediaBuffer.impl_->fragmentCacheBuffer_.front();
625     EXPECT_EQ(0, fragmentInfo.chunks.front()->offset);
626 
627 
628     size_t writeLen2 = 10;
629     int64_t wrOffset2 = chunKSizePer * 25 + 8;
630     ASSERT_EQ(writeLen2, cachedMediaBuffer.Write(mp4Data.get(), wrOffset2, writeLen2));
631 
632     size_t readLen2 = chunkSize - 8;
633     char buffer[chunKSizePer * chunkNum] = {0};
634     EXPECT_EQ(readLen2, cachedMediaBuffer.Read(buffer, offset1, readLen2));
635     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset1, readLen2));
636 
637     cachedMediaBuffer.Dump(0);
638 
639     int64_t chunkOffsetReadBegin = 0;
640     size_t readLen3 = 512 + 8;
641     int64_t offset3 = chunKSizePer * 2 * 6 + chunkOffsetReadBegin;
642     EXPECT_EQ(true, cachedMediaBuffer.Seek(offset3));
643     EXPECT_EQ(readLen3, cachedMediaBuffer.Read(buffer, offset3, readLen3));
644     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset3, readLen3));
645 
646     fragmentInfo = cachedMediaBuffer.impl_->fragmentCacheBuffer_.front();
647     EXPECT_EQ(offset1 + (int64_t)readLen2, fragmentInfo.accessLength);
648     EXPECT_EQ((int64_t)readLen2, fragmentInfo.accessLength);
649     EXPECT_EQ(0, fragmentInfo.offsetBegin);
650     EXPECT_EQ(offset3, fragmentInfo.dataLength);
651     EXPECT_EQ(*fragmentInfo.chunks.begin(), *fragmentInfo.accessPos);
652 
653     fragmentInfo = *std::next(cachedMediaBuffer.impl_->fragmentCacheBuffer_.begin()) ;
654     EXPECT_EQ((int64_t)readLen3, fragmentInfo.accessLength);
655     EXPECT_EQ(offset3, fragmentInfo.offsetBegin);
656     EXPECT_EQ((int64_t)writeLen1 - offset3, fragmentInfo.dataLength);
657     EXPECT_EQ(*std::next(fragmentInfo.chunks.begin()), *fragmentInfo.accessPos);
658     cachedMediaBuffer.Dump(0);
659     ASSERT_EQ(true, TestCheck(cachedMediaBuffer));
660 
661     EXPECT_EQ((size_t)offset3, cachedMediaBuffer.Read(buffer, offset1, (size_t)offset3));
662     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset1, (size_t)offset3));
663 
664     EXPECT_EQ(writeLen1 - (size_t)offset3, cachedMediaBuffer.Read(buffer, offset3, writeLen1 - (size_t)offset3));
665     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset3, writeLen1 - (size_t)offset3));
666 }
667 
668 HWTEST_F(DownloaderUnitTest, ReadSplitChunk_3, TestSize.Level1)
669 {
670     CacheMediaChunkBuffer cachedMediaBuffer;
671     constexpr uint32_t chunkNum = 2 * 15 * 100;
672     constexpr uint32_t chunKSizePer = 512;
673     uint64_t totalSize = chunKSizePer * chunkNum;
674     uint32_t chunkSize = chunKSizePer;
675     ASSERT_EQ(true, cachedMediaBuffer.Init(totalSize, chunkSize));
676     EXPECT_EQ(0u, cachedMediaBuffer.GetBufferSize(0));
677     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(0));
678 
679     constexpr int64_t mediaSize = ONE_KILO * (chunkNum + 1);
680     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
681 
682     size_t writeLen1 = chunKSizePer * 20 + 8;
683     int64_t offset1 = chunKSizePer + 8;
684     ASSERT_EQ(writeLen1, cachedMediaBuffer.Write(mp4Data.get() + offset1, offset1, writeLen1));
685     EXPECT_EQ(writeLen1, cachedMediaBuffer.GetBufferSize(offset1));
686     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(offset1));
687     auto fragmentInfo = cachedMediaBuffer.impl_->fragmentCacheBuffer_.front();
688     EXPECT_EQ(offset1, fragmentInfo.chunks.front()->offset);
689 
690     size_t writeLen2 = 10;
691     int64_t wrOffset2 = 0;
692     ASSERT_EQ(writeLen2, cachedMediaBuffer.Write(mp4Data.get(), wrOffset2, writeLen2));
693 
694     size_t readLen2 = chunkSize - 8;
695     char buffer[chunKSizePer * chunkNum] = {0};
696     EXPECT_EQ(readLen2, cachedMediaBuffer.Read(buffer, offset1, readLen2));
697     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset1, readLen2));
698 
699     cachedMediaBuffer.Dump(0);
700 
701     int64_t chunkOffsetReadBegin = 0;
702     size_t readLen3 = 512 + 8;
703     int64_t offset3 = chunKSizePer * 2 * 6 + chunkOffsetReadBegin;
704     EXPECT_EQ(true, cachedMediaBuffer.Seek(offset3));
705     EXPECT_EQ(readLen3, cachedMediaBuffer.Read(buffer, offset3, readLen3));
706     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset3, readLen3));
707     cachedMediaBuffer.Dump(0);
708     EXPECT_EQ(writeLen1, cachedMediaBuffer.GetBufferSize(offset1));
709     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(offset1));
710 
711     fragmentInfo = cachedMediaBuffer.impl_->fragmentCacheBuffer_.back();
712     EXPECT_EQ((int64_t)readLen3, fragmentInfo.accessLength);
713     EXPECT_EQ(offset3, fragmentInfo.offsetBegin);
714     int64_t splitFirstLeftLenght = offset3 - offset1;
715     EXPECT_EQ((int64_t)writeLen1 - splitFirstLeftLenght, fragmentInfo.dataLength);
716     cachedMediaBuffer.Dump(0);
717 
718     ASSERT_EQ(true, TestCheck(cachedMediaBuffer));
719 
720     EXPECT_EQ((size_t)splitFirstLeftLenght, cachedMediaBuffer.Read(buffer, offset1, (size_t)splitFirstLeftLenght));
721     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset1, (size_t)splitFirstLeftLenght));
722 
723     EXPECT_GT(writeLen1, (size_t)splitFirstLeftLenght);
724     EXPECT_EQ(writeLen1, cachedMediaBuffer.Read(buffer, offset1, writeLen1));
725     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset1, writeLen1));
726 
727     EXPECT_EQ(writeLen1 - (size_t)offset3, cachedMediaBuffer.Read(buffer, offset3, writeLen1 - (size_t)offset3));
728     EXPECT_EQ(0, memcmp(buffer, mp4Data.get() + offset3, writeLen1 - (size_t)offset3));
729 }
730 
731 HWTEST_F(DownloaderUnitTest, ReadSplitChunk_4, TestSize.Level1)
732 {
733     CacheMediaChunkBuffer cachedMediaBuffer;
734     constexpr uint32_t chunkNum = 2 * 15 * 100;
735     constexpr uint32_t chunKSizePer = 512;
736     uint64_t totalSize = chunKSizePer * chunkNum;
737     uint32_t chunkSize = chunKSizePer;
738     ASSERT_EQ(true, cachedMediaBuffer.Init(totalSize, chunkSize));
739     EXPECT_EQ(0u, cachedMediaBuffer.GetBufferSize(0));
740     EXPECT_EQ(0u, cachedMediaBuffer.GetNextBufferOffset(0));
741 
742     constexpr int64_t mediaSize = ONE_KILO * (chunkNum + 1);
743     std::unique_ptr<uint8_t[]> mp4Data = std::make_unique<uint8_t[]>(mediaSize);
744     size_t* data = (size_t*) mp4Data.get();
745     for (size_t i = 0; i < mediaSize / sizeof(size_t); ++i) {
746         data[i] = i;
747     }
748 
749     for (uint32_t i = 0; i < 20; ++i) {
750         size_t writeLen1 = chunKSizePer - 16;
751         int64_t offset1 = chunKSizePer * i + 8 ;
752         ASSERT_EQ(writeLen1, cachedMediaBuffer.Write(mp4Data.get() + offset1, offset1, writeLen1));
753     }
754 
755     for (uint32_t i = 0; i < 30; ++i) {
756         size_t writeLen1 = chunKSizePer - 8;
757         int64_t offset1 = chunKSizePer * i + 8 ;
758         ASSERT_EQ(writeLen1, cachedMediaBuffer.Write(mp4Data.get() + offset1, offset1, writeLen1));
759     }
760     cachedMediaBuffer.Clear();
761     ASSERT_EQ(true, TestLastCheck(cachedMediaBuffer));
762 }
763 
764 HWTEST_F(DownloaderUnitTest, StopBufferring_1, TestSize.Level1)
765 {
766     downloader->StopBufferring();
767     EXPECT_NE(downloader->client_, nullptr);
768 }
769 
770 HWTEST_F(DownloaderUnitTest, StopBufferring_2, TestSize.Level1)
771 {
772     downloader->task_ = std::make_shared<Task>(std::string("OS_Downloader"));
773     std::map<std::string, std::string> httpHeader;
774     RequestInfo requestInfo;
775     requestInfo.url = "http";
776     requestInfo.httpHeader = httpHeader;
777     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e80d02(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 778                                   std::shared_ptr<DownloadRequest>& request) {
779     };
__anon2af147e80e02(uint8_t*&& data, uint32_t&& len, bool notblock) 780     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
781         return len;
782     };
783     downloader->currentRequest_ = std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
784     downloader->isAppBackground_ = true;
785     downloader->StopBufferring();
786     EXPECT_EQ(downloader->client_, nullptr);
787 }
788 
789 HWTEST_F(DownloaderUnitTest, StopBufferring_3, TestSize.Level1)
790 {
791     downloader->task_ = std::make_shared<Task>(std::string("OS_Downloader"));
792     std::map<std::string, std::string> httpHeader;
793     RequestInfo requestInfo;
794     requestInfo.url = "http";
795     requestInfo.httpHeader = httpHeader;
796     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e80f02(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 797                                   std::shared_ptr<DownloadRequest>& request) {
798     };
__anon2af147e81002(uint8_t*&& data, uint32_t&& len, bool notblock) 799     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
800         return len;
801     };
802     downloader->currentRequest_ = std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
803     downloader->isAppBackground_ = false;
804     downloader->StopBufferring();
805     EXPECT_NE(downloader->client_, nullptr);
806 }
807 
808 HWTEST_F(DownloaderUnitTest, StopBufferring_4, TestSize.Level1)
809 {
810     std::map<std::string, std::string> httpHeader;
811     RequestInfo requestInfo;
812     requestInfo.url = "http";
813     requestInfo.httpHeader = httpHeader;
814     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e81102(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 815                                   std::shared_ptr<DownloadRequest>& request) {
816     };
__anon2af147e81202(uint8_t*&& data, uint32_t&& len, bool notblock) 817     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
818         return len;
819     };
820     downloader->currentRequest_ = std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
821     downloader->isAppBackground_ = false;
822     downloader->StopBufferring();
823     EXPECT_NE(downloader->client_, nullptr);
824 }
825 
826 HWTEST_F(DownloaderUnitTest, StopBufferring_5, TestSize.Level1)
827 {
828     downloader->task_ = std::make_shared<Task>(std::string("OS_Downloader"));
829     std::map<std::string, std::string> httpHeader;
830     RequestInfo requestInfo;
831     requestInfo.url = "http";
832     requestInfo.httpHeader = httpHeader;
833     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e81302(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 834                                   std::shared_ptr<DownloadRequest>& request) {
835     };
__anon2af147e81402(uint8_t*&& data, uint32_t&& len, bool notblock) 836     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
837         return len;
838     };
839     downloader->currentRequest_ = std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
840     downloader->currentRequest_->startPos_ = START_POS;
841     downloader->isAppBackground_ = false;
842     downloader->shouldStartNextRequest = false;
843     downloader->StopBufferring();
844     EXPECT_NE(downloader->client_, nullptr);
845 }
846 
847 HWTEST_F(DownloaderUnitTest, StopBufferring_6, TestSize.Level1)
848 {
849     downloader->task_ = std::make_shared<Task>(std::string("OS_Downloader"));
850     std::map<std::string, std::string> httpHeader;
851     RequestInfo requestInfo;
852     requestInfo.url = "http";
853     requestInfo.httpHeader = httpHeader;
854     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e81502(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 855                                   std::shared_ptr<DownloadRequest>& request) {
856     };
__anon2af147e81602(uint8_t*&& data, uint32_t&& len, bool notblock) 857     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
858         return len;
859     };
860     downloader->currentRequest_ = std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
861     downloader->isAppBackground_ = false;
862     downloader->shouldStartNextRequest = false;
863     downloader->StopBufferring();
864     EXPECT_NE(downloader->client_, nullptr);
865 }
866 
867 HWTEST_F(DownloaderUnitTest, ToString_EmptyList, TestSize.Level1)
868 {
869     list<string> lists;
870     string result = ToString(lists);
871     EXPECT_EQ(result, "");
872 }
873 
874 HWTEST_F(DownloaderUnitTest, ToString_NoEmptyList, TestSize.Level1)
875 {
876     list<string> lists = {"Hello", "World"};
877     string result = ToString(lists);
878     EXPECT_EQ(result, "Hello,World");
879 }
880 
881 HWTEST_F(DownloaderUnitTest, InsertCharBefore_Test1, TestSize.Level1)
882 {
883     string input = "hello world";
884     char from = 'x';
885     char preChar = 'y';
886     char nextChar = 'z';
887     string expected = "hello world";
888     string actual = InsertCharBefore(input, from, preChar, nextChar);
889     EXPECT_EQ(expected, actual);
890 }
891 
892 HWTEST_F(DownloaderUnitTest, InsertCharBefore_Test2, TestSize.Level1)
893 {
894     string input = "hello world";
895     char from = 'l';
896     char preChar = 'y';
897     char nextChar = 'o';
898     string expected = "heyllo woryld";
899     string actual = InsertCharBefore(input, from, preChar, nextChar);
900     EXPECT_EQ(expected, actual);
901 }
902 
903 HWTEST_F(DownloaderUnitTest, InsertCharBefore_Test3, TestSize.Level1)
904 {
905     string input = "hello world";
906     char from = 'l';
907     char preChar = 'y';
908     char nextChar = 'l';
909     string expected = "hello woryld";
910     string actual = InsertCharBefore(input, from, preChar, nextChar);
911     EXPECT_EQ(expected, actual);
912 }
913 
914 HWTEST_F(DownloaderUnitTest, Trim_EmptyString, TestSize.Level1)
915 {
916     string input = "";
917     string expected = "";
918     EXPECT_EQ(Trim(input), expected);
919 }
920 
921 HWTEST_F(DownloaderUnitTest, Trim_LeadingSpaces, TestSize.Level1)
922 {
923     string input = "   Hello";
924     string expected = "Hello";
925     EXPECT_EQ(Trim(input), expected);
926 }
927 
928 HWTEST_F(DownloaderUnitTest, Trim_TrailingSpaces, TestSize.Level1)
929 {
930     string input = "Hello   ";
931     string expected = "Hello";
932     EXPECT_EQ(Trim(input), expected);
933 }
934 
935 HWTEST_F(DownloaderUnitTest, Trim_LeadingAndTrailingSpaces, TestSize.Level1)
936 {
937     string input = "  Hello   ";
938     string expected = "Hello";
939     EXPECT_EQ(Trim(input), expected);
940 }
941 
942 HWTEST_F(DownloaderUnitTest, Trim_NoSpaces, TestSize.Level1)
943 {
944     string input = "Hello";
945     string expected = "Hello";
946     EXPECT_EQ(Trim(input), expected);
947 }
948 
949 HWTEST_F(DownloaderUnitTest, IsRegexValid_Test1, TestSize.Level1)
950 {
951     string regex = "";
952     bool result = IsRegexValid(regex);
953     EXPECT_EQ(result, false);
954 }
955 
956 HWTEST_F(DownloaderUnitTest, IsRegexValid_Test2, TestSize.Level1)
957 {
958     string regex = "!@#$%^&*()";
959     bool result = IsRegexValid(regex);
960     EXPECT_EQ(result, false);
961 }
962 
963 HWTEST_F(DownloaderUnitTest, IsRegexValid_Test3, TestSize.Level1)
964 {
965     string regex = "abc123";
966     bool result = IsRegexValid(regex);
967     EXPECT_EQ(result, true);
968 }
969 
970 HWTEST_F(DownloaderUnitTest, ReplaceCharacters_01, TestSize.Level1)
971 {
972     string input = "";
973     string output = ReplaceCharacters(input);
974     EXPECT_EQ(output, "");
975 }
976 
977 HWTEST_F(DownloaderUnitTest, ReplaceCharacters_02, TestSize.Level1)
978 {
979     string input = "abc";
980     string output = ReplaceCharacters(input);
981     EXPECT_EQ(output, "abc");
982 }
983 
984 HWTEST_F(DownloaderUnitTest, ReplaceCharacters_03, TestSize.Level1)
985 {
986     string input = "a.b.c";
987     string output = ReplaceCharacters(input);
988     EXPECT_EQ(output, "a\\.b\\.c");
989 }
990 
991 HWTEST_F(DownloaderUnitTest, ReplaceCharacters_04, TestSize.Level1)
992 {
993     string input = "a\\b\\c";
994     string output = ReplaceCharacters(input);
995     EXPECT_EQ(output, "a\\b\\c");
996 }
997 
998 HWTEST_F(DownloaderUnitTest, ReplaceCharacters_05, TestSize.Level1)
999 {
1000     string input = "a\\b.c";
1001     string output = ReplaceCharacters(input);
1002     EXPECT_EQ(output, "a\\b\\.c");
1003 }
1004 
1005 HWTEST_F(DownloaderUnitTest, IsMatch_01, TestSize.Level1)
1006 {
1007     string str = "test";
1008     string patternStr = "";
1009     bool result = IsMatch(str, patternStr);
1010     EXPECT_FALSE(result);
1011 }
1012 
1013 HWTEST_F(DownloaderUnitTest, IsMatch_02, TestSize.Level1)
1014 {
1015     string str = "test";
1016     string patternStr = "*";
1017     bool result = IsMatch(str, patternStr);
1018     EXPECT_TRUE(result);
1019 }
1020 
1021 HWTEST_F(DownloaderUnitTest, IsMatch_03, TestSize.Level1)
1022 {
1023     string str = "test";
1024     string patternStr = "test";
1025     bool result = IsMatch(str, patternStr);
1026     EXPECT_TRUE(result);
1027 }
1028 
1029 HWTEST_F(DownloaderUnitTest, IsMatch_04, TestSize.Level1)
1030 {
1031     string str = "test";
1032     string patternStr = "t.*";
1033     bool result = IsMatch(str, patternStr);
1034     EXPECT_FALSE(result);
1035 }
1036 
1037 HWTEST_F(DownloaderUnitTest, IsMatch_05, TestSize.Level1)
1038 {
1039     string str = "test";
1040     string patternStr = "e.*";
1041     bool result = IsMatch(str, patternStr);
1042     EXPECT_FALSE(result);
1043 }
1044 
1045 HWTEST_F(DownloaderUnitTest, IsExcluded_01, TestSize.Level1)
1046 {
1047     string str = "test";
1048     string exclusions = "";
1049     string split = ",";
1050     EXPECT_FALSE(IsExcluded(str, exclusions, split));
1051 }
1052 
1053 HWTEST_F(DownloaderUnitTest, IsExcluded_02, TestSize.Level1)
1054 {
1055     string str = "test";
1056     string exclusions = "test,example";
1057     string split = ",";
1058     EXPECT_TRUE(IsExcluded(str, exclusions, split));
1059 }
1060 
1061 HWTEST_F(DownloaderUnitTest, IsExcluded_03, TestSize.Level1)
1062 {
1063     string str = "test";
1064     string exclusions = "example,sample";
1065     string split = ",";
1066     EXPECT_FALSE(IsExcluded(str, exclusions, split));
1067 }
1068 
1069 HWTEST_F(DownloaderUnitTest, IsExcluded_04, TestSize.Level1)
1070 {
1071     string str = "test";
1072     string exclusions = "example";
1073     string split = ",";
1074     EXPECT_FALSE(IsExcluded(str, exclusions, split));
1075 }
1076 
1077 HWTEST_F(DownloaderUnitTest, HandleRetErrorCode001, TestSize.Level1)
1078 {
1079     downloader->task_ = std::make_shared<Task>(std::string("OS_Downloader"));
1080     std::map<std::string, std::string> httpHeader;
1081     RequestInfo requestInfo;
1082     requestInfo.url = "http";
1083     requestInfo.httpHeader = httpHeader;
1084     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e81702(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1085                                   std::shared_ptr<DownloadRequest>& request) {
1086     };
__anon2af147e81802(uint8_t*&& data, uint32_t&& len, bool notblock) 1087     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1088         return len;
1089     };
1090     downloader->currentRequest_ = std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1091     downloader->currentRequest_->serverError_ = 500;
1092     downloader->HandleRetErrorCode();
1093     EXPECT_NE(downloader->client_, nullptr);
1094 }
1095 HWTEST_F(DownloaderUnitTest, IsChunkedInterrupt, TestSize.Level1)
1096 {
1097     std::map<std::string, std::string> httpHeader;
1098     RequestInfo requestInfo;
1099     requestInfo.url = "http";
1100     requestInfo.httpHeader = httpHeader;
1101     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e81902(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1102                                   std::shared_ptr<DownloadRequest>& request) {
1103     };
__anon2af147e81a02(uint8_t*&& data, uint32_t&& len, bool notblock) 1104     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1105         return len;
1106     };
1107     std::shared_ptr<DownloadRequest> Request_ =
1108         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1109 
1110     bool isInterruptNeeded = true;
1111     EXPECT_EQ(Request_->IsChunked(isInterruptNeeded), Seekable::INVALID);
1112 }
1113 
1114 HWTEST_F(DownloaderUnitTest, IsChunkedIsChunk, TestSize.Level1)
1115 {
1116     std::map<std::string, std::string> httpHeader;
1117     RequestInfo requestInfo;
1118     requestInfo.url = "http";
1119     requestInfo.httpHeader = httpHeader;
1120     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e81b02(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1121                                   std::shared_ptr<DownloadRequest>& request) {
1122     };
__anon2af147e81c02(uint8_t*&& data, uint32_t&& len, bool notblock) 1123     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1124         return len;
1125     };
1126     std::shared_ptr<DownloadRequest> Request_ =
1127         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1128 
1129     bool isInterruptNeeded = false;
1130     Request_->headerInfo_.isChunked = true;
1131     Request_->headerInfo_.fileContentLen = LIVE_CONTENT_LENGTH;
1132     EXPECT_EQ(Request_->IsChunked(isInterruptNeeded), Seekable::SEEKABLE);
1133 }
1134 
1135 HWTEST_F(DownloaderUnitTest, GetBitRateError01, TestSize.Level1)
1136 {
1137     std::map<std::string, std::string> httpHeader;
1138     RequestInfo requestInfo;
1139     requestInfo.url = "http";
1140     requestInfo.httpHeader = httpHeader;
1141     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e81d02(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1142                                   std::shared_ptr<DownloadRequest>& request) {
1143     };
__anon2af147e81e02(uint8_t*&& data, uint32_t&& len, bool notblock) 1144     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1145         return len;
1146     };
1147     std::shared_ptr<DownloadRequest> Request_ =
1148         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1149 
1150     Request_->downloadDoneTime_ = 0;
1151     EXPECT_EQ(Request_->GetBitRate(), 0);
1152 }
1153 
1154 HWTEST_F(DownloaderUnitTest, GetBitRateError02, TestSize.Level1)
1155 {
1156     std::map<std::string, std::string> httpHeader;
1157     RequestInfo requestInfo;
1158     requestInfo.url = "http";
1159     requestInfo.httpHeader = httpHeader;
1160     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e81f02(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1161                                   std::shared_ptr<DownloadRequest>& request) {
1162     };
__anon2af147e82002(uint8_t*&& data, uint32_t&& len, bool notblock) 1163     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1164         return len;
1165     };
1166     std::shared_ptr<DownloadRequest> Request_ =
1167         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1168 
1169     Request_->downloadStartTime_ = 1;
1170     Request_->downloadDoneTime_ = 1;
1171     Request_->realRecvContentLen_ = 1;
1172     EXPECT_EQ(Request_->GetBitRate(), 0);
1173 }
1174 
1175 HWTEST_F(DownloaderUnitTest, IsM3u8Request, TestSize.Level1)
1176 {
1177     std::map<std::string, std::string> httpHeader;
1178     RequestInfo requestInfo;
1179     requestInfo.url = "http";
1180     requestInfo.httpHeader = httpHeader;
1181     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e82102(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1182                                   std::shared_ptr<DownloadRequest>& request) {
1183     };
__anon2af147e82202(uint8_t*&& data, uint32_t&& len, bool notblock) 1184     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1185         return len;
1186     };
1187     std::shared_ptr<DownloadRequest> Request_ =
1188         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1189 
1190     Request_->protocolType_ = RequestProtocolType::HLS;
1191     EXPECT_TRUE(Request_->IsM3u8Request());
1192 }
1193 
1194 HWTEST_F(DownloaderUnitTest, IsServerAcceptRange, TestSize.Level1)
1195 {
1196     std::map<std::string, std::string> httpHeader;
1197     RequestInfo requestInfo;
1198     requestInfo.url = "http";
1199     requestInfo.httpHeader = httpHeader;
1200     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e82302(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1201                                   std::shared_ptr<DownloadRequest>& request) {
1202     };
__anon2af147e82402(uint8_t*&& data, uint32_t&& len, bool notblock) 1203     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1204         return len;
1205     };
1206     std::shared_ptr<DownloadRequest> Request_ =
1207         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1208 
1209     Request_->headerInfo_.isChunked = true;
1210     EXPECT_FALSE(Request_->IsServerAcceptRange());
1211 }
1212 
1213 HWTEST_F(DownloaderUnitTest, DownloadInterrupt, TestSize.Level1)
1214 {
1215     std::map<std::string, std::string> httpHeader;
1216     RequestInfo requestInfo;
1217     requestInfo.url = "http";
1218     requestInfo.httpHeader = httpHeader;
1219     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e82502(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1220                                   std::shared_ptr<DownloadRequest>& request) {
1221     };
__anon2af147e82602(uint8_t*&& data, uint32_t&& len, bool notblock) 1222     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1223         return len;
1224     };
1225     std::shared_ptr<DownloadRequest> Request_ =
1226         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1227 
1228     Request_->isInterruptNeeded_ = true;
1229     int32_t waitMs = 0;
1230     downloader->Download(Request_, waitMs);
1231     EXPECT_NE(downloader->client_, nullptr);
1232 }
1233 
1234 HWTEST_F(DownloaderUnitTest, Download002, TestSize.Level1)
1235 {
1236     std::map<std::string, std::string> httpHeader;
1237     RequestInfo requestInfo;
1238     requestInfo.url = "http";
1239     requestInfo.httpHeader = httpHeader;
1240     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e82702(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1241                                   std::shared_ptr<DownloadRequest>& request) {
1242     };
__anon2af147e82802(uint8_t*&& data, uint32_t&& len, bool notblock) 1243     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1244         return len;
1245     };
1246     std::shared_ptr<DownloadRequest> Request_ =
1247         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1248 
1249     Request_->isInterruptNeeded_ = false;
1250     int32_t waitMs = -1;
1251     downloader->Download(Request_, waitMs);
1252     downloader->Pause();
1253     OSAL::SleepFor(1 * 1000);
1254     Request_->requestSize_ = Request_->GetFileContentLength() + 1;
1255     Request_->startPos_ = Request_->GetFileContentLength() - 1;
1256     downloader->Resume();
1257     Request_->retryTimes_ = 1;
1258     downloader->Cancel();
1259 
1260     EXPECT_NE(downloader->client_, nullptr);
1261 }
1262 
1263 HWTEST_F(DownloaderUnitTest, Seek001, TestSize.Level1)
1264 {
1265     std::map<std::string, std::string> httpHeader;
1266     RequestInfo requestInfo;
1267     requestInfo.url = "http";
1268     requestInfo.httpHeader = httpHeader;
1269     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e82902(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1270                                   std::shared_ptr<DownloadRequest>& request) {
1271     };
__anon2af147e82a02(uint8_t*&& data, uint32_t&& len, bool notblock) 1272     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1273         return len;
1274     };
1275     std::shared_ptr<DownloadRequest> Request_ =
1276         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1277 
1278     downloader->downloadRequestSize_ = 1;
1279     Request_->retryTimes_ = 1;
1280     EXPECT_FALSE(downloader->Seek(1));
1281 }
1282 
1283 HWTEST_F(DownloaderUnitTest, HttpDownloadLoop001, TestSize.Level1)
1284 {
1285     std::map<std::string, std::string> httpHeader;
1286     RequestInfo requestInfo;
1287     requestInfo.url = "http";
1288     requestInfo.httpHeader = httpHeader;
1289     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e82b02(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1290                                   std::shared_ptr<DownloadRequest>& request) {
1291     };
__anon2af147e82c02(uint8_t*&& data, uint32_t&& len, bool notblock) 1292     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1293         return len;
1294     };
1295     std::shared_ptr<DownloadRequest> Request_ =
1296         std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1297 
1298     downloader->shouldStartNextRequest.store(true);
1299     downloader->requestQue_->Push(Request_, static_cast<int>(-1));
1300     downloader->isInterruptNeeded_ = true;
1301     EXPECT_NE(downloader->client_, nullptr);
1302 }
1303 
1304 class SourceLoader : public IMediaSourceLoader {
1305 public:
~SourceLoader()1306     ~SourceLoader() {};
1307 
Init(std::shared_ptr<IMediaSourceLoadingRequest> & request)1308     int32_t Init(std::shared_ptr<IMediaSourceLoadingRequest> &request)
1309     {
1310         return 1;
1311     };
1312 
Open(const std::string & url,const std::map<std::string,std::string> & header)1313     int64_t Open(const std::string &url, const std::map<std::string, std::string> &header)
1314     {
1315         return 1;
1316     };
1317 
Read(int64_t uuid,int64_t requestedOffset,int64_t requestedLength)1318     int32_t Read(int64_t uuid, int64_t requestedOffset, int64_t requestedLength)
1319     {
1320         return 1;
1321     };
1322 
Close(int64_t uuid)1323     int32_t Close(int64_t uuid)
1324     {
1325         return 1;
1326     };
1327 };
1328 
1329 HWTEST_F(DownloaderUnitTest, OPEN_APP_URI_001, TestSize.Level1)
1330 {
1331     std::string testPath = "http://127.0.0.1:46666/test_cbr/720_1M/video_720.m3u8";
1332     std::shared_ptr<SourceLoader> loader = std::make_shared<SourceLoader>();
1333     std::shared_ptr<MediaSourceLoaderCombinations> sourceLoader =
1334         std::make_shared<MediaSourceLoaderCombinations>(loader);
1335     std::map<std::string, std::string> httpHeader;
1336     RequestInfo requestInfo;
1337     requestInfo.url = "http";
1338     requestInfo.httpHeader = httpHeader;
1339     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e82d02(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1340                                   std::shared_ptr<DownloadRequest>& request) {
1341     };
__anon2af147e82e02(uint8_t*&& data, uint32_t&& len, bool notblock) 1342     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1343         return len;
1344     };
1345     std::shared_ptr<Downloader> downloader1 = std::make_shared<Downloader>("test", sourceLoader);
1346     downloader1->currentRequest_ = std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1347     downloader1->appPreviousRequestUrl_ = testPath;
1348     EXPECT_NE(downloader1->client_, nullptr);
1349     EXPECT_NE(downloader1->sourceLoader_, nullptr);
1350     EXPECT_NE(downloader1->currentRequest_, nullptr);
1351     EXPECT_EQ(downloader1->uuid_, 0);
1352     downloader1->OpenAppUri();
1353     EXPECT_NE(downloader1->uuid_, 0);
1354     downloader1->sourceLoader_ = nullptr;
1355     downloader1->OpenAppUri();
1356     EXPECT_NE(downloader1->uuid_, 0);
1357 }
1358 
1359 HWTEST_F(DownloaderUnitTest, DROP_RETRY_DATA_001, TestSize.Level1)
1360 {
1361     std::string testPath = "http://127.0.0.1:46666/test_cbr/720_1M/video_720.m3u8";
1362     std::shared_ptr<SourceLoader> loader = std::make_shared<SourceLoader>();
1363     std::shared_ptr<MediaSourceLoaderCombinations> sourceLoader =
1364         std::make_shared<MediaSourceLoaderCombinations>(loader);
1365     std::map<std::string, std::string> httpHeader;
1366     RequestInfo requestInfo;
1367     requestInfo.url = "http";
1368     requestInfo.httpHeader = httpHeader;
1369     auto realStatusCallback = [this] (DownloadStatus&& status, std::shared_ptr<Downloader>& downloader,
__anon2af147e82f02(DownloadStatus&& status, std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request) 1370                                   std::shared_ptr<DownloadRequest>& request) {
1371     };
__anon2af147e83002(uint8_t*&& data, uint32_t&& len, bool notblock) 1372     auto saveData =  [this] (uint8_t*&& data, uint32_t&& len, bool notblock) {
1373         return len;
1374     };
1375     std::shared_ptr<Downloader> downloader1 = std::make_shared<Downloader>("test", sourceLoader);
1376     downloader1->currentRequest_ = std::make_shared<DownloadRequest>(saveData, realStatusCallback, requestInfo);
1377     downloader1->appPreviousRequestUrl_ = testPath;
1378     downloader1->OpenAppUri();
1379     EXPECT_NE(downloader1->client_, nullptr);
1380     EXPECT_NE(downloader1->sourceLoader_, nullptr);
1381     EXPECT_NE(downloader1->currentRequest_, nullptr);
1382     uint8_t * buffer = new uint8_t[1000];
1383 
1384     downloader1->currentRequest_->startPos_ = 0;
1385     downloader1->DropRetryData(buffer, 1000, downloader1.get());
1386 
1387     downloader1->currentRequest_->startPos_ = 1000;
1388     EXPECT_EQ(downloader1->DropRetryData(buffer, 500, downloader1.get()), 500);
1389     EXPECT_EQ(downloader1->DropRetryData(buffer, 500, downloader1.get()), 500);
1390 }
1391 class SourceCallback : public Plugins::Callback {
1392 public:
OnEvent(const Plugins::PluginEvent & event)1393     void OnEvent(const Plugins::PluginEvent &event) override
1394     {}
1395 };
1396 
1397 HWTEST_F(DownloaderUnitTest, DOWNLOADER_MONITOR_001, TestSize.Level1)
1398 {
1399     std::shared_ptr<DownloadMonitor> downloader = std::make_shared<DownloadMonitor>
1400         (std::make_shared<DownloadMonitor>(std::make_shared<HttpMediaDownloader>("http", 100, nullptr)));
1401     Plugins::Callback* sourceCallback = new SourceCallback();
1402     downloader->callback_ = sourceCallback;
1403     downloader->NotifyError(52, 403);
1404     std::shared_ptr<DownloadRequest> request = std::make_shared<DownloadRequest>("", nullptr, nullptr,  false);
1405     request->clientError_ = 992;
1406     EXPECT_EQ(downloader->NeedRetry(request), false);
1407     downloader->GetDownloadInfo();
1408     downloader->GetBufferSize();
1409     downloader->GetBufferingTimeOut();
1410     downloader->GetReadTimeOut(true);
1411     downloader->GetSegmentOffset();
1412     downloader->GetHLSDiscontinuity();
1413     downloader->StopBufferring(true);
1414     int32_t serverCode = 0;
1415     downloader->GetServerMediaServiceErrorCode(400, serverCode);
1416     downloader->GetServerMediaServiceErrorCode(101, serverCode);
1417     downloader->GetCachedDuration();
1418     downloader->RestartAndClearBuffer();
1419     downloader->IsFlvLive();
1420     downloader->SetStartPts(1);
1421     downloader->SetExtraCache(1);
1422     downloader->GetMemorySize();
1423     downloader->SetCurrentBitRate(1, 1);
1424     downloader->SetPlayStrategy(nullptr);
1425     DownloadInfo downloadInfo;
1426     downloader->GetDownloadInfo(downloadInfo);
1427     PlaybackInfo playbackInfo;
1428     downloader->GetPlaybackInfo(playbackInfo);
1429     downloader->SetAppUid(1);
1430     downloader->GetPlayable();
1431     EXPECT_NE(downloader->downloader_, nullptr);
1432 }
1433 
1434 HWTEST_F(DownloaderUnitTest, DOWNLOADER_MONITOR_002, TestSize.Level1)
1435 {
1436     std::shared_ptr<DownloadMonitor> downloader = std::make_shared<DownloadMonitor>
1437         (std::make_shared<DownloadMonitor>(std::make_shared<HttpMediaDownloader>("http", 100, nullptr)));
1438     Plugins::Callback* sourceCallback = new SourceCallback();
1439     downloader->downloader_ = nullptr;
1440     downloader->callback_ = sourceCallback;
1441     downloader->NotifyError(52, 403);
1442     std::shared_ptr<DownloadRequest> request = std::make_shared<DownloadRequest>("", nullptr, nullptr,  false);
1443     request->clientError_ = 992;
1444     EXPECT_EQ(downloader->NeedRetry(request), false);
1445     downloader->GetDownloadInfo();
1446     downloader->GetBufferSize();
1447     downloader->GetBufferingTimeOut();
1448     downloader->GetReadTimeOut(true);
1449     downloader->GetSegmentOffset();
1450     downloader->GetHLSDiscontinuity();
1451     downloader->StopBufferring(true);
1452     downloader->WaitForBufferingEnd();
1453     int32_t serverCode = 0;
1454     downloader->GetServerMediaServiceErrorCode(400, serverCode);
1455     downloader->GetServerMediaServiceErrorCode(101, serverCode);
1456     downloader->GetCachedDuration();
1457     downloader->RestartAndClearBuffer();
1458     downloader->IsFlvLive();
1459     downloader->SetStartPts(1);
1460     downloader->SetExtraCache(1);
1461     downloader->GetMemorySize();
1462     downloader->SetCurrentBitRate(1, 1);
1463     downloader->SetPlayStrategy(nullptr);
1464     DownloadInfo downloadInfo;
1465     downloader->GetDownloadInfo(downloadInfo);
1466     PlaybackInfo playbackInfo;
1467     downloader->GetPlaybackInfo(playbackInfo);
1468     downloader->SetAppUid(1);
1469     downloader->GetPlayable();
1470     EXPECT_EQ(downloader->downloader_, nullptr);
1471     downloader->callback_ = nullptr;
1472     downloader->NotifyError(52, 403);
1473     downloader->NotifyError(52, 0);
1474     downloader->NotifyError(0, 0);
1475     EXPECT_EQ(downloader->callback_, nullptr);
1476 }
1477 }
1478 }
1479 }
1480 }