包含Linux系统调用的单元测试代码

时间:2018-08-24 13:46:55

标签: c++ linux unit-testing system-calls gcovr

我是C ++单元测试的新手。我正在使用googletest对包含linux系统调用的源执行单元测试(对覆盖率报告使用gcovr)。为了测试它们,我想到了两种方法

1。使用** LD_PRELOAD (通过对自己的系统调用的实现(例如写,读等)进行挂起)**

2。使用--wrap 链接器选项将实际的系统调用包装到我的存根实现中。

使用选项2几乎是不可行的,因为使用的系统调用数量更多(打开,写入,读取,fseek,套接字等等),因此我想到了使用方法1。

但是,我无法使用方法1生成覆盖率报告(我确实使用--coverage选项编译存根库)。当我看到strace时,它被锁定了。我不知道如何解决这个问题。因此,我想到了保留系统调用,而不是创建虚拟设备文件并对其进行处理。 (例如:/ sys / devices / system / cpu1 / online-> / home / user / dummy / cpu / online)。

现在,我想模拟从写入系统调用到此文件的错误情况,但它似乎不起作用(例如,我已经使用fcntl函数设置了虚拟文件的O_NONBLOCK标志)。

我需要有关

的建议

1。使用方法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;
    }
}

usingopen.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

使用open

gcc -ftest-coverage -fprofile-arcs -o usingopen usingopen.c

gcovr -f usingopen(在LD_PRELOAD设置为openstub.so之后卡住了)

谢谢您的建议!

0 个答案:

没有答案