| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| #pragma once |
| |
| /* |
| |
| There are two types of tests: plain tests and data tests. The former are entirely self-contained; |
| they consist of a C function that takes no input and produces no output; simply calling functions |
| like utassert(), utexpect(), and utfail() to trigger success or failure. These are intended for |
| testing functionality that requires no or only trivial amounts of input data. |
| |
| Data tests are for functions which need to be called multiple times with different input values, |
| read from files. The input data comes from the *.test files included in the various modules, the |
| first line of each indicating the name of the test function that should be called, as well as |
| optional parameters. A data test retrieves these parameters and/or input data, and acts upon it. |
| Typically, part of the input data for the test will include the expected output of the test, which |
| can be checked by calling utexpect(). |
| |
| The tests are triggered by the dftest function, which can be run in three modes: |
| |
| dftest plain |
| dftest data <path> |
| dftest all <path> |
| |
| When run in 'plain' mode, only the plain tests requiring no input files are executed. When run in |
| 'data' mode, the specified path will be searched for all files with the extension .test, and the |
| functions indicated in the first line of those files will be called. A given function may be called |
| multiple times, since each test file corresponds to one test execution. The 'all' mode does both |
| plain and data tests. |
| |
| All test groups defined in the various source files in test/ directories must be explicitly |
| referenced from main.c in dftest, as this is where it gets the references to the set of available |
| groups. These are passed to utrun, so it can determine what tests it needs to execute based on |
| the plain and data parameters. |
| |
| */ |
| |
| typedef enum { |
| PlainTest, |
| DataTest, |
| } TestType; |
| |
| typedef struct TestCase TestCase; |
| typedef struct TestGroup TestGroup; |
| |
| struct TestCase { |
| const char *name; |
| TestType type; |
| void (*fun)(void); |
| }; |
| |
| struct TestGroup { |
| const char *name; |
| TestCase tests[]; |
| }; |
| |
| // Functions to be called by the test harness |
| |
| struct DFHashTable; |
| struct DFBuffer; |
| |
| TestCase *utlookup(TestGroup **groups, const char *name); |
| void utsetup(const char *path, struct DFHashTable *data, int argc, const char **argv, struct DFBuffer *output); |
| void utteardown(void); |
| void utrun(TestGroup **groups, int plain, int data, const char **filenames); |
| |
| // Functions to be called from within test cases |
| |
| const char *utgetpath(void); |
| void *utgetdata(void); |
| int utgetargc(void); |
| const char **utgetargv(void); |
| void *utgetoutput(void); |
| |
| void utassert(int condition, const char *description); |
| void utexpect(const char *actual, const char *expected); |
| void utfail(const char *reason); |