/* Main function for test programs.
   Copyright (C) 2016-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library 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.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

/* This file should be included from test cases.  It will define a
   main function which provides the test wrapper.

   It assumes that the test case defines a function

     int do_test (void);

   and arranges for that function being called under the test wrapper.
   The do_test function should return 0 to indicate a passing test, 1
   to indicate a failing test, or 77 to indicate an unsupported test.
   Other result values could be used to indicate a failing test, but
   the result of the expression is passed to exit and exit only
   returns the lower 8 bits of its input.  A non-zero return with some
   values could cause a test to incorrectly be considered passing when
   it really failed.  For this reason, the function should always
   return 0 (EXIT_SUCCESS), 1 (EXIT_FAILURE), or 77
   (EXIT_UNSUPPORTED).

   The test function may print out diagnostic or warning messages as well
   as messages about failures.  These messages should be printed to stdout
   and not stderr so that the output is properly ordered with respect to
   the rest of the glibc testsuite run output.

   Several preprocessors macros can be defined before including this
   file.

   The name of the do_test function can be changed with the
   TEST_FUNCTION macro.  It must expand to the desired function name.

   If the test case needs access to command line parameters, it must
   define the TEST_FUNCTION_ARGV macro with the name of the test
   function.  It must have the following type:

     int TEST_FUNCTION_ARGV (int argc, char **argv);

   This overrides the do_test default function and is incompatible
   with the TEST_FUNCTION macro.

   If PREPARE is defined, it must expand to the name of a function of
   the type

     void PREPARE (int argc, char **);

   This function will be called early, after parsing the command line,
   but before running the test, in the parent process which acts as
   the test supervisor.

   If CLEANUP_HANDLER is defined, it must expand to the name of a
   function of the type

     void CLEANUP_HANDLER (void);

   This function will be called from the timeout (SIGALRM) signal
   handler.

   If EXPECTED_SIGNAL is defined, it must expanded to a constant which
   denotes the expected signal number.

   If EXPECTED_STATUS is defined, it must expand to the expected exit
   status.

   If TIMEOUT is defined, it must be positive constant.  It overrides
   the default test timeout and is measured in seconds.

   If TEST_NO_MALLOPT is defined, the test wrapper will not call
   mallopt.

   Custom command line handling can be implemented by defining the
   CMDLINE_OPTION macro (after including the <getopt.h> header; this
   requires _GNU_SOURCE to be defined).  This macro must expand to a
   to a comma-separated list of braced initializers for struct option
   from <getopt.h>, with a trailing comma.  CMDLINE_PROCESS can be
   defined as the name of a function which is called to process these
   options.  The function is passed the option character/number and
   has this type:

     void CMDLINE_PROCESS (int);

   If the program also to process custom default short command line
   argument (similar to getopt) it must define CMDLINE_OPTSTRING
   with the expected options (for instance "vb").
*/

#include <support/test-driver.h>

#include <string.h>

int
main (int argc, char **argv)
{
  struct test_config test_config;
  memset (&test_config, 0, sizeof (test_config));

#ifdef PREPARE
  test_config.prepare_function = (PREPARE);
#endif

#if defined (TEST_FUNCTION) && defined (TEST_FUNCTON_ARGV)
# error TEST_FUNCTION and TEST_FUNCTION_ARGV cannot be defined at the same time
#endif
#if defined (TEST_FUNCTION)
  test_config.test_function = TEST_FUNCTION;
#elif defined (TEST_FUNCTION_ARGV)
  test_config.test_function_argv = TEST_FUNCTION_ARGV;
#else
  test_config.test_function = do_test;
#endif

#ifdef CLEANUP_HANDLER
  test_config.cleanup_function = CLEANUP_HANDLER;
#endif

#ifdef EXPECTED_SIGNAL
  test_config.expected_signal = (EXPECTED_SIGNAL);
#endif

#ifdef EXPECTED_STATUS
  test_config.expected_status = (EXPECTED_STATUS);
#endif

#ifdef TEST_NO_MALLOPT
  test_config.no_mallopt = 1;
#endif

#ifdef TIMEOUT
  test_config.timeout = TIMEOUT;
#endif

#ifdef CMDLINE_OPTIONS
  struct option options[] =
    {
      CMDLINE_OPTIONS
      TEST_DEFAULT_OPTIONS
    };
  test_config.options = &options;
#endif
#ifdef CMDLINE_PROCESS
  test_config.cmdline_function = CMDLINE_PROCESS;
#endif
#ifdef CMDLINE_OPTSTRING
  test_config.optstring = "+" CMDLINE_OPTSTRING;
#else
  test_config.optstring = "+";
#endif

  return support_test_main (argc, argv, &test_config);
}
