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 }