【问题标题】:Ceedling/CMock: Adding va_list to :treat_as_array: produces a TypeErrorCeedling/CMock:将 va_list 添加到 :treat_as_array:会产生 TypeError
【发布时间】:2022-08-04 20:48:13
【问题描述】:

我正在为一些非开源继承代码开发一些单元测试。现在我刚刚测试了 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:没有将字符串隐式转换为整数

** 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:没有将字符串隐式转换为整数

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

达到这一点,我对尝试什么的想法更少了。我还打开了issue on the github for ceedling 说明这个问题,但我希望从其他可能也遇到这个问题的用户那里得到一些意见。

我的 ceedling 版本如下(Ubuntu 18.04.2):

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

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

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

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

任何帮助将不胜感激。

此致, GCT。

    标签: c unit-testing embedded cmock ceedling


    【解决方案1】:

    所以看来我错误地添加了 va_list 。

    它需要是:

      :treat_as_array:
        va_list
    

    现在 cmock 不再抱怨模拟模块了。

    我找不到任何关于如何向 :treat as_array: 添加内容的示例,所以希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      • 2020-02-22
      • 2016-08-01
      • 2018-09-15
      • 2018-09-22
      • 1970-01-01
      相关资源
      最近更新 更多