0

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
4

1 に答える 1