|
Packit |
0b5880 |
#! @AWK_PATH@ -f
|
|
Packit |
0b5880 |
# @configure_input@
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# checkmk - translate more concise versions of test suite specifications
|
|
Packit |
0b5880 |
# into C programs suitable for use with the Check unit test
|
|
Packit |
0b5880 |
# framework.
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# -- LICENSE --
|
|
Packit |
0b5880 |
#
|
|
Packit |
0b5880 |
# Written by Micah Cowan <micah@cowan.name>
|
|
Packit |
0b5880 |
# Copyright (c) 2006, 2010 Micah Cowan
|
|
Packit |
0b5880 |
#
|
|
Packit |
0b5880 |
# Redistribution of this program in any form, with or without
|
|
Packit |
0b5880 |
# modifications, is permitted, provided that the above copyright is
|
|
Packit |
0b5880 |
# retained in distributions of this program in source form.
|
|
Packit |
0b5880 |
#
|
|
Packit |
0b5880 |
# (This is a free, non-copyleft license compatible with pretty much any
|
|
Packit |
0b5880 |
# other free or proprietary license, including the GPL. It's essentially
|
|
Packit |
0b5880 |
# a scaled-down version of the "modified" BSD license.)
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
BEGIN {
|
|
Packit |
0b5880 |
progname="checkmk";
|
|
Packit |
0b5880 |
is_stdin=0;
|
|
Packit |
0b5880 |
outfname="/dev/stdout";
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Tokens
|
|
Packit |
0b5880 |
pp_ws = "[ \\t\\f\\v\\r\\n]+";
|
|
Packit |
0b5880 |
pp_ws_op = "[ \\t\\f\\v\\r\\n]*";
|
|
Packit |
0b5880 |
pp_digit = "[0-9]+"
|
|
Packit |
0b5880 |
pp_prefix = pp_ws_op "#" pp_ws_op;
|
|
Packit |
0b5880 |
pp_sep = "[ \\t\\f\\v\\r\\n]+";
|
|
Packit |
0b5880 |
pp_name = ".+";
|
|
Packit |
0b5880 |
pp_hex_quad = "[A-F0-9a-f][A-F0-9a-f][A-F0-9a-f][A-F0-9a-f]"
|
|
Packit |
0b5880 |
pp_ucn = "\\\\(u" pp_hex_quad "|U" pp_hex_quad pp_hex_quad ")";
|
|
Packit |
0b5880 |
pp_test_name = "([A-Za-z_]|" pp_ucn ")([A-Za-z0-9_]|" pp_ucn ")*";
|
|
Packit |
0b5880 |
pp_tag = "([Ss][Uu][Ii][Tt][Ee]|[Tt][Cc][Aa][Ss][Ee])";
|
|
Packit |
0b5880 |
pp_test_tag = "[Tt][Ee][Ss][Tt]";
|
|
Packit |
0b5880 |
pp_main_pre_tag = "[Mm][Aa][Ii][Nn]-[Pp][Rr][Ee]";
|
|
Packit |
0b5880 |
pp_main_post_tag = "[Mm][Aa][Ii][Nn]-[Pp][Oo][Ss][Tt]";
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Tests with arguments
|
|
Packit |
0b5880 |
pp_test_exit_tag = "[Tt][Ee][Ss][Tt]-[Ee][Xx][Ii][Tt]" pp_ws_op "[(]" \
|
|
Packit |
0b5880 |
pp_ws_op "[+-]?" pp_ws_op pp_digit pp_ws_op "[)]";
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
pp_test_signal_tag = "[Tt][Ee][Ss][Tt]-[Ss][Ii][Gg][Nn][Aa][Ll]" pp_ws_op \
|
|
Packit |
0b5880 |
"[(]" pp_ws_op "[+-]?" pp_ws_op pp_digit pp_ws_op "[)]";
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
pp_test_loop_tag = "[Tt][Ee][Ss][Tt]-[Ll][Oo][Oo][Pp]" pp_ws_op "[(]" \
|
|
Packit |
0b5880 |
pp_ws_op "[+-]?" pp_ws_op pp_digit pp_ws_op "[,]" pp_ws_op \
|
|
Packit |
0b5880 |
"[+-]?" pp_ws_op pp_digit pp_ws_op "[)]";
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
pp_test_loop_exit_tag = "[Tt][Ee][Ss][Tt]-[Ll][Oo][Oo][Pp]-[Ee][Xx][Ii][Tt]" \
|
|
Packit |
0b5880 |
pp_ws_op "[(]" pp_ws_op "[+-]?" pp_ws_op pp_digit pp_ws_op \
|
|
Packit |
0b5880 |
"[,]" pp_ws_op "[+-]?" pp_ws_op pp_digit pp_ws_op "[,]" \
|
|
Packit |
0b5880 |
pp_ws_op "[+-]?" pp_ws_op pp_digit pp_ws_op "[)]";
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
pp_test_loop_signal_tag = "[Tt][Ee][Ss][Tt]-[Ll][Oo][Oo][Pp]-[Ss][Ii][Gg]" \
|
|
Packit |
0b5880 |
"[Nn][Aa][Ll]" pp_ws_op "[(]" pp_ws_op "[+-]?" pp_ws_op pp_digit \
|
|
Packit |
0b5880 |
pp_ws_op "[,]" pp_ws_op "[+-]?" pp_ws_op pp_digit pp_ws_op \
|
|
Packit |
0b5880 |
"[,]" pp_ws_op "[+-]?" pp_ws_op pp_digit pp_ws_op "[)]";
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
pp_suite_or_tcase_line = "^" pp_prefix pp_tag pp_ws pp_name "$";
|
|
Packit |
0b5880 |
pp_test_line_prefix = "^" pp_prefix pp_test_tag pp_ws;
|
|
Packit |
0b5880 |
pp_test_exit_line_prefix = "^" pp_prefix pp_test_exit_tag pp_ws;
|
|
Packit |
0b5880 |
pp_test_signal_line_prefix = "^" pp_prefix pp_test_signal_tag pp_ws;
|
|
Packit |
0b5880 |
pp_test_loop_line_prefix = "^" pp_prefix pp_test_loop_tag pp_ws;
|
|
Packit |
0b5880 |
pp_test_loop_exit_line_prefix = "^" pp_prefix pp_test_loop_exit_tag pp_ws;
|
|
Packit |
0b5880 |
pp_test_loop_signal_line_prefix = "^" pp_prefix pp_test_loop_signal_tag pp_ws;
|
|
Packit |
0b5880 |
pp_test_line = pp_test_line_prefix pp_name pp_ws_op "$";
|
|
Packit |
0b5880 |
pp_test_exit_line = pp_test_exit_line_prefix pp_name pp_ws_op "$";
|
|
Packit |
0b5880 |
pp_test_signal_line = pp_test_signal_line_prefix pp_name pp_ws_op "$";
|
|
Packit |
0b5880 |
pp_test_loop_line = pp_test_loop_line_prefix pp_name pp_ws_op "$";
|
|
Packit |
0b5880 |
pp_test_loop_exit_line = pp_test_loop_exit_line_prefix pp_name pp_ws_op "$";
|
|
Packit |
0b5880 |
pp_test_loop_signal_line = pp_test_loop_signal_line_prefix pp_name pp_ws_op "$";
|
|
Packit |
0b5880 |
pp_main_pre_line = "^" pp_prefix pp_main_pre_tag pp_ws_op "$";
|
|
Packit |
0b5880 |
pp_main_post_line = "^" pp_prefix pp_main_post_tag pp_ws_op "$";
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Global vars
|
|
Packit |
0b5880 |
in_test = needs_line_decl = 0;
|
|
Packit |
0b5880 |
cur_suite = cur_tcase = "Core";
|
|
Packit |
0b5880 |
cur_test = "";
|
|
Packit |
0b5880 |
exit_okay = start = 1;
|
|
Packit |
0b5880 |
num_cur_tcases = num_cur_tests = 0;
|
|
Packit |
0b5880 |
test_type = num_tests = 0;
|
|
Packit |
0b5880 |
arg1 = 0;
|
|
Packit |
0b5880 |
arg2 = 1;
|
|
Packit |
0b5880 |
arg3 = 2;
|
|
Packit |
0b5880 |
test_name = 0;
|
|
Packit |
0b5880 |
test_type_flag = 1;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Run on the first line of the input file.
|
|
Packit |
0b5880 |
start {
|
|
Packit |
0b5880 |
print_boilerplate();
|
|
Packit |
0b5880 |
start = 0;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# (Executed every line:)
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
print_line = 1;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
$0 ~ pp_suite_or_tcase_line {
|
|
Packit |
0b5880 |
if (in_main())
|
|
Packit |
0b5880 |
in_main_error();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Skip to the start of the tag ("suite" or "tcase").
|
|
Packit |
0b5880 |
match($0, pp_prefix);
|
|
Packit |
0b5880 |
rol = substr($0, RLENGTH+1);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Save away the tag.
|
|
Packit |
0b5880 |
match(rol, "^" pp_tag);
|
|
Packit |
0b5880 |
tag = substr(rol, 1, RLENGTH);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Advance past the ws following tag.
|
|
Packit |
0b5880 |
rol = substr(rol, RLENGTH+1);
|
|
Packit |
0b5880 |
match(rol, pp_ws);
|
|
Packit |
0b5880 |
rol = substr(rol, RLENGTH+1);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# The suite or tcase name is the rest of the line, minus any
|
|
Packit |
0b5880 |
# trailing ws.
|
|
Packit |
0b5880 |
if (match(rol, pp_ws "$")) {
|
|
Packit |
0b5880 |
name = substr(rol, 1, RSTART-1);
|
|
Packit |
0b5880 |
} else {
|
|
Packit |
0b5880 |
name = rol;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
if (tolower(tag) == "suite") {
|
|
Packit |
0b5880 |
# Does this suite already exist?
|
|
Packit |
0b5880 |
if ((name, 0) in suite_tcase_map) {
|
|
Packit |
0b5880 |
error_with_line("Suite \"" name "\" already exists.");
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
cur_suite = name;
|
|
Packit |
0b5880 |
num_cur_tcases = 0;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
else if ((name, 0, 0) in tcase_test_map) {
|
|
Packit |
0b5880 |
error_with_line("Test Case \"" name "\" already exists.");
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
cur_tcase = name;
|
|
Packit |
0b5880 |
num_cur_tests = 0;
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
finish_test();
|
|
Packit |
0b5880 |
print_line = 0;
|
|
Packit |
0b5880 |
if (!clean_mode)
|
|
Packit |
0b5880 |
needs_line_decl = 1;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
$0 ~ pp_test_line {
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Pre checks
|
|
Packit |
0b5880 |
test_pre();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Get the test name
|
|
Packit |
0b5880 |
match($0, pp_test_line_prefix)
|
|
Packit |
0b5880 |
cur_test = substr($0, RLENGTH+1);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Remove trailing ws.
|
|
Packit |
0b5880 |
sub(pp_ws_op "$", "", cur_test);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Check for duplicate tests / cases and valid names
|
|
Packit |
0b5880 |
duplicate_check();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Boilerplate printing code
|
|
Packit |
0b5880 |
test_post();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Set type before calling register
|
|
Packit |
0b5880 |
test_type = 0;
|
|
Packit |
0b5880 |
register_test();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print_line = 0;
|
|
Packit |
0b5880 |
in_test = 1;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
$0 ~ pp_test_loop_line {
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_pre();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
match($0, pp_test_loop_line_prefix)
|
|
Packit |
0b5880 |
cur_test = substr($0, RLENGTH+1);
|
|
Packit |
0b5880 |
sub(pp_ws_op "$", "", cur_test);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
duplicate_check();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Split the line into an array to extract the arguments
|
|
Packit |
0b5880 |
split($0, arr, pp_ws_op "[(),]" pp_ws_op);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Eliminate possible whitespace between sign and numbers
|
|
Packit |
0b5880 |
gsub(pp_ws_op, "", arr[2]);
|
|
Packit |
0b5880 |
gsub(pp_ws_op, "", arr[3]);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_post();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_type = 1;
|
|
Packit |
0b5880 |
register_test();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print_line = 0;
|
|
Packit |
0b5880 |
in_test = 1;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
$0 ~ pp_test_exit_line {
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_pre();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
match($0, pp_test_exit_line_prefix)
|
|
Packit |
0b5880 |
cur_test = substr($0, RLENGTH+1);
|
|
Packit |
0b5880 |
sub(pp_ws_op "$", "", cur_test);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
duplicate_check();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
split($0, arr, pp_ws_op "[(),]" pp_ws_op);
|
|
Packit |
0b5880 |
gsub(pp_ws_op, "", arr[2]);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_post();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_type = 2;
|
|
Packit |
0b5880 |
register_test();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print_line = 0;
|
|
Packit |
0b5880 |
in_test = 1;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
$0 ~ pp_test_signal_line {
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_pre();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
match($0, pp_test_signal_line_prefix)
|
|
Packit |
0b5880 |
cur_test = substr($0, RLENGTH+1);
|
|
Packit |
0b5880 |
sub(pp_ws_op "$", "", cur_test);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
duplicate_check();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
split($0, arr, pp_ws_op "[(),]" pp_ws_op);
|
|
Packit |
0b5880 |
gsub(pp_ws_op, "", arr[2]);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_post();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_type = 3;
|
|
Packit |
0b5880 |
register_test();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print_line = 0;
|
|
Packit |
0b5880 |
in_test = 1;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
$0 ~ pp_test_loop_exit_line {
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_pre();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
match($0, pp_test_loop_exit_line_prefix)
|
|
Packit |
0b5880 |
cur_test = substr($0, RLENGTH+1);
|
|
Packit |
0b5880 |
sub(pp_ws_op "$", "", cur_test);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
duplicate_check();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
split($0, arr, pp_ws_op "[(),]" pp_ws_op);
|
|
Packit |
0b5880 |
gsub(pp_ws_op, "", arr[2]);
|
|
Packit |
0b5880 |
gsub(pp_ws_op, "", arr[3]);
|
|
Packit |
0b5880 |
gsub(pp_ws_op, "", arr[4]);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_post();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_type = 4;
|
|
Packit |
0b5880 |
register_test();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print_line = 0;
|
|
Packit |
0b5880 |
in_test = 1;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
$0 ~ pp_test_loop_signal_line {
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_pre();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
match($0, pp_test_loop_signal_line_prefix)
|
|
Packit |
0b5880 |
cur_test = substr($0, RLENGTH+1);
|
|
Packit |
0b5880 |
sub(pp_ws_op "$", "", cur_test);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
duplicate_check();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
split($0, arr, pp_ws_op "[(),]" pp_ws_op);
|
|
Packit |
0b5880 |
gsub(pp_ws_op, "", arr[2]);
|
|
Packit |
0b5880 |
gsub(pp_ws_op, "", arr[3]);
|
|
Packit |
0b5880 |
gsub(pp_ws_op, "", arr[4]);
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_post();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
test_type = 5;
|
|
Packit |
0b5880 |
register_test();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print_line = 0;
|
|
Packit |
0b5880 |
in_test = 1;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
$0 ~ pp_main_pre_line {
|
|
Packit |
0b5880 |
main_pre();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print "";
|
|
Packit |
0b5880 |
print " /* User-specified pre-run code */";
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
if (!clean_mode)
|
|
Packit |
0b5880 |
needs_line_decl = 1;
|
|
Packit |
0b5880 |
print_line = 0;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
$0 ~ pp_main_post_line {
|
|
Packit |
0b5880 |
main_post();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print "";
|
|
Packit |
0b5880 |
print " /* User-specified post-run code */";
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
if (!clean_mode)
|
|
Packit |
0b5880 |
needs_line_decl = 1;
|
|
Packit |
0b5880 |
print_line = 0;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print_line {
|
|
Packit |
0b5880 |
if (/[^ \t\f\v\r\n]/ && needs_line_decl && !clean_mode) {
|
|
Packit |
0b5880 |
print "#line " FNR;
|
|
Packit |
0b5880 |
needs_line_decl = 0;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
print;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
END {
|
|
Packit |
0b5880 |
if (!exit_okay) {
|
|
Packit |
0b5880 |
# We're exiting due to an error. Don't do anything else.
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
else if (num_tests) {
|
|
Packit |
0b5880 |
if (!main_post_done) {
|
|
Packit |
0b5880 |
main_post();
|
|
Packit |
0b5880 |
print "";
|
|
Packit |
0b5880 |
print " return nf == 0 ? 0 : 1;";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
print "}";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
else {
|
|
Packit |
0b5880 |
error("Expected at least one #test line.");
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
### Functions ###
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function test_pre()
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
if (in_main())
|
|
Packit |
0b5880 |
in_main_error();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
if (in_test) {
|
|
Packit |
0b5880 |
finish_test();
|
|
Packit |
0b5880 |
print "";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
++num_tests;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function duplicate_check()
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
# Confirm that the test name is a valid C identifier.
|
|
Packit |
0b5880 |
if (!match(cur_test, "^" pp_test_name "$")) {
|
|
Packit |
0b5880 |
error_with_line("Malformed test name \"" cur_test \
|
|
Packit |
0b5880 |
"\" (must be a C identifier).");
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Verify that it has not already been used.
|
|
Packit |
0b5880 |
if (cur_test in test_registry) {
|
|
Packit |
0b5880 |
error_with_line("Test \"" cur_test "\" already exists.");
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Verify that any implied test case is not a repeat.
|
|
Packit |
0b5880 |
if (num_cur_tests == 0 && (cur_tcase, 0, 0) in tcase_test_map) {
|
|
Packit |
0b5880 |
error_with_line("Test Case \"" name "\" already exists.");
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function test_post()
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
print "START_TEST(" cur_test ")";
|
|
Packit |
0b5880 |
print "{";
|
|
Packit |
0b5880 |
if (!clean_mode)
|
|
Packit |
0b5880 |
print "#line " FNR+1;
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
needs_line_decl = 0;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function main_post()
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
if (main_post_done)
|
|
Packit |
0b5880 |
error_with_line("main-post specified multiple times.");
|
|
Packit |
0b5880 |
if (!main_pre_done)
|
|
Packit |
0b5880 |
main_pre();
|
|
Packit |
0b5880 |
main_post_done = 1;
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print "";
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print_runner_bindings();
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print "";
|
|
Packit |
0b5880 |
print " srunner_run_all(sr, CK_ENV);";
|
|
Packit |
0b5880 |
print " nf = srunner_ntests_failed(sr);";
|
|
Packit |
0b5880 |
print " srunner_free(sr);";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function in_main()
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
return main_pre_done || main_post_done;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function in_main_error()
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
error_with_line("Cannot specify tests after main-pre or main-post.");
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function main_pre()
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
if (main_post_done)
|
|
Packit |
0b5880 |
error_with_line("main-pre specified after main-post.");
|
|
Packit |
0b5880 |
if (main_pre_done)
|
|
Packit |
0b5880 |
error_with_line("main-pre specified multiple times.");
|
|
Packit |
0b5880 |
main_pre_done = 1;
|
|
Packit |
0b5880 |
finish_test();
|
|
Packit |
0b5880 |
print "";
|
|
Packit |
0b5880 |
print "int main(void)";
|
|
Packit |
0b5880 |
print "{";
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
print_main_declarations();
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function suite_var_name(num)
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
return "s" num+1;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function tcase_var_name(snum, tcnum)
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
return "tc" snum+1 "_" tcnum+1;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function print_main_declarations()
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
for (i=0; i != num_suites; ++i) {
|
|
Packit |
0b5880 |
s = suite_names[i];
|
|
Packit |
0b5880 |
svar = suite_var_name(i);
|
|
Packit |
0b5880 |
print " Suite *" svar " = suite_create(" string_encode(s) ");";
|
|
Packit |
0b5880 |
for (j=0; j != suite_num_tcases[s]; ++j) {
|
|
Packit |
0b5880 |
tc = suite_tcase_map[s, j];
|
|
Packit |
0b5880 |
tcvar = tcase_var_name(i, j);
|
|
Packit |
0b5880 |
print " TCase *" tcvar " = tcase_create(" \
|
|
Packit |
0b5880 |
string_encode(tc) ");";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
print " SRunner *sr = srunner_create(s1);";
|
|
Packit |
0b5880 |
print " int nf;";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function string_encode(raw)
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
# The next line might look funny, but remember that the first
|
|
Packit |
0b5880 |
# argument will go through both string interpolation /and/ regex
|
|
Packit |
0b5880 |
# interpolation, so the backslashes must be double-escaped. The
|
|
Packit |
0b5880 |
# substitution string is supposed to result in an actual
|
|
Packit |
0b5880 |
# double-backslash.
|
|
Packit |
0b5880 |
gsub("\\\\", "@AWK_GSUB_DBL_BSLASH@", raw);
|
|
Packit |
0b5880 |
gsub("\"", "\\\"", raw);
|
|
Packit |
0b5880 |
return "\"" raw "\"";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function print_runner_bindings()
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
for (i=0; i != num_suites; ++i) {
|
|
Packit |
0b5880 |
s = suite_names[i];
|
|
Packit |
0b5880 |
svar = suite_var_name(i);
|
|
Packit |
0b5880 |
for (j=0; j != suite_num_tcases[s]; ++j) {
|
|
Packit |
0b5880 |
tc = suite_tcase_map[s, j];
|
|
Packit |
0b5880 |
tcvar = tcase_var_name(i, j);
|
|
Packit |
0b5880 |
print " suite_add_tcase(" svar ", " tcvar ");";
|
|
Packit |
0b5880 |
for (k=0; k != tcase_num_tests[tc]; ++k) {
|
|
Packit |
0b5880 |
t = tcase_test_map[tc, k, test_name];
|
|
Packit |
0b5880 |
test_type = tcase_test_map[tc, k, test_type_flag];
|
|
Packit |
0b5880 |
if (test_type == 0) {
|
|
Packit |
0b5880 |
print " tcase_add_test(" tcvar ", " t ");";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
else if (test_type == 1) {
|
|
Packit |
0b5880 |
print " tcase_add_loop_test(" tcvar ", " t ", " \
|
|
Packit |
0b5880 |
test_parameters[t, arg1] ", " test_parameters[t, arg2] \
|
|
Packit |
0b5880 |
");";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
else if (test_type == 2) {
|
|
Packit |
0b5880 |
print " tcase_add_exit_test(" tcvar ", " t ", " \
|
|
Packit |
0b5880 |
test_parameters[t, arg1] ");";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
else if (test_type == 3) {
|
|
Packit |
0b5880 |
print " tcase_add_test_raise_signal(" tcvar ", " t ", " \
|
|
Packit |
0b5880 |
test_parameters[t, arg1] ");";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
else if (test_type == 4) {
|
|
Packit |
0b5880 |
print " tcase_add_loop_exit_test(" tcvar ", " t ", " \
|
|
Packit |
0b5880 |
test_parameters[t, arg1] ", " test_parameters[t, arg2] \
|
|
Packit |
0b5880 |
", " test_parameters[t, arg3] ");";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
else if (test_type == 5) {
|
|
Packit |
0b5880 |
print " tcase_add_loop_test_raise_signal(" tcvar ", " t \
|
|
Packit |
0b5880 |
", " test_parameters[t, arg1] ", " test_parameters[t, arg2] \
|
|
Packit |
0b5880 |
", " test_parameters[t, arg3] ");";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
if (num_suites > 1) {
|
|
Packit |
0b5880 |
print "";
|
|
Packit |
0b5880 |
for (i=1; i != num_suites; ++i) {
|
|
Packit |
0b5880 |
svar = suite_var_name(i);
|
|
Packit |
0b5880 |
print " srunner_add_suite(sr, " svar ");";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function register_test()
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
if (num_cur_tcases == 0) {
|
|
Packit |
0b5880 |
suite_names[num_suites++] = cur_suite;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
if (num_cur_tests == 0) {
|
|
Packit |
0b5880 |
suite_tcase_map[cur_suite, num_cur_tcases++] = cur_tcase;
|
|
Packit |
0b5880 |
suite_num_tcases[cur_suite] = num_cur_tcases;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
tcase_test_map[cur_tcase, num_cur_tests, test_name] = cur_test;
|
|
Packit |
0b5880 |
tcase_test_map[cur_tcase, num_cur_tests++, test_type_flag] = test_type;
|
|
Packit |
0b5880 |
tcase_num_tests[cur_tcase] = num_cur_tests;
|
|
Packit |
0b5880 |
test_registry[cur_test] = 1;
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
# Store arguments to array
|
|
Packit |
0b5880 |
test_parameters[cur_test, arg1] = arr[2];
|
|
Packit |
0b5880 |
test_parameters[cur_test, arg2] = arr[3];
|
|
Packit |
0b5880 |
test_parameters[cur_test, arg3] = arr[4];
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function finish_test()
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
if (in_test) {
|
|
Packit |
0b5880 |
in_test = 0;
|
|
Packit |
0b5880 |
print "}";
|
|
Packit |
0b5880 |
print "END_TEST";
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function print_boilerplate()
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
print "/*";
|
|
Packit |
0b5880 |
print " * DO NOT EDIT THIS FILE. Generated by " progname ".";
|
|
Packit |
0b5880 |
if (!FILENAME || FILENAME == "-") {
|
|
Packit |
0b5880 |
clean_mode=1;
|
|
Packit |
0b5880 |
is_stdin=1;
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
if (is_stdin)
|
|
Packit |
0b5880 |
srcfile = "(standard input)";
|
|
Packit |
0b5880 |
else
|
|
Packit |
0b5880 |
srcfile = "\"" FILENAME "\"";
|
|
Packit |
0b5880 |
print " * Edit the original source file " srcfile " instead.";
|
|
Packit |
0b5880 |
print " */";
|
|
Packit |
0b5880 |
print "";
|
|
Packit |
0b5880 |
print "#include <check.h>";
|
|
Packit |
0b5880 |
print "";
|
|
Packit |
0b5880 |
if (!clean_mode)
|
|
Packit |
0b5880 |
print "#line 1 " string_encode(FILENAME)
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function error_with_line(err)
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
error((is_stdin ? "(standard input)" : FILENAME) " line " FNR ": " err);
|
|
Packit |
0b5880 |
}
|
|
Packit |
0b5880 |
|
|
Packit |
0b5880 |
function error(err)
|
|
Packit |
0b5880 |
{
|
|
Packit |
0b5880 |
print progname ": " err > "/dev/stderr";
|
|
Packit |
0b5880 |
exit_okay = 0;
|
|
Packit |
0b5880 |
exit 1;
|
|
Packit |
0b5880 |
}
|