/capnp_test

Test framework for Cap'n Proto compiler plugins.

Primary LanguageShellApache License 2.0Apache-2.0

capnp_test

Test framework for Cap'n Proto plugins.

The idea is to have a language agnostic test framework for Cap'n Proto plugins to use. This way there is a common set of tests to maintain that can be used by any plugin in any language.

At the core is a test.capnp schema defining all test data, and a Makefile for invoking the PUT (plugin under test) with data from the test schema.

Integrating the test framework with your plugin

A single executable, referred to as CAPNP_TEST_APP in the Makefile, is responsible for that each test gets carried out. That is, CAPNP_TEST_APP is called once, for each test case, with two arguments: the operation to be performed, and the name of the data from test.capnp. So, some knowledge of the relation between the name of the test data its type may be needed by the test app.

In order to run the test suite, invoke make with CAPNP_TEST_APP defined to the test app to use.

This may look something like this, when run from a command prompt:

    make CAPNP_TEST_APP=/path/to/test_app

If invoked from another makefile, simply make sure to export the CAPNP_TEST_APP variable, and then call $(MAKE) -C /path/to/capnp_test.

Test cases

The test cases is based on coding and decoding messages of varying types and data. All of this is defined in test.capnp and referenced from the Makefile.

In order to run a subset of the tests, define TESTS to the list of tests to be run prior to invoking make.

Example

As an example, we can look at the part of the Makefile for ecapnp that defines the rules for invoking the capnp_test tests.

check: export CAPNP_TEST_APP = $(CURDIR)/bin/ecapnp_test
check: test-schema build-test-deps

test-schema: $(DEPS_DIR)/capnp_test bin/test.capnp.hrl

bin/test.capnp.hrl: $(DEPS_DIR)/capnp_test/test.capnp
	capnpc -oerl:$(dir $@) --src-prefix=$(dir $<) $<

The build-test-deps target simply invokes a make all in the directory of ecapnp_test.

What does it look like?

When run, it may look something like this:

kaos@cypher ~/src/ecapnp (master *)
$ make check
++ TEST [decode-simpleTest]
== PASS [decode-simpleTest]

/home/kaos/src/ecapnp/bin/ecapnp_test done.

Or, in case of errors:

kaos@cypher ~/src/ecapnp (master *)
$ make check
++ TEST [decode-simpleTest]
2c2
<   msg = "a short message..." )
---
>   msg = "...egassem trohs a" )
## FAIL [decode-simpleTest]

/home/kaos/src/ecapnp/bin/ecapnp_test done.

TODO

More tests. Test different packaging/streaming options. Default values. Etc..