diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/nm-glib-compat.h | 11 | ||||
| -rw-r--r-- | include/nm-macros-internal.h | 1 | ||||
| -rw-r--r-- | include/nm-test-utils.h | 137 | ||||
| -rw-r--r-- | include/nm-version-macros.h | 7 | ||||
| -rw-r--r-- | include/nm-version-macros.h.in | 5 |
5 files changed, 145 insertions, 16 deletions
diff --git a/include/nm-glib-compat.h b/include/nm-glib-compat.h index dc39d2b9..691f9935 100644 --- a/include/nm-glib-compat.h +++ b/include/nm-glib-compat.h @@ -111,6 +111,17 @@ __g_type_ensure (GType type) #define g_test_initialized() (g_test_config_vars->test_initialized) #endif +/* Rumtime check for glib version. First do a compile time check which + * (if satisfied) shortcuts the runtime check. */ +#define nm_glib_check_version(major, minor, micro) \ + ( GLIB_CHECK_VERSION ((major), (minor), (micro)) \ + || ( ( glib_major_version > (major)) \ + || ( glib_major_version == (major) \ + && glib_minor_version > (minor)) \ + || ( glib_major_version == (major) \ + && glib_minor_version == (minor) \ + && glib_micro_version >= (micro)))) + /* g_test_skip() is only available since glib 2.38. Add a compatibility wrapper. */ inline static void __nmtst_g_test_skip (const gchar *msg) diff --git a/include/nm-macros-internal.h b/include/nm-macros-internal.h index a2f2da5a..123c49bb 100644 --- a/include/nm-macros-internal.h +++ b/include/nm-macros-internal.h @@ -177,6 +177,7 @@ (cond) ? (prefix) : "", \ (cond) ? (str) : (str_else), \ (cond) ? (suffix) : "" +#define NM_PRINT_FMT_QUOTE_STRING(arg) NM_PRINT_FMT_QUOTED((arg), "\"", (arg), "\"", "(null)") /*****************************************************************************/ diff --git a/include/nm-test-utils.h b/include/nm-test-utils.h index 258d3937..d23672b8 100644 --- a/include/nm-test-utils.h +++ b/include/nm-test-utils.h @@ -69,6 +69,8 @@ * If you set the level to DEBUG or TRACE, it also sets G_MESSAGES_DEBUG=all (unless * in assert-logging mode and unless G_MESSAGES_DEBUG is already defined). * + * "TRACE", this is shorthand for "log-level=TRACE". + * * "sudo-cmd=PATH": when running root tests as normal user, the test will execute * itself by invoking sudo at PATH. * For example @@ -80,6 +82,10 @@ * - respect g_test_quick(), if the command line contains '-mslow', '-mquick', '-mthorough'. * - use compile time default * + * "p=PATH"|"s=PATH": passes the path to g_test_init() as "-p" and "-s", respectively. + * Unfortunately, these options conflict with "--tap" which our makefile passes to the + * tests, thus it's only useful outside of `make check`. + * *******************************************************************************/ #include <arpa/inet.h> @@ -123,6 +129,28 @@ nmtst_assert_error (GError *error, } } +#define NMTST_WAIT(max_wait_ms, wait) \ + ({ \ + gboolean _not_expired = TRUE; \ + gint64 _nmtst_end, _nmtst_max_wait_us = (max_wait_ms) * 1000L; \ + \ + _nmtst_end = g_get_monotonic_time () + _nmtst_max_wait_us; \ + while (TRUE) { \ + { wait }; \ + if (g_get_monotonic_time () > _nmtst_end) { \ + _not_expired = FALSE; \ + break; \ + } \ + } \ + _not_expired; \ + }) + +#define NMTST_WAIT_ASSERT(max_wait_ms, wait) \ + G_STMT_START { \ + if (!(NMTST_WAIT (max_wait_ms, wait))) \ + g_assert_not_reached (); \ + } G_STMT_END + inline static void _nmtst_assert_success (gboolean success, GError *error, const char *file, int line) { @@ -142,6 +170,7 @@ struct __nmtst_internal gboolean assert_logging; gboolean no_expect_message; gboolean test_quick; + gboolean test_tap_log; char *sudo_cmd; char **orig_argv; }; @@ -256,6 +285,8 @@ __nmtst_init (int *argc, char ***argv, gboolean assert_logging, const char *log_ gboolean test_quick = FALSE; gboolean test_quick_set = FALSE; gboolean test_quick_argv = FALSE; + gs_unref_ptrarray GPtrArray *p_tests = NULL; + gs_unref_ptrarray GPtrArray *s_tests = NULL; if (!out_set_logging) out_set_logging = &_out_set_logging; @@ -275,17 +306,6 @@ __nmtst_init (int *argc, char ***argv, gboolean assert_logging, const char *log_ if (argc) __nmtst_internal.orig_argv = g_strdupv (*argv); - if (argc && !g_test_initialized ()) { - /* g_test_init() is a variadic function, so we cannot pass it - * (variadic) arguments. If you need to pass additional parameters, - * call nmtst_init() with argc==NULL and call g_test_init() yourself. */ - - /* g_test_init() sets g_log_set_always_fatal() for G_LOG_LEVEL_WARNING - * and G_LOG_LEVEL_CRITICAL. So, beware that the test will fail if you - * have any WARN or ERR log messages -- unless you g_test_expect_message(). */ - g_test_init (argc, argv, NULL); - } - __nmtst_internal.assert_logging = !!assert_logging; #if !GLIB_CHECK_VERSION (2, 35, 0) @@ -317,6 +337,9 @@ __nmtst_init (int *argc, char ***argv, gboolean assert_logging, const char *log_ } else if (!g_ascii_strncasecmp (debug, "log-level=", strlen ("log-level="))) { g_free (c_log_level); log_level = c_log_level = g_strdup (&debug[strlen ("log-level=")]); + } else if (!g_ascii_strcasecmp (debug, "TRACE")) { + g_free (c_log_level); + log_level = c_log_level = g_strdup (debug); } else if (!g_ascii_strncasecmp (debug, "log-domains=", strlen ("log-domains="))) { g_free (c_log_domains); log_domains = c_log_domains = g_strdup (&debug[strlen ("log-domains=")]); @@ -325,6 +348,14 @@ __nmtst_init (int *argc, char ***argv, gboolean assert_logging, const char *log_ sudo_cmd = g_strdup (&debug[strlen ("sudo-cmd=")]); } else if (!g_ascii_strcasecmp (debug, "no-expect-message")) { no_expect_message = TRUE; + } else if (!g_ascii_strncasecmp (debug, "p=", strlen ("p="))) { + if (!p_tests) + p_tests = g_ptr_array_new_with_free_func (g_free); + g_ptr_array_add (p_tests, g_strdup (&debug[strlen ("p=")])); + } else if (!g_ascii_strncasecmp (debug, "s=", strlen ("s="))) { + if (!s_tests) + s_tests = g_ptr_array_new_with_free_func (g_free); + g_ptr_array_add (s_tests, g_strdup (&debug[strlen ("s=")])); } else if (!g_ascii_strcasecmp (debug, "slow") || !g_ascii_strcasecmp (debug, "thorough")) { test_quick = FALSE; test_quick_set = TRUE; @@ -358,6 +389,90 @@ __nmtst_init (int *argc, char ***argv, gboolean assert_logging, const char *log_ || !strcmp (*(a+1), "slow") || !strcmp (*(a+1), "thorough")))) test_quick_argv = TRUE; + else if (strcmp (*a, "--tap") == 0) + __nmtst_internal.test_tap_log = TRUE; + } + } + + if (!argc || g_test_initialized ()) { + if (p_tests || s_tests) { + char *msg = g_strdup_printf (">>> nmtst: ignore -p and -s options for test which calls g_test_init() itself"); + + g_array_append_val (debug_messages, msg); + } + } else { + /* g_test_init() is a variadic function, so we cannot pass it + * (variadic) arguments. If you need to pass additional parameters, + * call nmtst_init() with argc==NULL and call g_test_init() yourself. */ + + /* g_test_init() sets g_log_set_always_fatal() for G_LOG_LEVEL_WARNING + * and G_LOG_LEVEL_CRITICAL. So, beware that the test will fail if you + * have any WARN or ERR log messages -- unless you g_test_expect_message(). */ + GPtrArray *arg_array = g_ptr_array_new (); + gs_free char **arg_array_c = NULL; + int arg_array_n, j; + static char **s_tests_x, **p_tests_x; + + if (*argc) { + for (i = 0; i < *argc; i++) + g_ptr_array_add (arg_array, (*argv)[i]); + } else + g_ptr_array_add (arg_array, "./test"); + + if (test_quick_set && !test_quick_argv) + g_ptr_array_add (arg_array, "-m=quick"); + + if (!__nmtst_internal.test_tap_log) { + for (i = 0; p_tests && i < p_tests->len; i++) { + g_ptr_array_add (arg_array, "-p"); + g_ptr_array_add (arg_array, p_tests->pdata[i]); + } + for (i = 0; s_tests && i < s_tests->len; i++) { + g_ptr_array_add (arg_array, "-s"); + g_ptr_array_add (arg_array, s_tests->pdata[i]); + } + } else if (p_tests || s_tests) { + char *msg = g_strdup_printf (">>> nmtst: ignore -p and -s options for tap-tests"); + + g_array_append_val (debug_messages, msg); + } + + g_ptr_array_add (arg_array, NULL); + + arg_array_n = arg_array->len - 1; + arg_array_c = (char **) g_ptr_array_free (arg_array, FALSE); + + g_test_init (&arg_array_n, &arg_array_c, NULL); + + if (*argc > 1) { + /* collaps argc/argv by removing the arguments detected + * by g_test_init(). */ + for (i = 1, j = 1; i < *argc; i++) { + if ((*argv)[i] == arg_array_c[j]) + j++; + else + (*argv)[i] = NULL; + } + for (i = 1, j = 1; i < *argc; i++) { + if ((*argv)[i]) { + (*argv)[j++] = (*argv)[i]; + if (i >= j) + (*argv)[i] = NULL; + } + } + *argc = j; + } + + /* we must "leak" the test paths because they are not cloned by g_test_init(). */ + if (!__nmtst_internal.test_tap_log) { + if (p_tests) { + p_tests_x = (char **) g_ptr_array_free (p_tests, FALSE); + p_tests = NULL; + } + if (s_tests) { + s_tests_x = (char **) g_ptr_array_free (s_tests, FALSE); + s_tests = NULL; + } } } diff --git a/include/nm-version-macros.h b/include/nm-version-macros.h index a3c5dc9b..2e15dcc1 100644 --- a/include/nm-version-macros.h +++ b/include/nm-version-macros.h @@ -45,7 +45,7 @@ * Evaluates to the micro version number of NetworkManager which this source * compiled against. */ -#define NM_MICRO_VERSION (8) +#define NM_MICRO_VERSION (10) /** * NM_CHECK_VERSION: @@ -72,8 +72,9 @@ #define NM_VERSION_1_0_6 (NM_ENCODE_VERSION (1, 0, 6)) #define NM_VERSION_1_0_8 (NM_ENCODE_VERSION (1, 0, 8)) #define NM_VERSION_1_0_10 (NM_ENCODE_VERSION (1, 0, 10)) +#define NM_VERSION_1_0_12 (NM_ENCODE_VERSION (1, 0, 12)) -#define NM_VERSION_CUR_STABLE NM_VERSION_1_0_8 -#define NM_VERSION_NEXT_STABLE NM_VERSION_1_0_10 +#define NM_VERSION_CUR_STABLE NM_VERSION_1_0_10 +#define NM_VERSION_NEXT_STABLE NM_VERSION_1_0_12 #endif /* __NM_VERSION_MACROS_H__ */ diff --git a/include/nm-version-macros.h.in b/include/nm-version-macros.h.in index 92df50ba..0051e005 100644 --- a/include/nm-version-macros.h.in +++ b/include/nm-version-macros.h.in @@ -72,8 +72,9 @@ #define NM_VERSION_1_0_6 (NM_ENCODE_VERSION (1, 0, 6)) #define NM_VERSION_1_0_8 (NM_ENCODE_VERSION (1, 0, 8)) #define NM_VERSION_1_0_10 (NM_ENCODE_VERSION (1, 0, 10)) +#define NM_VERSION_1_0_12 (NM_ENCODE_VERSION (1, 0, 12)) -#define NM_VERSION_CUR_STABLE NM_VERSION_1_0_8 -#define NM_VERSION_NEXT_STABLE NM_VERSION_1_0_10 +#define NM_VERSION_CUR_STABLE NM_VERSION_1_0_10 +#define NM_VERSION_NEXT_STABLE NM_VERSION_1_0_12 #endif /* __NM_VERSION_MACROS_H__ */ |