ThrowTheSwitch / CMock

CMock - Mock/stub generator for C
http://throwtheswitch.org
MIT License
653 stars 269 forks source link

using treat_inlines causes include files under support folder to break #407

Open stotzd opened 1 year ago

stotzd commented 1 year ago

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

I have a file "DSP280x_Device.h" under the test/support/ folder.

If I use treat_inlines and mock "gpio.h" (which includes "DSP280x_Device.h"), the generated "gpio.h" file under the mock folder will add the test/support/ path, which causes the compile to fail.

In file included from build/test/mocks/mock_gpio.h:6,
                 from test/test_can_runtime.c:12:
build/test/mocks/gpio.h:2:10: fatal error: test/support/DSP280x_Device.h: No such file or directory
    2 | #include "test/support/DSP280x_Device.h"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Letme commented 1 year ago

You will need to give a bit more than that, because here it seems like your compiler and build system cannot find the "DSP280x_Device.h" and not a CMock failure.

stotzd commented 1 year ago

Here is a sample gpio.h

#ifndef GPIO_H
#define GPIO_H

#include <stdint.h>
#include <stdbool.h>
#include "DSP280x_Device.h"
#include "DSP280x_Examples.h"

static inline bool gpio_get(uint16_t gpio_id)
{
    /* code here */
}

void GPIO_init_Startup( void );

#endif  /* GPIO_H */

Which will turn into this generated file in the mock folder:

#include "../../CodeVault/inc/sys/DSP280x_Examples.h"
#include "test/support/DSP280x_Device.h"
_Bool 

                  gpio_get(uint16_t gpio_id);

void GPIO_init_Startup( void );

For some reason, the compiler cannot find "test/support/DSP280x_Device.h" but it can find "DSP280x_Device.h". Is there something wrong with my project.yaml maybe?

---

# 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_auxiliary_dependencies: TRUE
  :build_root: build
#  :release_build: TRUE
  :test_file_prefix: test_
  :which_ceedling: gem
  :ceedling_version: 0.31.0
  :default_tasks:
    - test:all

#:test_build:
#  :use_assembly: TRUE

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

:environment:

:extension:
  :executable: .out

:paths:
  :test:
    - +:test/**
    - -:test/support
  :source:
    - ../../CodeVault/src/**
    - ../../CodeVault/inc/**
  :support:
    - test/support
  :libraries: []

:flags:
  :test:
    :compile:
      :*: # use :*: for all sources.
        - -Wno-trampolines # nested functions useful for defining stub callbacks
: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
    - OSCCLK_MHZ=20U    
  :test:
    - *common_defines
    - TEST
  :test_preprocess:
    - *common_defines
    - TEST

:cmock:
  :treat_externs: :include
  :treat_inlines: :include
  :mock_prefix: mock_
  :when_no_prototypes: :warn
  :enforce_strict_ordering: TRUE
  :plugins:
    - :ignore
    - :callback
  :treat_as:
    uint8:    HEX8
    uint16:   HEX16
    uint32:   UINT32
    int8:     INT8
    bool:     UINT8

# 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
    :report_include: "^../../CodeVault/src.*"

#: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

# 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
    - gcov
...
stotzd commented 1 year ago

I am attaching an example that fails. But if you remove the treat_inlines from the project.yaml it works.

inline_test.zip

stotzd commented 1 year ago

Is this related to the use_test_preprocessor setting? If I set it to FALSE, then it seems to compile. Is this correct?

radu-toma commented 1 year ago

I see similar issues and behaviour. Seems that

:use_test_preprocessor: FALSE

somehow works.