用CPP程序测试C

这是一次尝试, 但是失败了, 本来想用CPP的匿名函数特性方便写mock测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
extern "C" {
#include
} // extern "C"

// 编写set_mock()以动态改变skproto_evtpool_updated_hook的接收者
std::function cur_hook;
extern "C" {
void skproto_evtpool_updated_hook(skproto_evtpool_t *obj, int evt_serial)
{
cur_hook(obj, evt_serial);
}
} // extern "C"

void set_mock(std::function p_mock_func)
{
cur_hook = p_mock_func;
}

void test_normal_usage(void **state)
{
skproto_evtpool_t evtpool;
int evt, arg;

// init
assert_true(skproto_evtpool_init(&evtpool) == 0);

// case
evt = 555; arg = 666;
expect_value(xx);
set_mock([=](skproto_evtpool_t *obj, int evt_serial) {
check_expected_ptr(xxx);
});
assert_true(skproto_evtpool_raise(&evtpool, evt, arg) == 0);
}

但是发现cmocka的宏_check_expected用到了__func__, 这样就没法用匿名函数了.. 因为首先在expect_xxx宏中就要传入个函数名.

感觉可以试试gtest这种直接就是用来测试CPP的框架, 理由是:

  • 线程安全, cmocka无法在多线程环境中的mock函数中做assert, 否则可能错误
  • 支持C++11, 可以自然地使用匿名函数方便测试