| /* test/testutil.h */ |
| /*- |
| * Utilities for writing OpenSSL unit tests. |
| * |
| * More information: |
| * http://wiki.openssl.org/index.php/How_To_Write_Unit_Tests_For_OpenSSL |
| * |
| * Author: Mike Bland (mbland@acm.org) |
| * Date: 2014-06-07 |
| * ==================================================================== |
| * Copyright (c) 2014 The OpenSSL Project. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * |
| * 3. All advertising materials mentioning features or use of this |
| * software must display the following acknowledgment: |
| * "This product includes software developed by the OpenSSL Project |
| * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" |
| * |
| * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
| * endorse or promote products derived from this software without |
| * prior written permission. For written permission, please contact |
| * licensing@OpenSSL.org. |
| * |
| * 5. Products derived from this software may not be called "OpenSSL" |
| * nor may "OpenSSL" appear in their names without prior written |
| * permission of the OpenSSL Project. |
| * |
| * 6. Redistributions of any form whatsoever must retain the following |
| * acknowledgment: |
| * "This product includes software developed by the OpenSSL Project |
| * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
| * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
| * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
| * OF THE POSSIBILITY OF SUCH DAMAGE. |
| * ==================================================================== |
| */ |
| |
| #ifndef HEADER_TESTUTIL_H |
| # define HEADER_TESTUTIL_H |
| |
| /*- |
| * SETUP_TEST_FIXTURE and EXECUTE_TEST macros for test case functions. |
| * |
| * SETUP_TEST_FIXTURE will call set_up() to create a new TEST_FIXTURE_TYPE |
| * object called "fixture". It will also allocate the "result" variable used |
| * by EXECUTE_TEST. set_up() should take a const char* specifying the test |
| * case name and return a TEST_FIXTURE_TYPE by value. |
| * |
| * EXECUTE_TEST will pass fixture to execute_func() by value, call |
| * tear_down(), and return the result of execute_func(). execute_func() should |
| * take a TEST_FIXTURE_TYPE by value and return zero on success or one on |
| * failure. |
| * |
| * Unit tests can define their own SETUP_TEST_FIXTURE and EXECUTE_TEST |
| * variations like so: |
| * |
| * #define SETUP_FOOBAR_TEST_FIXTURE()\ |
| * SETUP_TEST_FIXTURE(FOOBAR_TEST_FIXTURE, set_up_foobar) |
| * |
| * #define EXECUTE_FOOBAR_TEST()\ |
| * EXECUTE_TEST(execute_foobar, tear_down_foobar) |
| * |
| * Then test case functions can take the form: |
| * |
| * static int test_foobar_feature() |
| * { |
| * SETUP_FOOBAR_TEST_FIXTURE(); |
| * [...set individual members of fixture...] |
| * EXECUTE_FOOBAR_TEST(); |
| * } |
| */ |
| # define SETUP_TEST_FIXTURE(TEST_FIXTURE_TYPE, set_up)\ |
| TEST_FIXTURE_TYPE fixture = set_up(TEST_CASE_NAME);\ |
| int result = 0 |
| |
| # define EXECUTE_TEST(execute_func, tear_down)\ |
| if (execute_func(fixture) != 0) result = 1;\ |
| tear_down(fixture);\ |
| return result |
| |
| /* |
| * TEST_CASE_NAME is defined as the name of the test case function where |
| * possible; otherwise we get by with the file name and line number. |
| */ |
| # if __STDC_VERSION__ < 199901L |
| # if defined(_MSC_VER) |
| # define TEST_CASE_NAME __FUNCTION__ |
| # else |
| # define testutil_stringify_helper(s) #s |
| # define testutil_stringify(s) testutil_stringify_helper(s) |
| # define TEST_CASE_NAME __FILE__ ":" testutil_stringify(__LINE__) |
| # endif /* _MSC_VER */ |
| # else |
| # define TEST_CASE_NAME __func__ |
| # endif /* __STDC_VERSION__ */ |
| |
| #endif /* HEADER_TESTUTIL_H */ |