OpenHarmony开发板上验证hap包中集成的C/C++三方库

简介

理论上C/C++三方库的测试验证一般使用原生库自带的测试用例进行验证,但OpenHarmony的北向应用调用C/C++三方库是需要通过napi接口实现的,因此对于hap包中集成的C/C++三方库的验证也需要通过开发对应的napi接口来进行验证。

本文通过minizip为例介绍hap包中集成C/C++三方库的验证过程。

napi接口定义

C/C++三方库napi接口定义一般分2种情况

  • 有需求,需求方给出对应的napi接口定义。
  • 无需求,根据三方库功能自定义napi接口。

对于自定义的napi接口,需要覆盖主要功能,且需要返回测试的正确结果。对于较为复杂的三方库,我们也可以将原生库的测试用例封装成napi接口,通过应用的调用实现原生库的测试验证。

minizip三方库是无用户需求的,因此我们需要自己定义napi接口进行验证。首先确认该库的功能是对文件进行压缩和解压缩,其次对minizip原生库的测试用例进行分析发现,通过输入不同的参数实现不同能力的压缩和解压缩功能。因此我们可以设计出2个napi接口,一个实现压缩功能,另一个实现解压缩功能。而对于其他能力(如加解密,多文件等)通过传入参数进行实现。具体的接口如下:

export class minizipNapi {
    compress(data:miniProperty):number;         // 实现压缩功能
    decompress(data:miniProperty):number;       // 实现解压缩功能
}

其中miniProperty为实现压缩解压缩时的参数,具体内容如下:

export interface miniOptions {
    include_path?:number                // 是否包含路径
    compress_level?:number              // 压缩等级
    compress_method?:number             // 压缩方式
    overwrite?:number                   // 是否覆盖
    append?:number                      // 是否追加
    disk_size?:number                   // 文件大小
    follow_links?:number                // 遵循符号链接
    store_links?:number                 // 存储符号链接
    zip_cd?:number                      // 是否是zip压缩
    encoding?:number                    // 编码方式
    verbose?:number                     // 版本号
    aes?:number                         // 是否需要aes校验
    cert_path?:string                   // 校验文件路径
    cert_pwd?:string                    // 校验密码
}

export interface miniProperty {
    path:string                         // 解/压缩 路径
    password?:string                    // 解/压缩 密码
    operate?:string                     // 压缩/解压缩
    file_extract?:string                // 解压后文件夹名字
    option:miniOptions                  // 属性
    directory?:string                   // 解压缩文件目标路径
    files?:Array                // 压缩文件
}

通过以上的2个接口及对应的参数,我们就可以实现类似原生库的测试验证

接口测试

我们可以在应用中定义多个按钮,通过点击按钮实现对文件的压缩和解压缩功能。

  • 实现正常的文件压缩和解压缩
Button(this.button0Txt)
        .fontSize(50)
        .margin({top:30})
        .fontWeight(FontWeight.Normal)
        .onClick(() => {

          if (this.button0 == 0) {      // 压缩功能
            this.button0 = 1;
            this.button0Txt = "decompress"
            if (this.mzip != undefined) {
              console.info("[Minizip]start compress!");
              try {
                let result = this.mzip.compress({ path: this.dir + "result.zip", operate: "compress", option: { append: 1, compress_level: 9 }, files: [this.dir + "file1.txt"] })
                if (result == undefined) {  // 压缩失败
                  this.button0 = 0;
                  this.button0Txt = "compress"
                }
                console.info("[Minizip]compress result = " + JSON.stringify(result));
              }catch(e) {
                console.info("[Minizip] error : " + JSON.stringify(e));
              }
            }else {
              console.info("[Minizip] mzip is undefined!");
            }
          } else {              // 解压功能
            this.button0 = 0;
            this.button0Txt = "compress"
            if (this.mzip != undefined) {
              console.info("[Minizip]start decompress!");
              let result = this.mzip.decompress({path:this.dir + "result.zip", operate:"decompress", option:{overwrite:1, compress_level:9}, directory:this.dir + "out"})
              if (result == undefined) {  // 压缩失败
                  this.button0 = 0;
                  this.button0Txt = "decompress"
                }
              console.info("[Minizip]compress result = " + JSON.stringify(result));
            } else {
              console.info("[Minizip] mzip is undefined!");
            }
          }
        })
  • 在这我们可以看到,普通的压缩功能我们只需要设置被压缩的文件(files1.txt)以及生成的目标文件(result.zip),压缩方式以及压缩等级。其中被压缩文件和生成的目标文件都必须带有绝对路径,该路径的获取方式’this.dir = globalThis.abilityContext.filesDir + “/”‘,对应开发板上的具体路径为’/data/app/el2/100/base/com.example.minizip/haps/entry/files’.
  • 实现带密码的压缩和解压缩

    如果需要实现带密码的压缩的话,我们在普通的压缩基础上加上密码属性即可。
// 实现带密码的压缩,密码为test
let result = this.mzip.compressWithPsd({path:this.dir + "result1.zip", password:"test", operate:"compress", option:{overwrite:1,compress_level:9}, files:[this.dir + "file1.txt"]})

// 实现带密码的解压缩,密码为 test
let result = this.mzip.decompressWithPsd({path:this.dir + "result1.zip", password:"test", operate:"decompress", option:{overwrite:1, compress_level:9}, directory:this.dir + "out"})
  • 以此类推,我们可以根据各个参数的意义进行不同能力的压缩和解压缩功能测试验证。

测试结果验证

测试验证的结果我们可以根据返回值显示到屏幕上,这样比较直观,如:

this.button0Txt = "compress"
if (result == undefined) {  // 压缩失败
    this.button0 = 0;
    this.button0Txt = "compress"
}

压缩成功,我们按钮上显示为’decompress'(即压缩成功后,下一次按下按钮执行解压缩功能),而如果失败则还是显示为’compress’。当然除了程序中通过返回结果进行判断测试结果,我们还需要将实际的压缩文件拷贝出来验证压缩的正确性。解压后的文件可以直接通过cmp命令将其与被压缩的文件进行比较来验证功能的正确性。

阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.shuli.cc/?p=21705,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?