大數據

移植開源組件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

Leave a Reply

Your email address will not be published. Required fields are marked *