Beware that this post is related to an SDK in maintenance mode
More Info: Consider nRF Connect SDK for new designs
This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Mocking nrf_gpio.h with Ceedling, Unity + FFF (Fake Function Framework)

I am trying to using ceedling with FFF to create mocks of some of the NRFX HAL files. However, when I run ceedling I get some very weird errors. I've taken the `test/include` file from the nRF5 Mesh SDK and I'm not getting compilation errors anymore, but I'm getting a warning that there are no prototypes defined in the file nrf_gpio.h. I saw from a previous question that I need to define HOST and SUPPRESS_INLINE_IMPLEMENTATION, which I have done, but I still get the warning.

I can see in my build folder that the cached nrf_gpio.h file has prototypes all marked as static inline, so I would think it should be creating the mocks accordingly. Does anyone have any experience with this?

Here is my ceedling project.yml configuration file.

---

# Notes:
# 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: ceedling_build
  :test_file_prefix: test_
  :which_ceedling: vendor/ceedling
  :default_tasks:
    - test:all

:environment:
   - :mcu: NRF52810_XXAA
   - :sdk_root: nRF5_SDK_16.0.0


:extension:
  :executable: .out

:paths:
  :test:
    - +:test/**
    - -:test/support
  :source:
    - src/**
  :include:
    - "#{ENV['SDK_ROOT']}/modules/nrfx" # For nrfx.h
    - "#{ENV['SDK_ROOT']}/modules/nrfx/hal" # For nrf_gpio.h
    - "#{ENV['SDK_ROOT']}/modules/nrfx/mdk" # For nrf52810_peripherals.h
    - "#{ENV['SDK_ROOT']}/modules/nrfx/soc"
    - "#{ENV['SDK_ROOT']}/components/toolchain/cmsis/include" # For core_cm4.h
  :support:
    - test/support

: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)
  :commmon: &common_defines
    - NRF52810_XXAA
    - BOARD_PCA10040
    - NRF52
  :test:
    - *common_defines
    - TEST
    - HOST
  :test_preprocess:
    - *common_defines
    - TEST
    - HOST
    - SUPPRESS_INLINE_IMPLEMENTATION

:cmock:
  :mock_prefix: mock_
  :when_no_prototypes: :warn
  :enforce_strict_ordering: TRUE
  :plugins:
    - :ignore
    - :ignore_arg
    - :array
    - :callback
    - :return_thru_ptr
    - :expect_any_args
  :treat_as:
    uint8:    HEX8
    uint16:   HEX16
    uint32:   UINT32
    int8:     INT8
    bool:     UINT8

:gcov:
    :html_report_type: basic

#: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: "${1}"  # or "-L ${1}" for example
  :common: &common_libraries []
  :test:
    - *common_libraries
  :release:
    - *common_libraries

:plugins:
  :load_paths:
    - vendor/ceedling/plugins
  :enabled:
    - stdout_pretty_tests_report
    - module_generator
    - raw_output_report
    - fake_function_framework
...

Related