1869 {
1870 int result = EXIT_FAILURE;
1872 size_t parameters_size = 0;
1873 size_t tests_size = 0;
1874 int arg;
1875
1876 char *envptr;
1877 unsigned long ts;
1878 char *endptr;
1879 unsigned long long iterations;
1882 const char **runner_tests;
1883 unsigned int tests_run;
1884 unsigned int tests_total;
1885
1887 runner.
suite = NULL;
1889 runner.
tests = NULL;
1895
1900#if defined(MUNIT_ENABLE_TIMING)
1903#endif
1904
1906#if !defined(_WIN32)
1908#else
1910#endif
1913 runner.
suite = suite;
1915 runner.
seed = munit_rand_generate_seed();
1917
1918 for (arg = 1; arg < argc; arg++) {
1919 if (strncmp("--", argv[arg], 2) == 0) {
1920 if (strcmp("seed", argv[arg] + 2) == 0) {
1921 if (arg + 1 >= argc) {
1922 munit_logf_internal(
MUNIT_LOG_ERROR, stderr,
"%s requires an argument", argv[arg]);
1923 goto cleanup;
1924 }
1925
1926 envptr = argv[arg + 1];
1927 ts = strtoul(argv[arg + 1], &envptr, 0);
1929 munit_logf_internal(
MUNIT_LOG_ERROR, stderr,
"invalid value ('%s') passed to %s", argv[arg + 1],
1930 argv[arg]);
1931 goto cleanup;
1932 }
1934
1935 arg++;
1936 } else if (strcmp("iterations", argv[arg] + 2) == 0) {
1937 if (arg + 1 >= argc) {
1938 munit_logf_internal(
MUNIT_LOG_ERROR, stderr,
"%s requires an argument", argv[arg]);
1939 goto cleanup;
1940 }
1941
1942 endptr = argv[arg + 1];
1943 iterations = strtoul(argv[arg + 1], &endptr, 0);
1944 if (*endptr != '\0' || iterations > UINT_MAX) {
1945 munit_logf_internal(
MUNIT_LOG_ERROR, stderr,
"invalid value ('%s') passed to %s", argv[arg + 1],
1946 argv[arg]);
1947 goto cleanup;
1948 }
1949
1950 runner.
iterations = (
unsigned int) iterations;
1951
1952 arg++;
1953 } else if (strcmp("param", argv[arg] + 2) == 0) {
1954 if (arg + 2 >= argc) {
1955 munit_logf_internal(
MUNIT_LOG_ERROR, stderr,
"%s requires two arguments", argv[arg]);
1956 goto cleanup;
1957 }
1958
1961 munit_log_internal(
MUNIT_LOG_ERROR, stderr,
"failed to allocate memory");
1962 goto cleanup;
1963 }
1964 runner.
parameters[parameters_size].
name = (
char *) argv[arg + 1];
1966 parameters_size++;
1969 arg += 2;
1970 } else if (strcmp("color", argv[arg] + 2) == 0) {
1971 if (arg + 1 >= argc) {
1972 munit_logf_internal(
MUNIT_LOG_ERROR, stderr,
"%s requires an argument", argv[arg]);
1973 goto cleanup;
1974 }
1975
1976 if (strcmp(argv[arg + 1], "always") == 0)
1978 else if (strcmp(argv[arg + 1], "never") == 0)
1980 else if (strcmp(argv[arg + 1], "auto") == 0)
1982 else {
1983 munit_logf_internal(
MUNIT_LOG_ERROR, stderr,
"invalid value ('%s') passed to %s", argv[arg + 1],
1984 argv[arg]);
1985 goto cleanup;
1986 }
1987
1988 arg++;
1989 } else if (strcmp("help", argv[arg] + 2) == 0) {
1990 munit_print_help(argc, argv, user_data, arguments);
1991 result = EXIT_SUCCESS;
1992 goto cleanup;
1993 } else if (strcmp("single", argv[arg] + 2) == 0) {
1995 } else if (strcmp("show-stderr", argv[arg] + 2) == 0) {
1997#if !defined(_WIN32)
1998 } else if (strcmp("no-fork", argv[arg] + 2) == 0) {
2000#endif
2001 } else if (strcmp("fatal-failures", argv[arg] + 2) == 0) {
2003 } else if (strcmp("log-visible", argv[arg] + 2) == 0 ||
2004 strcmp("log-fatal", argv[arg] + 2) == 0) {
2005 if (arg + 1 >= argc) {
2006 munit_logf_internal(
MUNIT_LOG_ERROR, stderr,
"%s requires an argument", argv[arg]);
2007 goto cleanup;
2008 }
2009
2010 if (strcmp(argv[arg + 1], "debug") == 0)
2012 else if (strcmp(argv[arg + 1], "info") == 0)
2014 else if (strcmp(argv[arg + 1], "warning") == 0)
2016 else if (strcmp(argv[arg + 1], "error") == 0)
2018 else {
2019 munit_logf_internal(
MUNIT_LOG_ERROR, stderr,
"invalid value ('%s') passed to %s", argv[arg + 1],
2020 argv[arg]);
2021 goto cleanup;
2022 }
2023
2024 if (strcmp("log-visible", argv[arg] + 2) == 0)
2025 munit_log_level_visible = level;
2026 else
2027 munit_log_level_fatal = level;
2028
2029 arg++;
2030 } else if (strcmp("list", argv[arg] + 2) == 0) {
2031 munit_suite_list_tests(suite, 0, NULL);
2032 result = EXIT_SUCCESS;
2033 goto cleanup;
2034 } else if (strcmp("list-params", argv[arg] + 2) == 0) {
2035 munit_suite_list_tests(suite, 1, NULL);
2036 result = EXIT_SUCCESS;
2037 goto cleanup;
2038 } else {
2039 argument = munit_arguments_find(arguments, argv[arg] + 2);
2040 if (argument == NULL) {
2041 munit_logf_internal(
MUNIT_LOG_ERROR, stderr,
"unknown argument ('%s')", argv[arg]);
2042 goto cleanup;
2043 }
2044
2045 if (!argument->
parse_argument(suite, user_data, &arg, argc, argv))
2046 goto cleanup;
2047 }
2048 } else {
2049 runner_tests = realloc((
void *) runner.
tests,
sizeof(
char *) * (tests_size + 2));
2050 if (runner_tests == NULL) {
2051 munit_log_internal(
MUNIT_LOG_ERROR, stderr,
"failed to allocate memory");
2052 goto cleanup;
2053 }
2054 runner.
tests = runner_tests;
2055 runner.
tests[tests_size++] = argv[arg];
2056 runner.
tests[tests_size] = NULL;
2057 }
2058 }
2059
2060 fflush(stderr);
2062
2063 munit_test_runner_run(&runner);
2064
2067 if (tests_run == 0) {
2068 fprintf(stderr,
"No tests run, %d (100%%) skipped.\n", runner.
report.
skipped);
2069 } else {
2070 fprintf(
MUNIT_OUTPUT_FILE,
"%d of %d (%0.0f%%) tests successful, %d (%0.0f%%) test skipped.\n",
2074 (((
double) runner.
report.
skipped) / ((
double) tests_total)) * 100.0);
2075 }
2076
2077
2078#if defined(MUNIT_FAIL_NO_TEST_RUN)
2080#else
2081 if (runner.
report.
failed == 0 && runner.report_simple.errored == 0) {
2082#endif
2083 result = EXIT_SUCCESS;
2084 }
2085
2086 cleanup:
2088 free((
void *) runner.
tests);
2089
2090 return result;
2091}
#define MUNIT_OUTPUT_FILE
struct MunitArgument_ MunitArgument
munit_bool(* parse_argument)(const MunitSuite *suite, void *user_data, int *arg, int argc, char *const argv[MUNIT_ARRAY_PARAM(argc+1)])
munit_uint64_t wall_clock
const MunitSuite * current_suite
MunitParameter * parameters
munit_bool single_parameter_mode
munit_bool fatal_failures