如何对特定的DML方法进行单元测试?



我正在编写一些常见的DML代码,其中包含一个相当复杂的方法,如:

saved uint32 checksum_ini;
method calculate_checksum(bytes_t data) -> (uint32 sum) {
uint32 result = checksum_ini;
for (int i = 0; i < data.size; ++i) {
result = f(result, data.data[i]);
}
return result;
}

我的设备通过读写一些寄存器间接调用该函数,这使得对校验和算法的所有角落用例进行单元测试变得很麻烦。

我如何有效地为我的校验和实现编写单元测试?

一种方法是创建一个专用的测试模块,比如test-checksum,包含一个测试设备,比如test_checksum_dev,它只导入你的公共代码,并将calculate_checksum方法暴露给Python,在Python中很容易编写测试。这分两步完成:首先,将方法公开到C:

dml 1.4;
device test_checksum_dev;
import "checksum-common.dml";
// Make DML method calculate_checksum available as extern C symbol "calculate_checksum"
// The signature will be:
// uint64 calculate_checksum(conf_object_t *obj, bytes_t data)
export calculate_checksum as "calculate_checksum";

第二步是将其公开给Python。创建checksum.h:

#ifndef CHECKSUM_H
#define CHECKSUM_H
#include <simics/base/types.h>
#include <simics/pywrap.h>
extern uint32 calculate_checksum(conf_object_t *obj, bytes_t data);
#endif /* CHECKSUM_H */

(如果您还将header %{ #include "checksum.h" %}添加到DML文件中,您将获得签名保持一致的硬检查)。

现在将头文件添加到模块makefile中的IFACE_FILES中以创建Python包装:

SRC_FILES = test-checksum.dml
IFACE_FILES = checksum.h
include $(MODULE_MAKEFILE)

您现在可以直接从测试中调用DML方法:

SIM_load_module('test-checksum')
from simmod.test_checksum.checksum import calculate_checksum
obj = SIM_create_object('test_checksum_dev', 'dev', checksum_ini=0xdeadbeef)
assert calculate_checksum(obj, b'hello world') == (0xda39ba47).to_bytes(4, 'little')

相关内容

  • 没有找到相关文章

最新更新