c - Cmocka:检查作为参数传递的结构



假设我声明了一个名为foo的C结构体,它有一个名为bar的int字段和一个名为baz的char *字段。

我如何使用ccmoka expect_check_expected宏来检查传递的结构是否正确并且两个字段都有预期的值?如果文档中有一个例子,我错过了。


[Update]也许我可以使用expect_check()?但是我找不到一个例子:-(

使用expect_memory(...)check_expected(...):

例子:

我假设在测试fut下有一个函数,它调用子函数subfunc。你的结构看起来像这样:

typedef struct foo_s {
  int bar;
  int baz;
} foo;

你的试驾函数可以是这样的:

void test(void **state) {
   foo myfoo = {
     .bar = 42,
     .baz = 13,
   };
   expect_memory(subfunc, param, &myfoo, sizeof(foo));
   fut();
}

子函数可以是这样的:

void subfunc(foo *param){
   check_expected(param);
}

比较结构体的内存在大多数情况下可能有效,但是如果编译器在那里放置一些填充字节,则会有一些无法控制的字节,并且可能具有随机值。这意味着您的测试可能并不总是产生相同的结果,这会导致非常恼人的调试会话。

例如,如果你有这样一个结构体:

typedef struct {
    uint8_t c;
    uint32_t i;
} tSomeStruct

你可能会认为ci是紧挨着的,sizeof( tSomeStruct )返回5。但是,如果您尝试这样做,您会惊讶地发现,sizeof( tSomeStruct )实际上更有可能返回8。这是因为前面提到的填充字节。您不知道这些其他字节的值是什么。你可以通过在使用结构体之前将其设置为0来解决这个问题,但是这有点粗糙,并且不是在所有情况下都有效。

可以使用expect_check( ... )check_expected( ... )来比较结构。这使您可以编写自己的比较函数。

下面是一个关于如何使用这个的例子(修改这个例子:Cmocka Gitlab)

typedef struct {
    char c;
    int i;
} tSomeStruct;
void mock_function( tSomeStruct* param )
{
    check_expected(param)
}
/* return 1 = true, return 0 = false */
int my_int_equal_check(const LargestIntegralType value,
                    const LargestIntegralType check_value_data)
{
    tSomeStruct* cast_value = ( tSomeStruct* ) value;
    tSomeStruct* cast_check_value_data = ( tSomeStruct* ) check_value_data;    
    if ( ( cast_value->c == cast_check_value_data->c )
    && ( cast_value->i == cast_check_value_data->i ) ) {
        return 1;
    }
    return 0;
}
void mytest(void **state)
{
    tSomeStruct struct = {
        .c = 'c',
        .i = 'i',
    }
    expect_check(mock_function, param, my_int_equal_check, &struct);
}

我不确定,但如果这是可能的,如果你不传递你的结构作为指针到你的函数,作为检查函数只需要LargestIntegralType。

我最近发现可以在check_expectedexpect_value中使用结构体成员:

typedef struct 
{
  int   a;
  float b;
} SomeStruct_t;
void mocked_function(SomeStruct_t* s)
{
  check_expected(s->a);
  check_expected(s->b);
}
void someTest(void **state)
{
  expect_value(mocked_function, s->a, 3);
  expect_value(mocked_function, s->b, 7.2);
  // ...
}

相关内容

  • 没有找到相关文章

最新更新