/* * Copyright (C) 2011 Red Hat, Inc. * * This work is provided "as is"; redistribution and modification * in whole or in part, in any medium, physical or electronic is * permitted without restriction. * * This work is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * In no event shall the authors or contributors be liable for any * direct, indirect, incidental, special, exemplary, or consequential * damages (including, but not limited to, procurement of substitute * goods or services; loss of use, data, or profits; or business * interruption) however caused and on any theory of liability, whether * in contract, strict liability, or tort (including negligence or * otherwise) arising in any way out of the use of this software, even * if advised of the possibility of such damage. * * Authors: Colin Walters */ #include "config.h" #include #include #include #include static void test_platform_argv0 (void) { GOptionContext *context; gboolean arg; GOptionEntry entries [] = { { "test", 't', 0, G_OPTION_ARG_STRING, &arg, NULL, NULL }, G_OPTION_ENTRY_NULL }; const gchar * const expected_prgnames[] = { "option-argv0", #ifdef G_OS_WIN32 "option-argv0.exe", #endif NULL, }; gboolean retval; gboolean fatal_errors = TRUE; /* This test must pass on platforms where platform_get_argv0() * is implemented. At the moment that means Linux/Cygwin, * (which uses /proc/self/cmdline) or OpenBSD (which uses * sysctl and KERN_PROC_ARGS) or Windows (which uses * GetCommandlineW ()). On other platforms the test * is not expected to pass, but we'd still want to know * how it does (the test code itself doesn't use any platform-specific * functionality, the difference is internal to glib, so it's quite * possible to run this test everywhere - it just won't pass on some * platforms). Make errors non-fatal on these other platforms, * to prevent them from crashing hard on failed assertions, * and make them call g_test_skip() instead. */ #if !defined HAVE_PROC_SELF_CMDLINE && \ !defined __OpenBSD__ && \ !defined __linux && \ !defined G_OS_WIN32 fatal_errors = FALSE; #endif context = g_option_context_new (NULL); g_option_context_add_main_entries (context, entries, NULL); retval = g_option_context_parse (context, NULL, NULL, NULL); if (fatal_errors) { g_assert_true (retval); g_assert_true (g_strv_contains (expected_prgnames, g_get_prgname ())); } else { gboolean failed = FALSE; if (!retval) { g_print ("g_option_context_parse() failed\n"); failed = TRUE; } else if (!g_strv_contains (expected_prgnames, g_get_prgname ())) { g_print ("program name `%s' is neither `option-argv0', nor `lt-option-argv0'\n", g_get_prgname()); failed = TRUE; } else g_print ("The test unexpectedly passed\n"); if (failed) g_test_skip ("platform_get_argv0() is not implemented [correctly?] on this platform"); } g_option_context_free (context); } int main (int argc, char *argv[]) { g_test_init (&argc, &argv, "no_g_set_prgname", NULL); g_test_add_func ("/option/argv0", test_platform_argv0); return g_test_run (); }