604 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			604 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								CMock: A Summary
							 | 
						||
| 
								 | 
							
								================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*[ThrowTheSwitch.org](http://throwtheswitch.org)*
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*This documentation is released under a Creative Commons 3.0 Attribution Share-Alike License*
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								What Exactly Are We Talking About Here?
							 | 
						||
| 
								 | 
							
								---------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CMock is a nice little tool which takes your header files and creates
							 | 
						||
| 
								 | 
							
								a Mock interface for it so that you can more easily unit test modules
							 | 
						||
| 
								 | 
							
								that touch other modules. For each function prototype in your
							 | 
						||
| 
								 | 
							
								header, like this one:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    int DoesSomething(int a, int b);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								...you get an automatically generated DoesSomething function
							 | 
						||
| 
								 | 
							
								that you can link to instead of your real DoesSomething function.
							 | 
						||
| 
								 | 
							
								By using this Mocked version, you can then verify that it receives
							 | 
						||
| 
								 | 
							
								the data you want, and make it return whatever data you desire,
							 | 
						||
| 
								 | 
							
								make it throw errors when you want, and more... Create these for
							 | 
						||
| 
								 | 
							
								everything your latest real module touches, and you're suddenly
							 | 
						||
| 
								 | 
							
								in a position of power: You can control and verify every detail
							 | 
						||
| 
								 | 
							
								of your latest creation.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To make that easier, CMock also gives you a bunch of functions
							 | 
						||
| 
								 | 
							
								like the ones below, so you can tell that generated DoesSomething
							 | 
						||
| 
								 | 
							
								function how to behave for each test:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    void DoesSomething_ExpectAndReturn(int a, int b, int toReturn);
							 | 
						||
| 
								 | 
							
								    void DoesSomething_ExpectAndThrow(int a, int b, EXCEPTION_T error);
							 | 
						||
| 
								 | 
							
								    void DoesSomething_StubWithCallback(CMOCK_DoesSomething_CALLBACK YourCallback);
							 | 
						||
| 
								 | 
							
								    void DoesSomething_IgnoreAndReturn(int toReturn);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can pile a bunch of these back to back, and it remembers what
							 | 
						||
| 
								 | 
							
								you wanted to pass when, like so:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    test_CallsDoesSomething_ShouldDoJustThat(void)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        DoesSomething_ExpectAndReturn(1,2,3);
							 | 
						||
| 
								 | 
							
								        DoesSomething_ExpectAndReturn(4,5,6);
							 | 
						||
| 
								 | 
							
								        DoesSomething_ExpectAndThrow(7,8, STATUS_ERROR_OOPS);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        CallsDoesSomething( );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This test will call CallsDoesSomething, which is the function
							 | 
						||
| 
								 | 
							
								we are testing. We are expecting that function to call DoesSomething
							 | 
						||
| 
								 | 
							
								three times. The first time, we check to make sure it's called
							 | 
						||
| 
								 | 
							
								as DoesSomething(1, 2) and we'll magically return a 3. The second
							 | 
						||
| 
								 | 
							
								time we check for DoesSomething(4, 5) and we'll return a 6. The
							 | 
						||
| 
								 | 
							
								third time we verify DoesSomething(7, 8) and we'll throw an error
							 | 
						||
| 
								 | 
							
								instead of returning anything. If CallsDoesSomething gets
							 | 
						||
| 
								 | 
							
								any of this wrong, it fails the test. It will fail if you didn't
							 | 
						||
| 
								 | 
							
								call DoesSomething enough, or too much, or with the wrong arguments,
							 | 
						||
| 
								 | 
							
								or in the wrong order.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CMock is based on Unity, which it uses for all internal testing.
							 | 
						||
| 
								 | 
							
								It uses Ruby to do all the main work (versions 2.0.0 and above).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Installing
							 | 
						||
| 
								 | 
							
								==========
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The first thing you need to do to install CMock is to get yourself
							 | 
						||
| 
								 | 
							
								a copy of Ruby. If you're on linux or osx, you probably already
							 | 
						||
| 
								 | 
							
								have it. You can prove it by typing the following:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ruby --version
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If it replied in a way that implies ignorance, then you're going to
							 | 
						||
| 
								 | 
							
								need to install it. You can go to [ruby-lang](https://ruby-lang.org)
							 | 
						||
| 
								 | 
							
								to get the latest version. You're also going to need to do that if it
							 | 
						||
| 
								 | 
							
								replied with a version that is older than 2.0.0. Go ahead. We'll wait.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Once you have Ruby, you have three options:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* Clone the latest [CMock repo on github](https://github.com/ThrowTheSwitch/CMock/)
							 | 
						||
| 
								 | 
							
								* Download the latest [CMock zip from github](https://github.com/ThrowTheSwitch/CMock/)
							 | 
						||
| 
								 | 
							
								* Install Ceedling (which has it built in!) through your commandline using `gem install ceedling`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Generated Mock Module Summary
							 | 
						||
| 
								 | 
							
								=============================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In addition to the mocks themselves, CMock will generate the
							 | 
						||
| 
								 | 
							
								following functions for use in your tests. The expect functions
							 | 
						||
| 
								 | 
							
								are always generated. The other functions are only generated
							 | 
						||
| 
								 | 
							
								if those plugins are enabled:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Expect:
							 | 
						||
| 
								 | 
							
								-------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Your basic staple Expects which will be used for most of your day
							 | 
						||
| 
								 | 
							
								to day CMock work. By calling this, you are telling CMock that you
							 | 
						||
| 
								 | 
							
								expect that function to be called during your test. It also specifies
							 | 
						||
| 
								 | 
							
								which arguments you expect it to be called with, and what return
							 | 
						||
| 
								 | 
							
								value you want returned when that happens. You can call this function
							 | 
						||
| 
								 | 
							
								multiple times back to back in order to queue up multiple calls.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `void func(void)` => `void func_Expect(void)`
							 | 
						||
| 
								 | 
							
								* `void func(params)` => `void func_Expect(expected_params)`
							 | 
						||
| 
								 | 
							
								* `retval func(void)` => `void func_ExpectAndReturn(retval_to_return)`
							 | 
						||
| 
								 | 
							
								* `retval func(params)` => `void func_ExpectAndReturn(expected_params, retval_to_return)`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ExpectAnyArgs:
							 | 
						||
| 
								 | 
							
								--------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This behaves just like the Expects calls, except that it doesn't really
							 | 
						||
| 
								 | 
							
								care what the arguments are that the mock gets called with. It still counts
							 | 
						||
| 
								 | 
							
								the number of times the mock is called and it still handles return values
							 | 
						||
| 
								 | 
							
								if there are some.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `void func(void)` => `void func_ExpectAnyArgs(void)`
							 | 
						||
| 
								 | 
							
								* `void func(params)` => `void func_ExpectAnyArgs(void)`
							 | 
						||
| 
								 | 
							
								* `retval func(void)` => `void func_ExpectAnyArgsAndReturn(retval_to_return)`
							 | 
						||
| 
								 | 
							
								* `retval func(params)` => `void func_ExpectAnyArgsAndReturn(retval_to_return)`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Array:
							 | 
						||
| 
								 | 
							
								------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								An ExpectWithArray is another variant of Expect. Like expect, it cares about
							 | 
						||
| 
								 | 
							
								the number of times a mock is called, the arguments it is called with, and the
							 | 
						||
| 
								 | 
							
								values it is to return. This variant has another feature, though. For anything
							 | 
						||
| 
								 | 
							
								that resembles a pointer or array, it breaks the argument into TWO arguments.
							 | 
						||
| 
								 | 
							
								The first is the original pointer. The second specify the number of elements
							 | 
						||
| 
								 | 
							
								it is to verify of that array. If you specify 1, it'll check one object. If 2,
							 | 
						||
| 
								 | 
							
								it'll assume your pointer is pointing at the first of two elements in an array.
							 | 
						||
| 
								 | 
							
								If you specify zero elements, it will check just the pointer if
							 | 
						||
| 
								 | 
							
								`:smart` mode is configured or fail if `:compare_data` is set.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `void func(void)` => (nothing. In fact, an additional function is only generated if the params list contains pointers)
							 | 
						||
| 
								 | 
							
								* `void func(ptr * param, other)` => `void func_ExpectWithArray(ptr* param, int param_depth, other)`
							 | 
						||
| 
								 | 
							
								* `retval func(void)` => (nothing. In fact, an additional function is only generated if the params list contains pointers)
							 | 
						||
| 
								 | 
							
								* `retval func(other, ptr* param)` => `void func_ExpectWithArrayAndReturn(other, ptr* param, int param_depth, retval_to_return)`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Ignore:
							 | 
						||
| 
								 | 
							
								-------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Maybe you don't care about the number of times a particular function is called or
							 | 
						||
| 
								 | 
							
								the actual arguments it is called with. In that case, you want to use Ignore. Ignore
							 | 
						||
| 
								 | 
							
								only needs to be called once per test. It will then ignore any further calls to that
							 | 
						||
| 
								 | 
							
								particular mock. The IgnoreAndReturn works similarly, except that it has the added
							 | 
						||
| 
								 | 
							
								benefit of knowing what to return when that call happens. If the mock is called more
							 | 
						||
| 
								 | 
							
								times than IgnoreAndReturn was called, it will keep returning the last value without
							 | 
						||
| 
								 | 
							
								complaint. If it's called less times, it will also ignore that. You SAID you didn't
							 | 
						||
| 
								 | 
							
								care how many times it was called, right?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `void func(void)` => `void func_Ignore(void)`
							 | 
						||
| 
								 | 
							
								* `void func(params)` => `void func_Ignore(void)`
							 | 
						||
| 
								 | 
							
								* `retval func(void)` => `void func_IgnoreAndReturn(retval_to_return)`
							 | 
						||
| 
								 | 
							
								* `retval func(params)` => `void func_IgnoreAndReturn(retval_to_return)`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Ignore Arg:
							 | 
						||
| 
								 | 
							
								------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Maybe you overall want to use Expect and its similar variations, but you don't care
							 | 
						||
| 
								 | 
							
								what is passed to a particular argument. This is particularly useful when that argument
							 | 
						||
| 
								 | 
							
								is a pointer to a value that is supposed to be filled in by the function. You don't want
							 | 
						||
| 
								 | 
							
								to use ExpectAnyArgs, because you still care about the other arguments. Instead, before
							 | 
						||
| 
								 | 
							
								any of your Expect calls are made, you can call this function. It tells CMock to ignore
							 | 
						||
| 
								 | 
							
								a particular argument for the rest of this test, for this mock function.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `void func(params)` => `void func_IgnoreArg_paramName(void)`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ReturnThruPtr:
							 | 
						||
| 
								 | 
							
								--------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Another option which operates on a particular argument of a function is the ReturnThruPtr
							 | 
						||
| 
								 | 
							
								plugin. For every argument that resembles a pointer or reference, CMock generates an
							 | 
						||
| 
								 | 
							
								instance of this function. Just as the AndReturn functions support injecting one or more
							 | 
						||
| 
								 | 
							
								return values into a queue, this function lets you specify one or more return values which
							 | 
						||
| 
								 | 
							
								are queued up and copied into the space being pointed at each time the mock is called.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `void func(param1)` => `void func_ReturnThruPtr_paramName(val_to_return)`
							 | 
						||
| 
								 | 
							
								* => `void func_ReturnArrayThruPtr_paramName(cal_to_return, len)`
							 | 
						||
| 
								 | 
							
								* => `void func_ReturnMemThruPtr_paramName(val_to_return, size)`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Callback:
							 | 
						||
| 
								 | 
							
								---------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If all those other options don't work, and you really need to do something custom, you
							 | 
						||
| 
								 | 
							
								still have a choice. As soon as you stub a callback in a test, it will call the callback
							 | 
						||
| 
								 | 
							
								whenever the mock is encountered and return the retval returned from the callback (if any)
							 | 
						||
| 
								 | 
							
								instead of performing the usual expect checks. It can be configured to check the arguments
							 | 
						||
| 
								 | 
							
								first (like expects) or just jump directly to the callback.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `void func(void)` => `void func_StubWithCallback(CMOCK_func_CALLBACK callback)`
							 | 
						||
| 
								 | 
							
								where `CMOCK_func_CALLBACK` looks like: `void func(int NumCalls)`
							 | 
						||
| 
								 | 
							
								* `void func(params)` => `void func_StubWithCallback(CMOCK_func_CALLBACK callback)`
							 | 
						||
| 
								 | 
							
								where `CMOCK_func_CALLBACK` looks like: `void func(params, int NumCalls)`
							 | 
						||
| 
								 | 
							
								* `retval func(void)` => `void func_StubWithCallback(CMOCK_func_CALLBACK callback)`
							 | 
						||
| 
								 | 
							
								where `CMOCK_func_CALLBACK` looks like: `retval func(int NumCalls)`
							 | 
						||
| 
								 | 
							
								* `retval func(params)` => `void func_StubWithCallback(CMOCK_func_CALLBACK callback)`
							 | 
						||
| 
								 | 
							
								where `CMOCK_func_CALLBACK` looks like: `retval func(params, int NumCalls)`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Cexception:
							 | 
						||
| 
								 | 
							
								-----------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Finally, if you are using Cexception for error handling, you can use this to throw errors
							 | 
						||
| 
								 | 
							
								from inside mocks. Like Expects, it remembers which call was supposed to throw the error,
							 | 
						||
| 
								 | 
							
								and it still checks parameters first.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `void func(void)` => `void func_ExpectAndThrow(value_to_throw)`
							 | 
						||
| 
								 | 
							
								* `void func(params)` => `void func_ExpectAndThrow(expected_params, value_to_throw)`
							 | 
						||
| 
								 | 
							
								* `retval func(void)` => `void func_ExpectAndThrow(value_to_throw)`
							 | 
						||
| 
								 | 
							
								* `retval func(params)` => `void func_ExpectAndThrow(expected_params, value_to_throw)`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Running CMock
							 | 
						||
| 
								 | 
							
								=============
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CMock is a Ruby script and class. You can therefore use it directly
							 | 
						||
| 
								 | 
							
								from the command line, or include it in your own scripts or rakefiles.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Mocking from the Command Line
							 | 
						||
| 
								 | 
							
								-----------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								After unpacking CMock, you will find cmock.rb in the 'lib' directory.
							 | 
						||
| 
								 | 
							
								This is the file that you want to run. It takes a list of header files
							 | 
						||
| 
								 | 
							
								to be mocked, as well as an optional yaml file for a more detailed
							 | 
						||
| 
								 | 
							
								configuration (see config options below).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								For example, this will create three mocks using the configuration
							 | 
						||
| 
								 | 
							
								specified in MyConfig.yml:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ruby cmock.rb -oMyConfig.yml super.h duper.h awesome.h
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								And this will create two mocks using the default configuration:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ruby cmock.rb ../mocking/stuff/is/fun.h ../try/it/yourself.h
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Mocking From Scripts or Rake
							 | 
						||
| 
								 | 
							
								----------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CMock can be used directly from your own scripts or from a rakefile.
							 | 
						||
| 
								 | 
							
								Start by including cmock.rb, then create an instance of CMock.
							 | 
						||
| 
								 | 
							
								When you create your instance, you may initialize it in one of
							 | 
						||
| 
								 | 
							
								three ways.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You may specify nothing, allowing it to run with default settings:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    require 'cmock.rb'
							 | 
						||
| 
								 | 
							
								    cmock = CMock.new
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You may specify a YAML file containing the configuration options
							 | 
						||
| 
								 | 
							
								you desire:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cmock = CMock.new('../MyConfig.yml')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You may specify the options explicitly:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cmock = Cmock.new(:plugins => [:cexception, :ignore], :mock_path => 'my/mocks/')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Config Options:
							 | 
						||
| 
								 | 
							
								---------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The following configuration options can be specified in the
							 | 
						||
| 
								 | 
							
								yaml file or directly when instantiating.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Passed as Ruby, they look like this:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        { :attributes => [“__funky”, “__intrinsic”], :when_ptr => :compare }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Defined in the yaml file, they look more like this:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        :cmock:
							 | 
						||
| 
								 | 
							
								          :attributes:
							 | 
						||
| 
								 | 
							
								            - __funky
							 | 
						||
| 
								 | 
							
								            - __intrinsic
							 | 
						||
| 
								 | 
							
								          :when_ptr: :compare
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In all cases, you can just include the things that you want to override
							 | 
						||
| 
								 | 
							
								from the defaults. We've tried to specify what the defaults are below.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:attributes`:
							 | 
						||
| 
								 | 
							
								  These are attributes that CMock should ignore for you for testing
							 | 
						||
| 
								 | 
							
								  purposes. Custom compiler extensions and externs are handy things to
							 | 
						||
| 
								 | 
							
								  put here. If your compiler is choking on some extended syntax, this
							 | 
						||
| 
								 | 
							
								  is often a good place to look.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * defaults: ['__ramfunc', '__irq', '__fiq', 'register', 'extern']
							 | 
						||
| 
								 | 
							
								  * **note:** this option will reinsert these attributes onto the mock's calls.
							 | 
						||
| 
								 | 
							
								    If that isn't what you are looking for, check out :strippables.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:c_calling_conventions`:
							 | 
						||
| 
								 | 
							
								  Similarly, CMock may need to understand which C calling conventions
							 | 
						||
| 
								 | 
							
								  might show up in your codebase. If it encounters something it doesn't
							 | 
						||
| 
								 | 
							
								  recognize, it's not going to mock it. We have the most common covered,
							 | 
						||
| 
								 | 
							
								  but there are many compilers out there, and therefore many other options.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * defaults: ['__stdcall', '__cdecl', '__fastcall']
							 | 
						||
| 
								 | 
							
								  * **note:** this option will reinsert these attributes onto the mock's calls.
							 | 
						||
| 
								 | 
							
								    If that isn't what you are looking for, check out :strippables.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:callback_after_arg_check`:
							 | 
						||
| 
								 | 
							
								  Tell `:callback` plugin to do the normal argument checking **before** it
							 | 
						||
| 
								 | 
							
								  calls the callback function by setting this to true. When false, the
							 | 
						||
| 
								 | 
							
								  callback function is called **instead** of the argument verification.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:callback_include_count`:
							 | 
						||
| 
								 | 
							
								  Tell `:callback` plugin to include an extra parameter to specify the
							 | 
						||
| 
								 | 
							
								  number of times the callback has been called. If set to false, the
							 | 
						||
| 
								 | 
							
								  callback has the same interface as the mocked function. This can be
							 | 
						||
| 
								 | 
							
								  handy when you're wanting to use callback as a stub.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:cexception_include`:
							 | 
						||
| 
								 | 
							
								  Tell `:cexception` plugin where to find CException.h... You only need to
							 | 
						||
| 
								 | 
							
								  define this if it's not in your build path already... which it usually
							 | 
						||
| 
								 | 
							
								  will be for the purpose of your builds.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: *nil*
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:enforce_strict_ordering`:
							 | 
						||
| 
								 | 
							
								  CMock always enforces the order that you call a particular function,
							 | 
						||
| 
								 | 
							
								  so if you expect GrabNabber(int size) to be called three times, it
							 | 
						||
| 
								 | 
							
								  will verify that the sizes are in the order you specified. You might
							 | 
						||
| 
								 | 
							
								  *also* want to make sure that all different functions are called in a
							 | 
						||
| 
								 | 
							
								  particular order. If so, set this to true.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:framework`:
							 | 
						||
| 
								 | 
							
								  Currently the only option is `:unity.` Eventually if we support other
							 | 
						||
| 
								 | 
							
								  unity test frameworks (or if you write one for us), they'll get added
							 | 
						||
| 
								 | 
							
								  here.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  : default: :unity
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:includes`:
							 | 
						||
| 
								 | 
							
								  An array of additional include files which should be added to the
							 | 
						||
| 
								 | 
							
								  mocks. Useful for global types and definitions used in your project.
							 | 
						||
| 
								 | 
							
								  There are more specific versions if you care WHERE in the mock files
							 | 
						||
| 
								 | 
							
								  the includes get placed. You can define any or all of these options.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * `:includes`
							 | 
						||
| 
								 | 
							
								  * `:includes_h_pre_orig_header`
							 | 
						||
| 
								 | 
							
								  * `:includes_h_post_orig_header`
							 | 
						||
| 
								 | 
							
								  * `:includes_c_pre_header`
							 | 
						||
| 
								 | 
							
								  * `:includes_c_post_header`
							 | 
						||
| 
								 | 
							
								  * default: nil #for all 5 options
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:memcmp_if_unknown`:
							 | 
						||
| 
								 | 
							
								  C developers create a lot of types, either through typedef or preprocessor
							 | 
						||
| 
								 | 
							
								  macros. CMock isn't going to automatically know what you were thinking all
							 | 
						||
| 
								 | 
							
								  the time (though it tries its best). If it comes across a type it doesn't
							 | 
						||
| 
								 | 
							
								  recognize, you have a choice on how you want it to handle it. It can either
							 | 
						||
| 
								 | 
							
								  perform a raw memory comparison and report any differences, or it can fail
							 | 
						||
| 
								 | 
							
								  with a meaningful message. Either way, this feature will only happen after
							 | 
						||
| 
								 | 
							
								  all other mechanisms have failed (The thing encountered isn't a standard
							 | 
						||
| 
								 | 
							
								  type. It isn't in the :treat_as list. It isn't in a custom unity_helper).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:mock_path`:
							 | 
						||
| 
								 | 
							
								  The directory where you would like the mock files generated to be
							 | 
						||
| 
								 | 
							
								  placed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: mocks
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:mock_prefix`:
							 | 
						||
| 
								 | 
							
								  The prefix to prepend to your mock files. For example, if it's “Mock”, a file
							 | 
						||
| 
								 | 
							
								  “USART.h” will get a mock called “MockUSART.c”. This CAN be used with a suffix
							 | 
						||
| 
								 | 
							
								  at the same time.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: Mock
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:mock_suffix`:
							 | 
						||
| 
								 | 
							
								  The suffix to append to your mock files. For example, it it's "_Mock", a file
							 | 
						||
| 
								 | 
							
								  "USART.h" will get a mock called "USART_Mock.h". This CAN be used with a prefix
							 | 
						||
| 
								 | 
							
								  at the same time.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: ""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:plugins`:
							 | 
						||
| 
								 | 
							
								  An array of which plugins to enable. ':expect' is always active. Also
							 | 
						||
| 
								 | 
							
								  available currently:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * `:ignore`
							 | 
						||
| 
								 | 
							
								  * `:ignore_arg`
							 | 
						||
| 
								 | 
							
								  * `:expect_any_args`
							 | 
						||
| 
								 | 
							
								  * `:array`
							 | 
						||
| 
								 | 
							
								  * `:cexception`
							 | 
						||
| 
								 | 
							
								  * `:callback`
							 | 
						||
| 
								 | 
							
								  * `:return_thru_ptr`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:strippables`:
							 | 
						||
| 
								 | 
							
								  An array containing a list of items to remove from the header
							 | 
						||
| 
								 | 
							
								  before deciding what should be mocked. This can be something simple
							 | 
						||
| 
								 | 
							
								  like a compiler extension CMock wouldn't recognize, or could be a
							 | 
						||
| 
								 | 
							
								  regex to reject certain function name patterns. This is a great way to
							 | 
						||
| 
								 | 
							
								  get rid of compiler extensions when your test compiler doesn't support
							 | 
						||
| 
								 | 
							
								  them. For example, use `:strippables: ['(?:functionName\s*\(+.*?\)+)']`
							 | 
						||
| 
								 | 
							
								  to prevent a function `functionName` from being mocked. By default, it
							 | 
						||
| 
								 | 
							
								  is ignoring all gcc attribute extensions.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: ['(?:__attribute__\s*\(+.*?\)+)']
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:subdir`:
							 | 
						||
| 
								 | 
							
								  This is a relative subdirectory for your mocks.  Set this to e.g. "sys" in
							 | 
						||
| 
								 | 
							
								  order to create a mock for `sys/types.h` in `(:mock_path)/sys/`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: ""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:treat_as`:
							 | 
						||
| 
								 | 
							
								  The `:treat_as` list is a shortcut for when you have created typedefs
							 | 
						||
| 
								 | 
							
								  of standard types. Why create a custom unity helper for UINT16 when
							 | 
						||
| 
								 | 
							
								  the unity function TEST_ASSERT_EQUAL_HEX16 will work just perfectly?
							 | 
						||
| 
								 | 
							
								  Just add 'UINT16' => 'HEX16' to your list (actually, don't. We already
							 | 
						||
| 
								 | 
							
								  did that one for you). Maybe you have a type that is a pointer to an
							 | 
						||
| 
								 | 
							
								  array of unsigned characters? No problem, just add 'UINT8_T*' =>
							 | 
						||
| 
								 | 
							
								  'HEX8*'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * NOTE: unlike the other options, your specifications MERGE with the
							 | 
						||
| 
								 | 
							
								    default list. Therefore, if you want to override something, you must
							 | 
						||
| 
								 | 
							
								    reassign it to something else (or to *nil* if you don't want it)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default:
							 | 
						||
| 
								 | 
							
								    * 'int': 'INT'
							 | 
						||
| 
								 | 
							
								    * 'char': 'INT8'
							 | 
						||
| 
								 | 
							
								    * 'short': 'INT16'
							 | 
						||
| 
								 | 
							
								    * 'long': 'INT'
							 | 
						||
| 
								 | 
							
								    * 'int8': 'INT8'
							 | 
						||
| 
								 | 
							
								    * 'int16': 'INT16'
							 | 
						||
| 
								 | 
							
								    * 'int32': 'INT'
							 | 
						||
| 
								 | 
							
								    * 'int8_t': 'INT8'
							 | 
						||
| 
								 | 
							
								    * 'int16_t': 'INT16'
							 | 
						||
| 
								 | 
							
								    * 'int32_t': 'INT'
							 | 
						||
| 
								 | 
							
								    * 'INT8_T': 'INT8'
							 | 
						||
| 
								 | 
							
								    * 'INT16_T': 'INT16'
							 | 
						||
| 
								 | 
							
								    * 'INT32_T': 'INT'
							 | 
						||
| 
								 | 
							
								    * 'bool': 'INT'
							 | 
						||
| 
								 | 
							
								    * 'bool_t': 'INT'
							 | 
						||
| 
								 | 
							
								    * 'BOOL': 'INT'
							 | 
						||
| 
								 | 
							
								    * 'BOOL_T': 'INT'
							 | 
						||
| 
								 | 
							
								    * 'unsigned int': 'HEX32'
							 | 
						||
| 
								 | 
							
								    * 'unsigned long': 'HEX32'
							 | 
						||
| 
								 | 
							
								    * 'uint32': 'HEX32'
							 | 
						||
| 
								 | 
							
								    * 'uint32_t': 'HEX32'
							 | 
						||
| 
								 | 
							
								    * 'UINT32': 'HEX32'
							 | 
						||
| 
								 | 
							
								    * 'UINT32_T': 'HEX32'
							 | 
						||
| 
								 | 
							
								    * 'void*': 'HEX8_ARRAY'
							 | 
						||
| 
								 | 
							
								    * 'unsigned short': 'HEX16'
							 | 
						||
| 
								 | 
							
								    * 'uint16': 'HEX16'
							 | 
						||
| 
								 | 
							
								    * 'uint16_t': 'HEX16'
							 | 
						||
| 
								 | 
							
								    * 'UINT16': 'HEX16'
							 | 
						||
| 
								 | 
							
								    * 'UINT16_T': 'HEX16'
							 | 
						||
| 
								 | 
							
								    * 'unsigned char': 'HEX8'
							 | 
						||
| 
								 | 
							
								    * 'uint8': 'HEX8'
							 | 
						||
| 
								 | 
							
								    * 'uint8_t': 'HEX8'
							 | 
						||
| 
								 | 
							
								    * 'UINT8': 'HEX8'
							 | 
						||
| 
								 | 
							
								    * 'UINT8_T': 'HEX8'
							 | 
						||
| 
								 | 
							
								    * 'char*': 'STRING'
							 | 
						||
| 
								 | 
							
								    * 'pCHAR': 'STRING'
							 | 
						||
| 
								 | 
							
								    * 'cstring': 'STRING'
							 | 
						||
| 
								 | 
							
								    * 'CSTRING': 'STRING'
							 | 
						||
| 
								 | 
							
								    * 'float': 'FLOAT'
							 | 
						||
| 
								 | 
							
								    * 'double': 'FLOAT'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:treat_as_void`:
							 | 
						||
| 
								 | 
							
								  We've seen "fun" legacy systems typedef 'void' with a custom type,
							 | 
						||
| 
								 | 
							
								  like MY_VOID. Add any instances of those to this list to help CMock
							 | 
						||
| 
								 | 
							
								  understand how to deal with your code.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: []
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:treat_externs`:
							 | 
						||
| 
								 | 
							
								  This specifies how you want CMock to handle functions that have been
							 | 
						||
| 
								 | 
							
								  marked as extern in the header file. Should it mock them?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * `:include` will mock externed functions
							 | 
						||
| 
								 | 
							
								  * `:exclude` will ignore externed functions (default).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:unity_helper_path`:
							 | 
						||
| 
								 | 
							
								  If you have created a header with your own extensions to unity to
							 | 
						||
| 
								 | 
							
								  handle your own types, you can set this argument to that path. CMock
							 | 
						||
| 
								 | 
							
								  will then automagically pull in your helpers and use them. The only
							 | 
						||
| 
								 | 
							
								  trick is that you make sure you follow the naming convention:
							 | 
						||
| 
								 | 
							
								  `UNITY_TEST_ASSERT_EQUAL_YourType`. If it finds macros of the right
							 | 
						||
| 
								 | 
							
								  shape that match that pattern, it'll use them.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: []
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:verbosity`:
							 | 
						||
| 
								 | 
							
								  How loud should CMock be?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * 0 for errors only
							 | 
						||
| 
								 | 
							
								  * 1 for errors and warnings
							 | 
						||
| 
								 | 
							
								  * 2 for normal (default)
							 | 
						||
| 
								 | 
							
								  * 3 for verbose
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:weak`:
							 | 
						||
| 
								 | 
							
								  When set this to some value, the generated mocks are defined as weak
							 | 
						||
| 
								 | 
							
								  symbols using the configured format. This allows them to be overridden
							 | 
						||
| 
								 | 
							
								  in particular tests.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * Set to '__attribute ((weak))' for weak mocks when using GCC.
							 | 
						||
| 
								 | 
							
								  * Set to any non-empty string for weak mocks when using IAR.
							 | 
						||
| 
								 | 
							
								  * default: ""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:when_no_prototypes`:
							 | 
						||
| 
								 | 
							
								  When you give CMock a header file and ask it to create a mock out of
							 | 
						||
| 
								 | 
							
								  it, it usually contains function prototypes (otherwise what was the
							 | 
						||
| 
								 | 
							
								  point?). You can control what happens when this isn't true. You can
							 | 
						||
| 
								 | 
							
								  set this to `:warn,` `:ignore,` or `:error`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: :warn
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:when_ptr`:
							 | 
						||
| 
								 | 
							
								  You can customize how CMock deals with pointers (c strings result in
							 | 
						||
| 
								 | 
							
								  string comparisons... we're talking about **other** pointers here). Your
							 | 
						||
| 
								 | 
							
								  options are `:compare_ptr` to just verify the pointers are the same,
							 | 
						||
| 
								 | 
							
								  `:compare_data` or `:smart` to verify that the data is the same.
							 | 
						||
| 
								 | 
							
								  `:compare_data` and `:smart` behaviors will change slightly based on
							 | 
						||
| 
								 | 
							
								  if you have the array plugin enabled. By default, they compare a
							 | 
						||
| 
								 | 
							
								  single element of what is being pointed to. So if you have a pointer
							 | 
						||
| 
								 | 
							
								  to a struct called ORGAN_T, it will compare one ORGAN_T (whatever that
							 | 
						||
| 
								 | 
							
								  is).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: :smart
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `:fail_on_unexpected_calls`:
							 | 
						||
| 
								 | 
							
								  By default, CMock will fail a test if a mock is called without _Expect and _Ignore
							 | 
						||
| 
								 | 
							
								  called first. While this forces test writers to be more explicit in their expectations,
							 | 
						||
| 
								 | 
							
								  it can clutter tests with _Expect or _Ignore calls for functions which are not the focus
							 | 
						||
| 
								 | 
							
								  of the test. While this is a good indicator that this module should be refactored, some
							 | 
						||
| 
								 | 
							
								  users are not fans of the additional noise.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Therefore, :fail_on_unexpected_calls can be set to false to force all mocks to start with
							 | 
						||
| 
								 | 
							
								  the assumption that they are operating as _Ignore unless otherwise specified.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * default: true
							 | 
						||
| 
								 | 
							
								  * **note:**
							 | 
						||
| 
								 | 
							
								    If this option is disabled, the mocked functions will return
							 | 
						||
| 
								 | 
							
								    a default value (0) when called (and only if they have to return something of course).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Compiled Options:
							 | 
						||
| 
								 | 
							
								-----------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A number of #defines also exist for customizing the cmock experience.
							 | 
						||
| 
								 | 
							
								Feel free to pass these into your compiler or whatever is most
							 | 
						||
| 
								 | 
							
								convenient. CMock will otherwise do its best to guess what you want
							 | 
						||
| 
								 | 
							
								based on other settings, particularly Unity's settings.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `CMOCK_MEM_STATIC` or `CMOCK_MEM_DYNAMIC`
							 | 
						||
| 
								 | 
							
								  Define one of these to determine if you want to dynamically add
							 | 
						||
| 
								 | 
							
								  memory during tests as required from the heap. If static, you
							 | 
						||
| 
								 | 
							
								  can control the total footprint of Cmock. If dynamic, you will
							 | 
						||
| 
								 | 
							
								  need to make sure you make some heap space available for Cmock.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `CMOCK_MEM_SIZE`
							 | 
						||
| 
								 | 
							
								  In static mode this is the total amount of memory you are allocating
							 | 
						||
| 
								 | 
							
								  to Cmock. In Dynamic mode this is the size of each chunk allocated
							 | 
						||
| 
								 | 
							
								  at once (larger numbers grab more memory but require less mallocs).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `CMOCK_MEM_ALIGN`
							 | 
						||
| 
								 | 
							
								  The way to align your data to. Not everything is as flexible as
							 | 
						||
| 
								 | 
							
								  a PC, as most embedded designers know. This defaults to 2, meaning
							 | 
						||
| 
								 | 
							
								  align to the closest 2^2 -> 4 bytes (32 bits). You can turn off alignment
							 | 
						||
| 
								 | 
							
								  by setting 0, force alignment to the closest uint16 with 1 or even
							 | 
						||
| 
								 | 
							
								  to the closest uint64 with 3.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `CMOCK_MEM_PTR_AS_INT`
							 | 
						||
| 
								 | 
							
								  This is used internally to hold pointers... it needs to be big
							 | 
						||
| 
								 | 
							
								  enough. On most processors a pointer is the same as an unsigned
							 | 
						||
| 
								 | 
							
								  long... but maybe that's not true for yours?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `CMOCK_MEM_INDEX_TYPE`
							 | 
						||
| 
								 | 
							
								  This needs to be something big enough to point anywhere in Cmock's
							 | 
						||
| 
								 | 
							
								  memory space... usually it's an unsigned int.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Examples
							 | 
						||
| 
								 | 
							
								========
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can look in the [examples directory](/examples/) for a couple of examples on how
							 | 
						||
| 
								 | 
							
								you might tool CMock into your build process. You may also want to consider
							 | 
						||
| 
								 | 
							
								using [Ceedling](https://throwtheswitch.org/ceedling). Please note that
							 | 
						||
| 
								 | 
							
								these examples are meant to show how the build process works. They have
							 | 
						||
| 
								 | 
							
								failing tests ON PURPOSE to show what that would look like. Don't be alarmed. ;)
							 | 
						||
| 
								 | 
							
								
							 |