CppUMock
========

CppUMock is the built-in mocking system of CppUTest. This chapter describes the
basic features of the system. For details please refer the `official CppUMock
manual`_.

System functions
----------------

Checking expectations
^^^^^^^^^^^^^^^^^^^^^

After defining expected calls an invoking actual call the test should check if
all the expected calls have happened. This can be done by calling
``mock().checkExpectations()``. The common place to put this function call is
the ``TEST_TEARDOWN`` function of the test group.


Resetting mocking system
^^^^^^^^^^^^^^^^^^^^^^^^

After the last interaction with the mocking system the developer should reset
the state of the system by calling ``mock().clear()``. The common place to put
this function call is the ``TEST_TEARDOWN`` function of the test group after
calling ``mock().checkExpectations()``.


Namespaces
^^^^^^^^^^

All interactions with the mocking system start by calling ``mock()``. This
function has an option ``name`` string parameter which can be used for limiting
the scope of the mocking operation.

.. code-block:: C++

  mock("bl1").expectOneCall("bl1_main");


Enable/disable
^^^^^^^^^^^^^^

The mocking system can be enabled/disabled runtime using the functions below.
This causes call expected and actual call to be ignored. Default settings are
restored by ``mock().clear()``.

- ``enable()``
- ``disable()``

.. code-block:: C++

  mock().disable();
  // All CppUMock calls are ignored after this point
  mock().enable();
  // CppUMock calls are working again

  mock().disable();
  // All CppUMock calls are ignored after this point
  [...]

  mock().clear();
  // Default settings are restored


String order
^^^^^^^^^^^^

After defining multiple expected function call the mocking system always
The mocking system always uses the next matching function when an actual call
happens but by default it doesn't check if different function calls happen in
the order of definition. This behaviour can be turned on using the
``mock().strictOrder()`` function. This option is also set to default by the
``mock().clear()`` function.

.. code-block:: C++

  mock().expectOneCall("A");
  mock().expectOneCall("B");

  mock().actualCall("B");
  mock().actualCall("A");
  // No error

  mock().strictOrder();
  mock().expectOneCall("A");
  mock().expectOneCall("B");

  mock().actualCall("B"); // Error generated here
  mock().actualCall("A");


Ignoring unspecified calls
^^^^^^^^^^^^^^^^^^^^^^^^^^

If there are addition actual calls happening in the test case which are
unrelated to the test case (i.e. log or other messages) the unspecified calls
can be ignored by adding ``mock().ignoreOtherCalls()`` to the test case. This
function should be used carefully because it can hide unexpected call which are
indicating errors in the code. The affect of this call ends by calling
``mock().clear()``.


Specifying object
-----------------

In object oriented environment member function should validate if the function
call happened on the suitable object. This is done by adding the following
function to the mock specification.

- ``onObject(objectPtr)``


Validating parameters
---------------------

Each supported parameter type has a corresponding function. These are the same
in the expected and actual calls.

- ``withBoolParameter(name, bool value)``
- ``withIntParameter(name, int value)``
- ``withUnsignedIntParameter(name, unsigned int value)``
- ``withLongIntParameter(name, long int value)``
- ``withUnsignedLongIntParameter(name, unsigned long int value)``
- ``withDoubleParameter(name, double value)``
- ``withStringParameter(name, const char* value)``
- ``withPointerParameter(name, void* value)``
- ``withFunctionPointerParameter(name, void (*value)())``
- ``withConstPointerParameter(name, const void* value)``
- ``withMemoryBufferParameter(name, const unsigned char* value, size_t size)``

If custum types are defined and copier/comparator objects were installed the
following function can handle these parameters.

- ``withParameterOfType(typeName, name, value)``

There's an option to copying data from the test environment into the mock
function. When setting expectations the following function can be used to set
the pointer and the address of the data. **The mocking system will not create a
copy of this data** so the original data should be kept intact until the actual
call happens.

- ``withOutputParameterReturning(name, value, size)``
- ``withOutputParameterOfTypeReturning(typeName, name, value)``

In the actual call the pair of these function are shown below.

- ``withOutputParameter(name, output)``
- ``withOutputParameterOfType(typeName, name, output)``


Ignoring parameters
^^^^^^^^^^^^^^^^^^^

There are cases when the developer doesn't want to specify all parameters. The
following function can set this behaviour in the expected call.

- ``ignoreOtherParameters()``


Specifying return values
------------------------

Using function name overloading the return values are specified by calling
``andReturnValue`` and the parameter type will determine the exact function.

- ``andReturnValue(bool value)``
- ``andReturnValue(int value)``
- ``andReturnValue(unsigned int value)``
- ``andReturnValue(long int value)``
- ``andReturnValue(unsigned long int value)``
- ``andReturnValue(double value)``
- ``andReturnValue(const char* value)``
- ``andReturnValue(void* value)``
- ``andReturnValue(const void* value)``
- ``andReturnValue(void (*value)())``


Returning value in actual calls
-------------------------------

All of these function have version with ``OrDefault(type default_value)``
suffix. These version return a default value if the return value was not
specified in the expected call.

- ``bool returnBoolValue()``
- ``int returnIntValue()``
- ``unsigned int returnUnsignedIntValue()``
- ``long int returnLongIntValue()``
- ``unsigned long int returnUnsignedLongIntValue()``
- ``double returnDoubleValue()``
- ``const char * returnStringValue()``
- ``void * returnPointerValue()``
- ``const void * returnConstPointerValue()``
- ``void (*returnFunctionPointerValue())()``


Debugging CppUMock errors
-------------------------

Debugging CppUMock errors can be hard unlike assertion errors because a mocking
failure can happen multiple layers of function calls under the test case. The
mocking system has a very similar feature to CppUTest's ``UT_CRASH()`` which is
``mock().crashOnFailure()``. By enabling this feature the code will crash on
mocking errors and the developer could easily catch it with the debugger.


--------------

*Copyright (c) 2019-2020, Arm Limited. All rights reserved.*

.. _`official CppUMock manual`: https://cpputest.github.io/mocking_manual.html