C言語のレガシーコードに対してテストを追加するときに、大量のスタブを作るのが面倒だったので、自動生成するツールを作ってみました。
インストール
$ gem install cstub
使い方
例として次のようなコードのスタブを作ります。
my_dependency.h
typedef int MY_INT;
typedef enum {
ERROR_NONE,
ERROR_PARAMETER,
} ERROR_CODE;
extern int depend_function(int);
extern MY_INT depend_function2(volatile unsigned int a, int b, int c);
extern ERROR_CODE depend_function3(int);
my_product_code.c
#include "my_dependency.h"
ERROR_CODE hello(int a)
{
int b = depend_function(a);
MY_INT c = depend_function2(b, 1, 2);
return depend_function3(c);
}
my_product_code.c
のリンクが通るようにするには、depend_function()
とdepend_function2()
とdepend_function3()
のスタブが必要です。
これを確かめるには一旦コンパイル&リンクしてnm
で確かめるのが早いでしょう。
$ arm-none-eabi-gcc -c my_product_code.c -o my_product_code.o
$ arm-none-eabi-nm -u my_product_code.o > filter.txt
$ cat filter.txt
U depend_function
U depend_function2
U depend_function3
my_product_code.c
とfilter.txt
を元にスタブを生成することができます。
$ cstub my_product_code.c --filter filter.txt --cpp "arm-none-eabi-gcc -P -E" -D__extension__
int depend_function(int par0)
{
return 0;
}
MY_INT depend_function2(volatile unsigned int a, int b, int c)
{
return 0;
}
ERROR_CODE depend_function3(int par0)
{
return ERROR_NONE;
}
注意点
コンパイラの拡張でparseが失敗することがあるので、その場合は拡張を無効にするようなマクロを定義してやってください。上の例だと"-D__extension__
"がそれに当たります。
その他
C言語のモックフレームワークはいろいろありますが、単に空処理の関数が欲しい時は、こういうので十分かと思いました。
ソース