我正在编写一些常见的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')