Я новичок в модульном тестировании в 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)
Спасибо вам за ваши предложения!
Задача ещё не решена.
Других решений пока нет …