/* 
 * 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 <walters@verbum.org>
 */

#include "config.h"
#include <glib.h>

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

static void
test_platform_argv0 (void)
{
  GOptionContext *context;
  gboolean arg;
  GOptionEntry entries [] =
    { { "test", 't', 0, G_OPTION_ARG_STRING, &arg, NULL, NULL },
      { NULL } };
  const gchar * const expected_prgnames[] =
    {
      "option-argv0",
      "lt-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 ();
}
