1 | // (C) Copyright Gennadiy Rozental 2001. |
2 | // Distributed under the Boost Software License, Version 1.0. |
3 | // (See accompanying file LICENSE_1_0.txt or copy at |
4 | // http://www.boost.org/LICENSE_1_0.txt) |
5 | |
6 | // See http://www.boost.org/libs/test for the library home page. |
7 | // |
8 | // File : $RCSfile$ |
9 | // |
10 | // Version : $Revision$ |
11 | // |
12 | // Description : simple implementation for Unit Test Framework parameter |
13 | // handling routines. May be rewritten in future to use some kind of |
14 | // command-line arguments parsing facility and environment variable handling |
15 | // facility |
16 | // *************************************************************************** |
17 | |
18 | #ifndef BOOST_TEST_UNIT_TEST_PARAMETERS_IPP_012205GER |
19 | #define BOOST_TEST_UNIT_TEST_PARAMETERS_IPP_012205GER |
20 | |
21 | // Boost.Test |
22 | #include <boost/test/unit_test_parameters.hpp> |
23 | |
24 | #include <boost/test/utils/basic_cstring/basic_cstring.hpp> |
25 | #include <boost/test/utils/basic_cstring/compare.hpp> |
26 | #include <boost/test/utils/basic_cstring/io.hpp> |
27 | #include <boost/test/utils/iterator/token_iterator.hpp> |
28 | |
29 | #include <boost/test/debug.hpp> |
30 | #include <boost/test/framework.hpp> |
31 | |
32 | #include <boost/test/detail/log_level.hpp> |
33 | #include <boost/test/detail/throw_exception.hpp> |
34 | |
35 | // Boost.Runtime.Param |
36 | #include <boost/test/utils/runtime/parameter.hpp> |
37 | #include <boost/test/utils/runtime/argument.hpp> |
38 | #include <boost/test/utils/runtime/finalize.hpp> |
39 | #include <boost/test/utils/runtime/cla/parser.hpp> |
40 | #include <boost/test/utils/runtime/env/fetch.hpp> |
41 | |
42 | // Boost |
43 | #include <boost/config.hpp> |
44 | #include <boost/test/detail/suppress_warnings.hpp> |
45 | #include <boost/test/detail/enable_warnings.hpp> |
46 | #include <boost/cstdlib.hpp> |
47 | |
48 | // STL |
49 | #include <cstdlib> |
50 | #include <iostream> |
51 | #include <fstream> |
52 | |
53 | #include <boost/test/detail/suppress_warnings.hpp> |
54 | |
55 | //____________________________________________________________________________// |
56 | |
57 | # ifdef BOOST_NO_STDC_NAMESPACE |
58 | namespace std { using ::getenv; using ::strncmp; using ::strcmp; } |
59 | # endif |
60 | |
61 | namespace boost { |
62 | namespace unit_test { |
63 | |
64 | namespace rt = boost::runtime; |
65 | |
66 | // ************************************************************************** // |
67 | // ************** runtime_config ************** // |
68 | // ************************************************************************** // |
69 | |
70 | namespace runtime_config { |
71 | |
72 | // UTF parameters |
73 | std::string btrt_auto_start_dbg = "auto_start_dbg" ; |
74 | std::string btrt_break_exec_path = "break_exec_path" ; |
75 | std::string btrt_build_info = "build_info" ; |
76 | std::string btrt_catch_sys_errors = "catch_system_errors" ; |
77 | std::string btrt_color_output = "color_output" ; |
78 | std::string btrt_detect_fp_except = "detect_fp_exceptions" ; |
79 | std::string btrt_detect_mem_leaks = "detect_memory_leaks" ; |
80 | std::string btrt_list_content = "list_content" ; |
81 | std::string btrt_list_labels = "list_labels" ; |
82 | std::string btrt_log_format = "log_format" ; |
83 | std::string btrt_log_level = "log_level" ; |
84 | std::string btrt_log_sink = "log_sink" ; |
85 | std::string btrt_combined_logger = "logger" ; |
86 | std::string btrt_output_format = "output_format" ; |
87 | std::string btrt_random_seed = "random" ; |
88 | std::string btrt_report_format = "report_format" ; |
89 | std::string btrt_report_level = "report_level" ; |
90 | std::string btrt_report_mem_leaks = "report_memory_leaks_to" ; |
91 | std::string btrt_report_sink = "report_sink" ; |
92 | std::string btrt_result_code = "result_code" ; |
93 | std::string btrt_run_filters = "run_test" ; |
94 | std::string btrt_save_test_pattern = "save_pattern" ; |
95 | std::string btrt_show_progress = "show_progress" ; |
96 | std::string btrt_use_alt_stack = "use_alt_stack" ; |
97 | std::string btrt_wait_for_debugger = "wait_for_debugger" ; |
98 | |
99 | std::string btrt_help = "help" ; |
100 | std::string btrt_usage = "usage" ; |
101 | std::string btrt_version = "version" ; |
102 | |
103 | //____________________________________________________________________________// |
104 | |
105 | namespace { |
106 | |
107 | void |
108 | register_parameters( rt::parameters_store& store ) |
109 | { |
110 | rt::option auto_start_dbg( btrt_auto_start_dbg, ( |
111 | rt::description = "Automatically attaches debugger in case of system level failure (signal)." , |
112 | rt::env_var = "BOOST_TEST_AUTO_START_DBG" , |
113 | |
114 | rt::help = "Specifies whether Boost.Test should attempt " |
115 | "to attach a debugger when fatal system error occurs. At the moment this feature " |
116 | "is only available on a few selected platforms: Win32 and *nix. There is a " |
117 | "default debugger configured for these platforms. You can manually configure " |
118 | "different debugger. For more details on how to configure the debugger see the " |
119 | "Boost.Test debug API, specifically the function boost::debug::set_debugger." |
120 | )); |
121 | |
122 | auto_start_dbg.add_cla_id( prefix: "--" , tag: btrt_auto_start_dbg, value_separator: "=" ); |
123 | auto_start_dbg.add_cla_id( prefix: "-" , tag: "d" , value_separator: " " ); |
124 | store.add( in: auto_start_dbg ); |
125 | |
126 | /////////////////////////////////////////////// |
127 | |
128 | rt::parameter<std::string> break_exec_path( btrt_break_exec_path, ( |
129 | rt::description = "For the exception safety testing allows to break at specific execution path." , |
130 | rt::env_var = "BOOST_TEST_BREAK_EXEC_PATH" |
131 | #ifndef BOOST_NO_CXX11_LAMBDAS |
132 | , |
133 | rt::callback = [](rt::cstring) { |
134 | BOOST_TEST_SETUP_ASSERT( false, "parameter break_exec_path is disabled in this release" ); |
135 | } |
136 | #endif |
137 | )); |
138 | |
139 | break_exec_path.add_cla_id( prefix: "--" , tag: btrt_break_exec_path, value_separator: "=" ); |
140 | store.add( in: break_exec_path ); |
141 | |
142 | /////////////////////////////////////////////// |
143 | |
144 | rt::option build_info( btrt_build_info, ( |
145 | rt::description = "Displays library build information." , |
146 | rt::env_var = "BOOST_TEST_BUILD_INFO" , |
147 | rt::help = "Displays library build information, including: platform, " |
148 | "compiler, STL version and Boost version." |
149 | )); |
150 | |
151 | build_info.add_cla_id( prefix: "--" , tag: btrt_build_info, value_separator: "=" ); |
152 | build_info.add_cla_id( prefix: "-" , tag: "i" , value_separator: " " ); |
153 | store.add( in: build_info ); |
154 | |
155 | /////////////////////////////////////////////// |
156 | |
157 | rt::option catch_sys_errors( btrt_catch_sys_errors, ( |
158 | rt::description = "Allows to switch between catching and ignoring system errors (signals)." , |
159 | rt::env_var = "BOOST_TEST_CATCH_SYSTEM_ERRORS" , |
160 | rt::default_value = |
161 | #ifdef BOOST_TEST_DEFAULTS_TO_CORE_DUMP |
162 | false, |
163 | #else |
164 | true, |
165 | #endif |
166 | rt::help = "If option " + btrt_catch_sys_errors + " has value 'no' the frameworks does not attempt to catch " |
167 | "asynchronous system failure events (signals on *NIX platforms or structured exceptions on Windows). " |
168 | " Default value is " |
169 | #ifdef BOOST_TEST_DEFAULTS_TO_CORE_DUMP |
170 | "no." |
171 | #else |
172 | "true." |
173 | #endif |
174 | )); |
175 | |
176 | catch_sys_errors.add_cla_id( prefix: "--" , tag: btrt_catch_sys_errors, value_separator: "=" , negatable: true ); |
177 | catch_sys_errors.add_cla_id( prefix: "-" , tag: "s" , value_separator: " " ); |
178 | store.add( in: catch_sys_errors ); |
179 | |
180 | /////////////////////////////////////////////// |
181 | |
182 | rt::option color_output( btrt_color_output, ( |
183 | rt::description = "Enables color output of the framework log and report messages." , |
184 | rt::env_var = "BOOST_TEST_COLOR_OUTPUT" , |
185 | rt::default_value = true, |
186 | rt::help = "Produces color output for logs, reports and help. " |
187 | "Defaults to true. " |
188 | )); |
189 | |
190 | color_output.add_cla_id( prefix: "--" , tag: btrt_color_output, value_separator: "=" , negatable: true ); |
191 | color_output.add_cla_id( prefix: "-" , tag: "x" , value_separator: " " ); |
192 | store.add( in: color_output ); |
193 | |
194 | /////////////////////////////////////////////// |
195 | |
196 | rt::option detect_fp_except( btrt_detect_fp_except, ( |
197 | rt::description = "Enables/disables floating point exceptions traps." , |
198 | rt::env_var = "BOOST_TEST_DETECT_FP_EXCEPTIONS" , |
199 | rt::help = "Enables/disables hardware traps for the floating " |
200 | "point exceptions (if supported on your platfrom)." |
201 | )); |
202 | |
203 | detect_fp_except.add_cla_id( prefix: "--" , tag: btrt_detect_fp_except, value_separator: "=" , negatable: true ); |
204 | store.add( in: detect_fp_except ); |
205 | |
206 | /////////////////////////////////////////////// |
207 | |
208 | rt::parameter<unsigned long> detect_mem_leaks( btrt_detect_mem_leaks, ( |
209 | rt::description = "Turns on/off memory leaks detection (optionally breaking on specified alloc order number)." , |
210 | rt::env_var = "BOOST_TEST_DETECT_MEMORY_LEAK" , |
211 | rt::default_value = 1L, |
212 | rt::optional_value = 1L, |
213 | rt::value_hint = "<alloc order number>" , |
214 | rt::help = "Enables/disables memory leaks detection. " |
215 | "This parameter has optional long integer value. The default value is 1, which " |
216 | "enables the memory leak detection. The value 0 disables memory leak detection. " |
217 | "Any value N greater than 1 is treated as leak allocation number and tells the " |
218 | "framework to setup runtime breakpoint at Nth heap allocation. If value is " |
219 | "omitted the default value is assumed." |
220 | )); |
221 | |
222 | detect_mem_leaks.add_cla_id( prefix: "--" , tag: btrt_detect_mem_leaks, value_separator: "=" ); |
223 | store.add( in: detect_mem_leaks ); |
224 | |
225 | /////////////////////////////////////////////// |
226 | |
227 | rt::enum_parameter<unit_test::output_format> list_content( btrt_list_content, ( |
228 | rt::description = "Lists the content of test tree - names of all test suites and test cases." , |
229 | rt::env_var = "BOOST_TEST_LIST_CONTENT" , |
230 | rt::default_value = OF_INVALID, |
231 | rt::optional_value = OF_CLF, |
232 | rt::enum_values<unit_test::output_format>::value = |
233 | #if defined(BOOST_TEST_CLA_NEW_API) |
234 | { |
235 | { "HRF" , OF_CLF }, |
236 | { "DOT" , OF_DOT } |
237 | }, |
238 | #else |
239 | rt::enum_values_list<unit_test::output_format>() |
240 | ( "HRF" , OF_CLF ) |
241 | ( "DOT" , OF_DOT ) |
242 | , |
243 | #endif |
244 | rt::help = "Lists the test suites and cases " |
245 | "of the test module instead of executing the test cases. The format of the " |
246 | "desired output can be passed to the command. Currently the " |
247 | "framework supports two formats: human readable format (HRF) and dot graph " |
248 | "format (DOT). If value is omitted HRF value is assumed." |
249 | )); |
250 | list_content.add_cla_id( prefix: "--" , tag: btrt_list_content, value_separator: "=" ); |
251 | store.add( in: list_content ); |
252 | |
253 | /////////////////////////////////////////////// |
254 | |
255 | rt::option list_labels( btrt_list_labels, ( |
256 | rt::description = "Lists all available labels." , |
257 | rt::env_var = "BOOST_TEST_LIST_LABELS" , |
258 | rt::help = "Option " + btrt_list_labels + " instructs the framework to list all the the labels " |
259 | "defined in the test module instead of executing the test cases." |
260 | )); |
261 | |
262 | list_labels.add_cla_id( prefix: "--" , tag: btrt_list_labels, value_separator: "=" ); |
263 | store.add( in: list_labels ); |
264 | |
265 | /////////////////////////////////////////////// |
266 | |
267 | rt::enum_parameter<unit_test::output_format> log_format( btrt_log_format, ( |
268 | rt::description = "Specifies log format." , |
269 | rt::env_var = "BOOST_TEST_LOG_FORMAT" , |
270 | rt::default_value = OF_CLF, |
271 | rt::enum_values<unit_test::output_format>::value = |
272 | #if defined(BOOST_TEST_CLA_NEW_API) |
273 | { |
274 | { "HRF" , OF_CLF }, |
275 | { "CLF" , OF_CLF }, |
276 | { "XML" , OF_XML }, |
277 | { "JUNIT" , OF_JUNIT }, |
278 | }, |
279 | #else |
280 | rt::enum_values_list<unit_test::output_format>() |
281 | ( "HRF" , OF_CLF ) |
282 | ( "CLF" , OF_CLF ) |
283 | ( "XML" , OF_XML ) |
284 | ( "JUNIT" , OF_JUNIT ) |
285 | , |
286 | #endif |
287 | rt::help = "Set the frameowrk's log format to one " |
288 | "of the formats supplied by the framework. The only acceptable values for this " |
289 | "parameter are the names of the output formats supplied by the framework. By " |
290 | "default the framework uses human readable format (HRF) for testing log. This " |
291 | "format is similar to compiler error format. Alternatively you can specify XML " |
292 | "or JUNIT as log format, which are easier to process by testing automation tools." |
293 | )); |
294 | |
295 | log_format.add_cla_id( prefix: "--" , tag: btrt_log_format, value_separator: "=" ); |
296 | log_format.add_cla_id( prefix: "-" , tag: "f" , value_separator: " " ); |
297 | store.add( in: log_format ); |
298 | |
299 | /////////////////////////////////////////////// |
300 | |
301 | rt::enum_parameter<unit_test::log_level> log_level( btrt_log_level, ( |
302 | rt::description = "Specifies the logging level of the test execution." , |
303 | rt::env_var = "BOOST_TEST_LOG_LEVEL" , |
304 | rt::default_value = log_all_errors, |
305 | rt::enum_values<unit_test::log_level>::value = |
306 | #if defined(BOOST_TEST_CLA_NEW_API) |
307 | { |
308 | { "all" , log_successful_tests }, |
309 | { "success" , log_successful_tests }, |
310 | { "test_suite" , log_test_units }, |
311 | { "unit_scope" , log_test_units }, |
312 | { "message" , log_messages }, |
313 | { "warning" , log_warnings }, |
314 | { "error" , log_all_errors }, |
315 | { "cpp_exception" , log_cpp_exception_errors }, |
316 | { "system_error" , log_system_errors }, |
317 | { "fatal_error" , log_fatal_errors }, |
318 | { "nothing" , log_nothing } |
319 | }, |
320 | #else |
321 | rt::enum_values_list<unit_test::log_level>() |
322 | ( "all" , log_successful_tests ) |
323 | ( "success" , log_successful_tests ) |
324 | ( "test_suite" , log_test_units ) |
325 | ( "unit_scope" , log_test_units ) |
326 | ( "message" , log_messages ) |
327 | ( "warning" , log_warnings ) |
328 | ( "error" , log_all_errors ) |
329 | ( "cpp_exception" , log_cpp_exception_errors ) |
330 | ( "system_error" , log_system_errors ) |
331 | ( "fatal_error" , log_fatal_errors ) |
332 | ( "nothing" , log_nothing ) |
333 | , |
334 | #endif |
335 | rt::help = "Set the framework's log level. " |
336 | "The log level defines the verbosity of the testing logs produced by a test " |
337 | "module. The verbosity ranges from a complete log, when all assertions " |
338 | "(both successful and failing) are reported, all notifications about " |
339 | "test units start and finish are included, to an empty log when nothing " |
340 | "is reported to a testing log stream." |
341 | )); |
342 | |
343 | log_level.add_cla_id( prefix: "--" , tag: btrt_log_level, value_separator: "=" ); |
344 | log_level.add_cla_id( prefix: "-" , tag: "l" , value_separator: " " ); |
345 | store.add( in: log_level ); |
346 | |
347 | /////////////////////////////////////////////// |
348 | |
349 | rt::parameter<std::string> log_sink( btrt_log_sink, ( |
350 | rt::description = "Specifies log sink: stdout (default), stderr or file name." , |
351 | rt::env_var = "BOOST_TEST_LOG_SINK" , |
352 | rt::value_hint = "<stderr|stdout|file name>" , |
353 | rt::help = "Sets the log sink - the location " |
354 | "where Boost.Test writes the logs of the test execution. It allows to easily redirect the " |
355 | "test logs to file or standard streams. By default testing log is " |
356 | "directed to standard output." |
357 | )); |
358 | |
359 | log_sink.add_cla_id( prefix: "--" , tag: btrt_log_sink, value_separator: "=" ); |
360 | log_sink.add_cla_id( prefix: "-" , tag: "k" , value_separator: " " ); |
361 | store.add( in: log_sink ); |
362 | |
363 | /////////////////////////////////////////////// |
364 | |
365 | rt::enum_parameter<unit_test::output_format> output_format( btrt_output_format, ( |
366 | rt::description = "Specifies output format (both log and report)." , |
367 | rt::env_var = "BOOST_TEST_OUTPUT_FORMAT" , |
368 | rt::enum_values<unit_test::output_format>::value = |
369 | #if defined(BOOST_TEST_CLA_NEW_API) |
370 | { |
371 | { "HRF" , OF_CLF }, |
372 | { "CLF" , OF_CLF }, |
373 | { "XML" , OF_XML } |
374 | }, |
375 | #else |
376 | rt::enum_values_list<unit_test::output_format>() |
377 | ( "HRF" , OF_CLF ) |
378 | ( "CLF" , OF_CLF ) |
379 | ( "XML" , OF_XML ) |
380 | , |
381 | #endif |
382 | rt::help = "Combines an effect of " + btrt_report_format + |
383 | " and " + btrt_log_format + " parameters. If this parameter is specified, " |
384 | "it overrides the value of other two parameters. This parameter does not " |
385 | "have a default value. The only acceptable values are string names of " |
386 | "output formats: HRF - human readable format and XML - XML formats for " |
387 | "automation tools processing." |
388 | )); |
389 | |
390 | output_format.add_cla_id( prefix: "--" , tag: btrt_output_format, value_separator: "=" ); |
391 | output_format.add_cla_id( prefix: "-" , tag: "o" , value_separator: " " ); |
392 | store.add( in: output_format ); |
393 | |
394 | /////////////////////////////////////////////// combined logger option |
395 | |
396 | rt::parameter<std::string,rt::REPEATABLE_PARAM> combined_logger( btrt_combined_logger, ( |
397 | rt::description = "Specifies log level and sink for one or several log format" , |
398 | rt::env_var = "BOOST_TEST_LOGGER" , |
399 | rt::value_hint = "log_format,log_level,log_sink[:log_format,log_level,log_sink]" , |
400 | rt::help = "Specify one or more logging definition, which include the logger type, level and sink. " |
401 | "The log format, level and sink follow the same format as for the argument '--" + btrt_log_format + |
402 | "', '--" + btrt_log_level + "' and '--" + btrt_log_sink + "' respetively. " |
403 | "This command can take several logging definition separated by a ':', or be repeated " |
404 | "on the command line." |
405 | )); |
406 | |
407 | combined_logger.add_cla_id( prefix: "--" , tag: btrt_combined_logger, value_separator: "=" ); |
408 | store.add( in: combined_logger ); |
409 | |
410 | /////////////////////////////////////////////// |
411 | |
412 | rt::parameter<unsigned> random_seed( btrt_random_seed, ( |
413 | rt::description = "Allows to switch between sequential and random order of test units execution." |
414 | " Optionally allows to specify concrete seed for random number generator." , |
415 | rt::env_var = "BOOST_TEST_RANDOM" , |
416 | rt::default_value = 0U, |
417 | rt::optional_value = 1U, |
418 | rt::value_hint = "<seed>" , |
419 | rt::help = "Instructs the framework to execute the " |
420 | "test cases in random order. This parameter accepts an optional unsigned " |
421 | "integer argument. If parameter is specified without the argument value testing " |
422 | "order is randomized based on current time. Alternatively you can specify " |
423 | "any positive value greater than 1 and it will be used as random seed for " |
424 | "the run. " |
425 | "By default, the test cases are executed in an " |
426 | "order defined by their declaration and the optional dependencies among the test units." |
427 | )); |
428 | |
429 | random_seed.add_cla_id( prefix: "--" , tag: btrt_random_seed, value_separator: "=" ); |
430 | store.add( in: random_seed ); |
431 | |
432 | /////////////////////////////////////////////// |
433 | |
434 | rt::enum_parameter<unit_test::output_format> report_format( btrt_report_format, ( |
435 | rt::description = "Specifies the test report format." , |
436 | rt::env_var = "BOOST_TEST_REPORT_FORMAT" , |
437 | rt::default_value = OF_CLF, |
438 | rt::enum_values<unit_test::output_format>::value = |
439 | #if defined(BOOST_TEST_CLA_NEW_API) |
440 | { |
441 | { "HRF" , OF_CLF }, |
442 | { "CLF" , OF_CLF }, |
443 | { "XML" , OF_XML } |
444 | }, |
445 | #else |
446 | rt::enum_values_list<unit_test::output_format>() |
447 | ( "HRF" , OF_CLF ) |
448 | ( "CLF" , OF_CLF ) |
449 | ( "XML" , OF_XML ) |
450 | , |
451 | #endif |
452 | rt::help = "Set the framework's report format " |
453 | "to one of the formats supplied by the framework. The only acceptable values " |
454 | "for this parameter are the names of the output formats. By default the framework " |
455 | "uses human readable format (HRF) for results reporting. Alternatively you can " |
456 | "specify XML as report format. This format is easier to process by testing " |
457 | "automation tools." |
458 | )); |
459 | |
460 | report_format.add_cla_id( prefix: "--" , tag: btrt_report_format, value_separator: "=" ); |
461 | report_format.add_cla_id( prefix: "-" , tag: "m" , value_separator: " " ); |
462 | store.add( in: report_format ); |
463 | |
464 | /////////////////////////////////////////////// |
465 | |
466 | rt::enum_parameter<unit_test::report_level> report_level( btrt_report_level, ( |
467 | rt::description = "Specifies test report level." , |
468 | rt::env_var = "BOOST_TEST_REPORT_LEVEL" , |
469 | rt::default_value = CONFIRMATION_REPORT, |
470 | rt::enum_values<unit_test::report_level>::value = |
471 | #if defined(BOOST_TEST_CLA_NEW_API) |
472 | { |
473 | { "confirm" , CONFIRMATION_REPORT }, |
474 | { "short" , SHORT_REPORT }, |
475 | { "detailed" , DETAILED_REPORT }, |
476 | { "no" , NO_REPORT } |
477 | }, |
478 | #else |
479 | rt::enum_values_list<unit_test::report_level>() |
480 | ( "confirm" , CONFIRMATION_REPORT ) |
481 | ( "short" , SHORT_REPORT ) |
482 | ( "detailed" , DETAILED_REPORT ) |
483 | ( "no" , NO_REPORT ) |
484 | , |
485 | #endif |
486 | rt::help = "Set the verbosity level of the " |
487 | "result report generated by the testing framework. Use value 'no' to " |
488 | "disable the results report completely." |
489 | )); |
490 | |
491 | report_level.add_cla_id( prefix: "--" , tag: btrt_report_level, value_separator: "=" ); |
492 | report_level.add_cla_id( prefix: "-" , tag: "r" , value_separator: " " ); |
493 | store.add( in: report_level ); |
494 | |
495 | /////////////////////////////////////////////// |
496 | |
497 | rt::parameter<std::string> report_mem_leaks( btrt_report_mem_leaks, ( |
498 | rt::description = "File where to report memory leaks to." , |
499 | rt::env_var = "BOOST_TEST_REPORT_MEMORY_LEAKS_TO" , |
500 | rt::default_value = std::string(), |
501 | rt::value_hint = "<file name>" , |
502 | rt::help = "Parameter " + btrt_report_mem_leaks + " allows to specify a file where to report " |
503 | "memory leaks to. The parameter does not have default value. If it is not specified, " |
504 | "memory leaks (if any) are reported to the standard error stream." |
505 | )); |
506 | |
507 | report_mem_leaks.add_cla_id( prefix: "--" , tag: btrt_report_mem_leaks, value_separator: "=" ); |
508 | store.add( in: report_mem_leaks ); |
509 | |
510 | /////////////////////////////////////////////// |
511 | |
512 | rt::parameter<std::string> report_sink( btrt_report_sink, ( |
513 | rt::description = "Specifies report sink: stderr(default), stdout or file name." , |
514 | rt::env_var = "BOOST_TEST_REPORT_SINK" , |
515 | rt::value_hint = "<stderr|stdout|file name>" , |
516 | rt::help = "Sets the result report sink - " |
517 | "the location where the framework writes the result report to. " |
518 | "The sink may be a a file or a standard " |
519 | "stream. The default is 'stderr': the " |
520 | "standard error stream." |
521 | )); |
522 | |
523 | report_sink.add_cla_id( prefix: "--" , tag: btrt_report_sink, value_separator: "=" ); |
524 | report_sink.add_cla_id( prefix: "-" , tag: "e" , value_separator: " " ); |
525 | store.add( in: report_sink ); |
526 | |
527 | /////////////////////////////////////////////// |
528 | |
529 | rt::option result_code( btrt_result_code, ( |
530 | rt::description = "Disables test modules's result code generation." , |
531 | rt::env_var = "BOOST_TEST_RESULT_CODE" , |
532 | rt::default_value = true, |
533 | rt::help = "The 'no' argument value for the parameter " + btrt_result_code + " instructs the " |
534 | "framework to always return zero result code. This can be used for test programs " |
535 | "executed within IDE. By default this parameter has value 'yes'." |
536 | )); |
537 | |
538 | result_code.add_cla_id( prefix: "--" , tag: btrt_result_code, value_separator: "=" , negatable: true ); |
539 | result_code.add_cla_id( prefix: "-" , tag: "c" , value_separator: " " ); |
540 | store.add( in: result_code ); |
541 | |
542 | /////////////////////////////////////////////// |
543 | |
544 | rt::parameter<std::string,rt::REPEATABLE_PARAM> tests_to_run( btrt_run_filters, ( |
545 | rt::description = "Filters which tests to execute." , |
546 | rt::env_var = "BOOST_TEST_RUN_FILTERS" , |
547 | rt::value_hint = "<test unit filter>" , |
548 | rt::help = "Filters which test units to execute. " |
549 | "The framework supports both 'selection filters', which allow to select " |
550 | "which test units to enable from the set of available test units, and 'disabler " |
551 | "filters', which allow to disable some test units. Boost.test also supports " |
552 | "enabling/disabling test units at compile time. These settings identify the default " |
553 | "set of test units to run. Parameter " + btrt_run_filters + " is used to change this default. " |
554 | "This parameter is repeatable, so you can specify more than one filter if necessary." |
555 | )); |
556 | |
557 | tests_to_run.add_cla_id( prefix: "--" , tag: btrt_run_filters, value_separator: "=" ); |
558 | tests_to_run.add_cla_id( prefix: "-" , tag: "t" , value_separator: " " ); |
559 | store.add( in: tests_to_run ); |
560 | |
561 | /////////////////////////////////////////////// |
562 | |
563 | rt::option save_test_pattern( btrt_save_test_pattern, ( |
564 | rt::description = "Allows to switch between saving or matching test pattern file." , |
565 | rt::env_var = "BOOST_TEST_SAVE_PATTERN" , |
566 | rt::help = "Parameter " + btrt_save_test_pattern + " facilitates switching mode of operation for " |
567 | "testing output streams.\n\nThis parameter serves no particular purpose within the " |
568 | "framework itself. It can be used by test modules relying on output_test_stream to " |
569 | "implement testing logic. Default mode is 'match' (false)." |
570 | )); |
571 | |
572 | save_test_pattern.add_cla_id( prefix: "--" , tag: btrt_save_test_pattern, value_separator: "=" ); |
573 | store.add( in: save_test_pattern ); |
574 | |
575 | /////////////////////////////////////////////// |
576 | |
577 | rt::option show_progress( btrt_show_progress, ( |
578 | rt::description = "Turns on progress display." , |
579 | rt::env_var = "BOOST_TEST_SHOW_PROGRESS" , |
580 | rt::help = "Instructs the framework to display the progress of the tests. " |
581 | "This feature is turned off by default." |
582 | )); |
583 | |
584 | show_progress.add_cla_id( prefix: "--" , tag: btrt_show_progress, value_separator: "=" ); |
585 | show_progress.add_cla_id( prefix: "-" , tag: "p" , value_separator: " " ); |
586 | store.add( in: show_progress ); |
587 | |
588 | /////////////////////////////////////////////// |
589 | |
590 | rt::option use_alt_stack( btrt_use_alt_stack, ( |
591 | rt::description = "Turns on/off usage of an alternative stack for signal handling." , |
592 | rt::env_var = "BOOST_TEST_USE_ALT_STACK" , |
593 | rt::default_value = true, |
594 | rt::help = "Instructs the framework to use an alternative " |
595 | "stack for operating system's signals handling (on platforms where this is supported). " |
596 | "The feature is enabled by default, but can be disabled using this command line switch." |
597 | )); |
598 | |
599 | use_alt_stack.add_cla_id( prefix: "--" , tag: btrt_use_alt_stack, value_separator: "=" , negatable: true ); |
600 | store.add( in: use_alt_stack ); |
601 | |
602 | /////////////////////////////////////////////// |
603 | |
604 | rt::option wait_for_debugger( btrt_wait_for_debugger, ( |
605 | rt::description = "Forces test module to wait for button to be pressed before starting test run." , |
606 | rt::env_var = "BOOST_TEST_WAIT_FOR_DEBUGGER" , |
607 | rt::help = "Instructs the framework to pause before starting " |
608 | "test units execution, so that you can attach a debugger to the test module process. " |
609 | "This feature is turned off by default." |
610 | )); |
611 | |
612 | wait_for_debugger.add_cla_id( prefix: "--" , tag: btrt_wait_for_debugger, value_separator: "=" ); |
613 | wait_for_debugger.add_cla_id( prefix: "-" , tag: "w" , value_separator: " " ); |
614 | store.add( in: wait_for_debugger ); |
615 | |
616 | /////////////////////////////////////////////// |
617 | |
618 | rt::parameter<std::string> help( btrt_help, ( |
619 | rt::description = "Help for framework parameters." , |
620 | rt::optional_value = std::string(), |
621 | rt::value_hint = "<parameter name>" , |
622 | rt::help = "Displays help on the framework's parameters. " |
623 | "The parameter accepts an optional argument value. If present, an argument value is " |
624 | "interpreted as a parameter name (name guessing works as well, so for example " |
625 | "'--help=rand' displays help on the parameter 'random'). If the parameter name is unknown " |
626 | "or ambiguous error is reported. If argument value is absent, a summary of all " |
627 | "framework's parameter is displayed." |
628 | )); |
629 | help.add_cla_id( prefix: "--" , tag: btrt_help, value_separator: "=" ); |
630 | store.add( in: help ); |
631 | |
632 | /////////////////////////////////////////////// |
633 | |
634 | rt::option usage( btrt_usage, ( |
635 | rt::description = "Short message explaining usage of Boost.Test parameters." |
636 | )); |
637 | usage.add_cla_id( prefix: "-" , tag: "?" , value_separator: " " ); |
638 | store.add( in: usage ); |
639 | |
640 | /////////////////////////////////////////////// |
641 | |
642 | rt::option version( btrt_version, ( |
643 | rt::description = "Prints Boost.Test version and exits." |
644 | )); |
645 | version.add_cla_id( prefix: "--" , tag: btrt_version, value_separator: " " ); |
646 | store.add( in: version ); |
647 | } |
648 | |
649 | static rt::arguments_store s_arguments_store; |
650 | static rt::parameters_store s_parameters_store; |
651 | |
652 | //____________________________________________________________________________// |
653 | |
654 | } // local namespace |
655 | |
656 | void |
657 | init( int& argc, char** argv ) |
658 | { |
659 | shared_ptr<rt::cla::parser> parser; |
660 | |
661 | BOOST_TEST_I_TRY { |
662 | // Initialize parameters list |
663 | if( s_parameters_store.is_empty() ) |
664 | register_parameters( store&: s_parameters_store ); |
665 | |
666 | // Clear up arguments store just in case (of multiple init invocations) |
667 | s_arguments_store.clear(); |
668 | |
669 | // Parse CLA they take precedence over environment |
670 | parser.reset( p: new rt::cla::parser( s_parameters_store, (rt::end_of_params = "--" , rt::negation_prefix = "no_" ) ) ); |
671 | argc = parser->parse( argc, argv, res&: s_arguments_store ); |
672 | |
673 | // Try to fetch missing arguments from environment |
674 | rt::env::fetch_absent( params: s_parameters_store, args&: s_arguments_store ); |
675 | |
676 | // Set arguments to default values if defined and perform all the validations |
677 | rt::finalize_arguments( params: s_parameters_store, args&: s_arguments_store ); |
678 | |
679 | // check if colorized output is enabled |
680 | bool use_color = true; |
681 | if( s_arguments_store.has(parameter_name: btrt_color_output ) ) { |
682 | use_color = runtime_config::get<bool>(parameter_name: runtime_config::btrt_color_output); |
683 | } |
684 | |
685 | // Report help if requested |
686 | if( runtime_config::get<bool>( parameter_name: btrt_version ) ) { |
687 | parser->version( ostr&: std::cerr ); |
688 | BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_success ) ); |
689 | } |
690 | else if( runtime_config::get<bool>( parameter_name: btrt_usage ) ) { |
691 | parser->usage( ostr&: std::cerr, param_name: runtime::cstring(), use_color ); |
692 | BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_success ) ); |
693 | } |
694 | else if( s_arguments_store.has( parameter_name: btrt_help ) ) { |
695 | parser->help(ostr&: std::cerr, |
696 | parameters: s_parameters_store, |
697 | param_name: runtime_config::get<std::string>( parameter_name: btrt_help ), |
698 | use_color ); |
699 | BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_success ) ); |
700 | } |
701 | |
702 | // A bit of business logic: output_format takes precedence over log/report formats |
703 | if( s_arguments_store.has( parameter_name: btrt_output_format ) ) { |
704 | unit_test::output_format of = s_arguments_store.get<unit_test::output_format>( parameter_name: btrt_output_format ); |
705 | s_arguments_store.set( parameter_name: btrt_report_format, value: of ); |
706 | s_arguments_store.set( parameter_name: btrt_log_format, value: of ); |
707 | } |
708 | |
709 | } |
710 | BOOST_TEST_I_CATCH( rt::init_error, ex ) { |
711 | BOOST_TEST_SETUP_ASSERT( false, ex.msg ); |
712 | } |
713 | BOOST_TEST_I_CATCH( rt::ambiguous_param, ex ) { |
714 | std::cerr << ex.msg << "\n Did you mean one of these?\n" ; |
715 | |
716 | BOOST_TEST_FOREACH( rt::cstring, name, ex.m_amb_candidates ) |
717 | std::cerr << " " << name << "\n" ; |
718 | |
719 | BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_exception_failure ) ); |
720 | } |
721 | BOOST_TEST_I_CATCH( rt::unrecognized_param, ex ) { |
722 | std::cerr << ex.msg << "\n" ; |
723 | |
724 | if( !ex.m_typo_candidates.empty() ) { |
725 | std::cerr << " Did you mean one of these?\n" ; |
726 | |
727 | BOOST_TEST_FOREACH( rt::cstring, name, ex.m_typo_candidates ) |
728 | std::cerr << " " << name << "\n" ; |
729 | } |
730 | else if( parser ) { |
731 | std::cerr << "\n" ; |
732 | parser->usage( ostr&: std::cerr ); |
733 | } |
734 | |
735 | BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_exception_failure ) ); |
736 | } |
737 | BOOST_TEST_I_CATCH( rt::input_error, ex ) { |
738 | std::cerr << ex.msg << "\n\n" ; |
739 | |
740 | if( parser ) |
741 | parser->usage( ostr&: std::cerr, param_name: ex.param_name ); |
742 | |
743 | BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_exception_failure ) ); |
744 | } |
745 | } |
746 | |
747 | //____________________________________________________________________________// |
748 | |
749 | rt::arguments_store const& |
750 | argument_store() |
751 | { |
752 | return s_arguments_store; |
753 | } |
754 | |
755 | //____________________________________________________________________________// |
756 | |
757 | bool |
758 | save_pattern() |
759 | { |
760 | return runtime_config::get<bool>( parameter_name: btrt_save_test_pattern ); |
761 | } |
762 | |
763 | //____________________________________________________________________________// |
764 | |
765 | } // namespace runtime_config |
766 | } // namespace unit_test |
767 | } // namespace boost |
768 | |
769 | #include <boost/test/detail/enable_warnings.hpp> |
770 | |
771 | #endif // BOOST_TEST_UNIT_TEST_PARAMETERS_IPP_012205GER |
772 | |