Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to mock macros? #929

Open
rickymohk opened this issue Sep 13, 2024 · 2 comments
Open

How to mock macros? #929

rickymohk opened this issue Sep 13, 2024 · 2 comments

Comments

@rickymohk
Copy link

rickymohk commented Sep 13, 2024

I am working on an IAR project. When my tests encounter micros accessing registers, segmentation fault will be raised. Are those macros mockable?

e.g.

stm32l4xx.h

#define WRITE_REG(REG, VAL)   ((REG) = (VAL))

source code file

#include "stm32l4xx.h"

void foo(void)
{
    WRITE_REG(some_register_address,some_value);
}

test code file

#include "mock_stm32l4xx.h"

void test_foo(void)
{
    foo();   //segmentation fault
}
@Letme
Copy link

Letme commented Sep 13, 2024

Macros are not mockable. Segmentation fault means you are accessing something that cannot be accessed in most cases which is a strange error to get from the target or simulator.

You mock low level registers as variables in a way that you create a stm32l4xx_test.h as "CPU" and then point typeDefs to the volatile variable instead of fixed addresses.

@mvandervoord
Copy link
Member

Here are some ideas towards working with registers:

https://vandervoord.net/blog/2015/5/24/unit-test-how-registers
https://vandervoord.net/blog/2015/5/24/unit-test-how-faking-changing-registers
https://vandervoord.net/blog/2015/5/24/unit-test-how-verifying-multiple-register-writes

To mock low-level API calls which are macros, you can perform a similar trick.

#ifdef TEST
void WRITE_REG(uint32_t REG, uint32_t VAL);
#else 
#define WRITE_REG(REG, VAL)   ((REG) = (VAL))
#endif

You never need to actually create the function in the top part. It provides a mockable interface for CMock to use. During release builds, the top portion is ignored and the macro is used.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants