diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index ff8e182b..4ff5bcc3 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -7,7 +7,6 @@ * [ ] `#if`/`#ifdef`s only for header encapsulation -* [ ] `api.h` does not include other files * [ ] No stringification macros * [ ] Output-parameter pointers in functions are on the left * [ ] Negative return values on failure of API functions (within restrictions of FO transform). diff --git a/README.md b/README.md index e69225ed..f68dbdd8 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ _The checking of items on this list is still being developed. Checked items shou * [x] Code is valid C99 * [x] Passes functional tests * [x] API functions do not write outside provided buffers +* [x] `api.h` cannot include external files * [x] Compiles with `-Wall -Wextra -Wpedantic -Werror` with `gcc` and `clang` * [x] Consistent test vectors across runs * [x] Consistent test vectors on big-endian and little-endian machines diff --git a/test/test_api_h.py b/test/test_api_h.py new file mode 100644 index 00000000..501791f9 --- /dev/null +++ b/test/test_api_h.py @@ -0,0 +1,32 @@ +import os +import re + +import pqclean + + +def test_preprocessor(): + for scheme in pqclean.Scheme.all_schemes(): + for implementation in scheme.implementations: + yield check_preprocessor, implementation + + +def check_preprocessor(implementation: pqclean.Implementation): + apipath = os.path.join(implementation.path(), 'api.h') + errors = [] + p = re.compile(r'^\s*#include\s*"') + with open(apipath) as f: + for i, line in enumerate(f): + if p.match(line): + errors.append("\n at {}:{}".format(apipath, i+1)) + if errors: + raise AssertionError( + "Prohibited external include in api.h" + "".join(errors) + ) + +if __name__ == "__main__": + try: + import nose2 + nose2.main() + except ImportError: + import nose + nose.runmodule()