Код модульного тестирования, который содержит системные вызовы Linux - PullRequest
0 голосов
/ 24 августа 2018

Я новичок в модульном тестировании в C ++.Я использую googletest для выполнения модульного тестирования (и gcovr для отчета о покрытии) источников, содержащих системные вызовы linux.Чтобы проверить их, я подумал о 2 подходах

1.Использование ** LD_PRELOAD (путем создания собственной реализации системных вызовов, таких как запись, чтение и т. Д.) **

2.Использование опций компоновщика --wrap для переноса текущего системного вызова с моей реализацией заглушки.

Использование опции 2 мало осуществимо, поскольку число используемых системных вызовов больше (open, write, read, fseek, socketи так далее), поэтому я подумал об использовании метода 1.

Однако я не могу сгенерировать отчет о покрытии, используя метод 1 (я компилирую свою библиотеку-заглушку с опциями --coverage).Это становится заблокированным, когда я вижу strace.Я не знаю, как решить эту проблему.Поэтому я подумал о том, чтобы хранить системные вызовы, вместо этого создавать фиктивные файлы устройств и работать с ними.(например: / sys / devices / system / cpu1 / online -> / home / user / dummy / cpu / online).

Теперь я хочу смоделировать условие ошибки при записи системного вызова в этот файл, но, похоже, оно не работает (я уже установил, например, флаг O_NONBLOCK для фиктивного файла, используя функцию fcntl).

Мне нужны предложения по

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)

Спасибо за ваши предложения!

...