移植开源组件mbedtls测试集到YoC

简介: 本文主要记录了将mbedtls移植到YoC的过程,为测试人员对其他开源组件测试集做移植提供参考。

本文主要记录了将mbedtls移植到YoC的过程,为测试人员对其他开源组件测试集做移植提供参考。 通常来说,知名开源组件测试集覆盖测试点广,质量较高,具有移植价值,但它们大多基于x86平台,并且包含较为复杂的测试框架,移植起来还是有一点难度的。

下面就以mbedtls为例,介绍一下其移植过程。

mbedtls测试集执行流程
参考github上mbedtls的readme.md及tests/Makefile, 可以知道,mbedtls测试集当中每个模块生成单独的可执行文件,以aes.ecb为例,涉及到的输入文件如下:

Main code file : suites/main_test.function
Platform code file : suites/host_test.function
Helper file : suites/helpers.function
Test suite file : suites/test_suite_aes.function
Test suite data : suites/test_suite_aes.ecb.data
Script file : scripts/generate_test_code.py
涉及到的输出文件如下:

Test suite file : test_suite_aes.ecb.c
Test suite data : test_suite_aes.ecb.datax
generate_test_code.py以.function文件为模板,参考.data文件生成test_suite_aes.ecb.c和test_suite_aes.ecb.datax。 以test_suite_aes.ecb.c为例,参考test_suite_aes.ecb.datax前两行:
AES-128-CBC Encrypt NIST KAT #1
2:hex:"fffffffffffff8000000000000000000":hex:"00000000000000000000000000000000":hex:"00000000000000000000000000000000":hex:"8b527a6aebdaec9eaef8eda2cb7783e5":int:0

第一行为case描述,第二行首先被parse_arguments分隔存入params数组,params第一个元素为2,参考test_funcs,对应要执行的function为test_aes_encrypt_cbc_wrapper,查看convert_params函数可以知道最终执行的函数调用为

unsigned char *p0 = {0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
size_t p1 = 16;
unsigned char *p2 ={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
size_t p3 = 16;
unsigned char *p4 ={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
size_t p5 = 16;
unsigned char *p6={0x8b,0x52,0x7a,0x6a,0xeb,0xda,0xec,0x9e,0xae,0xf8,0xed,0xa2,0xcb,0x77,0x83,0xe5};
size_t p7 = 16;
int p8 = 0
test_aes_encrypt_cbc ({p0,p1}, {p2,p3},{p4,p5},{p6,p7}, p8)
test_aes_encrypt_cbc里面使用TEST_ASSERT来判断case是否pass。

移植设计
首先,我们需要将datax文件放到YoC当中,目前YoC支持spiffs和lfs文件系统,这里我们以lfs为例,介绍一下如何将datax文件放入YoC。 参考

solutions_cb5654/smart_speaker_demo/app/src/audio/lfsdisk/README.md
可以将支持的模块的datax文件都放入一个文件夹,然后制作好镜像。
在要编译的package.yaml里面指定的config.yaml里面添加lfs分区,设定好大小,要和制作的lfs镜像文件的大小保持一致。 在要编译的package.yaml里面Makefile里面指定好编好的lfs镜像目录,将其copy到$(MK_GENERATED_IMGS_PATH)/data/lfs当中。
其次,mbedtls测试集使用了fgets来读取文件内容,YoC不支持FILE *指针,我们使用aos_read自己实现了fgets,代码如下:

static char my_fgets(int fd, char s, int n)
{
int c;
char *cs;
cs = s;
while(--n > 0 && (c = aos_read(fd, s, 1)) > 0)
{

  if((*cs++ = *s++) == '\n')
  {
    break;
  }

}
*cs = '0';
return (c == 0 && cs == s) ? NULL : s ;
}
fopen, fclose可以直接用aos_open, aos_close替换,feof逻辑使用do while循环替换。

问题及调试
YoC里面case是编译成一个solution,然后利用console组件aos_cli_register_command将需要执行的suite注册为串口命令,通过串口命令来执行对应的case。前面提到每个模块都会被编成单独的可执行文件,所以有各自的main函数,移植需要将各模块的main修改,这里采用的方式是修改main为$main_name,然后在scripts/generate_test_code.py里面add_input_info函数增加

snippets['main_name'] = c_file.strip("./")[:-2].replace(".","_")
另外,由于要读取的文件存入了lfs分区,需要修改suites/host_test.function里面的execute_tests将default_filename从"DATA_FILE"改为"/lfs/DATA_FILE"。

此外,由于用到了vfs相关api,需要在suites/helpers.function里面增加#include ,但这样会导致编译失败,由于我们不需要在x86平台生成可执行文件,可以修改tests/Makefile,注释掉$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $< $(MBEDTLS_TEST_OBJS) $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@。

编译过程还会缺乏文件,相关的都一并引入,如图image.png
需要在package.yaml当中的source_file里面添加

app/src/mbedtls_test/*.c
app/src/mbedtls_test/src/*.c
最后编译还是会报重复定义,在重复的函数名前添加static限定即可解决。

参考文件patch: https://gist.github.com/lzq420241/63ad7d7465c8452ba0c480d168c99748

相关文章
|
1月前
|
资源调度 测试技术 Linux
一款接口自动化神器—开源接口测试平台Lim(Less is More)
一款接口自动化神器—开源接口测试平台Lim(Less is More)
206 2
|
1月前
|
C++
jrtplib开源库系列之一:jrtplib介绍、安装和测试(window 10环境介绍)
关于jrtplib库网上已经有很多介绍,而且目前jrtplib作者已经停止更新(Apr 18, 2020),最新版本为v3.11.2。本系列内容也以该版本进行介绍。 相信你已经对RTP/RTCP协议有一定的了解,并想更深入的了解RTP协议的具体实现,jrtplib就是使用使用C++实现的RTP/RTCP协议。具体标准为RFC3550,如果想仔细阅读原文,但是对英文又有点吃力,可以参考我的博客RTP/RTCP中英文对照,在博客的后面有百度链接,是对RFC3550的中文翻译,可能很多地方不太准确,有些内容是自己添加进去的,希望不会影响你的阅读。
51 0
|
1月前
|
Web App开发 IDE 测试技术
【专栏】Selenium 是一款广泛使用的自动化测试框架:深入理解 Selenium 的核心组件
【4月更文挑战第27天】Selenium 是一款广泛使用的自动化测试框架,核心组件包括 WebDriver(与浏览器交互的接口,支持多浏览器测试),IDE(可视化的测试脚本录制和编辑工具)和 Grid(分布式测试,实现多机器并行测试)。通过这些组件,开发者能高效、稳定地进行自动化测试,但需注意浏览器兼容性、脚本维护和性能问题。理解并掌握这些组件的使用,能提升测试效率和质量。
|
26天前
|
NoSQL 关系型数据库 MySQL
软件测试之【基于开源商城系统fecmall功能测试项目实例】
软件测试之【基于开源商城系统fecmall功能测试项目实例】
54 0
软件测试之【基于开源商城系统fecmall功能测试项目实例】
|
1月前
|
资源调度 JavaScript 测试技术
单元测试:编写和运行Vue组件的单元测试
【4月更文挑战第23天】本文探讨了为Vue组件编写单元测试的重要性,以及如何设置测试环境、编写和运行测试。通过使用Jest或Mocha作为测试框架,结合Vue Test Utils,可以独立测试组件的功能,如渲染、事件处理和状态管理。编写测试用例时,应注意覆盖各种行为,并使用断言验证组件状态。运行测试并观察结果,确保测试独立性和高覆盖率。单元测试是保证代码质量和维护性的关键,应随着项目发展持续更新测试用例。
|
8月前
|
自然语言处理 前端开发 Java
您的智能测试助理来了!蚂蚁TestAgent开源,快来体验!
TestAgent 旨在构建测试领域的“智能体”,融合大模型和质量领域工程化技术,促进质量技术代系升级。我们期望和社区成员一起合作,打造创新的测试领域解决方案,构建24小时在线的测试助理服务,让测试如丝般顺滑。 很高兴地宣布,我们在国内首次开源了测试行业大模型及工具——TestAgent。本次版本包含了性能最强的7B测试领域大模型,以及配套的本地模型快速发布和体验工程化框架,欢迎体验和关注!
753 0
您的智能测试助理来了!蚂蚁TestAgent开源,快来体验!
|
1月前
|
设计模式 IDE 测试技术
深入理解自动化测试框架Selenium的核心组件
【2月更文挑战第30天】 在快速迭代的软件开发过程中,自动化测试已成为确保产品质量和加快上市速度的关键。本文将深入探讨Selenium这一广泛使用的自动化测试框架,剖析其核心组件以及它们如何协同工作以提供高效、灵活的测试解决方案。我们将从Selenium架构的基础出发,详细解读WebDriver API、Selenium Grid、以及各种语言绑定等关键部分,并讨论如何通过这些组件进行有效的UI测试。
|
1月前
|
运维 数据可视化 测试技术
Lag-Llama:第一个时间序列预测的开源基础模型介绍和性能测试
2023年10月,我们发表了一篇关于TimeGPT的文章,TimeGPT是时间序列预测的第一个基础模型之一,具有零样本推理、异常检测和共形预测能力。 虽然TimeGPT是一个专有模型,只能通过API访问。但是它还是引发了对时间序列基础模型的更多研究。到了2024年2月,已经有了一个用于时间序列预测的开源基础模型:laglllama。
247 2
|
1月前
|
存储 人工智能 自然语言处理
选择最适合数据的嵌入模型:OpenAI 和开源多语言嵌入的对比测试
OpenAI最近发布了他们的新一代嵌入模型*embedding v3*,他们将其描述为性能最好的嵌入模型,具有更高的多语言性能。这些模型分为两类:较小的称为text- embeddings -3-small,较大且功能更强大的称为text- embeddings -3-large。
172 0
|
1月前
|
Web App开发 Linux 数据安全/隐私保护
Docker本地部署开源浏览器Firefox并远程访问进行测试
Docker本地部署开源浏览器Firefox并远程访问进行测试
204 1