Модульное тестирование системных вызовов в Linux

Я новичок в модульном тестировании в 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

для использованияоткрыто

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

gcovr -f usingopen (это застревает после того, как LD_PRELOAD установлен в openstub.so)

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

0 ответов

Другие вопросы по тегам