+2010-02-17 Jose E. Marchesi <jemarch@gnu.org>
+
+ * tests/check_check_selective.c (make_selective_suite): New
+ function.
+ (selective_setup): New function.
+ (selective_teardown): New function.
+ New tests 'test_srunner_run_run_all, 'test_srunner_run_suite',
+ 'test_srunner_run_no_suite', test_srunner_run_tcase',
+ 'test_srunner_no_tcase', 'test_srunner_suite_tcase',
+ 'test_srunner_suite_no_tcase', 'test_srunner_run_suite_env',
+ 'test_srunner_run_no_suite_env', 'test_srunner_run_tcase_env',
+ 'test_srunner_run_no_tcase_env', 'test_srunner_suite_tcase_env',
+ 'test_srunner_suite_no_tcase_env'.
+
+ * tests/Makefile.am (check_check_SOURCES): Add
+ 'check_check_selective.c'.
+
+ * tests/check_check_selective.c: New file.
+
+ * tests/check_check_main.c (main): Add the selective_suite to the
+ master suite.
+
+2010-02-10 Jose E. Marchesi <jemarch@gnu.org>
+
+ * doc/check.texi (SRunner Output): Document 'srunner_run' and the
+ usage of CK_RUN_CASE and CK_RUN_SUITE environment variables.
+
+ * src/check_run.c (srunner_run): Use values of environment
+ variables CK_RUN_CASE and CK_RUN_SUITE.
+
+2010-02-02 Jose E. Marchesi <jemarch@gnu.org>
+
+ * src/check.c (suite_tcase): New function that determines whether
+ a a given test suite contains a test case named after a given
+ string.
+
+ * src/check_run.c (srunner_run): New function, renamed from
+ 'srunner_run_all', allowing selective running of an specific test
+ suite and/or test case.
+ (srunner_run_all): New function, invoking srunner_run internally
+ to provide backwards compatibility.
+
+ * src/check.h.in: Add prototype for srunner_run.
+
2005-12-16 hugo303
* src/check_pack.c: Fixed buggy eprintf string.
static void srunner_run_init (SRunner *sr, enum print_output print_mode);
static void srunner_run_end (SRunner *sr, enum print_output print_mode);
static void srunner_iterate_suites (SRunner *sr,
+ const char *sname, const char *tcname,
enum print_output print_mode);
static void srunner_iterate_tcase_tfuns (SRunner *sr, TCase *tc);
static void srunner_add_failure (SRunner *sr, TestResult *tf);
}
static void srunner_iterate_suites (SRunner *sr,
+ const char *sname, const char *tcname,
enum print_output CK_ATTRIBUTE_UNUSED print_mode)
{
TCase *tc;
slst = sr->slst;
-
+
for (list_front(slst); !list_at_end(slst); list_advance(slst)) {
Suite *s = list_val(slst);
+ if (((sname != NULL) && (strcmp (sname, s->name) != 0))
+ || ((tcname != NULL) && (!suite_tcase (s, tcname))))
+ continue;
+
log_suite_start (sr, s);
tcl = s->tclst;
for (list_front(tcl);!list_at_end (tcl); list_advance (tcl)) {
tc = list_val (tcl);
+
+ if ((tcname != NULL) && (strcmp (tcname, tc->name) != 0)) {
+ continue;
+ }
+
srunner_run_tcase (sr, tc);
}
}
void srunner_run_all (SRunner *sr, enum print_output print_mode)
+{
+ srunner_run (sr,
+ NULL, /* All test suites. */
+ NULL, /* All test cases. */
+ print_mode);
+}
+
+void srunner_run (SRunner *sr, const char *sname, const char *tcname, enum print_output print_mode)
{
#ifdef _POSIX_VERSION
struct sigaction old_action;
struct sigaction new_action;
#endif /* _POSIX_VERSION */
+ /* Get the selected test suite and test case from the
+ environment. */
+ if (!tcname) tcname = getenv ("CK_RUN_CASE");
+ if (!sname) sname = getenv ("CK_RUN_SUITE");
+
if (sr == NULL)
return;
if (print_mode >= CK_LAST)
sigaction(SIGALRM, &new_action, &old_action);
#endif /* _POSIX_VERSION */
srunner_run_init (sr, print_mode);
- srunner_iterate_suites (sr, print_mode);
+ srunner_iterate_suites (sr, sname, tcname, print_mode);
srunner_run_end (sr, print_mode);
#ifdef _POSIX_VERSION
sigaction(SIGALRM, &old_action, NULL);
--- /dev/null
+#include "../lib/libcompat.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <check.h>
+#include "check_check.h"
+
+static SRunner *sr;
+static int test_tc11_executed;
+static int test_tc12_executed;
+static int test_tc21_executed;
+
+static void reset_executed (void)
+{
+ test_tc11_executed = 0;
+ test_tc12_executed = 0;
+ test_tc21_executed = 0;
+}
+
+START_TEST(test_tc11)
+{
+ test_tc11_executed = 1;
+}
+END_TEST
+
+START_TEST(test_tc12)
+{
+ test_tc12_executed = 1;
+}
+END_TEST
+
+START_TEST(test_tc21)
+{
+ test_tc21_executed = 1;
+}
+END_TEST
+
+static void selective_setup (void)
+{
+ Suite *s1, *s2;
+ TCase *tc11, *tc12, *tc21;
+
+ /*
+ * Create a test suite 'suite1' with two test cases 'tcase11' and
+ * 'tcase12' containing a single test each.
+ */
+ s1 = suite_create ("suite1");
+ tc11 = tcase_create ("tcase11");
+ tcase_add_test (tc11, test_tc11);
+ tc12 = tcase_create ("tcase12");
+ tcase_add_test (tc12, test_tc12);
+ suite_add_tcase (s1, tc11);
+ suite_add_tcase (s1, tc12);
+
+ /*
+ * Create a test suite 'suite2' with one test case 'test21'
+ * containing two tests.
+ */
+ s2 = suite_create ("suite2");
+ tc21 = tcase_create ("tcase21");
+ tcase_add_test (tc21, test_tc21);
+ suite_add_tcase (s2, tc21);
+
+ sr = srunner_create (s1);
+ srunner_add_suite (sr, s2);
+ srunner_set_fork_status (sr, CK_NOFORK);
+}
+
+static void selective_teardown (void)
+{
+ srunner_free (sr);
+}
+
+
+START_TEST(test_srunner_run_run_all)
+{
+ /* This test exercises the srunner_run function for the case where
+ both sname and tcname are NULL. That means to run all the test
+ cases in all the defined suites. */
+ srunner_run (sr,
+ NULL, /* NULL tsuite name. */
+ NULL, /* NULL tcase name. */
+ CK_VERBOSE);
+
+ fail_unless (srunner_ntests_run(sr) == 3,
+ "Not all tests were executed.");
+
+ reset_executed ();
+}
+END_TEST
+
+START_TEST(test_srunner_run_suite)
+{
+ /* This test makes the srunner_run function to run all the test
+ cases of a existing suite. */
+ srunner_run (sr,
+ "suite1",
+ NULL, /* NULL tcase name. */
+ CK_VERBOSE);
+
+ fail_unless (test_tc11_executed
+ && test_tc12_executed
+ && !test_tc21_executed,
+ "Expected tests were not executed.");
+
+ reset_executed ();
+}
+END_TEST
+
+START_TEST(test_srunner_run_no_suite)
+{
+ /* This test makes the srunner_run function to run all the test
+ cases of a non-existing suite. */
+ srunner_run (sr,
+ "non-existing-suite",
+ NULL, /* NULL tcase name. */
+ CK_VERBOSE);
+
+ fail_if (test_tc11_executed
+ || test_tc12_executed
+ || test_tc21_executed,
+ "An unexpected test was executed.");
+
+ reset_executed ();
+}
+END_TEST
+
+START_TEST(test_srunner_run_tcase)
+{
+ /* This test makes the srunner_run function to run an specific
+ existing test case. */
+ srunner_run (sr,
+ NULL, /* NULL suite name. */
+ "tcase12",
+ CK_VERBOSE);
+
+ fail_unless (!test_tc11_executed
+ && test_tc12_executed
+ && !test_tc21_executed,
+ "Expected tests were not executed.");
+
+ reset_executed ();
+}
+END_TEST
+
+START_TEST(test_srunner_no_tcase)
+{
+ /* This test makes the srunner_run function to run a non-existant
+ test case. */
+ srunner_run (sr,
+ NULL, /* NULL suite name. */
+ "non-existant-test-case",
+ CK_VERBOSE);
+
+ fail_if (test_tc11_executed
+ || test_tc12_executed
+ || test_tc21_executed,
+ "An unexpected test was executed.");
+
+ reset_executed ();
+}
+END_TEST
+
+START_TEST(test_srunner_suite_tcase)
+{
+ /* This test makes the srunner_run function to run a specific test
+ case of a specific test suite. */
+ srunner_run (sr,
+ "suite2",
+ "tcase21",
+ CK_VERBOSE);
+
+ fail_unless (!test_tc11_executed
+ && !test_tc12_executed
+ && test_tc21_executed,
+ "Expected tests were not executed.");
+
+ reset_executed ();
+}
+END_TEST
+
+START_TEST(test_srunner_suite_no_tcase)
+{
+ /* This test makes the srunner_run function to run a non existant
+ test case of a specific test suite. */
+ srunner_run (sr,
+ "suite1",
+ "non-existant-test-case",
+ CK_VERBOSE);
+
+ fail_if (test_tc11_executed
+ || test_tc12_executed
+ || test_tc21_executed,
+ "An unexpected test was executed.");
+
+ reset_executed ();
+}
+END_TEST
+
+
+START_TEST(test_srunner_run_suite_env)
+{
+ /* This test makes the srunner_run_all function to run all the test
+ cases of a existing suite. */
+ setenv ("CK_RUN_SUITE", "suite1", 1);
+ srunner_run_all (sr, CK_VERBOSE);
+
+ fail_unless (test_tc11_executed
+ && test_tc12_executed
+ && !test_tc21_executed,
+ "Expected tests were not executed.");
+
+ reset_executed ();
+ unsetenv ("CK_RUN_SUITE");
+}
+END_TEST
+
+START_TEST(test_srunner_run_no_suite_env)
+{
+ /* This test makes the srunner_run_all function to run all the test
+ cases of a non-existing suite. */
+ setenv ("CK_RUN_SUITE", "non-existing-suite", 1);
+ srunner_run_all (sr, CK_VERBOSE);
+
+ fail_if (test_tc11_executed
+ || test_tc12_executed
+ || test_tc21_executed,
+ "An unexpected test was executed.");
+
+ reset_executed ();
+ unsetenv ("CK_RUN_SUITE");
+}
+END_TEST
+
+START_TEST(test_srunner_run_tcase_env)
+{
+ /* This test makes the srunner_run_all function to run an specific
+ existing test case. */
+ setenv ("CK_RUN_CASE", "tcase12", 1);
+ srunner_run_all (sr, CK_VERBOSE);
+
+ fail_unless (!test_tc11_executed
+ && test_tc12_executed
+ && !test_tc21_executed,
+ "Expected tests were not executed.");
+
+ reset_executed ();
+ unsetenv ("CK_RUN_CASE");
+}
+END_TEST
+
+START_TEST(test_srunner_no_tcase_env)
+{
+ /* This test makes the srunner_run_all function to run a
+ non-existant test case. */
+ setenv ("CK_RUN_CASE", "non-existant-test-case", 1);
+ srunner_run_all (sr, CK_VERBOSE);
+
+ fail_if (test_tc11_executed
+ || test_tc12_executed
+ || test_tc21_executed,
+ "An unexpected test was executed.");
+
+ reset_executed ();
+ unsetenv ("CK_RUN_CASE");
+}
+END_TEST
+
+START_TEST(test_srunner_suite_tcase_env)
+{
+ /* This test makes the srunner_run_all function to run a specific test
+ case of a specific test suite. */
+ setenv ("CK_RUN_SUITE", "suite2", 1);
+ setenv ("CK_RUN_CASE", "tcase21", 1);
+ srunner_run_all (sr, CK_VERBOSE);
+
+ fail_unless (!test_tc11_executed
+ && !test_tc12_executed
+ && test_tc21_executed,
+ "Expected tests were not executed.");
+
+ reset_executed ();
+ unsetenv ("CK_RUN_SUITE");
+ unsetenv ("CK_RUN_CASE");
+}
+END_TEST
+
+START_TEST(test_srunner_suite_no_tcase_env)
+{
+ /* This test makes the srunner_run_all function to run a non
+ existant test case of a specific test suite. */
+ setenv ("CK_RUN_SUITE", "suite1", 1);
+ setenv ("CK_RUN_CASE", "non-existant-test-case", 1);
+ srunner_run_all (sr, CK_VERBOSE);
+
+ fail_if (test_tc11_executed
+ || test_tc12_executed
+ || test_tc21_executed,
+ "An unexpected test was executed.");
+
+ reset_executed ();
+ unsetenv ("CK_RUN_SUITE");
+ unsetenv ("CK_RUN_CASE");
+}
+END_TEST
+
+Suite *make_selective_suite (void)
+{
+ Suite *s = suite_create ("SelectiveTesting");
+ TCase *tc = tcase_create ("Core");
+
+ suite_add_tcase (s, tc);
+ tcase_add_test (tc, test_srunner_run_run_all);
+ tcase_add_test (tc, test_srunner_run_suite);
+ tcase_add_test (tc, test_srunner_run_no_suite);
+ tcase_add_test (tc, test_srunner_run_tcase);
+ tcase_add_test (tc, test_srunner_no_tcase);
+ tcase_add_test (tc, test_srunner_suite_tcase);
+ tcase_add_test (tc, test_srunner_suite_no_tcase);
+ tcase_add_test (tc, test_srunner_run_suite_env);
+ tcase_add_test (tc, test_srunner_run_no_suite_env);
+ tcase_add_test (tc, test_srunner_run_tcase_env);
+ tcase_add_test (tc, test_srunner_no_tcase_env);
+ tcase_add_test (tc, test_srunner_suite_tcase_env);
+ tcase_add_test (tc, test_srunner_suite_no_tcase_env);
+
+ tcase_add_unchecked_fixture (tc,
+ selective_setup,
+ selective_teardown);
+ return s;
+}