README revision 1.1 1 1.1 christos How to add recipes
2 1.1 christos ==================
3 1.1 christos
4 1.1 christos For any test that you want to perform, you write a script located in
5 1.1 christos test/recipes/, named {nn}-test_{name}.t, where {nn} is a two digit number and
6 1.1 christos {name} is a unique name of your choice.
7 1.1 christos
8 1.1 christos Please note that if a test involves a new testing executable, you will need to
9 1.1 christos do some additions in test/Makefile. More on this later.
10 1.1 christos
11 1.1 christos
12 1.1 christos Naming conventions
13 1.1 christos =================
14 1.1 christos
15 1.1 christos A test executable is named test/{name}test.c
16 1.1 christos
17 1.1 christos A test recipe is named test/recipes/{nn}-test_{name}.t, where {nn} is a two
18 1.1 christos digit number and {name} is a unique name of your choice.
19 1.1 christos
20 1.1 christos The number {nn} is (somewhat loosely) grouped as follows:
21 1.1 christos
22 1.1 christos 00-04 sanity, internal and essential API tests
23 1.1 christos 05-09 individual symmetric cipher algorithms
24 1.1 christos 10-14 math (bignum)
25 1.1 christos 15-19 individual asymmetric cipher algorithms
26 1.1 christos 20-24 openssl commands (some otherwise not tested)
27 1.1 christos 25-29 certificate forms, generation and verification
28 1.1 christos 30-35 engine and evp
29 1.1 christos 60-79 APIs
30 1.1 christos 70 PACKET layer
31 1.1 christos 80-89 "larger" protocols (CA, CMS, OCSP, SSL, TSA)
32 1.1 christos 90-98 misc
33 1.1 christos 99 most time consuming tests [such as test_fuzz]
34 1.1 christos
35 1.1 christos
36 1.1 christos A recipe that just runs a test executable
37 1.1 christos =========================================
38 1.1 christos
39 1.1 christos A script that just runs a program looks like this:
40 1.1 christos
41 1.1 christos #! /usr/bin/perl
42 1.1 christos
43 1.1 christos use OpenSSL::Test::Simple;
44 1.1 christos
45 1.1 christos simple_test("test_{name}", "{name}test", "{name}");
46 1.1 christos
47 1.1 christos {name} is the unique name you have chosen for your test.
48 1.1 christos
49 1.1 christos The second argument to `simple_test' is the test executable, and `simple_test'
50 1.1 christos expects it to be located in test/
51 1.1 christos
52 1.1 christos For documentation on OpenSSL::Test::Simple, do
53 1.1 christos `perldoc util/perl/OpenSSL/Test/Simple.pm'.
54 1.1 christos
55 1.1 christos
56 1.1 christos A recipe that runs a more complex test
57 1.1 christos ======================================
58 1.1 christos
59 1.1 christos For more complex tests, you will need to read up on Test::More and
60 1.1 christos OpenSSL::Test. Test::More is normally preinstalled, do `man Test::More' for
61 1.1 christos documentation. For OpenSSL::Test, do `perldoc util/perl/OpenSSL/Test.pm'.
62 1.1 christos
63 1.1 christos A script to start from could be this:
64 1.1 christos
65 1.1 christos #! /usr/bin/perl
66 1.1 christos
67 1.1 christos use strict;
68 1.1 christos use warnings;
69 1.1 christos use OpenSSL::Test;
70 1.1 christos
71 1.1 christos setup("test_{name}");
72 1.1 christos
73 1.1 christos plan tests => 2; # The number of tests being performed
74 1.1 christos
75 1.1 christos ok(test1, "test1");
76 1.1 christos ok(test2, "test1");
77 1.1 christos
78 1.1 christos sub test1
79 1.1 christos {
80 1.1 christos # test feature 1
81 1.1 christos }
82 1.1 christos
83 1.1 christos sub test2
84 1.1 christos {
85 1.1 christos # test feature 2
86 1.1 christos }
87 1.1 christos
88 1.1 christos
89 1.1 christos Changes to test/build.info
90 1.1 christos ==========================
91 1.1 christos
92 1.1 christos Whenever a new test involves a new test executable you need to do the
93 1.1 christos following (at all times, replace {NAME} and {name} with the name of your
94 1.1 christos test):
95 1.1 christos
96 1.1 christos * add {name} to the list of programs under PROGRAMS_NO_INST
97 1.1 christos
98 1.1 christos * create a three line description of how to build the test, you will have
99 1.1 christos to modify the include paths and source files if you don't want to use the
100 1.1 christos basic test framework:
101 1.1 christos
102 1.1 christos SOURCE[{name}]={name}.c
103 1.1 christos INCLUDE[{name}]=.. ../include
104 1.1 christos DEPEND[{name}]=../libcrypto libtestutil.a
105 1.1 christos
106 1.1 christos Generic form of C test executables
107 1.1 christos ==================================
108 1.1 christos
109 1.1 christos #include "testutil.h"
110 1.1 christos
111 1.1 christos static int my_test(void)
112 1.1 christos {
113 1.1 christos int testresult = 0; /* Assume the test will fail */
114 1.1 christos int observed;
115 1.1 christos
116 1.1 christos observed = function(); /* Call the code under test */
117 1.1 christos if (!TEST_int_eq(observed, 2)) /* Check the result is correct */
118 1.1 christos goto end; /* Exit on failure - optional */
119 1.1 christos
120 1.1 christos testresult = 1; /* Mark the test case a success */
121 1.1 christos end:
122 1.1 christos cleanup(); /* Any cleanup you require */
123 1.1 christos return testresult;
124 1.1 christos }
125 1.1 christos
126 1.1 christos int setup_tests(void)
127 1.1 christos {
128 1.1 christos ADD_TEST(my_test); /* Add each test separately */
129 1.1 christos return 1; /* Indicate success */
130 1.1 christos }
131 1.1 christos
132 1.1 christos You should use the TEST_xxx macros provided by testutil.h to test all failure
133 1.1 christos conditions. These macros produce an error message in a standard format if the
134 1.1 christos condition is not met (and nothing if the condition is met). Additional
135 1.1 christos information can be presented with the TEST_info macro that takes a printf
136 1.1 christos format string and arguments. TEST_error is useful for complicated conditions,
137 1.1 christos it also takes a printf format string and argument. In all cases the TEST_xxx
138 1.1 christos macros are guaranteed to evaluate their arguments exactly once. This means
139 1.1 christos that expressions with side effects are allowed as parameters. Thus,
140 1.1 christos
141 1.1 christos if (!TEST_ptr(ptr = OPENSSL_malloc(..)))
142 1.1 christos
143 1.1 christos works fine and can be used in place of:
144 1.1 christos
145 1.1 christos ptr = OPENSSL_malloc(..);
146 1.1 christos if (!TEST_ptr(ptr))
147 1.1 christos
148 1.1 christos The former produces a more meaningful message on failure than the latter.
149 1.1 christos
150