ThrowTheSwitch / Ceedling

Ruby-based unit testing and build system for C projects
http://throwtheswitch.org
Other
567 stars 241 forks source link

How to mock embedded codebases depending on FreeRTOS #579

Open second-string opened 3 years ago

second-string commented 3 years ago

EDIT: I think there are some better approaches that have been posted more recently - make sure you check out all of the alternative approaches to see what suits you best

Hi, I've searched pretty extensively on how to get this working, but I can't seem to find too many (if any) mentions of people running into this issue. I can't be the only person using CMock or Ceedling to mock unit tests within an embedded codebase including FreeRTOS, so I fear I'm missing something obvious.

Initially, I could get everything working with minimal hassle by including

    - ../libs/STM32_Cube/mccoy_st/Core/**
    - ../libs/STM32_Cube/mccoy_st/Drivers/**

along with my normal source file paths in the :paths:source: section of my project.yml.

Then when I wanted to start testing more of my files than a few fully decoupled algorithms, I ran into the issue where either those modules' header files, or headers that they included, in turn included files from the Middlewares directory of the FreeRTOS source files (which is the third and final dir that sits at the same level as Core and Drivers listed above).

No problem, I though, and dropped the Middlewares path below those two.

    - ../libs/STM32_Cube/mccoy_st/Core/**
    - ../libs/STM32_Cube/mccoy_st/Drivers/**
    - ../libs/STM32_Cube/mccoy_st/Middlewares/**

This then exploded into a ton of errors trying to compile FreeRTOS, most notably the one mentioned here: https://github.com/ThrowTheSwitch/Ceedling/issues/548 We previously had been using a support file for stubbing FreeRTOS files with 5 or 6 macros and functions definitions to avoid including the Middlewares folder in the tests, so I replaced that with an empty C file besides the line #include "freertos.c" to gte around the casing issues.

We also have been using multiple "stubbed" headers in lieu of our real source headers which were basically copies of the originals with functionality delicately carved out of them and no FreeRTOS dependencies. This was because even when using #include "mock_[filename].h" the generated mock files still include the original header file. We would include the stubbed headers with #ifdef UNIT_TEST throughout source header files, where UNIT_TEST was a define declared in our Ceedling project.yml.

The problem with this solution is that it doesn't scale, and at some point I'll run into something that I can't typedef void * or remove from a header.

I finally removed almost all of the errors by stubbing things out or partitioning header includes with #ifdef UNIT_TEST only to get down to a ton of errors about invalid __asm(...) calls from within FreeRTOS files. Obviously this is because Ceedling is using gcc to compile, but for our embedded project we're using arm-none-eabi-gcc.

So now I've gone down the route of adding in a custom compiler and linker into our project.yml file:

:tools:
  :test_compiler:
    :executable: arm-none-eabi-gcc
    :arguments:
      - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE               #expands to -I search paths
      - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR   #expands to -I search paths
      - -D$: COLLECTION_DEFINES_TEST_AND_VENDOR  #expands to all -D defined symbols
      - -c ${1}
      - -o ${2}
  :test_linker:
    :executable: arm-none-eabi-gcc
    :arguments:
      - ${1}
      - -o ${2}

and I switched :flags:test:compile: and :flags:test:compile: from what we had defined in there for 32-bit compilation with gcc to the same compilation/linking flags used when compiling with out STM32 makefile. I've fought through a dozen compilation and linking errors to finally get to one single linker issue:

Linking test_event_log.out...
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol Reset_Handler; defaulting to 0000000008000000
Running test_event_log.out...

ERROR: Test executable "test_event_log.out" failed.
> Produced no final test result counts in $stdout:
qemu: uncaught target signal 4 (Illegal instruction) - core dumped
Illegal instruction
> And exited with status: [0] (count of failed tests).
> This is often a symptom of a bad memory access in source or test code.

Running Hook post_test...
rake aborted!

It can't find that symbol because it's defined in a startup assembly file. It's located on the source paths, so I'm not sure why it's not included in compilation and linking. Regardless, I'm not really sure this approach will work / is worth it.

Finally to my actual question: am I going about this 100% wrong? Is there an easy way to stub/mock out layers way up before I did any of this that I'm just somehow missing? If I could use the standard compiler and not include this architecture-specific Middlewares directory I'd love that, but I'm lost as to how to do that without completely sullying all of my source header and implementation files with a ton of #ifdefs, writing a header stub for tons of files, and hand stubbing out every single FreeRTOS function signature that's called.

Letme commented 3 years ago

The first part seemed logical, but then the second part where you changed the compiler to the embedded one I kinda lost you. Are you trying to run binaries on target? Then I would assume .elf instead of .out and some more commands in project.yml to actually run (:simulator: fields). So that second route seems totally wrong. This also explains the problems you have with asm directive, as that is probably something tuned to arm (based on your includes).

Now for the first part. I haven't been doing much with FreeRTOS in the last 5 years, but I remember it was a bunch of quite standard C files. Glanced through the website quickly and I noticed you generate it per target - so my question: is your freetros generated for x86_64 or did you leave it for arm? The error in the other issue simply tells you you probably need mock_task.h before mock_freertos.h, and I would assume also FreeRTOSConfig.h somewhere on top.

second-string commented 3 years ago

It's only arm, which is why I figured I was going down the wrong path here. But if I can't compile that Middlewares folder, then any of the code I have that's utilizing FreeRTOS queues or tasks (which I feel like is pretty common) won't ever compile or link correctly for the tests. There will always be a large amount of "Undefined symbol XXX" where the symbol is located in Middleware. Here's a rough overview of what's in each of those FreeRTOS directories: image

I can see what I can get going from a fresh start and trying to mock every Middlewares implementation file with "mock_queue.h", "mock_task.h".

Letme commented 3 years ago

Ah I see your misunderstanding. CMock does not need source file- it needs header files and it generates mocks out of that. That means you basically include the path of the freertos and use mock_taks, etc. to generate source files (which are platform not specific) that then compile into platform specific binaries. So in your test file add mock_task.h and make sure that original task.h is inside include paths somewhere and Ceedling/CMock will find it and

second-string commented 3 years ago

So this still gives me an error

Test 'test_event_log.c'
-----------------------
Generating include list for semphr.h...
ceedling/temp/_semphr.h:32:3: error: #error "include FreeRTOS.h" must appear in source files before "include semphr.h"
  #error "include FreeRTOS.h" must appear in source files before "include semphr.h"

I'm assuming it's because the CMock mock generated headers are included in the compiler path before my individual includes (which does include the FreeRTOS.h file). This is the gcc call that errors:

'gcc -E -MM -MG -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.0/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.0/vendor/c_exception/lib" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.0/vendor/cmock/src" -I"ceedling/test/mocks" -I"../test" -I"../test/sunrise_data" -I"../test/statistics_data" -I"../test/ISO unit tests" -I"../test/ISO unit tests/python" -I"../test/ISO unit tests/python/__pycache__" -I"../test/support" -I"../app" -I"../app/src" -I"../app/inc" -I"../common" -I"../common/src" -I"../common/inc" -I"../periph" -I"../periph/src" -I"../periph/inc" -I"../hw" -I"../hw/src" -I"../hw/inc" -I"../libs/printf" -I"../libs/printf/src" -I"../libs/printf/inc" -I"../libs/STM32_Cube/my_project_st/Core" -I"../libs/STM32_Cube/my_project_st/Core/Inc" -I"../libs/STM32_Cube/my_project_st/Core/Src" -I"../libs/STM32_Cube/my_project_st/Drivers" -I"../libs/STM32_Cube/my_project_st/Drivers/STM32F7xx_HAL_Driver" -I"../libs/STM32_Cube/my_project_st/Drivers/STM32F7xx_HAL_Driver/Inc" -I"../libs/STM32_Cube/my_project_st/Drivers/STM32F7xx_HAL_Driver/Inc/Legacy" -I"../libs/STM32_Cube/my_project_st/Drivers/STM32F7xx_HAL_Driver/Src" -I"../libs/STM32_Cube/my_project_st/Drivers/CMSIS" -I"../libs/STM32_Cube/my_project_st/Drivers/CMSIS/Device" -I"../libs/STM32_Cube/my_project_st/Drivers/CMSIS/Device/ST" -I"../libs/STM32_Cube/my_project_st/Drivers/CMSIS/Device/ST/STM32F7xx" -I"../libs/STM32_Cube/my_project_st/Drivers/CMSIS/Device/ST/STM32F7xx/Include" -I"../libs/STM32_Cube/my_project_st/Drivers/CMSIS/Include" -I"../libs/STM32_Cube/my_project_st/Middlewares/Third_Party/FreeRTOS/Source/include" -I"../libs/STM32_Cube/my_project_st/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC" -I"../libs/STM32_Cube/my_project_st/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM7" -I"../libs/STM32_Cube/my_project_st/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1" -DUSE_FULL_LL_DRIVER -DUSE_HAL_DRIVER -DSTM32F765xx -DSTATIC_TESTABLE="" -DUNIT_TEST -DGNU_COMPILER "ceedling/temp/_semphr.h"'
Letme commented 3 years ago

Hm. Those includes also include sources of the directories, you do not want including. However, I am assuming that non-FreeRTOS version is working.

There is a setting in CMock which is:

:cmock:
    :includes_h_pre_orig_header:
        - 'FreeRTOS.h'

You also have includes_c_pre_header, but I don't think you need that.

second-string commented 3 years ago

I'm still getting the same error even with that added. Is there a way to stop the ceedling/cmock process without it cleaning up after itself? I want to be able to look at the generated mock file that's erroring to see where FreeRTOS.h is being included, but it's always removed after the test run fails.

I can see it did something, since it now "generates include list for FreeRTOS.h" first.

Test 'test_event_log.c'
-----------------------
Generating include list for FreeRTOS.h...
Generating include list for semphr.h...
ceedling/temp/_semphr.h:32:3: error: #error "include FreeRTOS.h" must appear in source files before "include semphr.h"
  #error "include FreeRTOS.h" must appear in source files before "include semphr.h"
   ^~~~~
ERROR: Shell command failed.
second-string commented 3 years ago

The reason the source files are included there is because those paths are all added under :paths:source:, which the Ceedling documentation says should include all source files, and can also include their headers.

second-string commented 3 years ago

I put together a barebones project that's showcasing what I'm running into. The description of the problem and 2 questions I have are in the README.

https://github.com/dot4qu/FreeRTOS-Ceedling-error-example

Letme commented 3 years ago

Based on example there (The log output) it is never creating mock_queue.h (at least the short bit), so I am expecting that your paths in project.yml are wrong. Care to explain where you run project.yml and why cant it be in application root, so that paths are easier to determine (also makefile is not there, for some strange reason)? Or you mean you execute from the libs/STM32_Cube/ceed_test_project_st/ directory always?

second-string commented 3 years ago

In response to this pull request: https://github.com/dot4qu/FreeRTOS-Ceedling-error-example/pull/1/commits/45d0f482a03b3cd06948b386c03fd0818c2c3d26

I've fixed the expect and return statement with correct arguments, which then allows ceedling to compile and pass the test. But i guess what I'm asking is how in the world is this supposed to scale?

For our production application, we multiple different peripherals and tasks all calling more functions. This depth is going to lead to so many ExpectAndReturn setups in each of the test functions. Why do I have to call one of the Expect, or Ignore, or AddCallback or whatever functions for the actual mocked function to be included in compilation and linking? I can see the function in the mock_queue.c file (which is in fact correctly generated), but why isn't it the default to surface that for my code-under-test to link against. Then if I do nothing, the mocked function will just exist and not do anything. If I want to mock out specific behavior, parameters, callbacks, and more, then I can use those applicable functions.

The reason the structure is like that is because it was the quickest way I could get a project set up. I didn't want to move the STM32_CubeMx generated makefile from that location because I didn't want to deal with refactoring it. Normally I would not have project.yml or my makefile down in the STM32 lib directories. The mock_queue.h/.c are correctly generated.

Letme commented 3 years ago

OK, so that is what was missing. You could also put mock_queue_Init(); in setup and mock_queue_Verify() in teardown to achieve the failing test case which will report: xQueue... called fewer times than expected . So I do not see how this does not scale - you need to declare mocked interfaces (and if you decide in strict ordering, that as well) and returned values for those mocks. That way you completely cut out the FreeRTOS from producing anything faulty as your test code will have a stable API. It will also make updating FreeRTOS easier (or replacing it with something else in the future).

So main thing that was missing (and even I did not think) was mock initialization. The reason for that is, that Ceedling only builds mocks you request - and I guess that request is based on Init and Verify instead of include. @mvandervoord maybe that is the reason?

So in short: You produce units where you only mock external API to that unit. That means FreeRTOS calls, and other components. I do not see how this does not scale?

second-string commented 3 years ago

So I eventually got this working in enough of a capacity to get all of the source code tested. I'm still not entirely sure I did this the "correct" way, since there seems to be some extra work that feels like it shouldn't be necessary. That being said, I want to detail it here for anyone else that finds this issue.

In the project.yml, the only FreeRTOS paths included were the original ones that I posted. The paths block in my project.yml looked like this:

:paths:
  :test:
    - +:../test/**
    - -:../test/support
  :source:
    - ../app/**
    - ../common/**
    - ../periph/**
    - ../hw/**
    - ../libs/STM32_Cube/[project_name]/Core/**
    - ../libs/STM32_Cube/[project_name]/Drivers/**
    - [a couple other unrelated libraries used]
  :support:
    - ../test/support
  :libraries: []

Like I mentioned before, there were many header and source files in our source code that included things from FreeRTOS that were not in the two included paths: mainly stuff like task.h, queue.h, semphr.h, etc, etc. These existed in the aforementioned Middlewares directory generated from STM32CubeMx, but that I couldn't include in our project.yml paths because of the HW-specific code in their dependencies, not necessarily they themselves.

My initial approach to fix this was using #ifdef UNIT_TEST which was defined in project.yml in all the areas of source code where we included these FreeRTOS header files. This was wrong (and super ugly).

The solution instead was to declare copies of these files in in the /test/support directory which you can see is defined under the support section of the project.yml paths. This meant that compiling our code for real with the arm compiler, it would correctly use the FreeRTOS header and source files, but when using Ceedling, our support headers would take the place of them and compile the same. This is what our support folder ended up looking like: image

This was still a decently manual process - for every function our code called or type it used that existed in the FreeRTOS headers, I had to copy that code out of the FreeRTOS header and into our fake support headers. This is an example of what a section of our custom queue.h support file looked like: image

You can see that everything is mostly copied from the FreeRTOS files, but some custom code had to be added/changed to prevent continuing dependencies deeper down into FreeRTOS code. One thing to ensure you get right is to copy the chain of dependencies exactly. So if your source code includes semphr.h but actually uses a typedef that's defined in a file that semphr.h includes, don't put that in your semphr.h support file. Generate the entire dependency chain of files exactly as they exist in the FreeRTOS directories. This might mean you have some support files that only exist with one or two includes in them for other support files - that's fine. It will save you a world of pain if you start getting deeper into the code used from FreeRTOS.

Now, ceedling wouldn't complain about , but instead throw a linker error since it couldn't find implementations of the functions we were stubbing in our support headers. To fix this last issue, we included the mocks for the fake headers. So if any source code called functions stubbed in the semphr.h FreeRTOS file, we'd transfer that stub to our header, then #include "mock_semphr.h" in the _test_ file. It's important to note that this works by including the mock in the test file because otherwise it would muck up the source code with#ifdef UNIT_TEST` once again.

There were also some weird issues still with the files on the FreeRTOS paths that were actually included, where ceedling would see the header but not the implementation, so we'd have to manually define the definition for say, vTaskDelay, in all of our test files that used source code calling that. This was a small enough number of functions not to bother me, but I think there's still something to fix there with the project.yml setup.

GlebPlekhotko commented 2 years ago

Hello, Reader!

This is quite stale issue, but I've recently run into the similar problems using a FreeRTOS-based project with the Ceedling as well. And here's how I dealt with it.

Let's consider there is a file name "Stuff.c" which addresses FreeRTOS features like queues. So at the beginning there should be something like this:

#include <FreeRTOS.h>
#include <queue.h>
#include "Stuff.h"

int stuffFunction(int *argument)
{
  return xQueueReceive(..., argument, ...);
}

You want to test a behavior of the "stuffFunction" which uses "xQueueReceive". Naturally, you're not going to use the "real" "xQueueReceive" and so want to generate a mock for it. So you create a file named "_TestStuff.c". And there is the following content:

#include "Stuff.h"
#include "Mock_queue.h"

void setUp(void) {};
void tearDown(void) {};

void test_stuffFunction(void) {
  TEST_ASSERT_EQUAL(-1, stuffFunction(NULL));
}

Here the "_Mock__" prefix informs Ceedling that a mock C file must be created based on the contents of the "queue.h". Prefix is specified in your project.yml file, so check it up.

If you fire "ceedling test:all" command, you will get the following error: error: #error "include FreeRTOS.h" must appear in source files before "include queue.h"

That is because to generate mocks Ceedling must preprocess and figure out dependencies of each particular file. And it is doing it by feeding them individually to the GCC along with -E -MF and other options. Of course, it doesn't know, that it must first include "FreeRTOS.h" and only after that start its fancy stuff. Hence, it issues the aforementioned error.

So you must make GCC include "FreeRTOS.h" before it starts handling "queue.h". That may be achieved by "-include" option, or more specifically "-include FreeRTOS.h". It must be added to the "tools" section of the "project.yml" file, subsections:

Here is how they look like in my case:

:tools:
  :test_file_preprocessor:
    :executable: gcc.exe
    :name: default_test_file_preprocessor
    :stderr_redirect: :none
    :background_exec: :none
    :optional: false
    :arguments:
    - ''
    - ''
    - "-E"
    - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
    - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
    - "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
    - "-D$": DEFINES_TEST_PREPROCESS
    - "-DGNU_COMPILER"
    - "-include FreeRTOS.h"
    - '"${1}"'
    - -o "${2}"
  :test_file_preprocessor_directives:
    :executable: gcc.exe
    :name: default_test_file_preprocessor_directives
    :stderr_redirect: :none
    :background_exec: :none
    :optional: false
    :arguments:
    - "-E"
    - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
    - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
    - "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
    - "-D$": DEFINES_TEST_PREPROCESS
    - "-DGNU_COMPILER"
    - "-include FreeRTOS.h"
    - "-fdirectives-only"
    - '"${1}"'
    - -o "${2}"
  :test_includes_preprocessor:
    :executable: gcc.exe
    :name: default_test_includes_preprocessor
    :stderr_redirect: :none
    :background_exec: :none
    :optional: false
    :arguments:
    - ''
    - ''
    - "-E"
    - "-MM"
    - "-MG"
    - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
    - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
    - "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
    - "-D$": DEFINES_TEST_PREPROCESS
    - "-DGNU_COMPILER"
    - "-include FreeRTOS.h"
    - '"${1}"'
  :test_dependencies_generator:
    :executable: gcc.exe
    :name: default_test_dependencies_generator
    :stderr_redirect: :none
    :background_exec: :none
    :optional: false
    :arguments:
    - ''
    - ''
    - "-E"
    - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
    - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
    - "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
    - "-D$": DEFINES_TEST_PREPROCESS
    - "-DGNU_COMPILER"
    - "-include FreeRTOS.h"
    - -MT "${3}"
    - "-MM"
    - "-MD"
    - "-MG"
    - -MF "${2}"
    - -c "${1}"

This fix resolves "FreeRTOS.h" error, but tests runner will still fail to build. That is because generated "_Mockqueue.h" file will miss "#include " before "#include ". To fix this problem you must append the "includes" option to the "cmock" section in the "project.yml" file. Like this:

:cmock:
  :includes:
    - FreeRTOS.h 

And that's all, you have a working test suite to test FreeRTOS-based projects using Ceedling. Of course, you must reason about how you will test threads/tasks, but there are plethora of options, take your pick.

Good luck!

lorenz10 commented 1 year ago

@GlebPlekhotko thank you, your previous comment was really helpful !

luisGallet commented 1 year ago

@GlebPlekhotko I followed you example for mocking queue from FreeRTOS but it keeps failing building the test runner. It doesn't find the object definitions from queue.h The mocked queue file includes FreeRTOS.h before queue.h. I wonder if they need to be in more specific locations.

Error output from ceedling

Generating runner for test_odb_comms_manager.c...
Compiling test_odb_comms_manager_runner.c...
In file included from build/test/runners/test_odb_comms_manager_runner.c:7:
build/test/mocks/mock_queue.h:35:73: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
   35 | void xQueueGenericSend_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, const void* const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition, BaseType_t cmock_to_return);
      |                                                                         ^~~~~~~~~~~~~
      |                                                                         xQueueHandle
build/test/mocks/mock_queue.h:36:57: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
   36 | typedef BaseType_t (* CMOCK_xQueueGenericSend_CALLBACK)(QueueHandle_t xQueue, const void* const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition, int cmock_num_calls);
      |                                                         ^~~~~~~~~~~~~
      |                                                         xQueueHandle
build/test/mocks/mock_queue.h:37:36: error: unknown type name ‘CMOCK_xQueueGenericSend_CALLBACK’
   37 | void xQueueGenericSend_AddCallback(CMOCK_xQueueGenericSend_CALLBACK Callback);
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:38:29: error: unknown type name ‘CMOCK_xQueueGenericSend_CALLBACK’
   38 | void xQueueGenericSend_Stub(CMOCK_xQueueGenericSend_CALLBACK Callback);
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from build/test/runners/test_odb_comms_manager_runner.c:7:
build/test/mocks/mock_queue.h:41:82: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
   41 | void xQueueGenericSend_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, const void* const pvItemToQueue, int pvItemToQueue_Depth, TickType_t xTicksToWait, const BaseType_t xCopyPosition, BaseType_t cmock_to_return);
      |                                                                                  ^~~~~~~~~~~~~
      |                                                                                  xQueueHandle
build/test/mocks/mock_queue.h:57:66: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
   57 | void xQueuePeek_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, void* const pvBuffer, TickType_t xTicksToWait, BaseType_t cmock_to_return);
      |                                                                  ^~~~~~~~~~~~~
      |                                                                  xQueueHandle
build/test/mocks/mock_queue.h:58:50: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
   58 | typedef BaseType_t (* CMOCK_xQueuePeek_CALLBACK)(QueueHandle_t xQueue, void* const pvBuffer, TickType_t xTicksToWait, int cmock_num_calls);
      |                                                  ^~~~~~~~~~~~~
      |                                                  xQueueHandle
build/test/mocks/mock_queue.h:59:29: error: unknown type name ‘CMOCK_xQueuePeek_CALLBACK’
   59 | void xQueuePeek_AddCallback(CMOCK_xQueuePeek_CALLBACK Callback);
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:60:22: error: unknown type name ‘CMOCK_xQueuePeek_CALLBACK’
   60 | void xQueuePeek_Stub(CMOCK_xQueuePeek_CALLBACK Callback);
      |                      ^~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:63:75: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
   63 | void xQueuePeek_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, void* const pvBuffer, int pvBuffer_Depth, TickType_t xTicksToWait, BaseType_t cmock_to_return);
      |                                                                           ^~~~~~~~~~~~~
      |                                                                           xQueueHandle
build/test/mocks/mock_queue.h:81:73: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
   81 | void xQueuePeekFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, void* const pvBuffer, BaseType_t cmock_to_return);
      |                                                                         ^~~~~~~~~~~~~
      |                                                                         xQueueHandle
build/test/mocks/mock_queue.h:82:57: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
   82 | typedef BaseType_t (* CMOCK_xQueuePeekFromISR_CALLBACK)(QueueHandle_t xQueue, void* const pvBuffer, int cmock_num_calls);
      |                                                         ^~~~~~~~~~~~~
      |                                                         xQueueHandle
build/test/mocks/mock_queue.h:83:36: error: unknown type name ‘CMOCK_xQueuePeekFromISR_CALLBACK’
   83 | void xQueuePeekFromISR_AddCallback(CMOCK_xQueuePeekFromISR_CALLBACK Callback);
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:84:29: error: unknown type name ‘CMOCK_xQueuePeekFromISR_CALLBACK’
   84 | void xQueuePeekFromISR_Stub(CMOCK_xQueuePeekFromISR_CALLBACK Callback);
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:87:82: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
   87 | void xQueuePeekFromISR_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, void* const pvBuffer, int pvBuffer_Depth, BaseType_t cmock_to_return);
      |                                                                                  ^~~~~~~~~~~~~
      |                                                                                  xQueueHandle
build/test/mocks/mock_queue.h:103:69: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  103 | void xQueueReceive_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, void* const pvBuffer, TickType_t xTicksToWait, BaseType_t cmock_to_return);
      |                                                                     ^~~~~~~~~~~~~
      |                                                                     xQueueHandle
build/test/mocks/mock_queue.h:104:53: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  104 | typedef BaseType_t (* CMOCK_xQueueReceive_CALLBACK)(QueueHandle_t xQueue, void* const pvBuffer, TickType_t xTicksToWait, int cmock_num_calls);
      |                                                     ^~~~~~~~~~~~~
      |                                                     xQueueHandle
build/test/mocks/mock_queue.h:105:32: error: unknown type name ‘CMOCK_xQueueReceive_CALLBACK’; did you mean ‘CMOCK_grdSubjectCreate_CALLBACK’?
  105 | void xQueueReceive_AddCallback(CMOCK_xQueueReceive_CALLBACK Callback);
      |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                CMOCK_grdSubjectCreate_CALLBACK
build/test/mocks/mock_queue.h:106:25: error: unknown type name ‘CMOCK_xQueueReceive_CALLBACK’; did you mean ‘CMOCK_grdSubjectCreate_CALLBACK’?
  106 | void xQueueReceive_Stub(CMOCK_xQueueReceive_CALLBACK Callback);
      |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                         CMOCK_grdSubjectCreate_CALLBACK
build/test/mocks/mock_queue.h:109:78: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  109 | void xQueueReceive_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, void* const pvBuffer, int pvBuffer_Depth, TickType_t xTicksToWait, BaseType_t cmock_to_return);
      |                                                                              ^~~~~~~~~~~~~
      |                                                                              xQueueHandle
build/test/mocks/mock_queue.h:127:84: error: unknown type name ‘QueueHandle_t’
  127 | void uxQueueMessagesWaiting_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, const QueueHandle_t xQueue, UBaseType_t cmock_to_return);
      |                                                                                    ^~~~~~~~~~~~~
build/test/mocks/mock_queue.h:128:69: error: unknown type name ‘QueueHandle_t’
  128 | typedef UBaseType_t (* CMOCK_uxQueueMessagesWaiting_CALLBACK)(const QueueHandle_t xQueue, int cmock_num_calls);
      |                                                                     ^~~~~~~~~~~~~
build/test/mocks/mock_queue.h:141:84: error: unknown type name ‘QueueHandle_t’
  141 | void uxQueueSpacesAvailable_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, const QueueHandle_t xQueue, UBaseType_t cmock_to_return);
      |                                                                                    ^~~~~~~~~~~~~
build/test/mocks/mock_queue.h:142:69: error: unknown type name ‘QueueHandle_t’
  142 | typedef UBaseType_t (* CMOCK_uxQueueSpacesAvailable_CALLBACK)(const QueueHandle_t xQueue, int cmock_num_calls);
      |                                                                     ^~~~~~~~~~~~~
build/test/mocks/mock_queue.h:155:59: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  155 | void vQueueDelete_CMockExpect(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue);
      |                                                           ^~~~~~~~~~~~~
      |                                                           xQueueHandle
build/test/mocks/mock_queue.h:156:46: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  156 | typedef void (* CMOCK_vQueueDelete_CALLBACK)(QueueHandle_t xQueue, int cmock_num_calls);
      |                                              ^~~~~~~~~~~~~
      |                                              xQueueHandle
build/test/mocks/mock_queue.h:157:31: error: unknown type name ‘CMOCK_vQueueDelete_CALLBACK’; did you mean ‘CMOCK_grdSubjectCreate_CALLBACK’?
  157 | void vQueueDelete_AddCallback(CMOCK_vQueueDelete_CALLBACK Callback);
      |                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                               CMOCK_grdSubjectCreate_CALLBACK
build/test/mocks/mock_queue.h:158:24: error: unknown type name ‘CMOCK_vQueueDelete_CALLBACK’; did you mean ‘CMOCK_grdSubjectCreate_CALLBACK’?
  158 | void vQueueDelete_Stub(CMOCK_vQueueDelete_CALLBACK Callback);
      |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                        CMOCK_grdSubjectCreate_CALLBACK
build/test/mocks/mock_queue.h:169:80: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  169 | void xQueueGenericSendFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, const void* const pvItemToQueue, BaseType_t* const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition, BaseType_t cmock_to_return);
      |                                                                                ^~~~~~~~~~~~~
      |                                                                                xQueueHandle
build/test/mocks/mock_queue.h:170:64: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  170 | typedef BaseType_t (* CMOCK_xQueueGenericSendFromISR_CALLBACK)(QueueHandle_t xQueue, const void* const pvItemToQueue, BaseType_t* const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition, int cmock_num_calls);
      |                                                                ^~~~~~~~~~~~~
      |                                                                xQueueHandle
build/test/mocks/mock_queue.h:171:43: error: unknown type name ‘CMOCK_xQueueGenericSendFromISR_CALLBACK’
  171 | void xQueueGenericSendFromISR_AddCallback(CMOCK_xQueueGenericSendFromISR_CALLBACK Callback);
      |                                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:172:36: error: unknown type name ‘CMOCK_xQueueGenericSendFromISR_CALLBACK’
  172 | void xQueueGenericSendFromISR_Stub(CMOCK_xQueueGenericSendFromISR_CALLBACK Callback);
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:175:89: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  175 | void xQueueGenericSendFromISR_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, const void* const pvItemToQueue, int pvItemToQueue_Depth, BaseType_t* const pxHigherPriorityTaskWoken, int pxHigherPriorityTaskWoken_Depth, const BaseType_t xCopyPosition, BaseType_t cmock_to_return);
      |                                                                                         ^~~~~~~~~~~~~
      |                                                                                         xQueueHandle
build/test/mocks/mock_queue.h:195:73: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  195 | void xQueueGiveFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, BaseType_t* const pxHigherPriorityTaskWoken, BaseType_t cmock_to_return);
      |                                                                         ^~~~~~~~~~~~~
      |                                                                         xQueueHandle
build/test/mocks/mock_queue.h:196:57: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  196 | typedef BaseType_t (* CMOCK_xQueueGiveFromISR_CALLBACK)(QueueHandle_t xQueue, BaseType_t* const pxHigherPriorityTaskWoken, int cmock_num_calls);
      |                                                         ^~~~~~~~~~~~~
      |                                                         xQueueHandle
build/test/mocks/mock_queue.h:197:36: error: unknown type name ‘CMOCK_xQueueGiveFromISR_CALLBACK’
  197 | void xQueueGiveFromISR_AddCallback(CMOCK_xQueueGiveFromISR_CALLBACK Callback);
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:198:29: error: unknown type name ‘CMOCK_xQueueGiveFromISR_CALLBACK’
  198 | void xQueueGiveFromISR_Stub(CMOCK_xQueueGiveFromISR_CALLBACK Callback);
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:201:82: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  201 | void xQueueGiveFromISR_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, BaseType_t* const pxHigherPriorityTaskWoken, int pxHigherPriorityTaskWoken_Depth, BaseType_t cmock_to_return);
      |                                                                                  ^~~~~~~~~~~~~
      |                                                                                  xQueueHandle
build/test/mocks/mock_queue.h:217:76: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  217 | void xQueueReceiveFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, void* const pvBuffer, BaseType_t* const pxHigherPriorityTaskWoken, BaseType_t cmock_to_return);
      |                                                                            ^~~~~~~~~~~~~
      |                                                                            xQueueHandle
build/test/mocks/mock_queue.h:218:60: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  218 | typedef BaseType_t (* CMOCK_xQueueReceiveFromISR_CALLBACK)(QueueHandle_t xQueue, void* const pvBuffer, BaseType_t* const pxHigherPriorityTaskWoken, int cmock_num_calls);
      |                                                            ^~~~~~~~~~~~~
      |                                                            xQueueHandle
build/test/mocks/mock_queue.h:219:39: error: unknown type name ‘CMOCK_xQueueReceiveFromISR_CALLBACK’
  219 | void xQueueReceiveFromISR_AddCallback(CMOCK_xQueueReceiveFromISR_CALLBACK Callback);
      |                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:220:32: error: unknown type name ‘CMOCK_xQueueReceiveFromISR_CALLBACK’
  220 | void xQueueReceiveFromISR_Stub(CMOCK_xQueueReceiveFromISR_CALLBACK Callback);
      |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:223:85: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  223 | void xQueueReceiveFromISR_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, void* const pvBuffer, int pvBuffer_Depth, BaseType_t* const pxHigherPriorityTaskWoken, int pxHigherPriorityTaskWoken_Depth, BaseType_t cmock_to_return);
      |                                                                                     ^~~~~~~~~~~~~
      |                                                                                     xQueueHandle
build/test/mocks/mock_queue.h:245:87: error: unknown type name ‘QueueHandle_t’
  245 | void xQueueIsQueueEmptyFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, const QueueHandle_t xQueue, BaseType_t cmock_to_return);
      |                                                                                       ^~~~~~~~~~~~~
build/test/mocks/mock_queue.h:246:71: error: unknown type name ‘QueueHandle_t’
  246 | typedef BaseType_t (* CMOCK_xQueueIsQueueEmptyFromISR_CALLBACK)(const QueueHandle_t xQueue, int cmock_num_calls);
      |                                                                       ^~~~~~~~~~~~~
build/test/mocks/mock_queue.h:259:86: error: unknown type name ‘QueueHandle_t’
  259 | void xQueueIsQueueFullFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, const QueueHandle_t xQueue, BaseType_t cmock_to_return);
      |                                                                                      ^~~~~~~~~~~~~
build/test/mocks/mock_queue.h:260:70: error: unknown type name ‘QueueHandle_t’
  260 | typedef BaseType_t (* CMOCK_xQueueIsQueueFullFromISR_CALLBACK)(const QueueHandle_t xQueue, int cmock_num_calls);
      |                                                                      ^~~~~~~~~~~~~
build/test/mocks/mock_queue.h:273:91: error: unknown type name ‘QueueHandle_t’
  273 | void uxQueueMessagesWaitingFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, const QueueHandle_t xQueue, UBaseType_t cmock_to_return);
      |                                                                                           ^~~~~~~~~~~~~
build/test/mocks/mock_queue.h:274:76: error: unknown type name ‘QueueHandle_t’
  274 | typedef UBaseType_t (* CMOCK_uxQueueMessagesWaitingFromISR_CALLBACK)(const QueueHandle_t xQueue, int cmock_num_calls);
      |                                                                            ^~~~~~~~~~~~~
build/test/mocks/mock_queue.h:287:75: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  287 | void xQueueCRSendFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, const void* pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken, BaseType_t cmock_to_return);
      |                                                                           ^~~~~~~~~~~~~
      |                                                                           xQueueHandle
build/test/mocks/mock_queue.h:288:59: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  288 | typedef BaseType_t (* CMOCK_xQueueCRSendFromISR_CALLBACK)(QueueHandle_t xQueue, const void* pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken, int cmock_num_calls);
      |                                                           ^~~~~~~~~~~~~
      |                                                           xQueueHandle
build/test/mocks/mock_queue.h:289:38: error: unknown type name ‘CMOCK_xQueueCRSendFromISR_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  289 | void xQueueCRSendFromISR_AddCallback(CMOCK_xQueueCRSendFromISR_CALLBACK Callback);
      |                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                      CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:290:31: error: unknown type name ‘CMOCK_xQueueCRSendFromISR_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  290 | void xQueueCRSendFromISR_Stub(CMOCK_xQueueCRSendFromISR_CALLBACK Callback);
      |                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                               CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:293:84: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  293 | void xQueueCRSendFromISR_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, const void* pvItemToQueue, int pvItemToQueue_Depth, BaseType_t xCoRoutinePreviouslyWoken, BaseType_t cmock_to_return);
      |                                                                                    ^~~~~~~~~~~~~
      |                                                                                    xQueueHandle
build/test/mocks/mock_queue.h:307:78: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  307 | void xQueueCRReceiveFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, void* pvBuffer, BaseType_t* pxTaskWoken, BaseType_t cmock_to_return);
      |                                                                              ^~~~~~~~~~~~~
      |                                                                              xQueueHandle
build/test/mocks/mock_queue.h:308:62: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  308 | typedef BaseType_t (* CMOCK_xQueueCRReceiveFromISR_CALLBACK)(QueueHandle_t xQueue, void* pvBuffer, BaseType_t* pxTaskWoken, int cmock_num_calls);
      |                                                              ^~~~~~~~~~~~~
      |                                                              xQueueHandle
build/test/mocks/mock_queue.h:309:41: error: unknown type name ‘CMOCK_xQueueCRReceiveFromISR_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  309 | void xQueueCRReceiveFromISR_AddCallback(CMOCK_xQueueCRReceiveFromISR_CALLBACK Callback);
      |                                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                         CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:310:34: error: unknown type name ‘CMOCK_xQueueCRReceiveFromISR_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  310 | void xQueueCRReceiveFromISR_Stub(CMOCK_xQueueCRReceiveFromISR_CALLBACK Callback);
      |                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                  CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:313:87: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  313 | void xQueueCRReceiveFromISR_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, void* pvBuffer, int pvBuffer_Depth, BaseType_t* pxTaskWoken, int pxTaskWoken_Depth, BaseType_t cmock_to_return);
      |                                                                                       ^~~~~~~~~~~~~
      |                                                                                       xQueueHandle
build/test/mocks/mock_queue.h:335:68: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  335 | void xQueueCRSend_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, const void* pvItemToQueue, TickType_t xTicksToWait, BaseType_t cmock_to_return);
      |                                                                    ^~~~~~~~~~~~~
      |                                                                    xQueueHandle
build/test/mocks/mock_queue.h:336:52: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  336 | typedef BaseType_t (* CMOCK_xQueueCRSend_CALLBACK)(QueueHandle_t xQueue, const void* pvItemToQueue, TickType_t xTicksToWait, int cmock_num_calls);
      |                                                    ^~~~~~~~~~~~~
      |                                                    xQueueHandle
build/test/mocks/mock_queue.h:337:31: error: unknown type name ‘CMOCK_xQueueCRSend_CALLBACK’
  337 | void xQueueCRSend_AddCallback(CMOCK_xQueueCRSend_CALLBACK Callback);
      |                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:338:24: error: unknown type name ‘CMOCK_xQueueCRSend_CALLBACK’
  338 | void xQueueCRSend_Stub(CMOCK_xQueueCRSend_CALLBACK Callback);
      |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:341:77: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  341 | void xQueueCRSend_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, const void* pvItemToQueue, int pvItemToQueue_Depth, TickType_t xTicksToWait, BaseType_t cmock_to_return);
      |                                                                             ^~~~~~~~~~~~~
      |                                                                             xQueueHandle
build/test/mocks/mock_queue.h:355:71: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  355 | void xQueueCRReceive_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, void* pvBuffer, TickType_t xTicksToWait, BaseType_t cmock_to_return);
      |                                                                       ^~~~~~~~~~~~~
      |                                                                       xQueueHandle
build/test/mocks/mock_queue.h:356:55: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  356 | typedef BaseType_t (* CMOCK_xQueueCRReceive_CALLBACK)(QueueHandle_t xQueue, void* pvBuffer, TickType_t xTicksToWait, int cmock_num_calls);
      |                                                       ^~~~~~~~~~~~~
      |                                                       xQueueHandle
build/test/mocks/mock_queue.h:357:34: error: unknown type name ‘CMOCK_xQueueCRReceive_CALLBACK’; did you mean ‘CMOCK_uxQueueSpacesAvailable_CALLBACK’?
  357 | void xQueueCRReceive_AddCallback(CMOCK_xQueueCRReceive_CALLBACK Callback);
      |                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                  CMOCK_uxQueueSpacesAvailable_CALLBACK
build/test/mocks/mock_queue.h:358:27: error: unknown type name ‘CMOCK_xQueueCRReceive_CALLBACK’; did you mean ‘CMOCK_uxQueueSpacesAvailable_CALLBACK’?
  358 | void xQueueCRReceive_Stub(CMOCK_xQueueCRReceive_CALLBACK Callback);
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                           CMOCK_uxQueueSpacesAvailable_CALLBACK
build/test/mocks/mock_queue.h:361:80: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  361 | void xQueueCRReceive_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, void* pvBuffer, int pvBuffer_Depth, TickType_t xTicksToWait, BaseType_t cmock_to_return);
      |                                                                                ^~~~~~~~~~~~~
      |                                                                                xQueueHandle
build/test/mocks/mock_queue.h:373:73: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  373 | void xQueueCreateMutex_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t cmock_to_return);
      |                                                                         ^~~~~~~~~~~~~
      |                                                                         xQueueHandle
build/test/mocks/mock_queue.h:377:80: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  377 | void xQueueCreateMutex_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t cmock_to_return);
      |                                                                                ^~~~~~~~~~~~~
      |                                                                                xQueueHandle
build/test/mocks/mock_queue.h:379:100: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  379 | void xQueueCreateMutex_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, const uint8_t ucQueueType, QueueHandle_t cmock_to_return);
      |                                                                                                    ^~~~~~~~~~~~~
      |                                                                                                    xQueueHandle
build/test/mocks/mock_queue.h:380:24: error: expected declaration specifiers or ‘...’ before ‘*’ token
  380 | typedef QueueHandle_t (* CMOCK_xQueueCreateMutex_CALLBACK)(const uint8_t ucQueueType, int cmock_num_calls);
      |                        ^
build/test/mocks/mock_queue.h:381:36: error: unknown type name ‘CMOCK_xQueueCreateMutex_CALLBACK’; did you mean ‘CMOCK_uxQueueMessagesWaiting_CALLBACK’?
  381 | void xQueueCreateMutex_AddCallback(CMOCK_xQueueCreateMutex_CALLBACK Callback);
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                    CMOCK_uxQueueMessagesWaiting_CALLBACK
build/test/mocks/mock_queue.h:382:29: error: unknown type name ‘CMOCK_xQueueCreateMutex_CALLBACK’; did you mean ‘CMOCK_uxQueueMessagesWaiting_CALLBACK’?
  382 | void xQueueCreateMutex_Stub(CMOCK_xQueueCreateMutex_CALLBACK Callback);
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                             CMOCK_uxQueueMessagesWaiting_CALLBACK
build/test/mocks/mock_queue.h:387:79: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  387 | void xQueueCreateMutexStatic_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t cmock_to_return);
      |                                                                               ^~~~~~~~~~~~~
      |                                                                               xQueueHandle
build/test/mocks/mock_queue.h:391:86: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  391 | void xQueueCreateMutexStatic_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t cmock_to_return);
      |                                                                                      ^~~~~~~~~~~~~
      |                                                                                      xQueueHandle
build/test/mocks/mock_queue.h:393:136: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  393 | void xQueueCreateMutexStatic_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, const uint8_t ucQueueType, StaticQueue_t* pxStaticQueue, QueueHandle_t cmock_to_return);
      |                                                                                                                                        ^~~~~~~~~~~~~
      |                                                                                                                                        xQueueHandle
build/test/mocks/mock_queue.h:394:24: error: expected declaration specifiers or ‘...’ before ‘*’ token
  394 | typedef QueueHandle_t (* CMOCK_xQueueCreateMutexStatic_CALLBACK)(const uint8_t ucQueueType, StaticQueue_t* pxStaticQueue, int cmock_num_calls);
      |                        ^
build/test/mocks/mock_queue.h:395:42: error: unknown type name ‘CMOCK_xQueueCreateMutexStatic_CALLBACK’
  395 | void xQueueCreateMutexStatic_AddCallback(CMOCK_xQueueCreateMutexStatic_CALLBACK Callback);
      |                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:396:35: error: unknown type name ‘CMOCK_xQueueCreateMutexStatic_CALLBACK’
  396 | void xQueueCreateMutexStatic_Stub(CMOCK_xQueueCreateMutexStatic_CALLBACK Callback);
      |                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:399:170: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  399 | void xQueueCreateMutexStatic_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, const uint8_t ucQueueType, StaticQueue_t* pxStaticQueue, int pxStaticQueue_Depth, QueueHandle_t cmock_to_return);
      |                                                                                                                                                                          ^~~~~~~~~~~~~
      |                                                                                                                                                                          xQueueHandle
build/test/mocks/mock_queue.h:409:85: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  409 | void xQueueCreateCountingSemaphore_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t cmock_to_return);
      |                                                                                     ^~~~~~~~~~~~~
      |                                                                                     xQueueHandle
build/test/mocks/mock_queue.h:413:92: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  413 | void xQueueCreateCountingSemaphore_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t cmock_to_return);
      |                                                                                            ^~~~~~~~~~~~~
      |                                                                                            xQueueHandle
build/test/mocks/mock_queue.h:415:149: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  415 | void xQueueCreateCountingSemaphore_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, QueueHandle_t cmock_to_return);
      |                                                                                                                                                     ^~~~~~~~~~~~~
      |                                                                                                                                                     xQueueHandle
build/test/mocks/mock_queue.h:416:24: error: expected declaration specifiers or ‘...’ before ‘*’ token
  416 | typedef QueueHandle_t (* CMOCK_xQueueCreateCountingSemaphore_CALLBACK)(const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, int cmock_num_calls);
      |                        ^
build/test/mocks/mock_queue.h:417:48: error: unknown type name ‘CMOCK_xQueueCreateCountingSemaphore_CALLBACK’
  417 | void xQueueCreateCountingSemaphore_AddCallback(CMOCK_xQueueCreateCountingSemaphore_CALLBACK Callback);
      |                                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:418:41: error: unknown type name ‘CMOCK_xQueueCreateCountingSemaphore_CALLBACK’
  418 | void xQueueCreateCountingSemaphore_Stub(CMOCK_xQueueCreateCountingSemaphore_CALLBACK Callback);
      |                                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:425:91: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  425 | void xQueueCreateCountingSemaphoreStatic_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t cmock_to_return);
      |                                                                                           ^~~~~~~~~~~~~
      |                                                                                           xQueueHandle
build/test/mocks/mock_queue.h:429:98: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  429 | void xQueueCreateCountingSemaphoreStatic_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t cmock_to_return);
      |                                                                                                  ^~~~~~~~~~~~~
      |                                                                                                  xQueueHandle
build/test/mocks/mock_queue.h:431:185: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  431 | void xQueueCreateCountingSemaphoreStatic_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t* pxStaticQueue, QueueHandle_t cmock_to_return);
      |                                                                                                                                                                                         ^~~~~~~~~~~~~
      |                                                                                                                                                                                         xQueueHandle
build/test/mocks/mock_queue.h:432:24: error: expected declaration specifiers or ‘...’ before ‘*’ token
  432 | typedef QueueHandle_t (* CMOCK_xQueueCreateCountingSemaphoreStatic_CALLBACK)(const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t* pxStaticQueue, int cmock_num_calls);
      |                        ^
build/test/mocks/mock_queue.h:433:54: error: unknown type name ‘CMOCK_xQueueCreateCountingSemaphoreStatic_CALLBACK’; did you mean ‘xQueueCreateCountingSemaphoreStatic_StopIgnore’?
  433 | void xQueueCreateCountingSemaphoreStatic_AddCallback(CMOCK_xQueueCreateCountingSemaphoreStatic_CALLBACK Callback);
      |                                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                                      xQueueCreateCountingSemaphoreStatic_StopIgnore
build/test/mocks/mock_queue.h:434:47: error: unknown type name ‘CMOCK_xQueueCreateCountingSemaphoreStatic_CALLBACK’; did you mean ‘xQueueCreateCountingSemaphoreStatic_StopIgnore’?
  434 | void xQueueCreateCountingSemaphoreStatic_Stub(CMOCK_xQueueCreateCountingSemaphoreStatic_CALLBACK Callback);
      |                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                               xQueueCreateCountingSemaphoreStatic_StopIgnore
build/test/mocks/mock_queue.h:437:219: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  437 | QueueCreateCountingSemaphoreStatic_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t* pxStaticQueue, int pxStaticQueue_Depth, QueueHandle_t cmock_to_return);
      |                                                                                                                                                                                                                     ^~~~~~~~~~~~~
      |                                                                                                                                                                                                                     xQueueHandle
build/test/mocks/mock_queue.h:455:75: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  455 | void xQueueSemaphoreTake_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, TickType_t xTicksToWait, BaseType_t cmock_to_return);
      |                                                                           ^~~~~~~~~~~~~
      |                                                                           xQueueHandle
build/test/mocks/mock_queue.h:456:59: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  456 | typedef BaseType_t (* CMOCK_xQueueSemaphoreTake_CALLBACK)(QueueHandle_t xQueue, TickType_t xTicksToWait, int cmock_num_calls);
      |                                                           ^~~~~~~~~~~~~
      |                                                           xQueueHandle
build/test/mocks/mock_queue.h:457:38: error: unknown type name ‘CMOCK_xQueueSemaphoreTake_CALLBACK’; did you mean ‘CMOCK_uxQueueSpacesAvailable_CALLBACK’?
  457 | void xQueueSemaphoreTake_AddCallback(CMOCK_xQueueSemaphoreTake_CALLBACK Callback);
      |                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                      CMOCK_uxQueueSpacesAvailable_CALLBACK
build/test/mocks/mock_queue.h:458:31: error: unknown type name ‘CMOCK_xQueueSemaphoreTake_CALLBACK’; did you mean ‘CMOCK_uxQueueSpacesAvailable_CALLBACK’?
  458 | void xQueueSemaphoreTake_Stub(CMOCK_xQueueSemaphoreTake_CALLBACK Callback);
      |                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                               CMOCK_uxQueueSpacesAvailable_CALLBACK
build/test/mocks/mock_queue.h:465:76: error: unknown type name ‘TaskHandle_t’; did you mean ‘xTaskHandle’?
  465 | void xQueueGetMutexHolder_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, TaskHandle_t cmock_to_return);
      |                                                                            ^~~~~~~~~~~~
      |                                                                            xTaskHandle
build/test/mocks/mock_queue.h:469:83: error: unknown type name ‘TaskHandle_t’; did you mean ‘xTaskHandle’?
  469 | void xQueueGetMutexHolder_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, TaskHandle_t cmock_to_return);
      |                                                                                   ^~~~~~~~~~~~
      |                                                                                   xTaskHandle
build/test/mocks/mock_queue.h:471:76: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  471 | void xQueueGetMutexHolder_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xSemaphore, TaskHandle_t cmock_to_return);
      |                                                                            ^~~~~~~~~~~~~
      |                                                                            xQueueHandle
build/test/mocks/mock_queue.h:471:102: error: unknown type name ‘TaskHandle_t’; did you mean ‘xTaskHandle’?
  471 | void xQueueGetMutexHolder_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xSemaphore, TaskHandle_t cmock_to_return);
      |                                                                                                      ^~~~~~~~~~~~
      |                                                                                                      xTaskHandle
build/test/mocks/mock_queue.h:472:23: error: expected declaration specifiers or ‘...’ before ‘*’ token
  472 | typedef TaskHandle_t (* CMOCK_xQueueGetMutexHolder_CALLBACK)(QueueHandle_t xSemaphore, int cmock_num_calls);
      |                       ^
build/test/mocks/mock_queue.h:473:39: error: unknown type name ‘CMOCK_xQueueGetMutexHolder_CALLBACK’
  473 | void xQueueGetMutexHolder_AddCallback(CMOCK_xQueueGetMutexHolder_CALLBACK Callback);
      |                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:474:32: error: unknown type name ‘CMOCK_xQueueGetMutexHolder_CALLBACK’
  474 | void xQueueGetMutexHolder_Stub(CMOCK_xQueueGetMutexHolder_CALLBACK Callback);
      |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:479:83: error: unknown type name ‘TaskHandle_t’; did you mean ‘xTaskHandle’?
  479 | void xQueueGetMutexHolderFromISR_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, TaskHandle_t cmock_to_return);
      |                                                                                   ^~~~~~~~~~~~
      |                                                                                   xTaskHandle
build/test/mocks/mock_queue.h:483:90: error: unknown type name ‘TaskHandle_t’; did you mean ‘xTaskHandle’?
  483 | void xQueueGetMutexHolderFromISR_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, TaskHandle_t cmock_to_return);
      |                                                                                          ^~~~~~~~~~~~
      |                                                                                          xTaskHandle
build/test/mocks/mock_queue.h:485:83: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  485 | void xQueueGetMutexHolderFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xSemaphore, TaskHandle_t cmock_to_return);
      |                                                                                   ^~~~~~~~~~~~~
      |                                                                                   xQueueHandle
build/test/mocks/mock_queue.h:485:109: error: unknown type name ‘TaskHandle_t’; did you mean ‘xTaskHandle’?
  485 | void xQueueGetMutexHolderFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xSemaphore, TaskHandle_t cmock_to_return);
      |                                                                                                             ^~~~~~~~~~~~
      |                                                                                                             xTaskHandle
build/test/mocks/mock_queue.h:486:23: error: expected declaration specifiers or ‘...’ before ‘*’ token
  486 | typedef TaskHandle_t (* CMOCK_xQueueGetMutexHolderFromISR_CALLBACK)(QueueHandle_t xSemaphore, int cmock_num_calls);
      |                       ^
build/test/mocks/mock_queue.h:487:46: error: unknown type name ‘CMOCK_xQueueGetMutexHolderFromISR_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  487 | void xQueueGetMutexHolderFromISR_AddCallback(CMOCK_xQueueGetMutexHolderFromISR_CALLBACK Callback);
      |                                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                              CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:488:39: error: unknown type name ‘CMOCK_xQueueGetMutexHolderFromISR_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  488 | void xQueueGetMutexHolderFromISR_Stub(CMOCK_xQueueGetMutexHolderFromISR_CALLBACK Callback);
      |                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                       CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:499:80: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  499 | void xQueueTakeMutexRecursive_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xMutex, TickType_t xTicksToWait, BaseType_t cmock_to_return);
      |                                                                                ^~~~~~~~~~~~~
      |                                                                                xQueueHandle
build/test/mocks/mock_queue.h:500:64: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  500 | typedef BaseType_t (* CMOCK_xQueueTakeMutexRecursive_CALLBACK)(QueueHandle_t xMutex, TickType_t xTicksToWait, int cmock_num_calls);
      |                                                                ^~~~~~~~~~~~~
      |                                                                xQueueHandle
build/test/mocks/mock_queue.h:501:43: error: unknown type name ‘CMOCK_xQueueTakeMutexRecursive_CALLBACK’
  501 | void xQueueTakeMutexRecursive_AddCallback(CMOCK_xQueueTakeMutexRecursive_CALLBACK Callback);
      |                                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:502:36: error: unknown type name ‘CMOCK_xQueueTakeMutexRecursive_CALLBACK’
  502 | void xQueueTakeMutexRecursive_Stub(CMOCK_xQueueTakeMutexRecursive_CALLBACK Callback);
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:515:80: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  515 | void xQueueGiveMutexRecursive_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xMutex, BaseType_t cmock_to_return);
      |                                                                                ^~~~~~~~~~~~~
      |                                                                                xQueueHandle
build/test/mocks/mock_queue.h:516:64: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  516 | typedef BaseType_t (* CMOCK_xQueueGiveMutexRecursive_CALLBACK)(QueueHandle_t xMutex, int cmock_num_calls);
      |                                                                ^~~~~~~~~~~~~
      |                                                                xQueueHandle
build/test/mocks/mock_queue.h:517:43: error: unknown type name ‘CMOCK_xQueueGiveMutexRecursive_CALLBACK’
  517 | void xQueueGiveMutexRecursive_AddCallback(CMOCK_xQueueGiveMutexRecursive_CALLBACK Callback);
      |                                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:518:36: error: unknown type name ‘CMOCK_xQueueGiveMutexRecursive_CALLBACK’
  518 | void xQueueGiveMutexRecursive_Stub(CMOCK_xQueueGiveMutexRecursive_CALLBACK Callback);
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:523:75: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  523 | void xQueueGenericCreate_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t cmock_to_return);
      |                                                                           ^~~~~~~~~~~~~
      |                                                                           xQueueHandle
build/test/mocks/mock_queue.h:527:82: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  527 | void xQueueGenericCreate_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t cmock_to_return);
      |                                                                                  ^~~~~~~~~~~~~
      |                                                                                  xQueueHandle
build/test/mocks/mock_queue.h:529:165: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  529 | void xQueueGenericCreate_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType, QueueHandle_t cmock_to_return);
      |                                                                                                                                                                     ^~~~~~~~~~~~~
      |                                                                                                                                                                     xQueueHandle
build/test/mocks/mock_queue.h:530:24: error: expected declaration specifiers or ‘...’ before ‘*’ token
  530 | typedef QueueHandle_t (* CMOCK_xQueueGenericCreate_CALLBACK)(const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType, int cmock_num_calls);
      |                        ^
build/test/mocks/mock_queue.h:531:38: error: unknown type name ‘CMOCK_xQueueGenericCreate_CALLBACK’; did you mean ‘CMOCK_grdSubjectCreate_CALLBACK’?
  531 | void xQueueGenericCreate_AddCallback(CMOCK_xQueueGenericCreate_CALLBACK Callback);
      |                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                      CMOCK_grdSubjectCreate_CALLBACK
build/test/mocks/mock_queue.h:532:31: error: unknown type name ‘CMOCK_xQueueGenericCreate_CALLBACK’; did you mean ‘CMOCK_grdSubjectCreate_CALLBACK’?
  532 | void xQueueGenericCreate_Stub(CMOCK_xQueueGenericCreate_CALLBACK Callback);
      |                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                               CMOCK_grdSubjectCreate_CALLBACK
build/test/mocks/mock_queue.h:541:71: error: unknown type name ‘QueueSetHandle_t’; did you mean ‘xQueueSetHandle’?
  541 | void xQueueCreateSet_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetHandle_t cmock_to_return);
      |                                                                       ^~~~~~~~~~~~~~~~
      |                                                                       xQueueSetHandle
build/test/mocks/mock_queue.h:545:78: error: unknown type name ‘QueueSetHandle_t’; did you mean ‘xQueueSetHandle’?
  545 | void xQueueCreateSet_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetHandle_t cmock_to_return);
      |                                                                              ^~~~~~~~~~~~~~~~
      |                                                                              xQueueSetHandle
build/test/mocks/mock_queue.h:547:109: error: unknown type name ‘QueueSetHandle_t’; did you mean ‘xQueueSetHandle’?
  547 | void xQueueCreateSet_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, const UBaseType_t uxEventQueueLength, QueueSetHandle_t cmock_to_return);
      |                                                                                                             ^~~~~~~~~~~~~~~~
      |                                                                                                             xQueueSetHandle
build/test/mocks/mock_queue.h:548:27: error: expected declaration specifiers or ‘...’ before ‘*’ token
  548 | typedef QueueSetHandle_t (* CMOCK_xQueueCreateSet_CALLBACK)(const UBaseType_t uxEventQueueLength, int cmock_num_calls);
      |                           ^
build/test/mocks/mock_queue.h:549:34: error: unknown type name ‘CMOCK_xQueueCreateSet_CALLBACK’
  549 | void xQueueCreateSet_AddCallback(CMOCK_xQueueCreateSet_CALLBACK Callback);
      |                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:550:27: error: unknown type name ‘CMOCK_xQueueCreateSet_CALLBACK’
  550 | void xQueueCreateSet_Stub(CMOCK_xQueueCreateSet_CALLBACK Callback);
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:561:70: error: unknown type name ‘QueueSetMemberHandle_t’; did you mean ‘xQueueSetMemberHandle’?
  561 | void xQueueAddToSet_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet, BaseType_t cmock_to_return);
      |                                                                      ^~~~~~~~~~~~~~~~~~~~~~
      |                                                                      xQueueSetMemberHandle
build/test/mocks/mock_queue.h:561:112: error: unknown type name ‘QueueSetHandle_t’; did you mean ‘xQueueSetHandle’?
  561 | void xQueueAddToSet_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet, BaseType_t cmock_to_return);
      |                                                                                                                ^~~~~~~~~~~~~~~~
      |                                                                                                                xQueueSetHandle
build/test/mocks/mock_queue.h:562:54: error: unknown type name ‘QueueSetMemberHandle_t’; did you mean ‘xQueueSetMemberHandle’?
  562 | typedef BaseType_t (* CMOCK_xQueueAddToSet_CALLBACK)(QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet, int cmock_num_calls);
      |                                                      ^~~~~~~~~~~~~~~~~~~~~~
      |                                                      xQueueSetMemberHandle
build/test/mocks/mock_queue.h:562:96: error: unknown type name ‘QueueSetHandle_t’; did you mean ‘xQueueSetHandle’?
  562 | typedef BaseType_t (* CMOCK_xQueueAddToSet_CALLBACK)(QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet, int cmock_num_calls);
      |                                                                                                ^~~~~~~~~~~~~~~~
      |                                                                                                xQueueSetHandle
build/test/mocks/mock_queue.h:563:33: error: unknown type name ‘CMOCK_xQueueAddToSet_CALLBACK’
  563 | void xQueueAddToSet_AddCallback(CMOCK_xQueueAddToSet_CALLBACK Callback);
      |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:564:26: error: unknown type name ‘CMOCK_xQueueAddToSet_CALLBACK’
  564 | void xQueueAddToSet_Stub(CMOCK_xQueueAddToSet_CALLBACK Callback);
      |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:577:75: error: unknown type name ‘QueueSetMemberHandle_t’; did you mean ‘xQueueSetMemberHandle’?
  577 | void xQueueRemoveFromSet_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet, BaseType_t cmock_to_return);
      |                                                                           ^~~~~~~~~~~~~~~~~~~~~~
      |                                                                           xQueueSetMemberHandle
build/test/mocks/mock_queue.h:577:117: error: unknown type name ‘QueueSetHandle_t’; did you mean ‘xQueueSetHandle’?
  577 | void xQueueRemoveFromSet_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet, BaseType_t cmock_to_return);
      |                                                                                                                     ^~~~~~~~~~~~~~~~
      |                                                                                                                     xQueueSetHandle
build/test/mocks/mock_queue.h:578:59: error: unknown type name ‘QueueSetMemberHandle_t’; did you mean ‘xQueueSetMemberHandle’?
  578 | typedef BaseType_t (* CMOCK_xQueueRemoveFromSet_CALLBACK)(QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet, int cmock_num_calls);
      |                                                           ^~~~~~~~~~~~~~~~~~~~~~
      |                                                           xQueueSetMemberHandle
build/test/mocks/mock_queue.h:578:101: error: unknown type name ‘QueueSetHandle_t’; did you mean ‘xQueueSetHandle’?
  578 | typedef BaseType_t (* CMOCK_xQueueRemoveFromSet_CALLBACK)(QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet, int cmock_num_calls);
      |                                                                                                     ^~~~~~~~~~~~~~~~
      |                                                                                                     xQueueSetHandle
build/test/mocks/mock_queue.h:579:38: error: unknown type name ‘CMOCK_xQueueRemoveFromSet_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  579 | void xQueueRemoveFromSet_AddCallback(CMOCK_xQueueRemoveFromSet_CALLBACK Callback);
      |                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                      CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:580:31: error: unknown type name ‘CMOCK_xQueueRemoveFromSet_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  580 | void xQueueRemoveFromSet_Stub(CMOCK_xQueueRemoveFromSet_CALLBACK Callback);
      |                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                               CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:587:75: error: unknown type name ‘QueueSetMemberHandle_t’; did you mean ‘xQueueSetMemberHandle’?
  587 | void xQueueSelectFromSet_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetMemberHandle_t cmock_to_return);
      |                                                                           ^~~~~~~~~~~~~~~~~~~~~~
      |                                                                           xQueueSetMemberHandle
build/test/mocks/mock_queue.h:591:82: error: unknown type name ‘QueueSetMemberHandle_t’; did you mean ‘xQueueSetMemberHandle’?
  591 | void xQueueSelectFromSet_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetMemberHandle_t cmock_to_return);
      |                                                                                  ^~~~~~~~~~~~~~~~~~~~~~
      |                                                                                  xQueueSetMemberHandle
build/test/mocks/mock_queue.h:593:75: error: unknown type name ‘QueueSetHandle_t’; did you mean ‘xQueueSetHandle’?
  593 | void xQueueSelectFromSet_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait, QueueSetMemberHandle_t cmock_to_return);
      |                                                                           ^~~~~~~~~~~~~~~~
      |                                                                           xQueueSetHandle
build/test/mocks/mock_queue.h:593:134: error: unknown type name ‘QueueSetMemberHandle_t’; did you mean ‘xQueueSetMemberHandle’?
  593 | void xQueueSelectFromSet_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait, QueueSetMemberHandle_t cmock_to_return);
      |                                                                                                                                      ^~~~~~~~~~~~~~~~~~~~~~
      |                                                                                                                                      xQueueSetMemberHandle
build/test/mocks/mock_queue.h:594:33: error: expected declaration specifiers or ‘...’ before ‘*’ token
  594 | typedef QueueSetMemberHandle_t (* CMOCK_xQueueSelectFromSet_CALLBACK)(QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait, int cmock_num_calls);
      |                                 ^
build/test/mocks/mock_queue.h:595:38: error: unknown type name ‘CMOCK_xQueueSelectFromSet_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  595 | void xQueueSelectFromSet_AddCallback(CMOCK_xQueueSelectFromSet_CALLBACK Callback);
      |                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                      CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:596:31: error: unknown type name ‘CMOCK_xQueueSelectFromSet_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  596 | void xQueueSelectFromSet_Stub(CMOCK_xQueueSelectFromSet_CALLBACK Callback);
      |                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                               CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:603:82: error: unknown type name ‘QueueSetMemberHandle_t’; did you mean ‘xQueueSetMemberHandle’?
  603 | void xQueueSelectFromSetFromISR_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetMemberHandle_t cmock_to_return);
      |                                                                                  ^~~~~~~~~~~~~~~~~~~~~~
      |                                                                                  xQueueSetMemberHandle
build/test/mocks/mock_queue.h:607:89: error: unknown type name ‘QueueSetMemberHandle_t’; did you mean ‘xQueueSetMemberHandle’?
  607 | void xQueueSelectFromSetFromISR_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetMemberHandle_t cmock_to_return);
      |                                                                                         ^~~~~~~~~~~~~~~~~~~~~~
      |                                                                                         xQueueSetMemberHandle
build/test/mocks/mock_queue.h:609:82: error: unknown type name ‘QueueSetHandle_t’; did you mean ‘xQueueSetHandle’?
  609 | void xQueueSelectFromSetFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetHandle_t xQueueSet, QueueSetMemberHandle_t cmock_to_return);
      |                                                                                  ^~~~~~~~~~~~~~~~
      |                                                                                  xQueueSetHandle
build/test/mocks/mock_queue.h:609:110: error: unknown type name ‘QueueSetMemberHandle_t’; did you mean ‘xQueueSetMemberHandle’?
  609 | void xQueueSelectFromSetFromISR_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueSetHandle_t xQueueSet, QueueSetMemberHandle_t cmock_to_return);
      |                                                                                                              ^~~~~~~~~~~~~~~~~~~~~~
      |                                                                                                              xQueueSetMemberHandle
build/test/mocks/mock_queue.h:610:33: error: expected declaration specifiers or ‘...’ before ‘*’ token
  610 | typedef QueueSetMemberHandle_t (* CMOCK_xQueueSelectFromSetFromISR_CALLBACK)(QueueSetHandle_t xQueueSet, int cmock_num_calls);
      |                                 ^
build/test/mocks/mock_queue.h:611:45: error: unknown type name ‘CMOCK_xQueueSelectFromSetFromISR_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  611 | void xQueueSelectFromSetFromISR_AddCallback(CMOCK_xQueueSelectFromSetFromISR_CALLBACK Callback);
      |                                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                             CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:612:38: error: unknown type name ‘CMOCK_xQueueSelectFromSetFromISR_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  612 | void xQueueSelectFromSetFromISR_Stub(CMOCK_xQueueSelectFromSetFromISR_CALLBACK Callback);
      |                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                      CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:623:77: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  623 | void vQueueWaitForMessageRestricted_CMockExpect(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely);
      |                                                                             ^~~~~~~~~~~~~
      |                                                                             xQueueHandle
build/test/mocks/mock_queue.h:624:64: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  624 | typedef void (* CMOCK_vQueueWaitForMessageRestricted_CALLBACK)(QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely, int cmock_num_calls);
      |                                                                ^~~~~~~~~~~~~
      |                                                                xQueueHandle
build/test/mocks/mock_queue.h:625:49: error: unknown type name ‘CMOCK_vQueueWaitForMessageRestricted_CALLBACK’; did you mean ‘vQueueWaitForMessageRestricted_Expect’?
  625 | void vQueueWaitForMessageRestricted_AddCallback(CMOCK_vQueueWaitForMessageRestricted_CALLBACK Callback);
      |                                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                                 vQueueWaitForMessageRestricted_Expect
build/test/mocks/mock_queue.h:626:42: error: unknown type name ‘CMOCK_vQueueWaitForMessageRestricted_CALLBACK’; did you mean ‘vQueueWaitForMessageRestricted_Expect’?
  626 | void vQueueWaitForMessageRestricted_Stub(CMOCK_vQueueWaitForMessageRestricted_CALLBACK Callback);
      |                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                          vQueueWaitForMessageRestricted_Expect
build/test/mocks/mock_queue.h:641:74: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  641 | void xQueueGenericReset_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, BaseType_t xNewQueue, BaseType_t cmock_to_return);
      |                                                                          ^~~~~~~~~~~~~
      |                                                                          xQueueHandle
build/test/mocks/mock_queue.h:642:58: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  642 | typedef BaseType_t (* CMOCK_xQueueGenericReset_CALLBACK)(QueueHandle_t xQueue, BaseType_t xNewQueue, int cmock_num_calls);
      |                                                          ^~~~~~~~~~~~~
      |                                                          xQueueHandle
build/test/mocks/mock_queue.h:643:37: error: unknown type name ‘CMOCK_xQueueGenericReset_CALLBACK’
  643 | void xQueueGenericReset_AddCallback(CMOCK_xQueueGenericReset_CALLBACK Callback);
      |                                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:644:30: error: unknown type name ‘CMOCK_xQueueGenericReset_CALLBACK’
  644 | void xQueueGenericReset_Stub(CMOCK_xQueueGenericReset_CALLBACK Callback);
      |                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:657:67: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  657 | void vQueueSetQueueNumber_CMockExpect(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, UBaseType_t uxQueueNumber);
      |                                                                   ^~~~~~~~~~~~~
      |                                                                   xQueueHandle
build/test/mocks/mock_queue.h:658:54: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  658 | typedef void (* CMOCK_vQueueSetQueueNumber_CALLBACK)(QueueHandle_t xQueue, UBaseType_t uxQueueNumber, int cmock_num_calls);
      |                                                      ^~~~~~~~~~~~~
      |                                                      xQueueHandle
build/test/mocks/mock_queue.h:659:39: error: unknown type name ‘CMOCK_vQueueSetQueueNumber_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  659 | void vQueueSetQueueNumber_AddCallback(CMOCK_vQueueSetQueueNumber_CALLBACK Callback);
      |                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                       CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:660:32: error: unknown type name ‘CMOCK_vQueueSetQueueNumber_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  660 | void vQueueSetQueueNumber_Stub(CMOCK_vQueueSetQueueNumber_CALLBACK Callback);
      |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:673:77: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  673 | void uxQueueGetQueueNumber_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, UBaseType_t cmock_to_return);
      |                                                                             ^~~~~~~~~~~~~
      |                                                                             xQueueHandle
build/test/mocks/mock_queue.h:674:62: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  674 | typedef UBaseType_t (* CMOCK_uxQueueGetQueueNumber_CALLBACK)(QueueHandle_t xQueue, int cmock_num_calls);
      |                                                              ^~~~~~~~~~~~~
      |                                                              xQueueHandle
build/test/mocks/mock_queue.h:675:40: error: unknown type name ‘CMOCK_uxQueueGetQueueNumber_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  675 | void uxQueueGetQueueNumber_AddCallback(CMOCK_uxQueueGetQueueNumber_CALLBACK Callback);
      |                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                        CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:676:33: error: unknown type name ‘CMOCK_uxQueueGetQueueNumber_CALLBACK’; did you mean ‘CMOCK_xQueueIsQueueFullFromISR_CALLBACK’?
  676 | void uxQueueGetQueueNumber_Stub(CMOCK_uxQueueGetQueueNumber_CALLBACK Callback);
      |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                 CMOCK_xQueueIsQueueFullFromISR_CALLBACK
build/test/mocks/mock_queue.h:687:75: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  687 | void ucQueueGetQueueType_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, QueueHandle_t xQueue, uint8_t cmock_to_return);
      |                                                                           ^~~~~~~~~~~~~
      |                                                                           xQueueHandle
build/test/mocks/mock_queue.h:688:56: error: unknown type name ‘QueueHandle_t’; did you mean ‘xQueueHandle’?
  688 | typedef uint8_t (* CMOCK_ucQueueGetQueueType_CALLBACK)(QueueHandle_t xQueue, int cmock_num_calls);
      |                                                        ^~~~~~~~~~~~~
      |                                                        xQueueHandle
build/test/mocks/mock_queue.h:689:38: error: unknown type name ‘CMOCK_ucQueueGetQueueType_CALLBACK’
  689 | void ucQueueGetQueueType_AddCallback(CMOCK_ucQueueGetQueueType_CALLBACK Callback);
      |                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/test/mocks/mock_queue.h:690:31: error: unknown type name ‘CMOCK_ucQueueGetQueueType_CALLBACK’
  690 | void ucQueueGetQueueType_Stub(CMOCK_ucQueueGetQueueType_CALLBACK Callback);
      |                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ERROR: Shell command failed.
> Shell executed command:
'gcc -I"/var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.7.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"include" -I"../observer/include" -I"../grd-aws-iot/grd-aws-iot-device-sdk-embedded-C/platform/include" -I"/home/luis-gallet/esp/esp-idf/components/esp_common/include" -I"/home/luis-gallet/esp/esp-idf/components/freertos" -I"/home/luis-gallet/esp/esp-idf/components/freertos/include" -I"/home/luis-gallet/esp/esp-idf/components/freertos/include/freertos" -I"/home/luis-gallet/esp/esp-idf/components/freertos/port/linux/include" -DTEST -DGNU_COMPILER -g -c "build/test/runners/test_odb_comms_manager_runner.c" -o "build/test/out/c/test_odb_comms_manager_runner.o" -MMD -MF "build/test/dependencies/test_odb_comms_manager_runner.d"'
> And exited with status: [1].

#<Thread:0x000055adbc64bb70 /var/lib/gems/2.7.0/gems/ceedling-0.31.1/lib/ceedling/par_map.rb:7 run> terminated with exception (report_on_exception is true):
Traceback (most recent call last):
        11: from /var/lib/gems/2.7.0/gems/ceedling-0.31.1/lib/ceedling/par_map.rb:10:in `block (2 levels) in par_map'
        10: from /var/lib/gems/2.7.0/gems/ceedling-0.31.1/lib/ceedling/task_invoker.rb:97:in `block in invoke_test_objects'
         9: from /usr/share/rubygems-integration/all/gems/rake-13.0.1/lib/rake/task.rb:188:in `invoke'
         8: from /usr/share/rubygems-integration/all/gems/rake-13.0.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
         7: from /usr/share/rubygems-integration/all/gems/rake-13.0.1/lib/rake/task.rb:199:in `synchronize'
         6: from /usr/share/rubygems-integration/all/gems/rake-13.0.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
         5: from /usr/share/rubygems-integration/all/gems/rake-13.0.1/lib/rake/task.rb:281:in `execute'
         4: from /usr/share/rubygems-integration/all/gems/rake-13.0.1/lib/rake/task.rb:281:in `each'
         3: from /usr/share/rubygems-integration/all/gems/rake-13.0.1/lib/rake/task.rb:281:in `block in execute'
         2: from /var/lib/gems/2.7.0/gems/ceedling-0.31.1/lib/ceedling/rules_tests.rake:17:in `block in <top (required)>'
         1: from /var/lib/gems/2.7.0/gems/ceedling-0.31.1/lib/ceedling/generator.rb:99:in `generate_object_file'
/var/lib/gems/2.7.0/gems/ceedling-0.31.1/lib/ceedling/tool_executor.rb:88:in `exec': ShellExecutionException (ShellExecutionException)
rake aborted!
ShellExecutionException: ShellExecutionException
/var/lib/gems/2.7.0/gems/ceedling-0.31.1/lib/ceedling/tool_executor.rb:88:in `exec'
/var/lib/gems/2.7.0/gems/ceedling-0.31.1/lib/ceedling/generator.rb:99:in `generate_object_file'
/var/lib/gems/2.7.0/gems/ceedling-0.31.1/lib/ceedling/rules_tests.rake:17:in `block in <top (required)>'
/var/lib/gems/2.7.0/gems/ceedling-0.31.1/lib/ceedling/task_invoker.rb:97:in `block in invoke_test_objects'
/var/lib/gems/2.7.0/gems/ceedling-0.31.1/lib/ceedling/par_map.rb:10:in `block (2 levels) in par_map'
Tasks: TOP => build/test/out/c/test_odb_comms_manager_runner.o
(See full trace by running task with --trace)
ERROR: Ceedling Failed

Here's my project.yml:

---

# Notes:
# Sample project C code is not presently written to produce a release artifact.
# As such, release build options are disabled.
# This sample, therefore, only demonstrates running a collection of unit tests.

:project:
  :use_exceptions: FALSE
  :use_test_preprocessor: TRUE
  :use_preprocessor_directives: TRUE
  :build_root: build
#  :release_build: TRUE
  :test_file_prefix: test_
  :which_ceedling: gem
  :ceedling_version: 0.31.1
  :default_tasks:
    - test:all

#:test_build:
#  :use_assembly: TRUE

#:release_build:
#  :output: MyApp.out
#  :use_assembly: FALSE

:environment:
  - :path: 
    - "#{ENV['PATH']}"
    - "#{ENV['IDF_PATH']}"

:extension:
  :executable: .out

:paths:
  :test:
    - +:test/**
    - -:test/support
  :source:
    - odb_comms_manager.c
  :support:
    - test/support
  :include:
    - include/**
    - ../observer/include/**
    - ../grd-aws-iot/grd-aws-iot-device-sdk-embedded-C/platform/include/**
    - "#{ENV['IDF_PATH']}/components/esp_common/include/"
    - "#{ENV['IDF_PATH']}/components/freertos/"
    - "#{ENV['IDF_PATH']}/components/freertos/include/"
    - "#{ENV['IDF_PATH']}/components/freertos/include/freertos/"
    - "#{ENV['IDF_PATH']}/components/freertos/port/linux/include/"
  :libraries: []

:defines:
  # in order to add common defines:
  #  1) remove the trailing [] from the :common: section
  #  2) add entries to the :common: section (e.g. :test: has TEST defined)
  :common: &common_defines []
  :test:
    - *common_defines
    - TEST
  :test_preprocess:
    - *common_defines
    - TEST
    - configSUPPORT_DYNAMIC_ALLOCATION=1
    - INC_FREERTOS_H

:cmock:
  :verbosity: 3
  :includes:
    - FreeRTOS.h
  :strippables:
    - '(?:__attribute__\s*\(+.*?\)+)'
      # following functions are disabled by configQUEUE_REGISTRY_SIZE
    - '(?:vQueueAddToRegistry\s*\([\s\w\*_,]*\))'
    - '(?:vQueueUnregisterQueue\s*\([\s\w\*_,]*\))'
    - '(?:pcQueueGetName\s*\([\s\w\*_,]*\))'
      # following function is disabled by configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS
    - '(?:vTaskSetThreadLocalStoragePointerAndDelCallback\s*\([\s\w\*_,]*\))'
    - PRIVILEGED_FUNCTION
    - portDONT_DISCARD
  :mock_prefix: mock_
  :when_no_prototypes: :warn
  :enforce_strict_ordering: TRUE
  :plugins:
    - :ignore
    - :callback
    - :expect
    - :expect_any_args
    - :return_thru_ptr
    - :array
    - :ignore_arg
  :treat_as:
    uint8:    HEX8
    uint16:   HEX16
    uint32:   UINT32
    int8:     INT8
    bool:     UINT8
    QueueHandle_t: HEX32
# Add -gcov to the plugins list to make sure of the gcov plugin
# You will need to have gcov and gcovr both installed to make it work.
# For more information on these options, see docs in plugins/gcov
:gcov:
  :reports:
    - HtmlDetailed
  :gcovr:
    :html_medium_threshold: 75
    :html_high_threshold: 90

# Ceedling defaults to using gcc for compiling, linking, etc.
# As [:tools] is blank, gcc will be used (so long as it's in your system path)
# See documentation to configure a given toolchain for use
:tools:
  :test_file_preprocessor:
    :executable: gcc
    :name: default_test_file_preprocessor
    :stderr_redirect: :none
    :background_exec: :none
    :optional: false
    :arguments:
    - ''
    - ''
    - "-E"
    - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
    - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
    - "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
    - "-D$": DEFINES_TEST_PREPROCESS
    - "-DGNU_COMPILER"
    - "-include FreeRTOS.h"
    - '"${1}"'
    - -o "${2}"
  :test_file_preprocessor_directives:
    :executable: gcc
    :name: default_test_file_preprocessor_directives
    :stderr_redirect: :none
    :background_exec: :none
    :optional: false
    :arguments:
    - "-E"
    - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
    - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
    - "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
    - "-D$": DEFINES_TEST_PREPROCESS
    - "-DGNU_COMPILER"
    - "-include FreeRTOS.h"
    - "-fdirectives-only"
    - '"${1}"'
    - -o "${2}"
  :test_includes_preprocessor:
    :executable: gcc
    :name: default_test_includes_preprocessor
    :stderr_redirect: :none
    :background_exec: :none
    :optional: false
    :arguments:
    - ''
    - ''
    - "-E"
    - "-MM"
    - "-MG"
    - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
    - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
    - "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
    - "-D$": DEFINES_TEST_PREPROCESS
    - "-DGNU_COMPILER"
    - "-include FreeRTOS.h"
    - '"${1}"'
  :test_dependencies_generator:
    :executable: gcc
    :name: default_test_dependencies_generator
    :stderr_redirect: :none
    :background_exec: :none
    :optional: false
    :arguments:
    - ''
    - ''
    - "-E"
    - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
    - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
    - "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
    - "-D$": DEFINES_TEST_PREPROCESS
    - "-DGNU_COMPILER"
    - "-include FreeRTOS.h"
    - -MT "${3}"
    - "-MM"
    - "-MD"
    - "-MG"
    - -MF "${2}"
    - -c "${1}"

# LIBRARIES
# These libraries are automatically injected into the build process. Those specified as
# common will be used in all types of builds. Otherwise, libraries can be injected in just
# tests or releases. These options are MERGED with the options in supplemental yaml files.
:libraries:
  :placement: :end
  :flag: "-l${1}"
  :path_flag: "-L ${1}"
  :system: []    # for example, you might list 'm' to grab the math library
  :test: []
  :release: []

:plugins:
  :load_paths:
    - "#{Ceedling.load_path}"
  :enabled:
    - gcov
    - junit_tests_report
    - stdout_pretty_tests_report
    - module_generator
...

Any idea will be helpful! Thanks!

luisGallet commented 1 year ago

I found out why my setup was not working. I'm using the freertos version that comes with esp-idf v4.4, it includes portable.h and this file includes portmacro.h. The portmacro header file version is the linux one since I included this path in the project.yml "#{ENV['IDF_PATH']}/components/freertos/port/linux/include/", and this header file includes esp_attr.h. There are 3 definitions of this file in esp-idf v4.4 and I copied the one from components/mdns/test_afl_fuxx_host/ to the test/support folder. This was the reason the test runner was not compiling because this copy of esp_attr.h defines QUEUE_H so the test runner could not find all definitions from queue.h.

Once I deleted this define from my copy of esp_attr.h, ceedling could create a mock for queue.h and the test runner was successfully compiled.

Thanks to the solution from @GlebPlekhotko, I could get rid of these two defines I previously added to the test_preprocess: configSUPPORT_DYNAMIC_ALLOCATION=1 and INC_FREERTOS_H. I added those as a hacky solution to mock queue.h.

GlebPlekhotko commented 1 year ago

You're welcome!

oyeBilly commented 1 year ago

Hi @luisGallet I wonder if you could share an example project that builds unit tests and includes/mocks esp-idf components with ceedling? I am trying to build an example here: esp32 hello ceedling but have issues when I include the esp-idf/components folder in my source in project.yml.

Alternatively if you don't have an example could you take a look at mine and give me some clue or a working fork? I have tried throwtheswtich forums with no luck. Would be very grateful for some example to follow. Thanks!

luisGallet commented 1 year ago

Hi @luisGallet I wonder if you could share an example project that builds unit tests and includes/mocks esp-idf components with ceedling? I am trying to build an example here: esp32 hello ceedling but have issues when I include the esp-idf/components folder in my source in project.yml.

Alternatively if you don't have an example could you take a look at mine and give me some clue or a working fork? I have tried throwtheswtich forums with no luck. Would be very grateful for some example to follow. Thanks!

Hey @oyeBilly until now I have only mocked freeRTOS functions and esp_random.h. Here's my project.yml

---

# Notes:
# Sample project C code is not presently written to produce a release artifact.
# As such, release build options are disabled.
# This sample, therefore, only demonstrates running a collection of unit tests.

:project:
  :use_exceptions: FALSE
  :use_test_preprocessor: TRUE
  :use_preprocessor_directives: TRUE
  :build_root: build
#  :release_build: TRUE
  :test_file_prefix: test_
  :which_ceedling: gem
  :ceedling_version: 0.31.1
  :default_tasks:
    - test:all

#:test_build:
#  :use_assembly: TRUE

#:release_build:
#  :output: MyApp.out
#  :use_assembly: FALSE

:environment:
  - IDF_PATH: "#{ENV['IDF_PATH']}"
  - IDB_HOME: "#{ENV['IDB_HOME']}"

:extension:
  :executable: .out

:import:
  - esp-idf-includes.yml
  - components-includes.yml

:paths:
  :test:
    - +:test/**
    - -:test/support
  :source:
    - odb_comms_manager.c
  :support:
    - test/support
  :include:
    - include/
  :libraries: []

:defines:
  # in order to add common defines:
  #  1) remove the trailing [] from the :common: section
  #  2) add entries to the :common: section (e.g. :test: has TEST defined)
  :common: &common_defines []
  :test:
    - *common_defines
    - TEST
  :test_preprocess:
    - *common_defines
    - TEST

:cmock:
  :verbosity: 3
  :includes_h_pre_orig_header:
    - FreeRTOS.h
  :includes:
    - FreeRTOS.h
  :strippables:
    - '(?:__attribute__\s*\(+.*?\)+)'
      # following functions are disabled by configQUEUE_REGISTRY_SIZE
    - '(?:vQueueAddToRegistry\s*\([\s\w\*_,]*\))'
    - '(?:vQueueUnregisterQueue\s*\([\s\w\*_,]*\))'
    - '(?:pcQueueGetName\s*\([\s\w\*_,]*\))'
      # following function is disabled by configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS
    - '(?:vTaskSetThreadLocalStoragePointerAndDelCallback\s*\([\s\w\*_,]*\))'
    - PRIVILEGED_FUNCTION
    - portDONT_DISCARD
  :mock_prefix: mock_
  :when_no_prototypes: :warn
  :enforce_strict_ordering: TRUE
  :plugins:
    - :ignore
    - :callback
    - :expect
    - :expect_any_args
    - :return_thru_ptr
    - :array
    - :ignore_arg
  :treat_as:
    uint8:    HEX8
    uint16:   HEX16
    uint32:   UINT32
    int8:     INT8
    bool:     UINT8
  :defines:
    - CMOCK_MEM_DYNAMIC
  # :treat_inlines: :include
# Add -gcov to the plugins list to make sure of the gcov plugin
# You will need to have gcov and gcovr both installed to make it work.
# For more information on these options, see docs in plugins/gcov
:gcov:
  :reports:
    - HtmlDetailed
  :gcovr:
    :html_medium_threshold: 75
    :html_high_threshold: 90

# Ceedling defaults to using gcc for compiling, linking, etc.
# As [:tools] is blank, gcc will be used (so long as it's in your system path)
# See documentation to configure a given toolchain for use
:tools:
  :test_file_preprocessor:
    :executable: gcc
    :name: default_test_file_preprocessor
    :stderr_redirect: :none
    :background_exec: :none
    :optional: false
    :arguments:
    - ''
    - ''
    - "-E"
    - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
    - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
    - "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
    - "-D$": DEFINES_TEST_PREPROCESS
    - "-DGNU_COMPILER"
    - "-include FreeRTOS.h"
    - '"${1}"'
    - -o "${2}"
  :test_file_preprocessor_directives:
    :executable: gcc
    :name: default_test_file_preprocessor_directives
    :stderr_redirect: :none
    :background_exec: :none
    :optional: false
    :arguments:
    - "-E"
    - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
    - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
    - "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
    - "-D$": DEFINES_TEST_PREPROCESS
    - "-DGNU_COMPILER"
    - "-include FreeRTOS.h"
    - "-fdirectives-only"
    - '"${1}"'
    - -o "${2}"
  :test_includes_preprocessor:
    :executable: gcc
    :name: default_test_includes_preprocessor
    :stderr_redirect: :none
    :background_exec: :none
    :optional: false
    :arguments:
    - ''
    - ''
    - "-E"
    - "-MM"
    - "-MG"
    - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
    - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
    - "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
    - "-D$": DEFINES_TEST_PREPROCESS
    - "-DGNU_COMPILER"
    - "-include FreeRTOS.h"
    - '"${1}"'
  :test_dependencies_generator:
    :executable: gcc
    :name: default_test_dependencies_generator
    :stderr_redirect: :none
    :background_exec: :none
    :optional: false
    :arguments:
    - ''
    - ''
    - "-E"
    - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
    - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
    - "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
    - "-D$": DEFINES_TEST_PREPROCESS
    - "-DGNU_COMPILER"
    - "-include FreeRTOS.h"
    - -MT "${3}"
    - "-MM"
    - "-MD"
    - "-MG"
    - -MF "${2}"
    - -c "${1}"

# LIBRARIES
# These libraries are automatically injected into the build process. Those specified as
# common will be used in all types of builds. Otherwise, libraries can be injected in just
# tests or releases. These options are MERGED with the options in supplemental yaml files.
:libraries:
  :placement: :end
  :flag: "-l${1}"
  :path_flag: "-L ${1}"
  :system: []    # for example, you might list 'm' to grab the math library
  :test: []
  :release: []

:plugins:
  :load_paths:
    - "#{Ceedling.load_path}"
  :enabled:
    - gcov
    - junit_tests_report
    - stdout_pretty_tests_report
    - module_generator

It is important to override the tools section as @GlebPlekhotko showed above if you want to mock freeRTOS. In the proyect.yml there's a section import. I added the include path for each esp idf library that I wanted to mock. I also had to create a custom version of esp_attr.h and save it in the test/support folder.

#pragma once
#define IRAM_ATTR
oyeBilly commented 1 year ago

@luisGallet Thanks for the help, I'm making progress!

I'm still getting some errors, which I think I can fix but wanted to check if i'm following best practice here.

In file included from /esp-idf/components/freertos/include/freertos/FreeRTOS.h:57,
                 from <command-line>:
/esp-idf/components/freertos/include/esp_additions/freertos/FreeRTOSConfig.h:84:2: error: #error "Needs architecture-speific FreeRTOSConfig.h!"
   84 | #error "Needs architecture-speific FreeRTOSConfig.h!"
      |  ^~~~~
In file included from /esp-idf/components/freertos/include/freertos/FreeRTOS.h:63,
                 from <command-line>:
/esp-idf/components/freertos/include/freertos/portable.h:79:6: error: #error "Invalid portBYTE_ALIGNMENT definition"
   79 |     #error "Invalid portBYTE_ALIGNMENT definition"
      |      ^~~~~
In file included from <command-line>:
/esp-idf/components/freertos/include/freertos/FreeRTOS.h:256:6: error: #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h
  256 |     #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h
      |      ^~~~~

It looks like after including FreeRTOS.h there's still files not being included in the correct order. I tried adding an include for FreeRTOSConfig_arch.h before FreeRTOS.h in the cmock and tools sections and that did remove the first error.

  1. But is that the correct way to go about this? If there was yet another dependency I would end up having to hard code a bunch of includes in the project.yml which seems to work against the usefulness of ceedling. (@GlebPlekhotko maybe you have some insight to this too?)

  2. For the next two errors I'm going to try adding some #ifdef TEST type statements, but also don't like modifying source that my test code isn't even touching. I wonder if there's another clever alternative to this?

  3. All this effort and my unit test isn't even about any FreeRTOS or esp-idf code. I'm trying to unit test a function call I added to the hello world example from esp-idf. The hello_worldmain.c #includes freeRTOS and some esp files. Can I explicitly mock those to avoid this? my unit test file

    
    #include "unity.h"
    #include "cmock.h"

include "mock_hey_ceedling.h" // a module with a function call i'm testing that has no external dependencies

include "hello_world_main.h" // only has a function proto for app_main()

void test_app_main_should_callHeyCeedling(void) { hey_ceedling_expect(); // the only function call I want to test for

app_main(); // will call some freeRTOS and esp_ functions but I want to ignore those

}


See my project.yml regarding my question (1):

Notes:

Sample project C code is not presently written to produce a release artifact.

As such, release build options are disabled.

This sample, therefore, only demonstrates running a collection of unit tests.

:project: :use_exceptions: FALSE :use_test_preprocessor: TRUE :use_preprocessor_directives: TRUE :use_deep_dependencies: TRUE :generate_deep_dependencies: FALSE :use_auxiliary_dependencies: TRUE :build_root: build_test

:release_build: TRUE

:test_fileprefix: test :which_ceedling: gem :ceedling_version: 0.31.1 :default_tasks:

:test_build:

:use_assembly: TRUE

:release_build:

:output: MyApp.out

:use_assembly: FALSE

:environment:

:import:

:extension: :executable: .out

:paths: :test:

:defines:

in order to add common defines:

1) remove the trailing [] from the :common: section

2) add entries to the :common: section (e.g. :test: has TEST defined)

:common: &common_defines [] :test:

:cmock:

copied from example https://github.com/ThrowTheSwitch/Ceedling/issues/579#issuecomment-1229347565

:verbosity: 3 :includes_h_pre_orig_header:

Add -gcov to the plugins list to make sure of the gcov plugin

You will need to have gcov and gcovr both installed to make it work.

For more information on these options, see docs in plugins/gcov

:gcov: :reports:

:tools:

Ceedling defaults to using gcc for compiling, linking, etc.

As [:tools] is blank, gcc will be used (so long as it's in your system path)

See documentation to configure a given toolchain for use

copy from example https://github.com/ThrowTheSwitch/Ceedling/issues/579#issuecomment-1229347565

:tools: :test_file_preprocessor: :executable: gcc :name: default_test_file_preprocessor :stderr_redirect: :none :background_exec: :none :optional: false :arguments:

LIBRARIES

These libraries are automatically injected into the build process. Those specified as

common will be used in all types of builds. Otherwise, libraries can be injected in just

tests or releases. These options are MERGED with the options in supplemental yaml files.

:libraries: :placement: :end :flag: "-l${1}" :path_flag: "-L ${1}" :system: [] # for example, you might list 'm' to grab the math library :test: [] :release: []

:plugins: :load_paths:

Again thanks so much for the help!

luisGallet commented 1 year ago

You need to have those defines defined in your FreeRTOSConfig_arch.h file. This is the only way to make freeRTOS compile. Also you don't need to include all the components in your project.yml, only include what you need (freertos and the other components the example includes).

On Mon., Aug. 29, 2022, 5:02 p.m. Billy, @.***> wrote:

@luisGallet https://github.com/luisGallet Thanks for the help, I'm making progress!

I'm still getting some errors, which I think I can fix but wanted to check if i'm following best practice here.

In file included from /esp-idf/components/freertos/include/freertos/FreeRTOS.h:57, from : /esp-idf/components/freertos/include/esp_additions/freertos/FreeRTOSConfig.h:84:2: error: #error "Needs architecture-speific FreeRTOSConfig.h!" 84 | #error "Needs architecture-speific FreeRTOSConfig.h!" | ^~~~~ In file included from /esp-idf/components/freertos/include/freertos/FreeRTOS.h:63, from : /esp-idf/components/freertos/include/freertos/portable.h:79:6: error: #error "Invalid portBYTE_ALIGNMENT definition" 79 | #error "Invalid portBYTE_ALIGNMENT definition" | ^~~~~ In file included from : /esp-idf/components/freertos/include/freertos/FreeRTOS.h:256:6: error: #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h 256 | #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h | ^~~~~

It looks like after including FreeRTOS.h there's still files not being included in the correct order. I tried adding an include for FreeRTOSConfig_arch.h before FreeRTOS.h in the cmock and tools sections and that did remove the first error.

1.

But is that the correct way to go about this? If there was yet another dependency I would end up having to hard code a bunch of includes in the project.yml which seems to work against the usefulness of ceedling. ( @GlebPlekhotko https://github.com/GlebPlekhotko maybe you have some insight to this too?) 2.

For the next two errors I'm going to try adding some #ifdef TEST type statements, but also don't like modifying source that my test code isn't even touching. I wonder if there's another clever alternative to this? 3.

All this effort and my unit test isn't even about any FreeRTOS or esp-idf code. I'm trying to unit test a function call I added to the hello world example from esp-idf. The hello_worldmain.c #includes freeRTOS and some esp files. Can I explicitly mock those to avoid this? my unit test file

include "unity.h"

include "cmock.h"

include "mock_hey_ceedling.h" // a module with a function call i'm testing that has no external dependencies

include "hello_world_main.h" // only has a function proto for app_main()

void test_app_main_should_callHeyCeedling(void) { hey_ceedling_expect(); // the only function call I want to test for

app_main(); // will call some freeRTOS and esp_ functions but I want to ignore those

}

See my project.yml regarding my question (1):


Notes:

Sample project C code is not presently written to produce a release artifact.

As such, release build options are disabled.

This sample, therefore, only demonstrates running a collection of unit tests.

:project: :use_exceptions: FALSE :use_test_preprocessor: TRUE :use_preprocessor_directives: TRUE :use_deep_dependencies: TRUE :generate_deep_dependencies: FALSE :use_auxiliary_dependencies: TRUE :build_root: build_test

:release_build: TRUE

:test_fileprefix: test :which_ceedling: gem :ceedling_version: 0.31.1 :default_tasks:

  • test:all

:test_build:

:use_assembly: TRUE

:release_build:

:output: MyApp.out

:use_assembly: FALSE

:environment:

  • :IDF_PATH: /esp-idf

:import:

  • esp-idf-includes.yml

:extension: :executable: .out

:paths: :test:

  • +:test/**
  • +:components/**/test
  • +:main/test/**
  • -:test/support :source:
  • +:main/*
  • +:components/* :include:
  • +:components/**/include :support:
  • test/support :libraries: []

:defines:

in order to add common defines:

1) remove the trailing [] from the :common: section

2) add entries to the :common: section (e.g. :test: has TEST defined)

:common: &common_defines [] :test:

  • *common_defines
  • TEST :test_preprocess:
  • *common_defines
  • TEST

:cmock:

copied from example https://github.com/ThrowTheSwitch/Ceedling/issues/579#issuecomment-1229347565

:verbosity: 3 :includes_h_pre_orig_header:

  • FreeRTOSConfig_arch.h #just a guess to put this first
  • FreeRTOS.h :includes:
  • FreeRTOSConfig_arch.h #just a guess to put this first
  • FreeRTOS.h :strippables:
  • '(?:attribute\s(+.?)+)'

    following functions are disabled by configQUEUE_REGISTRY_SIZE

  • '(?:vQueueAddToRegistry\s([\s\w*_,]))'
  • '(?:vQueueUnregisterQueue\s([\s\w*_,]))'
  • '(?:pcQueueGetName\s([\s\w*_,]))'

    following function is disabled by configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS

  • '(?:vTaskSetThreadLocalStoragePointerAndDelCallback\s([\s\w*_,]))'
  • PRIVILEGED_FUNCTION
  • portDONT_DISCARD

    end copy from example

    :mockprefix: mock :when_no_prototypes: :warn :enforce_strict_ordering: TRUE :plugins:

  • :ignore
  • :callback
  • :ignore
  • :array
  • :expect_any_args
  • :return_thru_ptr :treat_as: uint8: HEX8 uint16: HEX16 uint32: UINT32 int8: INT8 bool: UINT8 :defines:
  • CMOCK_MEM_DYNAMIC

Add -gcov to the plugins list to make sure of the gcov plugin

You will need to have gcov and gcovr both installed to make it work.

For more information on these options, see docs in plugins/gcov

:gcov: :reports:

  • HtmlDetailed :gcovr: :html_medium_threshold: 75 :html_high_threshold: 90

:tools:

Ceedling defaults to using gcc for compiling, linking, etc.

As [:tools] is blank, gcc will be used (so long as it's in your system path)

See documentation to configure a given toolchain for use

copy from example https://github.com/ThrowTheSwitch/Ceedling/issues/579#issuecomment-1229347565

:tools: :test_file_preprocessor: :executable: gcc :name: default_test_file_preprocessor :stderr_redirect: :none :background_exec: :none :optional: false :arguments:

  • ''
  • ''
  • "-E"
  • -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
  • -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
  • "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
  • "-D$": DEFINES_TEST_PREPROCESS
  • "-DGNU_COMPILER"
  • "-includeFreeRTOSConfig_arch.h" #just a guess to put this first
  • "-include FreeRTOS.h"
  • '"${1}"'
  • -o "${2}" :test_file_preprocessor_directives: :executable: gcc :name: default_test_file_preprocessor_directives :stderr_redirect: :none :background_exec: :none :optional: false :arguments:
  • "-E"
  • -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
  • -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
  • "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
  • "-D$": DEFINES_TEST_PREPROCESS
  • "-DGNU_COMPILER"
  • "-includeFreeRTOSConfig_arch.h" #just a guess to put this first
  • "-include FreeRTOS.h"
  • "-fdirectives-only"
  • '"${1}"'
  • -o "${2}" :test_includes_preprocessor: :executable: gcc :name: default_test_includes_preprocessor :stderr_redirect: :none :background_exec: :none :optional: false :arguments:
  • ''
  • ''
  • "-E"
  • "-MM"
  • "-MG"
  • -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
  • -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
  • "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
  • "-D$": DEFINES_TEST_PREPROCESS
  • "-DGNU_COMPILER"
  • "-includeFreeRTOSConfig_arch.h" #just a guess to put this first
  • "-include FreeRTOS.h"
  • '"${1}"' :test_dependencies_generator: :executable: gcc :name: default_test_dependencies_generator :stderr_redirect: :none :background_exec: :none :optional: false :arguments:
  • ''
  • ''
  • "-E"
  • -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
  • -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
  • "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
  • "-D$": DEFINES_TEST_PREPROCESS
  • "-DGNU_COMPILER"
  • "-includeFreeRTOSConfig_arch.h" #just a guess to put this first
  • "-include FreeRTOS.h"
  • -MT "${3}"
  • "-MM"
  • "-MD"
  • "-MG"
  • -MF "${2}"
  • -c "${1}"

    end copy from example

LIBRARIES

These libraries are automatically injected into the build process. Those specified as

common will be used in all types of builds. Otherwise, libraries can be injected in just

tests or releases. These options are MERGED with the options in supplemental yaml files.

:libraries: :placement: :end :flag: "-l${1}" :path_flag: "-L ${1}" :system: [] # for example, you might list 'm' to grab the math library :test: [] :release: []

:plugins: :load_paths:

  • "#{Ceedling.load_path}" :enabled:
  • stdout_pretty_tests_report
  • module_generator

Again thanks so much for the help!

— Reply to this email directly, view it on GitHub https://github.com/ThrowTheSwitch/Ceedling/issues/579#issuecomment-1230989140, or unsubscribe https://github.com/notifications/unsubscribe-auth/AV5WU5UIHSI2S7DS3ZRFGRDV3VFQPANCNFSM42F5MRZA . You are receiving this because you were mentioned.Message ID: @.***>

raulperez commented 1 year ago

EDIT: I think there are some better approaches that have been posted more recently - make sure you check out all of the alternative approaches to see what suits you best

Hi, I've searched pretty extensively on how to get this working, but I can't seem to find too many (if any) mentions of people running into this issue. I can't be the only person using CMock or Ceedling to mock unit tests within an embedded codebase including FreeRTOS, so I fear I'm missing something obvious.

Initially, I could get everything working with minimal hassle by including

    - ../libs/STM32_Cube/mccoy_st/Core/**
    - ../libs/STM32_Cube/mccoy_st/Drivers/**

along with my normal source file paths in the :paths:source: section of my project.yml.

Then when I wanted to start testing more of my files than a few fully decoupled algorithms, I ran into the issue where either those modules' header files, or headers that they included, in turn included files from the Middlewares directory of the FreeRTOS source files (which is the third and final dir that sits at the same level as Core and Drivers listed above).

No problem, I though, and dropped the Middlewares path below those two.

    - ../libs/STM32_Cube/mccoy_st/Core/**
    - ../libs/STM32_Cube/mccoy_st/Drivers/**
    - ../libs/STM32_Cube/mccoy_st/Middlewares/**

This then exploded into a ton of errors trying to compile FreeRTOS, most notably the one mentioned here: #548 We previously had been using a support file for stubbing FreeRTOS files with 5 or 6 macros and functions definitions to avoid including the Middlewares folder in the tests, so I replaced that with an empty C file besides the line #include "freertos.c" to gte around the casing issues.

We also have been using multiple "stubbed" headers in lieu of our real source headers which were basically copies of the originals with functionality delicately carved out of them and no FreeRTOS dependencies. This was because even when using #include "mock_[filename].h" the generated mock files still include the original header file. We would include the stubbed headers with #ifdef UNIT_TEST throughout source header files, where UNIT_TEST was a define declared in our Ceedling project.yml.

The problem with this solution is that it doesn't scale, and at some point I'll run into something that I can't typedef void * or remove from a header.

I finally removed almost all of the errors by stubbing things out or partitioning header includes with #ifdef UNIT_TEST only to get down to a ton of errors about invalid __asm(...) calls from within FreeRTOS files. Obviously this is because Ceedling is using gcc to compile, but for our embedded project we're using arm-none-eabi-gcc.

So now I've gone down the route of adding in a custom compiler and linker into our project.yml file:

:tools:
  :test_compiler:
    :executable: arm-none-eabi-gcc
    :arguments:
      - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE               #expands to -I search paths
      - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR   #expands to -I search paths
      - -D$: COLLECTION_DEFINES_TEST_AND_VENDOR  #expands to all -D defined symbols
      - -c ${1}
      - -o ${2}
  :test_linker:
    :executable: arm-none-eabi-gcc
    :arguments:
      - ${1}
      - -o ${2}

and I switched :flags:test:compile: and :flags:test:compile: from what we had defined in there for 32-bit compilation with gcc to the same compilation/linking flags used when compiling with out STM32 makefile. I've fought through a dozen compilation and linking errors to finally get to one single linker issue:

Linking test_event_log.out...
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol Reset_Handler; defaulting to 0000000008000000
Running test_event_log.out...

ERROR: Test executable "test_event_log.out" failed.
> Produced no final test result counts in $stdout:
qemu: uncaught target signal 4 (Illegal instruction) - core dumped
Illegal instruction
> And exited with status: [0] (count of failed tests).
> This is often a symptom of a bad memory access in source or test code.

Running Hook post_test...
rake aborted!

It can't find that symbol because it's defined in a startup assembly file. It's located on the source paths, so I'm not sure why it's not included in compilation and linking. Regardless, I'm not really sure this approach will work / is worth it.

Finally to my actual question: am I going about this 100% wrong? Is there an easy way to stub/mock out layers way up before I did any of this that I'm just somehow missing? If I could use the standard compiler and not include this architecture-specific Middlewares directory I'd love that, but I'm lost as to how to do that without completely sullying all of my source header and implementation files with a ton of #ifdefs, writing a header stub for tons of files, and hand stubbing out every single FreeRTOS function signature that's called.

How did you solve the issue with the Reset_Handler?