Cmocka を使用して、C で記述された共有オブジェクトの単体テスト スイートを作成していますが、問題が発生しています。ソースコードを共有できないため、何が問題なのかを示すために、最小限の「動作しない」例を作成しました。
私のプログラムは、foo.c、foo.h、bar.c、bar.h、main.c の 5 つのファイルで構成されています。
- bar.* ファイルは bar() 関数を定義します。この関数は単純に 2 を掛けた引数を返します。
- foo.* ファイルは、bar.h で定義された bar() 関数を使用する foo() 関数を宣言します。
- main.c には、単純な cmocka テストと__wrap_bar()が含まれています。
関数で、引数に 3 を掛けたものを返します。
libfootest.so オブジェクト (foo+bar) を作成してプログラムをコンパイルし、このオブジェクトを main.o にリンクして、-Wl,--wrap=bar フラグをコンパイラに渡します。この構成では、 libfootestがテスト対象のモジュールであり、main がテスター プログラムです。__wrap__bar が呼び出される (テストに失敗する) ことを期待していますが、標準の bar() が呼び出されます (テストに合格)。どうすればこの問題を解決できますか? 以下に、私が使用しているすべてのコードを示します。
bar.c:
#include "bar.h"
int bar(int val) {
return val*2;
}
bar.h:
int bar(int val);
foo.h:
#include <stdio.h>
int foo(int val);
foo.c:
#include "foo.h"
#include "bar.h"
int foo(int val) {
int ret;
ret = bar(val);
printf("RET: %d", ret);
return ret;
}
main.c:
#include <stdio.h>
//required include for CMOCKA
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <setjmp.h>
#include <cmocka.h>
//library under test
#include "foo.h"
int __wrap_bar(int val) {
return 3*val;
}
static void test_foo(void **state) {
int ret = foo(5);
assert_int_equal(ret, 10);
}
int main (int argc, char** argv) {
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_foo),
};
return cmocka_run_group_tests(tests, NULL, NULL);
}
メイクファイル:
CMOCKA_LIB_DIR=../../cmocka-1.1.5/build/src
CXXFLAGS+=-g -Og -fPIC
CFLAGS+=-g -Og -std=c99 -fPIC
CC=gcc
CXX=g++
all: main.o ./libfootest.so
gcc -o linux-test -g -L. -L$(CMOCKA_LIB_DIR) $(filter %.o, $^) -lcmocka -lfootest -Wl,-rpath=. -Wall -Wl,--wrap=bar -Wl,-rpath=$(CMOCKA_LIB_DIR)
./libfootest.so: foo.o bar.o
$(CC) -shared -o $@ -g $^ -pedantic -Wall
clean:
rm -f *.o
rm -f *.so