簡體   English   中英

Ceedling/CMock:將 va_list 添加到:treat_as_array:產生 TypeError

[英]Ceedling/CMock: Adding va_list to :treat_as_array: produces a TypeError

我正在為一些非開源繼承代碼開發一些單元測試。 現在我剛剛測試了 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 在 mocking 以下 function 時遇到錯誤:

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:沒有將字符串隱式轉換為 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:沒有將字符串隱式轉換為 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問題談到缺少對可變函數的支持:

所以我想我只是想弄清楚這是一個不受支持的功能還是我做錯了什么。

任何幫助將不勝感激。

最好的問候,GCT。

所以看來我錯誤地添加了 va_list 。

它需要是:

  :treat_as_array:
    va_list

現在 cmock 不再抱怨模擬模塊了。

我找不到任何關於如何向:treat_as_array: 添加內容的示例,所以希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM