9e545cd92c028d880544a97d020f2d7947d7df8d
[src/agl-compositor.git] / tests / weston-test-runner.h
1 /*
2  * Copyright © 2012 Intel Corporation
3  * Copyright © 2013 Sam Spilsbury <smspillaz@gmail.com>
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the
14  * next paragraph) shall be included in all copies or substantial
15  * portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20  * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
21  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
22  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24  * SOFTWARE.
25  */
26
27 #ifndef _WESTON_TEST_RUNNER_H_
28 #define _WESTON_TEST_RUNNER_H_
29
30 #include "config.h"
31
32 #include <stdlib.h>
33
34 #include <wayland-util.h>
35 #include "shared/helpers.h"
36 #include "weston-test-fixture-compositor.h"
37 #include "weston-testsuite-data.h"
38
39 #ifdef NDEBUG
40 #error "Tests must not be built with NDEBUG defined, they rely on assert()."
41 #endif
42
43 /** Test program entry
44  *
45  * Each invocation of TEST(), TEST_P(), or PLUGIN_TEST() will create one
46  * more weston_test_entry in a custom named section in the final binary.
47  * Iterating through the section then allows to iterate through all
48  * the defined tests.
49  *
50  * \ingroup testharness_private
51  */
52 struct weston_test_entry {
53         const char *name;
54         void (*run)(void *);
55         const void *table_data;
56         size_t element_size;
57         int n_elements;
58 } __attribute__ ((aligned (32)));
59
60 #define TEST_BEGIN(name, arg)                                           \
61         static void name(arg)
62
63 #define TEST_COMMON(func, name, data, size, n_elem)                     \
64         static void func(void *);                                       \
65                                                                         \
66         const struct weston_test_entry test##name                       \
67                 __attribute__ ((used, section ("test_section"))) =      \
68         {                                                               \
69                 #name, func, data, size, n_elem                         \
70         };
71
72 #define NO_ARG_TEST(name)                                               \
73         TEST_COMMON(wrap##name, name, NULL, 0, 1)                       \
74         static void name(void);                                         \
75         static void wrap##name(void *data)                              \
76         {                                                               \
77                 (void) data;                                            \
78                 name();                                                 \
79         }                                                               \
80                                                                         \
81         TEST_BEGIN(name, void)
82
83 #define ARG_TEST(name, test_data)                                       \
84         TEST_COMMON(name, name, test_data,                              \
85                     sizeof(test_data[0]),                               \
86                     ARRAY_LENGTH(test_data))                            \
87         TEST_BEGIN(name, void *data)                                    \
88
89 /** Add a test with no parameters
90  *
91  * This defines one test as a new function. Use this macro in place of the
92  * function signature and put the function body after this.
93  *
94  * \param name Name for the test, must be a valid function name.
95  *
96  * \ingroup testharness
97  */
98 #define TEST(name) NO_ARG_TEST(name)
99
100 /** Add an array driven test with a parameter
101  *
102  * This defines an array of tests as a new function. Use this macro in place
103  * of the function signature and put the function body after this. The function
104  * will be executed once for each element in \c data_array, passing the
105  * element as the argument <tt>void *data</tt> to the function.
106  *
107  * This macro is not usable if fixture setup is using
108  * weston_test_harness_execute_as_plugin().
109  *
110  * \param name Name for the test, must be a valid function name.
111  * \param data_array A static const array of any type. The length will be
112  * recorded automatically.
113  *
114  * \ingroup testharness
115  */
116 #define TEST_P(name, data_array) ARG_TEST(name, data_array)
117
118 /** Add a test with weston_compositor argument
119  *
120  * This defines one test as a new function. Use this macro in place of the
121  * function signature and put the function body after this. The function
122  * will have one argument <tt>struct weston_compositor *compositor</tt>.
123  *
124  * This macro is only usable if fixture setup is using
125  * weston_test_harness_execute_as_plugin().
126  *
127  * \param name Name for the test, must be a valid function name.
128  *
129  * \ingroup testharness
130  */
131 #define PLUGIN_TEST(name)                                               \
132         TEST_COMMON(wrap##name, name, NULL, 0, 1)                       \
133         static void name(struct weston_compositor *);                   \
134         static void wrap##name(void *compositor)                        \
135         {                                                               \
136                 name(compositor);                                       \
137         }                                                               \
138         TEST_BEGIN(name, struct weston_compositor *compositor)
139
140 void
141 testlog(const char *fmt, ...) WL_PRINTF(1, 2);
142
143 const char *
144 get_test_name(void);
145
146 int
147 get_test_fixture_index(void);
148
149 /** Fixture setup array record
150  *
151  * Helper to store the attributes of the data array passed in to
152  * DECLARE_FIXTURE_SETUP_WITH_ARG().
153  *
154  * \ingroup testharness_private
155  */
156 struct fixture_setup_array {
157         const void *array;
158         size_t element_size;
159         int n_elements;
160 };
161
162 const struct fixture_setup_array *
163 fixture_setup_array_get_(void);
164
165 /** Test harness context
166  *
167  * \ingroup testharness
168  */
169 struct weston_test_harness;
170
171 enum test_result_code
172 fixture_setup_run_(struct weston_test_harness *harness, const void *arg_);
173
174 /** Register a fixture setup function
175  *
176  * This registers the given (preferably static) function to be used for setting
177  * up any fixtures you might need. The function must have the signature:
178  *
179  * \code
180  * enum test_result_code func_(struct weston_test_harness *harness)
181  * \endcode
182  *
183  * The function must call one of weston_test_harness_execute_standalone(),
184  * weston_test_harness_execute_as_plugin() or
185  * weston_test_harness_execute_as_client() passing in the \c harness argument,
186  * and return the return value from that call. The function can also return a
187  * test_result_code on its own if it does not want to run the tests,
188  * e.g. RESULT_SKIP or RESULT_HARD_ERROR.
189  *
190  * The function will be called once to run all tests.
191  *
192  * \param func_ The function to be used as fixture setup.
193  *
194  * \ingroup testharness
195  */
196 #define DECLARE_FIXTURE_SETUP(func_)                                    \
197         enum test_result_code                                           \
198         fixture_setup_run_(struct weston_test_harness *harness,         \
199                            const void *arg_)                            \
200         {                                                               \
201                 return func_(harness);                                  \
202         }
203
204 /** Register a fixture setup function with a data array
205  *
206  * This registers the given (preferably static) function to be used for setting
207  * up any fixtures you might need. The function must have the signature:
208  *
209  * \code
210  * enum test_result_code func_(struct weston_test_harness *harness, typeof(array_[0]) *arg)
211  * \endcode
212  *
213  * The function must call one of weston_test_harness_execute_standalone(),
214  * weston_test_harness_execute_as_plugin() or
215  * weston_test_harness_execute_as_client() passing in the \c harness argument,
216  * and return the return value from that call. The function can also return a
217  * test_result_code on its own if it does not want to run the tests,
218  * e.g. RESULT_SKIP or RESULT_HARD_ERROR.
219  *
220  * The function will be called once with each element of the array pointed to
221  * by \c arg, so that all tests would be repeated for each element in turn.
222  *
223  * \param func_ The function to be used as fixture setup.
224  * \param array_ A static const array of arbitrary type.
225  *
226  * \ingroup testharness
227  */
228 #define DECLARE_FIXTURE_SETUP_WITH_ARG(func_, array_)                   \
229         const struct fixture_setup_array *                              \
230         fixture_setup_array_get_(void)                                  \
231         {                                                               \
232                 static const struct fixture_setup_array arr = {         \
233                         .array = array_,                                \
234                         .element_size = sizeof(array_[0]),              \
235                         .n_elements = ARRAY_LENGTH(array_)              \
236                 };                                                      \
237                 return &arr;                                            \
238         }                                                               \
239                                                                         \
240         enum test_result_code                                           \
241         fixture_setup_run_(struct weston_test_harness *harness,         \
242                            const void *arg_)                            \
243         {                                                               \
244                 typeof(array_[0]) *arg = arg_;                          \
245                 return func_(harness, arg);                             \
246         }
247
248 enum test_result_code
249 weston_test_harness_execute_as_client(struct weston_test_harness *harness,
250                                       const struct compositor_setup *setup);
251
252 enum test_result_code
253 weston_test_harness_execute_as_plugin(struct weston_test_harness *harness,
254                                       const struct compositor_setup *setup);
255
256 enum test_result_code
257 weston_test_harness_execute_standalone(struct weston_test_harness *harness);
258
259 #endif