• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 <cstring>
17 #include <fcntl.h>
18 #include <functional>
19 #include <gtest/gtest.h>
20 #include <iostream>
21 #include <memory>
22 #include <sys/mman.h>
23 #include <sys/stat.h>
24 #include <unistd.h>
25 #include "log.h"
26 #include "pkg_algorithm.h"
27 #include "pkg_gzipfile.h"
28 #include "pkg_manager.h"
29 #include "pkg_manager_impl.h"
30 #include "pkg_test.h"
31 #include "pkg_utils.h"
32 #include "securec.h"
33 
34 using namespace std;
35 using namespace Hpackage;
36 using namespace Updater;
37 using namespace testing::ext;
38 
39 namespace UpdaterUt {
40 constexpr auto WINDOWBITS = -15;  // 32kb window; negative to indicate a raw stream.
41 constexpr auto MEMLEVEL = 8;      // the default value.
42 constexpr auto STRATEGY = Z_DEFAULT_STRATEGY;
43 constexpr uint16_t HEADER_CRC = 0x02; /* bit 1 set: CRC16 for the gzip header */
44 constexpr uint16_t EXTRA_FIELD = 0x04; /* bit 2 set: extra field present */
45 constexpr uint16_t ORIG_NAME = 0x08; /* bit 3 set: original file name present */
46 constexpr uint16_t COMMENT = 0x10; /* bit 4 set: file comment present */
47 constexpr uint32_t DEFAULT_LOCAK_DIGEST = 32;
48 constexpr uint32_t TEST_FILE_VERSION = 1000;
49 constexpr uint32_t TEST_DECOMPRESS_GZIP_OFFSET = 2;
50 constexpr int32_t LZ4F_MAX_BLOCKID = 7;
51 constexpr int32_t ZIP_MAX_LEVEL = 9;
52 
53 class TestPkgStream : public PkgStreamImpl {
54 public:
TestPkgStream(PkgManager::PkgManagerPtr pkgManager,std::string fileName)55     explicit TestPkgStream(PkgManager::PkgManagerPtr pkgManager, std::string fileName)
56         : PkgStreamImpl(pkgManager, fileName) {}
~TestPkgStream()57     virtual ~TestPkgStream() {}
58 
Read(const PkgBuffer & buff,size_t start,size_t size,size_t & readLen)59     int32_t Read(const PkgBuffer &buff, size_t start, size_t size, size_t &readLen) override
60     {
61         return PkgStreamImpl::Read(buff, start, size, readLen);
62     }
Write(const PkgBuffer & ptr,size_t size,size_t start)63     int32_t Write(const PkgBuffer &ptr, size_t size, size_t start) override
64     {
65         return PKG_SUCCESS;
66     }
Seek(long int sizeT,int whence)67     int32_t Seek(long int sizeT, int whence) override
68     {
69         return PKG_SUCCESS;
70     }
Flush(size_t size)71     int32_t Flush(size_t size) override
72     {
73         return PKG_SUCCESS;
74     }
GetFileName() const75     const std::string GetFileName() const override
76     {
77         return "";
78     }
GetFileLength()79     size_t GetFileLength() override
80     {
81         return 0;
82     }
83 };
84 
85 class PkgMangerTest : public PkgTest {
86 public:
PkgMangerTest()87     PkgMangerTest() {}
~PkgMangerTest()88     ~PkgMangerTest() override {}
89 
TestStreamProcess(const PkgBuffer & ptr,size_t size,size_t start,bool isFinish,const void * context)90     static int TestStreamProcess(const PkgBuffer &ptr, size_t size, size_t start, bool isFinish,
91         const void *context)
92     {
93         PKG_LOGI("TestStreamProcess size %zu, start %zu finish %d", size, start, isFinish);
94         return PKG_SUCCESS;
95     }
96 
GetUpgradePkgInfo(UpgradePkgInfo & pkgInfo,std::vector<std::pair<std::string,ComponentInfo>> & files)97     void GetUpgradePkgInfo(UpgradePkgInfo &pkgInfo, std::vector<std::pair<std::string, ComponentInfo>> &files)
98     {
99         pkgInfo.softwareVersion = "100.100.100.100";
100         pkgInfo.date = "2021-02-02";
101         pkgInfo.time = "21:23:49";
102         pkgInfo.productUpdateId = "555.555.100.555";
103         pkgInfo.pkgInfo.entryCount = testFileNames_.size();
104         pkgInfo.pkgInfo.digestMethod = PKG_DIGEST_TYPE_SHA256;
105         pkgInfo.pkgInfo.signMethod = PKG_SIGN_METHOD_RSA;
106         pkgInfo.pkgInfo.pkgType = PKG_PACK_TYPE_UPGRADE;
107         pkgInfo.updateFileVersion = TEST_FILE_VERSION;
108         std::string filePath;
109         uint16_t componentInfoId = 100;
110         files.resize(testFileNames_.size());
111         for (uint32_t i = 0; i < testFileNames_.size(); i++) {
112             filePath = TEST_PATH_FROM;
113             filePath += testFileNames_[i].c_str();
114             files[i].first = filePath;
115 
116             ComponentInfo* info = &files[i].second;
117             int ret = BuildFileDigest(*info->digest, sizeof(info->digest), filePath);
118             EXPECT_EQ(ret, PKG_SUCCESS);
119             info->fileInfo.identity = testFileNames_[i];
120             info->fileInfo.unpackedSize = GetFileSize(filePath);
121             info->fileInfo.packedSize = info->fileInfo.unpackedSize;
122             info->fileInfo.packMethod = PKG_COMPRESS_METHOD_NONE;
123             info->fileInfo.digestMethod = PKG_DIGEST_TYPE_SHA256;
124             info->version = "2.2.2.2";
125             info->id = componentInfoId;
126             info->resType = 0;
127             info->type = 0;
128             info->originalSize = info->fileInfo.unpackedSize;
129             info->compFlags = 0;
130         }
131     }
TestPackagePack()132     int TestPackagePack()
133     {
134         PKG_LOGI("\n\n ************* TestPackagePack %s \r\n", testPackageName.c_str());
135         UpgradePkgInfo pkgInfo;
136         std::vector<std::pair<std::string, ComponentInfo>> files;
137         GetUpgradePkgInfo(pkgInfo, files);
138         std::string packagePath = TEST_PATH_TO;
139         packagePath += testPackageName;
140         int32_t ret = pkgManager_->CreatePackage(packagePath, "", &pkgInfo.pkgInfo, files);
141         EXPECT_EQ(ret, PKG_INVALID_FILE);
142         ret = pkgManager_->CreatePackage(packagePath, GetTestPrivateKeyName(0), &pkgInfo.pkgInfo, files);
143         EXPECT_EQ(ret, PKG_SUCCESS);
144         return 0;
145     }
146 
TestPackagePackFileNotExist()147     int TestPackagePackFileNotExist()
148     {
149         PKG_LOGI("\n\n ************* TestPackagePackFileNotExist %s \r\n", testPackageName.c_str());
150         UpgradePkgInfo pkgInfo;
151         std::vector<std::pair<std::string, ComponentInfo>> files;
152         GetUpgradePkgInfo(pkgInfo, files);
153         std::string packagePath = TEST_PATH_TO;
154         packagePath += testPackageName;
155 
156         // 修改成错误的路径
157         files[0].first = "sssssssssss";
158         int32_t ret = pkgManager_->CreatePackage(packagePath, GetTestPrivateKeyName(0), &pkgInfo.pkgInfo, files);
159         EXPECT_EQ(ret, PKG_INVALID_FILE);
160         return 0;
161     }
162 
TestPackagePackParamInvalid()163     int TestPackagePackParamInvalid()
164     {
165         PKG_LOGI("\n\n ************* TestPackagePackParamInvalid %s \r\n", testPackageName.c_str());
166         std::vector<std::pair<std::string, ComponentInfo>> files;
167         std::string packagePath = TEST_PATH_TO;
168         packagePath += testPackageName;
169         int32_t ret = pkgManager_->CreatePackage(packagePath, GetTestPrivateKeyName(0), nullptr, files);
170         EXPECT_EQ(ret, PKG_INVALID_PARAM);
171         return 0;
172     }
173 
TestPkgStreamImpl()174     int TestPkgStreamImpl()
175     {
176         std::string path = TEST_PATH_TO + testCombinePkgName;
177         std::unique_ptr<TestPkgStream> stream = std::make_unique<TestPkgStream>(pkgManager_, path);
178         EXPECT_NE(stream, nullptr);
179         constexpr size_t buffSize = 10;
180         uint8_t buff[buffSize];
181         size_t size = sizeof(buff);
182         size_t start = 0;
183         size_t readLen = 0;
184         PkgBuffer buffer(buff, sizeof(buff));
185         int ret = ((PkgStreamPtr)(stream.get()))->Read(buffer, start, size, readLen);
186         EXPECT_EQ(0, ret);
187         PkgBuffer data = {};
188         ret = ((PkgStreamPtr)(stream.get()))->GetBuffer(data);
189         EXPECT_EQ(0, ret);
190 
191         ret = ((PkgStreamPtr)(stream.get()))->GetStreamType();
192         EXPECT_EQ(PkgStream::PkgStreamType_Read, ret);
193 
194         return 0;
195     }
196 
TestInvalidStream()197     int TestInvalidStream()
198     {
199         std::string packagePath = TEST_PATH_TO;
200         packagePath += testPackageName;
201         auto stream = std::make_unique<FileStream>(pkgManager_, testPackageName, nullptr, 0);
202         size_t start = 0;
203         size_t readLen = 0;
204         size_t bufferSize = 10;
205         PkgBuffer buffer(bufferSize);
206         int ret = stream->Read(buffer, start, bufferSize, readLen);
207         EXPECT_EQ(PKG_INVALID_STREAM, ret);
208         return 0;
209     }
210 
TestRead()211     int TestRead()
212     {
213         constexpr size_t buffSize = 8;
214         int index = 7;
215         uint8_t buffValue = 100;
216         uint8_t buff[buffSize] = {0};
217         buff[index] = buffValue;
218         ReadLE64(buff);
219         return 0;
220     }
221 
TestCheckFile()222     int TestCheckFile()
223     {
224         std::string filePath = TEST_PATH_TO;
225         filePath += "/4444/";
226         int ret = CheckFile(filePath);
227         EXPECT_EQ(ret, 0);
228         return 0;
229     }
230 
TestGetCurrPath()231     int TestGetCurrPath()
232     {
233         std::string path = GetCurrPath();
234         if (path == "./") {
235             EXPECT_EQ(1, 0);
236         }
237         return 0;
238     }
239 
TestCreatePackageInvalidFile()240     int TestCreatePackageInvalidFile()
241     {
242         UpgradePkgInfo pkgInfo;
243         size_t testSize = 100;
244         uint16_t componentInfoId = 100;
245         std::vector<std::pair<std::string, ComponentInfo>> files;
246         GetUpgradePkgInfo(pkgInfo, files);
247         ComponentInfo info;
248         info.fileInfo.identity = "aaaaaaaa";
249         info.fileInfo.unpackedSize = testSize;
250         info.fileInfo.packedSize = testSize;
251         info.fileInfo.packMethod = PKG_COMPRESS_METHOD_NONE;
252         info.fileInfo.digestMethod = PKG_DIGEST_TYPE_SHA256;
253         info.version = "2.2.2.2";
254         info.id = componentInfoId;
255         info.resType = 0;
256         info.type = 0;
257         info.originalSize = testSize;
258         info.compFlags = 0;
259         std::string packagePath = TEST_PATH_TO;
260         packagePath += testPackageName;
261         files.push_back(std::pair<std::string, ComponentInfo>("/qqqqqq", info));
262         int ret = pkgManager_->CreatePackage(packagePath, GetTestPrivateKeyName(0), &pkgInfo.pkgInfo, files);
263         EXPECT_EQ(ret, PKG_INVALID_FILE);
264         return 0;
265     }
266 
TestCreatePackageInvalidSignMethod()267     int TestCreatePackageInvalidSignMethod()
268     {
269         UpgradePkgInfo pkgInfo;
270         std::vector<std::pair<std::string, ComponentInfo>> files;
271         GetUpgradePkgInfo(pkgInfo, files);
272         std::string packagePath = TEST_PATH_TO;
273         packagePath += testPackageName;
274         uint8_t signMethodIndex = 10;
275         pkgInfo.pkgInfo.signMethod = PKG_SIGN_METHOD_RSA + signMethodIndex;
276         int ret = pkgManager_->CreatePackage(packagePath, GetTestPrivateKeyName(0), &pkgInfo.pkgInfo, files);
277         EXPECT_NE(ret, 0);
278         return 0;
279     }
280 
TestLz4PackageInvalidFile()281     int TestLz4PackageInvalidFile()
282     {
283         pkgManager_ = static_cast<PkgManagerImpl*>(PkgManager::GetPackageInstance());
284         EXPECT_NE(pkgManager_, nullptr);
285 
286         std::vector<std::pair<std::string, Lz4FileInfo>> files;
287         Lz4FileInfo file;
288         file.fileInfo.identity = testPackageName;
289         file.fileInfo.packMethod = PKG_COMPRESS_METHOD_ZIP;
290         file.fileInfo.digestMethod = PKG_DIGEST_TYPE_CRC;
291         files.push_back(std::pair<std::string, Lz4FileInfo>("fileName", file));
292         PkgInfo pkgInfo;
293         pkgInfo.signMethod = PKG_SIGN_METHOD_RSA;
294         pkgInfo.digestMethod  = PKG_DIGEST_TYPE_SHA256;
295         pkgInfo.pkgType = PKG_PACK_TYPE_GZIP;
296         std::string fileName = TEST_PATH_TO;
297         fileName += testGZipPackageName;
298         int ret = pkgManager_->CreatePackage(fileName, "", &pkgInfo, files);
299         EXPECT_EQ(ret, PKG_INVALID_FILE);
300         ret = pkgManager_->CreatePackage(fileName, GetTestPrivateKeyName(0), nullptr, files);
301         EXPECT_EQ(ret, PKG_INVALID_PARAM);
302         ret = pkgManager_->CreatePackage(fileName, GetTestPrivateKeyName(0), &pkgInfo, files);
303         EXPECT_EQ(ret, PKG_INVALID_FILE);
304         return 0;
305     }
306 
TestLz4PackageInvalidPkgType()307     int TestLz4PackageInvalidPkgType()
308     {
309         pkgManager_ = static_cast<PkgManagerImpl*>(PkgManager::GetPackageInstance());
310         EXPECT_NE(pkgManager_, nullptr);
311 
312         std::vector<std::pair<std::string, Lz4FileInfo>> files;
313         Lz4FileInfo file;
314         file.fileInfo.identity = testPackageName;
315         file.fileInfo.packMethod = PKG_COMPRESS_METHOD_ZIP;
316         file.fileInfo.digestMethod = PKG_DIGEST_TYPE_CRC;
317         files.push_back(std::pair<std::string, Lz4FileInfo>("fileName", file));
318         PkgInfo pkgInfo;
319         pkgInfo.signMethod = PKG_SIGN_METHOD_RSA;
320         pkgInfo.digestMethod  = PKG_DIGEST_TYPE_SHA256;
321         uint8_t pkgTypeIndex = 100;
322         pkgInfo.pkgType = PKG_PACK_TYPE_GZIP + pkgTypeIndex;
323         std::string fileName = TEST_PATH_TO;
324         fileName += testGZipPackageName;
325         int ret = pkgManager_->CreatePackage(fileName, GetTestPrivateKeyName(0), &pkgInfo, files);
326         EXPECT_EQ(ret, PKG_INVALID_FILE);
327         return 0;
328     }
329 
TestZipPackageInvalidFile()330     int TestZipPackageInvalidFile()
331     {
332         pkgManager_ = static_cast<PkgManagerImpl*>(PkgManager::GetPackageInstance());
333         EXPECT_NE(pkgManager_, nullptr);
334 
335         std::vector<std::pair<std::string, ZipFileInfo>> files;
336         for (auto name : testFileNames_) {
337             ZipFileInfo file;
338             file.fileInfo.identity = name;
339             file.fileInfo.packMethod = PKG_COMPRESS_METHOD_ZIP;
340             file.fileInfo.digestMethod = PKG_DIGEST_TYPE_CRC;
341             files.push_back(std::pair<std::string, ZipFileInfo>("55555555555", file));
342         }
343         PkgInfo pkgInfo;
344         pkgInfo.signMethod = PKG_SIGN_METHOD_RSA;
345         pkgInfo.digestMethod  = PKG_DIGEST_TYPE_SHA256;
346         pkgInfo.pkgType  = PKG_PACK_TYPE_ZIP;
347         std::string fileName = TEST_PATH_TO;
348         fileName += testZipPackageName;
349         int ret = pkgManager_->CreatePackage(fileName, "", &pkgInfo, files);
350         EXPECT_EQ(ret, PKG_INVALID_FILE);
351         ret = pkgManager_->CreatePackage(fileName, GetTestPrivateKeyName(0), nullptr, files);
352         EXPECT_EQ(ret, PKG_INVALID_PARAM);
353         ret = pkgManager_->CreatePackage(fileName, GetTestPrivateKeyName(0), &pkgInfo, files);
354         EXPECT_EQ(ret, PKG_INVALID_FILE);
355         return 0;
356     }
357 
TestLoadPackageFail()358     int TestLoadPackageFail()
359     {
360         pkgManager_ = static_cast<PkgManagerImpl*>(PkgManager::GetPackageInstance());
361         EXPECT_NE(pkgManager_, nullptr);
362         std::vector<std::string> components;
363         std::string fileName = TEST_PATH_TO;
364         fileName += "testZipPackageName.aaa";
365         int32_t ret = pkgManager_->LoadPackage(fileName, GetTestCertName(0), components);
366         EXPECT_EQ(ret, PKG_INVALID_FILE);
367         return 0;
368     }
369 
TestDecompressLz4plus(Hpackage::Lz4FileInfo & lz4Info)370     void TestDecompressLz4plus(Hpackage::Lz4FileInfo &lz4Info)
371     {
372         pkgManager_ = static_cast<PkgManagerImpl*>(PkgManager::GetPackageInstance());
373         EXPECT_NE(pkgManager_, nullptr);
374         int8_t compressionLevel = 2;
375         lz4Info.fileInfo.identity = "Lz4";
376         lz4Info.fileInfo.packMethod = PKG_COMPRESS_METHOD_LZ4;
377         lz4Info.fileInfo.digestMethod = PKG_DIGEST_TYPE_NONE;
378         lz4Info.compressionLevel = compressionLevel;
379         lz4Info.blockSizeID = 0;
380         lz4Info.contentChecksumFlag = 0;
381         lz4Info.blockIndependence = 0;
382     }
383 
TestDecompressLz4(Hpackage::Lz4FileInfo & lz4Info,std::vector<uint8_t> & uncompressedData,std::vector<uint8_t> & digest)384     int TestDecompressLz4(Hpackage::Lz4FileInfo &lz4Info,
385         std::vector<uint8_t> &uncompressedData, std::vector<uint8_t> &digest)
386     {
387         std::string testFileName = TEST_PATH_FROM + "../diffpatch/PatchLz4test_new.lz4";
388         size_t fileSize = GetFileSize(testFileName);
389         int32_t fd = open(testFileName.c_str(), O_RDWR);
390         PKG_CHECK(fd > 0, return -1, "Can not open file ");
391 
392         size_t uncompressedDataSize = 1024;
393         uncompressedData.resize(uncompressedDataSize);
394         PkgManager::StreamPtr stream = nullptr;
395         pkgManager_->CreatePkgStream(stream, "Lz4",
396             [&](const PkgBuffer &buffer, size_t size, size_t start, bool isFinish, const void* context) -> int {
397                 (void)isFinish;
398                 (void)context;
399                 (void)size;
400                 (void)start;
401                 (void)buffer;
402                 size_t oldSize = uncompressedData.size();
403                 if ((start + size) > uncompressedData.size()) {
404                     uncompressedData.resize(oldSize * ((start + size) / oldSize + 1));
405                 }
406                 EXPECT_GE(memcpy_s(uncompressedData.data() + start, size, buffer.buffer, size), 0);
407                 return PKG_SUCCESS;
408             }, nullptr);
409 
410         std::unique_ptr<Hpackage::PkgStream, std::function<void(Hpackage::PkgManager::StreamPtr)>> outStream(stream,
411             [&](Hpackage::PkgManager::StreamPtr stream) {
412             pkgManager_->ClosePkgStream(stream);
413         });
414         PKG_CHECK(outStream != nullptr, close(fd); return -1, "Can not create stream ");
415 
416         void* mappedData = mmap(nullptr, fileSize, PROT_READ, MAP_SHARED, fd, 0);
417         PKG_CHECK(mappedData != MAP_FAILED, close(fd); return -2, "Can not mmap ");
418 
419         size_t addrOffset = 4;
420         TestDecompressLz4plus(lz4Info);
421         Hpackage::PkgBuffer buffer(static_cast<uint8_t*>(mappedData) + addrOffset, fileSize);
422         int32_t ret = pkgManager_->DecompressBuffer(&lz4Info.fileInfo, buffer, outStream.get());
423 
424         // 生成摘要,检查数据完整
425         SHA256_CTX sha256Ctx = {};
426         SHA256_Init(&sha256Ctx);
427         SHA256_Update(&sha256Ctx, static_cast<const uint8_t*>(mappedData), lz4Info.fileInfo.packedSize + 4);
428         SHA256_Final(digest.data(), &sha256Ctx);
429 
430         munmap(mappedData, fileSize);
431         close(fd);
432         PKG_CHECK(ret == 0, return -1, "Can not decompress buff ");
433         PKG_LOGE("GetLz4UncompressedData packedSize:%zu unpackedSize:%zu fileSize: %zu",
434             lz4Info.fileInfo.packedSize, lz4Info.fileInfo.unpackedSize, fileSize);
435         return 0;
436     }
437 
TestDecompressGzipInitFile(Hpackage::ZipFileInfo & zipInfo,size_t & offset,size_t & fileSize,void * mappedData)438     void TestDecompressGzipInitFile(Hpackage::ZipFileInfo &zipInfo, size_t &offset,
439         size_t &fileSize, void *mappedData)
440     {
441         int32_t zipMethod = 8;
442         int32_t zipLevel = 4;
443         zipInfo.fileInfo.identity = "gzip";
444         zipInfo.fileInfo.packMethod = PKG_COMPRESS_METHOD_GZIP;
445         zipInfo.fileInfo.digestMethod = PKG_DIGEST_TYPE_NONE;
446         zipInfo.method = zipMethod;
447         zipInfo.level = zipLevel;
448         zipInfo.memLevel = MEMLEVEL;
449         zipInfo.windowBits = WINDOWBITS;
450         zipInfo.strategy = STRATEGY;
451 
452         auto buffer = reinterpret_cast<uint8_t*>(mappedData);
453         auto header = reinterpret_cast<GZipHeader*>(mappedData);
454         // 有扩展头信息
455         if (header->flags & EXTRA_FIELD) {
456             uint16_t extLen = ReadLE16(buffer + offset);
457             offset += sizeof(uint16_t) + extLen;
458         }
459         if (header->flags & ORIG_NAME) {
460             std::string fileName;
461             PkgFile::ConvertBufferToString(fileName, {buffer + offset, fileSize - offset});
462             offset += fileName.size() + 1;
463         }
464         if (header->flags & COMMENT) {
465             std::string comment;
466             PkgFile::ConvertBufferToString(comment, {buffer + offset, fileSize - offset});
467             offset += comment.size() + 1;
468         }
469         if (header->flags & HEADER_CRC) { // 暂不校验
470             offset += TEST_DECOMPRESS_GZIP_OFFSET;
471         }
472         return;
473     }
474 
TestDecompressGzip(Hpackage::ZipFileInfo & zipInfo,std::vector<uint8_t> & uncompressedData,std::vector<uint8_t> & digest)475     int TestDecompressGzip(Hpackage::ZipFileInfo &zipInfo, std::vector<uint8_t> &uncompressedData,
476         std::vector<uint8_t> &digest)
477     {
478         std::string testFileName = TEST_PATH_FROM + "../applypatch/TestDecompressGzip.new.gz";
479         size_t fileSize = GetFileSize(testFileName);
480         size_t uncompressedDataSize = 1024;
481         int fd = open(testFileName.c_str(), O_RDWR);
482         if (fd < 0) {
483             return -1;
484         }
485         uncompressedData.resize(uncompressedDataSize);
486         PkgManager::StreamPtr stream = nullptr;
487         pkgManager_->CreatePkgStream(stream, "Gzip",
488             [&](const PkgBuffer &buffer, size_t size, size_t start, bool isFinish, const void* context) -> int {
489                 (void)isFinish;
490                 (void)context;
491                 (void)size;
492                 (void)start;
493                 (void)buffer;
494                 size_t oldSize = uncompressedData.size();
495                 if ((start + size) > uncompressedData.size()) {
496                     uncompressedData.resize(oldSize * ((start + size) / oldSize + 1));
497                 }
498                 EXPECT_GE(memcpy_s(uncompressedData.data() + start, size, buffer.buffer, size), 0);
499                 return PKG_SUCCESS;
500             }, nullptr);
501 
502         std::unique_ptr<Hpackage::PkgStream, std::function<void(Hpackage::PkgManager::StreamPtr)>> outStream(stream,
503             [&](Hpackage::PkgManager::StreamPtr stream) {
504             pkgManager_->ClosePkgStream(stream);
505         });
506         PKG_CHECK(outStream != nullptr, close(fd); return -1, "Can not create stream ");
507 
508         void* mappedData = mmap(nullptr, fileSize, PROT_READ, MAP_SHARED, fd, 0);
509         PKG_CHECK(mappedData != MAP_FAILED, close(fd); return -2, "Can not mmap ");
510 
511         pkgManager_ = static_cast<PkgManagerImpl*>(PkgManager::GetPackageInstance());
512         EXPECT_NE(pkgManager_, nullptr);
513         size_t offset = 10;
514         TestDecompressGzipInitFile(zipInfo, offset, fileSize, mappedData);
515 
516         Hpackage::PkgBuffer data(reinterpret_cast<uint8_t*>(mappedData) + offset, fileSize);
517         int32_t ret = pkgManager_->DecompressBuffer(&zipInfo.fileInfo, data, outStream.get());
518 
519         // 生成摘要,检查数据完整
520         SHA256_CTX sha256Ctx = {};
521         SHA256_Init(&sha256Ctx);
522         SHA256_Update(&sha256Ctx, reinterpret_cast<const uint8_t*>(mappedData) + offset, zipInfo.fileInfo.packedSize);
523         SHA256_Final(digest.data(), &sha256Ctx);
524 
525         munmap(mappedData, fileSize);
526         close(fd);
527         PKG_CHECK(ret == 0, return -1, "Can not decompress buff ");
528         PKG_LOGE("GetGZipUncompressedData packedSize:%zu unpackedSize:%zu",
529             zipInfo.fileInfo.packedSize, zipInfo.fileInfo.unpackedSize);
530 
531         return 0;
532     }
533 
TestCompressBuffer(Hpackage::FileInfo & info,std::vector<uint8_t> uncompressedData,std::vector<uint8_t> digest)534     int TestCompressBuffer(Hpackage::FileInfo &info, std::vector<uint8_t> uncompressedData,
535         std::vector<uint8_t> digest)
536     {
537         pkgManager_ = static_cast<PkgManagerImpl*>(PkgManager::GetPackageInstance());
538         EXPECT_NE(pkgManager_, nullptr);
539         // 生成摘要,检查数据完整
540         SHA256_CTX sha256Ctx = {};
541         SHA256_Init(&sha256Ctx);
542         PkgManager::StreamPtr stream = nullptr;
543         pkgManager_->CreatePkgStream(stream, "Gzip",
544             [&](const PkgBuffer &ptr, size_t size, size_t start, bool isFinish, const void* context) -> int {
545                 (void)isFinish;
546                 (void)context;
547                 (void)size;
548                 (void)start;
549                 (void)ptr;
550                 SHA256_Update(&sha256Ctx, ptr.buffer, size);
551                 return PKG_SUCCESS;
552             }, nullptr);
553 
554         std::unique_ptr<Hpackage::PkgStream, std::function<void(Hpackage::PkgManager::StreamPtr)>> outStream(stream,
555             [&](Hpackage::PkgManager::StreamPtr stream) {
556             pkgManager_->ClosePkgStream(stream);
557         });
558         PKG_CHECK(outStream != nullptr, return -1, "Can not create stream ");
559         Hpackage::PkgBuffer buffer(uncompressedData.data(), info.unpackedSize);
560         int32_t ret = pkgManager_->CompressBuffer(&info, buffer, outStream.get());
561         PKG_LOGE("GetGZipUncompressedData packedSize:%zu unpackedSize:%zu",
562             info.packedSize, info.unpackedSize);
563         PKG_CHECK(ret == 0, return -1, "Fail to CompressBuffer");
564         std::vector<uint8_t> localDigest(DEFAULT_LOCAK_DIGEST);
565         SHA256_Final(localDigest.data(), &sha256Ctx);
566         ret = memcmp(localDigest.data(), digest.data(), localDigest.size());
567         PKG_LOGE("digest cmp result %d", ret);
568         return ret;
569     }
570 
TestReadWriteLENull()571     void TestReadWriteLENull()
572     {
573         uint8_t *buff = nullptr;
574         WriteLE16(buff, 0);
575         uint16_t ret16 = ReadLE16(buff);
576         EXPECT_EQ(ret16, 0);
577         WriteLE32(buff, 0);
578         uint32_t ret32 = ReadLE32(buff);
579         EXPECT_EQ(ret32, 0);
580         uint64_t ret64 = ReadLE64(buff);
581         EXPECT_EQ(ret64, 0);
582     }
583 };
584 
585 HWTEST_F(PkgMangerTest, TestGZipBuffer, TestSize.Level1)
586 {
587     PkgMangerTest test;
588     Hpackage::ZipFileInfo zipInfo;
589     std::vector<uint8_t> digest(32);
590     std::vector<uint8_t> uncompressedData;
591     EXPECT_EQ(0, test.TestDecompressGzip(zipInfo, uncompressedData, digest));
592     int32_t ret = 0;
593     for (int32_t i = 0; i < ZIP_MAX_LEVEL; i++) {
594         zipInfo.level = i;
595         ret = test.TestCompressBuffer(zipInfo.fileInfo, uncompressedData, digest);
596         if (ret == 0) {
597             break;
598         }
599     }
600     EXPECT_EQ(0, ret);
601     uncompressedData.clear();
602 }
603 
604 HWTEST_F(PkgMangerTest, TestLz4Buffer, TestSize.Level1)
605 {
606     PkgMangerTest test;
607     Hpackage::Lz4FileInfo lz4Info;
608     std::vector<uint8_t> digest(32);
609     std::vector<uint8_t> uncompressedData;
610     EXPECT_EQ(0, test.TestDecompressLz4(lz4Info, uncompressedData, digest));
611     int32_t ret = 0;
612     for (int32_t i = 0; i < LZ4F_MAX_BLOCKID; i++) {
613         lz4Info.compressionLevel = 2;
614         lz4Info.blockSizeID = i;
615         ret = test.TestCompressBuffer(lz4Info.fileInfo, uncompressedData, digest);
616         if (ret == 0) {
617             break;
618         }
619     }
620     EXPECT_EQ(0, ret);
621     uncompressedData.clear();
622 }
623 
624 HWTEST_F(PkgMangerTest, TestInvalidCreatePackage, TestSize.Level1)
625 {
626     PkgMangerTest test;
627     EXPECT_EQ(0, test.TestPackagePack());
628     EXPECT_EQ(0, test.TestPackagePackFileNotExist());
629     EXPECT_EQ(0, test.TestPackagePackParamInvalid());
630 }
631 
632 HWTEST_F(PkgMangerTest, TestPkgStreamImpl, TestSize.Level1)
633 {
634     PkgMangerTest test;
635     EXPECT_EQ(0, test.TestPkgStreamImpl());
636 }
637 
638 HWTEST_F(PkgMangerTest, TestInvalidStream, TestSize.Level1)
639 {
640     PkgMangerTest test;
641     EXPECT_EQ(0, test.TestInvalidStream());
642 }
643 
644 HWTEST_F(PkgMangerTest, TestRead, TestSize.Level1)
645 {
646     PkgMangerTest test;
647     EXPECT_EQ(0, test.TestRead());
648 }
649 
650 HWTEST_F(PkgMangerTest, TestCheckFile, TestSize.Level1)
651 {
652     PkgMangerTest test;
653     EXPECT_EQ(0, test.TestCheckFile());
654 }
655 
656 HWTEST_F(PkgMangerTest, TestCreatePackageFail, TestSize.Level1)
657 {
658     PkgMangerTest test;
659     EXPECT_EQ(0, test.TestCreatePackageInvalidFile());
660     EXPECT_EQ(0, test.TestCreatePackageInvalidSignMethod());
661     EXPECT_EQ(0, test.TestLz4PackageInvalidFile());
662     EXPECT_EQ(0, test.TestLz4PackageInvalidPkgType());
663     EXPECT_EQ(0, test.TestZipPackageInvalidFile());
664 }
665 
666 HWTEST_F(PkgMangerTest, TestLoadPackageFail, TestSize.Level1)
667 {
668     PkgMangerTest test;
669     EXPECT_EQ(0, test.TestLoadPackageFail());
670 }
671 
672 HWTEST_F(PkgMangerTest, TestReadWriteLENull, TestSize.Level1)
673 {
674     PkgMangerTest test;
675     test.TestReadWriteLENull();
676 }
677 }
678