c - Ceedling/CMock:将va_list添加到:treat_as_array:产生TypeError.&l



我正在为一些非开源代码的继承代码开发一些单元测试。到目前为止,我一直在测试ceedling框架,使用自动生成的测试来确保一切正常运行。

当我为没有依赖关系的模块运行测试时,一切都很好,但是当我为一个有一堆依赖关系的模块运行测试时(我必须包括作为模拟):

#ifdef TEST
#include "unity.h"
#include "conn.h"
#include "mock_log.h"
#include "mock_memory.h"
#include "mock_rxbuffer.h"
#include "mock_txbuffer.h"

void setUp(void)
{
}
void tearDown(void)
{
}
void test_conn_NeedToImplement(void)
{
TEST_IGNORE_MESSAGE("Need to Implement conn");
}
#endif // TEST

Ceedling模拟以下函数时遇到错误:

void tx_push (struct txbuffer *tx, const char *format, va_list ap)

错误如下:

Test 'test_conn.c'
------------------
Generating runner for test_conn.c...
Compiling test_conn_runner.c...
Compiling mock_txbuffer.c...
build/test/mocks/mock_txbuffer.c: In function ‘CMockExpectParameters_tx_push’:
build/test/mocks/mock_txbuffer.c:420:31: warning: ‘sizeof’ on array function parameter ‘ap’ will return size of ‘__va_list_tag *’ [-Wsizeof-array-argument]
sizeof(va_list[sizeof(ap) == sizeof(va_list) ? 1 : -1])); /* add va_list to :treat_as_array if this causes an error */
^
build/test/mocks/mock_txbuffer.c:414:149: note: declared here
void CMockExpectParameters_tx_push(CMOCK_tx_push_CALL_INSTANCE* cmock_call_instance, struct txbuffer* tx, int tx_Depth, const char* format, va_list ap)
                                                                               ^~
build/test/mocks/mock_txbuffer.c:420:24: error: size of unnamed array is negative
sizeof(va_list[sizeof(ap) == sizeof(va_list) ? 1 : -1])); /* add va_list to :treat_as_array if this causes an error */
^
ERROR: Shell command failed.

因此,根据消息的建议,我将va_list添加到:treat_as_array:

:cmock:
:mock_prefix: mock_
:when_no_prototypes: :warn
:enforce_strict_ordering: TRUE
:plugins:
- :array
- :ignore
- :callback
:treat_as:
uint8:    HEX8
uint16:   HEX16
uint32:   UINT32
int8:     INT8
bool:     UINT8
:treat_as_array:
- va_list
:includes:
- <assert.h>
- <getopt.h>
- <libgen.h>
- <stdbool.h>
- <stdint.h>
- <stdio.h>
- <stdlib.h>
- <string.h>

这样做之后,我最终得到了一个新的错误(在调试中运行ceedling),格式为:

TypeError: no implicit conversion of String into Integer

** Invoke test:conn (first_time)
** Invoke test/test_conn.c (first_time, not_needed)
** Execute test:conn
** Invoke test_deps (first_time)
** Invoke directories (first_time)
** Invoke build/test/mocks (first_time, not_needed)
** Invoke build/artifacts (first_time, not_needed)
** Invoke build/test (first_time, not_needed)
** Invoke build/artifacts/test (first_time, not_needed)
** Invoke build/test/runners (first_time, not_needed)
** Invoke build/test/results (first_time, not_needed)
** Invoke build/test/out (first_time, not_needed)
** Invoke build/test/out/asm (first_time, not_needed)
** Invoke build/test/out/c (first_time, not_needed)
** Invoke build/test/cache (first_time, not_needed)
** Invoke build/test/dependencies (first_time, not_needed)
** Invoke build/logs (first_time, not_needed)
** Invoke build/temp (first_time, not_needed)
** Invoke build/test/preprocess/includes (first_time, not_needed)
** Invoke build/test/preprocess/files (first_time, not_needed)
** Invoke build/gcov/out (first_time, not_needed)
** Invoke build/gcov/results (first_time, not_needed)
** Invoke build/gcov/dependencies (first_time, not_needed)
** Invoke build/artifacts/gcov (first_time, not_needed)
** Execute directories
** Execute test_deps

Test 'test_conn.c'
------------------
Verbose: exec(): gcc -E -MM -MG -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "build/temp/_test_conn.c"
> Shell executed command:
'gcc -E -MM -MG -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "build/temp/_test_conn.c"'
> Produced output:
_test_conn.o: build/temp/_test_conn.c 
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h 
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h 
@@@@unity.h src/conn.h @@@@conn.h mock_log.h @@@@mock_log.h 
mock_memory.h @@@@mock_memory.h mock_rxbuffer.h @@@@mock_rxbuffer.h 
mock_txbuffer.h @@@@mock_txbuffer.h
** Invoke build/test/preprocess/includes/log.h (first_time, not_needed)
** Invoke src/log.h (first_time, not_needed)
Verbose: exec(): gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/log.h" -o "build/test/preprocess/files/log.h"
> Shell executed command:
'gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/log.h" -o "build/test/preprocess/files/log.h"'
** Invoke build/test/preprocess/includes/memory.h (first_time, not_needed)
** Invoke src/memory.h (first_time, not_needed)
Verbose: exec(): gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/memory.h" -o "build/test/preprocess/files/memory.h"
> Shell executed command:
'gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/memory.h" -o "build/test/preprocess/files/memory.h"'
** Invoke build/test/preprocess/includes/rxbuffer.h (first_time, not_needed)
** Invoke src/rxbuffer.h (first_time, not_needed)
Verbose: exec(): gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/rxbuffer.h" -o "build/test/preprocess/files/rxbuffer.h"
> Shell executed command:
'gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/rxbuffer.h" -o "build/test/preprocess/files/rxbuffer.h"'
** Invoke build/test/preprocess/includes/txbuffer.h (first_time, not_needed)
** Invoke src/txbuffer.h (first_time, not_needed)
Verbose: exec(): gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/txbuffer.h" -o "build/test/preprocess/files/txbuffer.h"
> Shell executed command:
'gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/txbuffer.h" -o "build/test/preprocess/files/txbuffer.h"'
** Invoke build/test/mocks/mock_log.c (first_time)
** Invoke build/test/cache/log.h (first_time, not_needed)
** Execute build/test/mocks/mock_log.c
Creating mock for log...
rake aborted!
TypeError: no implicit conversion of String into Integer
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:421:in `block in parse_args'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:411:in `each'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:411:in `parse_args'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:588:in `parse_declaration'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:45:in `block in parse'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:44:in `map'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:44:in `parse'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock.rb:48:in `generate_mock'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock.rb:32:in `block in setup_mocks'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock.rb:31:in `each'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock.rb:31:in `setup_mocks'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/generator.rb:50:in `generate_mock'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/rules_cmock.rake:8:in `block in <top (required)>'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/task_invoker.rb:60:in `block in invoke_test_mocks'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/task_invoker.rb:58:in `invoke_test_mocks'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/preprocessinator.rb:28:in `preprocess_test_and_invoke_test_mocks'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/test_invoker.rb:84:in `block in setup_and_invoke'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/test_invoker.rb:51:in `each'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/test_invoker.rb:51:in `setup_and_invoke'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/rules_tests.rake:70:in `block (2 levels) in <top (required)>'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/bin/ceedling:345:in `block in <top (required)>'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/bin/ceedling:332:in `<top (required)>'
/usr/local/bin/ceedling:23:in `load'
/usr/local/bin/ceedling:23:in `<main>'
Tasks: TOP => build/test/mocks/mock_log.c
(See full trace by running task with --trace)
--------------------
OVERALL TEST SUMMARY
--------------------
No tests executed.

如果我从:treat_as_array中删除va_list,我可以成功地测试具有依赖关系的模块,只要它们没有将va_list作为输入的函数。否则,即使没有va_list函数,我仍然会得到相同的错误:

TypeError: no implicit conversion of String into Integer

所以在我看来,我将va_list包含到:treat_as_array的方式可能存在问题?

到了这个时候,我几乎不知道该尝试什么了。我也在github上为ceedling打开了一个问题,说明了这个问题,但我希望从其他可能遇到这个问题的ceedling用户那里得到一些输入。

我的初始版本如下(Ubuntu 18.04.2):

Ceedling:: 0.31.1
Unity:: 2.5.4
CMock:: 2.5.4
CException:: 1.3.3

我在这里看到的堆栈交换中有一个类似的问题,但是没有将va_list添加到:treat_as_array的额外步骤。

并且有几个github问题讨论缺乏对变量函数的支持:

https://github.com/ThrowTheSwitch/CMock/issues/397
  • https://github.com/ThrowTheSwitch/CMock/issues/204
  • https://github.com/ThrowTheSwitch/CMock/issues/129

所以我想我只是想弄清楚这是一个不支持的功能还是我做错了什么。

任何帮助都将不胜感激。

最诚挚的问候,GCT。

所以看来我添加va_list是错误的。

必须是:

:treat_as_array:
va_list

现在cmock不再抱怨被模拟的模块。

我找不到任何例子如何添加一些东西到:treat_as_array:,所以希望这有助于。

相关内容

  • 没有找到相关文章

最新更新