Skip to main content

A minimal mocking utility for C projects.

Project description

🎣 narmock

Build Status PyPI PyPI - Python Version Code style: black

A minimal mocking utility for C projects.

🚧 Work in progress 🚧

Narmock finds the functions mocked in your tests and generates mocks with a slick API.

#include <time.h>

#include "__mocks__.h"
#include "narwhal.h"

TEST(example)
{
    MOCK(time)->mock_return(42);
    ASSERT_EQ(time(NULL), 42);
}

This example is a test written with Narwhal but Narmock can be used with other test frameworks and anywhere in regular source code.

Installation

The package can be installed with pip.

$ pip install narmock

Getting started

The command-line utility provides two essential commands that should make it possible to integrate Narmock in any kind of build system.

usage: narmock [-h] (-g [<code>] | -f) [-d <directory>]

A minimal mocking utility for C projects.

optional arguments:
  -h, --help      show this help message and exit
  -g [<code>]     generate mocks
  -f              output linker flags
  -d <directory>  mocks directory

Check out the basic example for a simple Makefile that integrates both Narwhal and Narmock.

Generating mocks

The narmock -g command finds the functions mocked in your code and generates a __mocks__.c file and a __mocks__.h file that respectively define and declare all the required mocks.

$ gcc -E *.c | narmock -g

Narmock requires source code to be expanded by the preprocessor. You can directly pipe the output of gcc -E to the command-line utility.

By default, __mocks__.c and __mocks__.h will be created in the current directory. You can specify a different output directory with the -d option.

$ gcc -E tests/*.c | narmock -g -d tests

Retrieving linker flags

The narmock -f command reads the generated __mocks__.h file and outputs the necessary linker flags for linking all your source files together.

$ gcc $(narmock -f) *.c

By default, the command looks for __mocks__.h in the current directory. You can specify a different directory with the -d option.

$ gcc $(narmock -f -d tests) tests/*.c

Mock API

The MOCK macro returns a pointer to the mock API of a given function.

MOCK(time);

Mock return

You can make a function return a specific value without calling its original implementation.

MOCK(time)->mock_return(42);

printf("%ld\n", time(NULL));  // Outputs 42

Mock implementation

You can switch the implementation of a function.

time_t time_stub(time_t *timer)
{
    return 42;
}

MOCK(time)->mock_implementation(time_stub);

printf("%ld\n", time(NULL));  // Outputs 42

Disable mock

You can disable the mock and make the function call its original implementation.

MOCK(time)->disable_mock();

printf("%ld\n", time(NULL));  // Outputs the current time

Call history

You can inspect the last call of a function.

printf("%ld\n", time(NULL));  // Outputs the current time

printf("%p\n", MOCK(time)->last_call->arg1);           // Outputs (nil)
printf("%ld\n", MOCK(time)->last_call->return_value);  // Outputs the current time

Note that the last_call pointer is NULL until the function gets called for the first time.

Contributing

Contributions are welcome. Feel free to open issues and suggest improvements. This project uses poetry so you'll need to install it first if you want to be able to work with the project locally.

$ curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python

You should now be able to install the required dependencies.

$ poetry install

The code follows the black code style.

$ poetry run black narmock

You can run the tests with poetry run make -C tests. The test suite is built with Narwhal.

$ poetry run make -C tests

License - MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

narmock-0.2.1.tar.gz (11.2 kB view details)

Uploaded Source

Built Distribution

narmock-0.2.1-py3-none-any.whl (11.6 kB view details)

Uploaded Python 3

File details

Details for the file narmock-0.2.1.tar.gz.

File metadata

  • Download URL: narmock-0.2.1.tar.gz
  • Upload date:
  • Size: 11.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/0.12.17 CPython/3.7.1 Linux/4.15.0-1028-gcp

File hashes

Hashes for narmock-0.2.1.tar.gz
Algorithm Hash digest
SHA256 b3783abb53048a6a0e3de1d0dae6a7d08fe8aad86f5da00de3c01ee4b2ee1300
MD5 3686b3e1240eadf32ea19ff6ffad8d06
BLAKE2b-256 3c37ac3c0deb4cea175cf63c245ecd95b3a8ecff51a4deafc93c7ff47906731f

See more details on using hashes here.

File details

Details for the file narmock-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: narmock-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 11.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/0.12.17 CPython/3.7.1 Linux/4.15.0-1028-gcp

File hashes

Hashes for narmock-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ba1a7c24f172fd72e45f66e47dfe8b74f5f1ca331739b17acb5980a08b0ed46f
MD5 19dc393a1afa5535838af645252e8fff
BLAKE2b-256 df96c5e3a521d5498d039c6f2ab9b9a791642bd5bd03c470712fcec3a5853b8d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page