我是 C++ 单元测试的新手。我正在使用 googletest 对包含 linux 系统调用的源执行单元测试(并使用 gcovr 进行覆盖率报告)。为了测试它们,我想到了两种方法
1. 使用**LD_PRELOAD(通过存根自己的系统调用实现,例如写入、读取等)**
2. 使用 --wrap链接器选项将实际系统调用与我的存根实现包装起来。
由于使用的系统调用的数量更多(open,write,read,fseek,socket等),使用选项2几乎是不可行的,因此我想到了使用方法1。
但是,我无法使用方法 1 生成覆盖率报告(我确实使用 --coverage 选项编译了我的存根库)。当我看到 strace 时,它被锁定了。我不知道如何解决这个问题。所以我想保留系统调用而不是创建虚拟设备文件并处理它们。(例如:/sys/devices/system/cpu1/online --> /home/user/dummy/cpu/online)。
现在,我想模拟从写入系统调用到该文件的错误条件,但它似乎不起作用(例如,我已经使用 fcntl 函数设置了虚拟文件的 O_NONBLOCK 标志)。
我需要关于
1. 使用方法一,如何生成覆盖率报告?
2. 如果不能,如何设置虚拟文件与设备文件相同的属性。
只是我的代码的快照:openstub.c
#include <sys/types.h>
#include <sys/stat.h>
int open(const char *pathname, int flags, mode_t mode)
{
if(mode ==1)
{
return 1;
}
else
{
return 0;
}
}
使用open.c
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
char dummypath[]="dummypath";
int filehandle;
filehandle = open(dummypath,O_WRONLY);
if(0>filehandle)
printf("i am NOT using stubs\n");
else if(filehandle ==1) {
printf("I am using stub\n");
}
else
{
printf("I am using stub with Not the WRITE mode\n");
}
}
编译命令:
gcc -shared -fPIC -ftest-coverage -fprofile-arcs openstub.c -o openstub.so
用于使用打开
gcc -ftest-coverage -fprofile-arcs -o usingopen usingopen.c
gcovr -f usingopen
(这在 LD_PRELOAD 设置为 openstub.so 后卡住了)
谢谢你的建议!