/*
 * svn_test_main.c:  shared main() & friends for SVN test-suite programs
 *
 * ====================================================================
 *    Licensed to the Apache Software Foundation (ASF) under one
 *    or more contributor license agreements.  See the NOTICE file
 *    distributed with this work for additional information
 *    regarding copyright ownership.  The ASF licenses this file
 *    to you under the Apache License, Version 2.0 (the
 *    "License"); you may not use this file except in compliance
 *    with the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing,
 *    software distributed under the License is distributed on an
 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *    KIND, either express or implied.  See the License for the
 *    specific language governing permissions and limitations
 *    under the License.
 * ====================================================================
 */



#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#ifdef WIN32
#include <crtdbg.h>
#endif

#include <apr_pools.h>
#include <apr_general.h>
#include <apr_signal.h>
#include <apr_env.h>

#include "svn_cmdline.h"
#include "svn_opt.h"
#include "svn_pools.h"
#include "svn_error.h"
#include "svn_test.h"
#include "svn_io.h"
#include "svn_path.h"
#include "svn_ctype.h"
#include "svn_utf.h"
#include "svn_version.h"

#include "private/svn_cmdline_private.h"
#include "private/svn_atomic.h"
#include "private/svn_mutex.h"
#include "private/svn_sqlite.h"

#include "svn_private_config.h"

#if APR_HAS_THREADS
#  include <apr_thread_proc.h>
#endif

/* Some Subversion test programs may want to parse options in the
   argument list, so we remember it here. */
extern int test_argc;
extern const char **test_argv;
int test_argc;
const char **test_argv;

/* Many tests write to disk. Instead of writing to the current
   directory, they should use this path as the root of the test data
   area. */
static const char *data_path;

/* Test option: Print more output */
static svn_boolean_t verbose_mode = FALSE;

/* Test option: Print only unexpected results */
static svn_boolean_t quiet_mode = FALSE;

/* Test option: Remove test directories after success */
static svn_boolean_t cleanup_mode = FALSE;

/* Test option: Allow segfaults */
static svn_boolean_t allow_segfaults = FALSE;

/* Test option: Limit testing to a given mode (i.e. XFail, Skip,
   Pass, All). */
static enum svn_test_mode_t mode_filter = svn_test_all;

/* Test option: Allow concurrent execution of tests */
static svn_boolean_t parallel = FALSE;

/* Option parsing enums and structures */
enum test_options_e {
  help_opt = SVN_OPT_FIRST_LONGOPT_ID,
  cleanup_opt,
  fstype_opt,
  list_opt,
  verbose_opt,
  quiet_opt,
  config_opt,
  server_minor_version_opt,
  allow_segfault_opt,
  srcdir_opt,
  reposdir_opt,
  reposurl_opt,
  repostemplate_opt,
  memcached_server_opt,
  mode_filter_opt,
  sqlite_log_opt,
  parallel_opt,
  fsfs_version_opt
};

static const apr_getopt_option_t cl_options[] =
{
  {"help",          help_opt, 0,
                    N_("display this help")},
  {"cleanup",       cleanup_opt, 0,
                    N_("remove test directories after success")},
  {"config-file",   config_opt, 1,
                    N_("specify test config file ARG")},
  {"fs-type",       fstype_opt, 1,
                    N_("specify a filesystem backend type ARG")},
  {"fsfs-version",  fsfs_version_opt, 1,
                    N_("specify the FSFS version ARG")},
  {"list",          list_opt, 0,
                    N_("lists all the tests with their short description")},
  {"mode-filter",   mode_filter_opt, 1,
                    N_("only run/list tests with expected mode ARG = PASS, "
                       "XFAIL, SKIP, or ALL (default)")},
  {"verbose",       verbose_opt, 0,
                    N_("print extra information")},
  {"server-minor-version", server_minor_version_opt, 1,
                    N_("set the minor version for the server ('3', '4', "
                       "'5', or '6')")},
  {"quiet",         quiet_opt, 0,
                    N_("print only unexpected results")},
  {"allow-segfaults", allow_segfault_opt, 0,
                    N_("don't trap seg faults (useful for debugging)")},
  {"srcdir",        srcdir_opt, 1,
                    N_("directory which contains test's C source files")},
  {"repos-dir",     reposdir_opt, 1,
                    N_("directory to create repositories in")},
  {"repos-url",     reposurl_opt, 1,
                    N_("the url to access reposdir as")},
  {"repos-template",repostemplate_opt, 1,
                    N_("the repository to use as template")},
  {"memcached-server", memcached_server_opt, 1,
                    N_("the memcached server to use")},
  {"sqlite-logging", sqlite_log_opt, 0,
                    N_("enable SQLite logging")},
  {"parallel",      parallel_opt, 0,
                    N_("allow concurrent execution of tests")},
  {0,               0, 0, 0}
};


/* ================================================================= */
/* Stuff for cleanup processing */

/* When non-zero, don't remove test directories */
static svn_boolean_t skip_cleanup = FALSE;

/* All cleanup actions are registered as cleanups on the cleanup_pool,
 * which may be thread-specific. */
#if APR_HAS_THREADS
/* The thread-local data key for the cleanup pool. */
static apr_threadkey_t *cleanup_pool_key = NULL;

/* No-op destructor for apr_threadkey_private_create(). */
static void null_threadkey_dtor(void *stuff) {}

/* Set the thread-specific cleanup pool. */
static void set_cleanup_pool(apr_pool_t *pool)
{
  apr_status_t status = apr_threadkey_private_set(pool, cleanup_pool_key);
  if (status)
    {
      printf("apr_threadkey_private_set() failed with code %ld.\n",
             (long)status);
      exit(1);
    }
}

/* Get the thread-specific cleanup pool. */
static apr_pool_t *get_cleanup_pool(void)
{
  void *data;
  apr_status_t status = apr_threadkey_private_get(&data, cleanup_pool_key);
  if (status)
    {
      printf("apr_threadkey_private_get() failed with code %ld.\n",
             (long)status);
      exit(1);
    }
  return data;
}

#  define cleanup_pool (get_cleanup_pool())
#  define HAVE_PER_THREAD_CLEANUP
#else
static apr_pool_t *cleanup_pool = NULL;
#  define set_cleanup_pool(p) (cleanup_pool = (p))
#endif

/* Used by test_thread to serialize access to stdout. */
static svn_mutex__t *log_mutex = NULL;

static apr_status_t
cleanup_rmtree(void *data)
{
  if (!skip_cleanup)
    {
      apr_pool_t *pool = svn_pool_create(NULL);
      const char *path = data;

      /* Ignore errors here. */
      svn_error_t *err = svn_io_remove_dir2(path, FALSE, NULL, NULL, pool);
      svn_error_clear(err);
      if (verbose_mode)
        {
          if (err)
            printf("FAILED CLEANUP: %s\n", path);
          else
            printf("CLEANUP: %s\n", path);
        }
      svn_pool_destroy(pool);
    }
  return APR_SUCCESS;
}



void
svn_test_add_dir_cleanup(const char *path)
{
  if (cleanup_mode)
    {
      const char *abspath;
      svn_error_t *err;

      /* All cleanup functions use the *same* pool (not subpools of it).
         Thus, we need to synchronize. */
      err = svn_mutex__lock(log_mutex);
      if (err)
        {
          if (verbose_mode)
            printf("FAILED svn_mutex__lock in svn_test_add_dir_cleanup.\n");
          svn_error_clear(err);
          return;
        }

      err = svn_path_get_absolute(&abspath, path, cleanup_pool);
      svn_error_clear(err);
      if (!err)
        apr_pool_cleanup_register(cleanup_pool, abspath, cleanup_rmtree,
                                  apr_pool_cleanup_null);
      else if (verbose_mode)
        printf("FAILED ABSPATH: %s\n", path);

      err = svn_mutex__unlock(log_mutex, NULL);
      if (err)
        {
          if (verbose_mode)
            printf("FAILED svn_mutex__unlock in svn_test_add_dir_cleanup.\n");
          svn_error_clear(err);
        }
    }
}


/* ================================================================= */
/* Quite a few tests use random numbers. */

apr_uint32_t
svn_test_rand(apr_uint32_t *seed)
{
  *seed = (*seed * 1103515245UL + 12345UL) & 0xffffffffUL;
  return *seed;
}


/* ================================================================= */


/* Determine the array size of test_funcs[], the inelegant way.  :)  */
static int
get_array_size(struct svn_test_descriptor_t *test_funcs)
{
  int i;

  for (i = 1; test_funcs[i].func2 || test_funcs[i].func_opts; i++)
    {
    }

  return (i - 1);
}

/* Buffer used for setjmp/longjmp. */
static jmp_buf jump_buffer;

/* Our SIGSEGV handler, which jumps back into do_test_num(), which see for
   more information. */
static void
crash_handler(int signum)
{
  longjmp(jump_buffer, 1);
}

/* Write the result of test number TEST_NUM to stdout.  Pretty-print test
   name and dots according to our test-suite spec, and return TRUE if there
   has been a test failure.

   The parameters are basically the internal state of do_test_num() and
   test_thread(). */
/*  */
static svn_boolean_t
log_results(const char *progname,
            int test_num,
            svn_boolean_t msg_only,
            svn_boolean_t run_this_test,
            svn_boolean_t skip,
            svn_boolean_t xfail,
            svn_boolean_t wimp,
            svn_error_t *err,
            const char *msg,
            const struct svn_test_descriptor_t *desc)
{
  svn_boolean_t test_failed;

  if (err && err->apr_err == SVN_ERR_TEST_SKIPPED)
    {
      svn_error_clear(err);
      err = SVN_NO_ERROR;
      skip = TRUE;
      xfail = FALSE; /* Or all XFail tests reporting SKIP would be failing */
    }

  /* Failure means unexpected results -- FAIL or XPASS. */
  test_failed = (!wimp && ((err != SVN_NO_ERROR) != (xfail != 0)));

  /* If we got an error, print it out.  */
  if (err)
    {
      svn_handle_error2(err, stdout, FALSE, "svn_tests: ");
      svn_error_clear(err);
    }

  if (msg_only)
    {
      const svn_boolean_t otoh = !!desc->predicate.description;

      if (run_this_test)
        printf(" %3d    %-5s  %s%s%s%s%s%s\n",
               test_num,
               (xfail ? "XFAIL" : (skip ? "SKIP" : "")),
               msg ? msg : "(test did not provide name)",
               (wimp && verbose_mode) ? " [[" : "",
               (wimp && verbose_mode) ? desc->wip : "",
               (wimp && verbose_mode) ? "]]" : "",
               (otoh ? " / " : ""),
               (otoh ? desc->predicate.description : ""));
    }
  else if (run_this_test && ((! quiet_mode) || test_failed))
    {
      printf("%s %s %d: %s%s%s%s\n",
             (err
              ? (xfail ? "XFAIL:" : "FAIL: ")
              : (xfail ? "XPASS:" : (skip ? "SKIP: " : "PASS: "))),
             progname,
             test_num,
             msg ? msg : "(test did not provide name)",
             wimp ? " [[WIMP: " : "",
             wimp ? desc->wip : "",
             wimp ? "]]" : "");
    }

  if (msg)
    {
      size_t len = strlen(msg);
      if (len > 50)
        printf("WARNING: Test docstring exceeds 50 characters\n");
      if (msg[len - 1] == '.')
        printf("WARNING: Test docstring ends in a period (.)\n");
      if (svn_ctype_isupper(msg[0]))
        printf("WARNING: Test docstring is capitalized\n");
    }
  if (desc->msg == NULL)
    printf("WARNING: New-style test descriptor is missing a docstring.\n");

  fflush(stdout);

  return test_failed;
}

/* Execute a test number TEST_NUM.  Pretty-print test name and dots
   according to our test-suite spec, and return the result code.
   If HEADER_MSG and *HEADER_MSG are not NULL, print *HEADER_MSG prior
   to pretty-printing the test information, then set *HEADER_MSG to NULL. */
static svn_boolean_t
do_test_num(const char *progname,
            int test_num,
            struct svn_test_descriptor_t *test_funcs,
            svn_boolean_t msg_only,
            svn_test_opts_t *opts,
            const char **header_msg,
            apr_pool_t *pool)
{
  svn_boolean_t skip, xfail, wimp;
  svn_error_t *err;
  const char *msg = NULL;  /* the message this individual test prints out */
  const struct svn_test_descriptor_t *desc;
  const int array_size = get_array_size(test_funcs);
  svn_boolean_t run_this_test; /* This test's mode matches DESC->MODE. */
  enum svn_test_mode_t test_mode;
  volatile int adjusted_num = test_num; /* volatile for setjmp */

  /* This allows './some-test -- -1' to run the last test. */
  if (adjusted_num < 0)
    adjusted_num += array_size + 1;

  /* Check our array bounds! */
  if ((adjusted_num > array_size) || (adjusted_num <= 0))
    {
      if (header_msg && *header_msg)
        printf("%s", *header_msg);
      printf("FAIL: %s: THERE IS NO TEST NUMBER %2d\n", progname, adjusted_num);
      skip_cleanup = TRUE;
      return TRUE;  /* BAIL, this test number doesn't exist. */
    }

  desc = &test_funcs[adjusted_num];
  /* Check the test predicate. */
  if (desc->predicate.func
      && desc->predicate.func(opts, desc->predicate.value, pool))
    test_mode = desc->predicate.alternate_mode;
  else
    test_mode = desc->mode;

  skip = test_mode == svn_test_skip;
  xfail = test_mode == svn_test_xfail;
  wimp = xfail && desc->wip;
  msg = desc->msg;
  run_this_test = mode_filter == svn_test_all || mode_filter == test_mode;

  if (run_this_test && header_msg && *header_msg)
    {
      printf("%s", *header_msg);
      *header_msg = NULL;
    }

  if (!allow_segfaults)
    {
      /* Catch a crashing test, so we don't interrupt the rest of 'em. */
      apr_signal(SIGSEGV, crash_handler);
    }

  /* We use setjmp/longjmp to recover from the crash.  setjmp() essentially
     establishes a rollback point, and longjmp() goes back to that point.
     When we invoke longjmp(), it instructs setjmp() to return non-zero,
     so we don't end up in an infinite loop.

     If we've got non-zero from setjmp(), we know we've crashed. */
  if (setjmp(jump_buffer) == 0)
    {
      /* Do test */
      if (msg_only || skip || !run_this_test)
        err = NULL; /* pass */
      else if (desc->func2)
        err = (*desc->func2)(pool);
      else
        err = (*desc->func_opts)(opts, pool);
    }
  else
    err = svn_error_create(SVN_ERR_TEST_FAILED, NULL,
                           "Test crashed "
                           "(run in debugger with '--allow-segfaults')");

  if (!allow_segfaults)
    {
      /* Now back to your regularly scheduled program... */
      apr_signal(SIGSEGV, SIG_DFL);
    }

  /* Failure means unexpected results -- FAIL or XPASS. */
  skip_cleanup = log_results(progname, adjusted_num, msg_only, run_this_test,
                             skip, xfail, wimp, err, msg, desc);

  return skip_cleanup;
}

#if APR_HAS_THREADS

/* Per-test parameters used by test_thread */
typedef struct test_params_t
{
  /* Name of the application */
  const char *progname;

  /* Total number of tests to execute */
  svn_atomic_t test_count;

  /* Global test options as provided by main() */
  svn_test_opts_t *opts;

  /* Reference to the global failure flag.  Set this if any test failed. */
  svn_atomic_t got_error;

  /* Test to execute next. */
  svn_atomic_t test_num;

  /* Test functions array. */
  struct svn_test_descriptor_t *test_funcs;
} test_params_t;

/* Thread function similar to do_test_num() but with fewer options.  We do
   catch segfaults.  All parameters are given as a test_params_t in DATA.
 */
static void * APR_THREAD_FUNC
test_thread(apr_thread_t *thread, void *data)
{
  svn_boolean_t skip, xfail, wimp;
  svn_error_t *err;
  const struct svn_test_descriptor_t *desc;
  svn_boolean_t run_this_test; /* This test's mode matches DESC->MODE. */
  enum svn_test_mode_t test_mode;
  test_params_t *params = data;
  svn_atomic_t test_num;
  apr_pool_t *pool;
  apr_pool_t *thread_root
    = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));

#ifdef HAVE_PER_THREAD_CLEANUP
  set_cleanup_pool(svn_pool_create(thread_root));
#endif

  pool = svn_pool_create(thread_root);

  for (test_num = svn_atomic_inc(&params->test_num);
       test_num <= params->test_count;
       test_num = svn_atomic_inc(&params->test_num))
    {
      svn_pool_clear(pool);
#ifdef HAVE_PER_THREAD_CLEANUP
      svn_pool_clear(cleanup_pool); /* after clearing pool*/
#endif

      desc = &params->test_funcs[test_num];
      /* Check the test predicate. */
      if (desc->predicate.func
          && desc->predicate.func(params->opts, desc->predicate.value, pool))
        test_mode = desc->predicate.alternate_mode;
      else
        test_mode = desc->mode;

      skip = test_mode == svn_test_skip;
      xfail = test_mode == svn_test_xfail;
      wimp = xfail && desc->wip;
      run_this_test = mode_filter == svn_test_all
                   || mode_filter == test_mode;

      /* Do test */
      if (skip || !run_this_test)
        err = NULL; /* pass */
      else if (desc->func2)
        err = (*desc->func2)(pool);
      else
        err = (*desc->func_opts)(params->opts, pool);

      /* Write results to console */
      svn_error_clear(svn_mutex__lock(log_mutex));
      if (log_results(params->progname, test_num, FALSE, run_this_test,
                      skip, xfail, wimp, err, desc->msg, desc))
        svn_atomic_set(&params->got_error, TRUE);
      svn_error_clear(svn_mutex__unlock(log_mutex, NULL));
    }

  svn_pool_clear(pool); /* Make sure this is cleared before cleanup_pool*/

  /* Release all test memory. Possibly includes cleanup_pool */
  svn_pool_destroy(thread_root);

  /* End thread explicitly to prevent APR_INCOMPLETE return codes in
     apr_thread_join(). */
  apr_thread_exit(thread, 0);
  return NULL;
}

/* Log an error with message MSG if the APR status of EXPR is not 0.
 */
#define CHECK_STATUS(expr,msg) \
  do { \
    apr_status_t rv = (expr); \
    if (rv) \
      { \
        svn_error_t *svn_err__temp = svn_error_wrap_apr(rv, msg); \
        svn_handle_error2(svn_err__temp, stdout, FALSE, "svn_tests: "); \
        svn_error_clear(svn_err__temp); \
      } \
  } while (0);

/* Execute all ARRAY_SIZE tests concurrently using MAX_THREADS threads.
   Pass PROGNAME and OPTS to the individual tests.  Return TRUE if at least
   one of the tests failed.  Allocate all data in POOL.

   Note that cleanups are delayed until all tests have been completed.
 */
static svn_boolean_t
do_tests_concurrently(const char *progname,
                      struct svn_test_descriptor_t *test_funcs,
                      int array_size,
                      int max_threads,
                      svn_test_opts_t *opts,
                      apr_pool_t *pool)
{
  int i;
  apr_thread_t **threads;

  /* Prepare thread parameters. */
  test_params_t params;
  params.got_error = FALSE;
  params.opts = opts;
  params.progname = progname;
  params.test_num = 1;
  params.test_funcs = test_funcs;
  params.test_count = array_size;

  /* Start all threads. */
  threads = apr_pcalloc(pool, max_threads * sizeof(*threads));
  for (i = 0; i < max_threads; ++i)
    {
      CHECK_STATUS(apr_thread_create(&threads[i], NULL, test_thread, &params,
                                     pool),
                   "creating test thread failed.\n");
    }

  /* Wait for all tasks (tests) to complete. */
  for (i = 0; i < max_threads; ++i)
    {
      apr_status_t result = 0;
      CHECK_STATUS(apr_thread_join(&result, threads[i]),
                   "Waiting for test thread to finish failed.");
      CHECK_STATUS(result,
                   "Test thread returned an error.");
    }

  return params.got_error != FALSE;
}

#endif

static void help(const char *progname, apr_pool_t *pool)
{
  int i;

  svn_error_clear(svn_cmdline_fprintf(stdout, pool,
                                      _("usage: %s [options] [test-numbers]\n"
                                      "\n"
                                      "Valid options:\n"),
                                      progname));
  for (i = 0; cl_options[i].name && cl_options[i].optch; i++)
    {
      const char *optstr;

      svn_opt_format_option(&optstr, cl_options + i, TRUE, pool);
      svn_error_clear(svn_cmdline_fprintf(stdout, pool, "  %s\n", optstr));
    }
  svn_error_clear(svn_cmdline_fprintf(stdout, pool, "\n"));
}

static svn_error_t *init_test_data(const char *argv0, apr_pool_t *pool)
{
  const char *temp_path;
  const char *base_name;

  /* Convert the program path to an absolute path. */
  SVN_ERR(svn_utf_cstring_to_utf8(&temp_path, argv0, pool));
  temp_path = svn_dirent_internal_style(temp_path, pool);
  SVN_ERR(svn_dirent_get_absolute(&temp_path, temp_path, pool));
  SVN_ERR_ASSERT(!svn_dirent_is_root(temp_path, strlen(temp_path)));

  /* Extract the interesting bits of the path. */
  temp_path = svn_dirent_dirname(temp_path, pool);
  base_name = svn_dirent_basename(temp_path, pool);
  if (0 == strcmp(base_name, ".libs"))
    {
      /* This is a libtoolized binary, skip the .libs directory. */
      temp_path = svn_dirent_dirname(temp_path, pool);
      base_name = svn_dirent_basename(temp_path, pool);
    }
  temp_path = svn_dirent_dirname(temp_path, pool);

  /* temp_path should now point to the root of the test
     builddir. Construct the path to the transient dir.  Note that we
     put the path insinde the cmdline/svn-test-work area. This is
     because trying to get the cmdline tests to use a different work
     area is unprintable; so we put the C test transient dir in the
     cmdline tests area, as the lesser of evils ... */
  temp_path = svn_dirent_join_many(pool, temp_path,
                                   "cmdline", "svn-test-work",
                                   base_name, SVN_VA_NULL);

  /* Finally, create the transient directory. */
  SVN_ERR(svn_io_make_dir_recursively(temp_path, pool));

  data_path = temp_path;
  return SVN_NO_ERROR;
}

const char *
svn_test_data_path(const char *base_name, apr_pool_t *result_pool)
{
  return svn_dirent_join(data_path, base_name, result_pool);
}

svn_error_t *
svn_test_get_srcdir(const char **srcdir,
                    const svn_test_opts_t *opts,
                    apr_pool_t *pool)
{
  const char *cwd;

  if (opts->srcdir)
    {
      *srcdir = opts->srcdir;
      return SVN_NO_ERROR;
    }

  fprintf(stderr, "WARNING: missing '--srcdir' option");
  SVN_ERR(svn_dirent_get_absolute(&cwd, ".", pool));
  fprintf(stderr, ", assuming '%s'\n", cwd);
  *srcdir = cwd;

  return SVN_NO_ERROR;
}

svn_error_t *
svn_test__init_auth_baton(svn_auth_baton_t **ab,
                          apr_pool_t *result_pool)
{
  svn_config_t *cfg_config;

  SVN_ERR(svn_config_create2(&cfg_config, FALSE, FALSE, result_pool));

  /* Disable the crypto backends that might not be entirely
     threadsafe and/or compatible with running headless.

     The windows system is just our own files, but then with user-key
     encrypted data inside. */
  svn_config_set(cfg_config,
                 SVN_CONFIG_SECTION_AUTH,
                 SVN_CONFIG_OPTION_PASSWORD_STORES,
                 "windows-cryptoapi");

  SVN_ERR(svn_cmdline_create_auth_baton2(ab,
                                         TRUE  /* non_interactive */,
                                         "jrandom", "rayjandom",
                                         NULL,
                                         TRUE  /* no_auth_cache */,
                                         TRUE /* trust_server_cert_unkown_ca */,
                                         FALSE, FALSE, FALSE, FALSE,
                                         cfg_config, NULL, NULL, result_pool));

  return SVN_NO_ERROR;
}

svn_error_t *
svn_test_make_sandbox_dir(const char **sb_dir_p,
                          const char *sb_name,
                          apr_pool_t *pool)
{
  const char *sb_dir;

  sb_dir = svn_test_data_path(sb_name, pool);
  SVN_ERR(svn_io_remove_dir2(sb_dir, TRUE, NULL, NULL, pool));
  SVN_ERR(svn_io_make_dir_recursively(sb_dir, pool));
  svn_test_add_dir_cleanup(sb_dir);

  *sb_dir_p = sb_dir;

  return SVN_NO_ERROR;
}

/* Standard svn test program */
int
svn_test_main(int argc, const char *argv[], int max_threads,
              struct svn_test_descriptor_t *test_funcs)
{
  int i;
  svn_boolean_t got_error = FALSE;
  apr_pool_t *pool, *test_pool;
  svn_boolean_t ran_a_test = FALSE;
  svn_boolean_t list_mode = FALSE;
  int opt_id;
  apr_status_t apr_err;
  apr_getopt_t *os;
  svn_error_t *err;
  char errmsg[200];
  /* How many tests are there? */
  int array_size = get_array_size(test_funcs);

  svn_test_opts_t opts = { NULL };

  opts.fs_type = DEFAULT_FS_TYPE;

  /* Initialize APR (Apache pools) */
  if (apr_initialize() != APR_SUCCESS)
    {
      printf("apr_initialize() failed.\n");
      exit(1);
    }

  /* set up the global pool.  Use a separate allocator to limit memory
   * usage but make it thread-safe to allow for multi-threaded tests.
   */
  pool = apr_allocator_owner_get(svn_pool_create_allocator(TRUE));
  err = svn_mutex__init(&log_mutex, TRUE, pool);
  if (err)
    {
      svn_handle_error2(err, stderr, TRUE, "svn_tests: ");
      svn_error_clear(err);
    }

  /* Set up the thread-local storage key for the cleanup pool. */
#ifdef HAVE_PER_THREAD_CLEANUP
  apr_err = apr_threadkey_private_create(&cleanup_pool_key,
                                         null_threadkey_dtor,
                                         pool);
  if (apr_err)
    {
      printf("apr_threadkey_private_create() failed with code %ld.\n",
             (long)apr_err);
      exit(1);
    }
#endif /* HAVE_PER_THREAD_CLEANUP */

  /* Remember the command line */
  test_argc = argc;
  test_argv = argv;

  err = init_test_data(argv[0], pool);
  if (err)
    {
      svn_handle_error2(err, stderr, TRUE, "svn_tests: ");
      svn_error_clear(err);
    }

  err = svn_cmdline__getopt_init(&os, argc, argv, pool);
  if (err)
    {
      svn_handle_error2(err, stderr, TRUE, "svn_tests: ");
      svn_error_clear(err);
    }


  os->interleave = TRUE; /* Let options and arguments be interleaved */

  /* Strip off any leading path components from the program name.  */
  opts.prog_name = svn_dirent_internal_style(argv[0], pool);
  opts.prog_name = svn_dirent_basename(opts.prog_name, NULL);

#ifdef WIN32
  /* Abuse cast in strstr() to remove .exe extension.
     Value is allocated in pool by svn_dirent_internal_style() */
  {
    char *exe_ext = strstr(opts.prog_name, ".exe");

    if (exe_ext)
      *exe_ext = '\0';
  }

#if _MSC_VER >= 1400
  /* ### This should work for VC++ 2002 (=1300) and later */
  /* Show the abort message on STDERR instead of a dialog to allow
     scripts (e.g. our testsuite) to continue after an abort without
     user intervention. Allow overriding for easier debugging. */
  if (!getenv("SVN_CMDLINE_USE_DIALOG_FOR_ABORT"))
    {
      /* In release mode: Redirect abort() errors to stderr */
      _set_error_mode(_OUT_TO_STDERR);

      /* In _DEBUG mode: Redirect all debug output (E.g. assert() to stderr.
         (Ignored in releas builds) */
      _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR);
      _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
      _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
      _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
    }
#endif /* _MSC_VER >= 1400 */
#endif

  if (err)
    return svn_cmdline_handle_exit_error(err, pool, opts.prog_name);

  /* For efficient UTF8 handling (e.g. used by our file I/O routines). */
  svn_utf_initialize2(FALSE, pool);

  while (1)
    {
      const char *opt_arg;

      /* Parse the next option. */
      apr_err = apr_getopt_long(os, cl_options, &opt_id, &opt_arg);
      if (APR_STATUS_IS_EOF(apr_err))
        break;
      else if (apr_err)
        {
          /* Ignore invalid option error to allow passing arbitrary options */
          if (apr_err == APR_BADCH)
            continue;

          fprintf(stderr, "apr_getopt_long failed : [%d] %s\n",
                  apr_err, apr_strerror(apr_err, errmsg, sizeof(errmsg)));
          exit(1);
        }

      switch (opt_id) {
        case help_opt:
          help(opts.prog_name, pool);
          exit(0);
        case cleanup_opt:
          cleanup_mode = TRUE;
          break;
        case config_opt:
          opts.config_file = apr_pstrdup(pool, opt_arg);
          break;
        case fstype_opt:
          opts.fs_type = apr_pstrdup(pool, opt_arg);
          break;
        case srcdir_opt:
          SVN_INT_ERR(svn_utf_cstring_to_utf8(&opts.srcdir, opt_arg, pool));
          opts.srcdir = svn_dirent_internal_style(opts.srcdir, pool);
          break;
        case reposdir_opt:
          SVN_INT_ERR(svn_utf_cstring_to_utf8(&opts.repos_dir, opt_arg, pool));
          opts.repos_dir = svn_dirent_internal_style(opts.repos_dir, pool);
          break;
        case reposurl_opt:
          SVN_INT_ERR(svn_utf_cstring_to_utf8(&opts.repos_url, opt_arg, pool));
          opts.repos_url = svn_uri_canonicalize(opts.repos_url, pool);
          break;
        case repostemplate_opt:
          SVN_INT_ERR(svn_utf_cstring_to_utf8(&opts.repos_template, opt_arg,
                                              pool));
          opts.repos_template = svn_dirent_internal_style(opts.repos_template,
                                                          pool);
          break;
        case memcached_server_opt:
          SVN_INT_ERR(svn_utf_cstring_to_utf8(&opts.memcached_server, opt_arg,
                                              pool));
          break;
        case list_opt:
          list_mode = TRUE;
          break;
        case mode_filter_opt:
          if (svn_cstring_casecmp(opt_arg, "PASS") == 0)
            mode_filter = svn_test_pass;
          else if (svn_cstring_casecmp(opt_arg, "XFAIL") == 0)
            mode_filter = svn_test_xfail;
          else if (svn_cstring_casecmp(opt_arg, "SKIP") == 0)
            mode_filter = svn_test_skip;
          else if (svn_cstring_casecmp(opt_arg, "ALL") == 0)
            mode_filter = svn_test_all;
          else
            {
              fprintf(stderr, "FAIL: Invalid --mode-filter option.  Try ");
              fprintf(stderr, " PASS, XFAIL, SKIP or ALL.\n");
              exit(1);
            }
          break;
        case verbose_opt:
          verbose_mode = TRUE;
          break;
        case quiet_opt:
          quiet_mode = TRUE;
          break;
        case allow_segfault_opt:
          allow_segfaults = TRUE;
          break;
        case server_minor_version_opt:
          {
            char *end;
            opts.server_minor_version = (int) strtol(opt_arg, &end, 10);
            if (end == opt_arg || *end != '\0')
              {
                fprintf(stderr, "FAIL: Non-numeric minor version given\n");
                exit(1);
              }
            if ((opts.server_minor_version < 3)
                || (opts.server_minor_version > SVN_VER_MINOR))
              {
                fprintf(stderr, "FAIL: Invalid minor version given\n");
                exit(1);
              }
            break;
          }
        case sqlite_log_opt:
          svn_sqlite__dbg_enable_errorlog();
          break;
#if APR_HAS_THREADS
        case parallel_opt:
          parallel = TRUE;
          break;
#endif
      }
    }
  opts.verbose = verbose_mode;

  /* Disable sleeping for timestamps, to speed up the tests. */
  apr_env_set(
         "SVN_I_LOVE_CORRUPTED_WORKING_COPIES_SO_DISABLE_SLEEP_FOR_TIMESTAMPS",
         "yes", pool);

  /* You can't be both quiet and verbose. */
  if (quiet_mode && verbose_mode)
    {
      fprintf(stderr, "FAIL: --verbose and --quiet are mutually exclusive\n");
      exit(1);
    }

  /* Create an iteration pool for the tests */
  set_cleanup_pool(svn_pool_create(pool));
  test_pool = svn_pool_create(pool);

  if (!allow_segfaults)
    svn_error_set_malfunction_handler(svn_error_raise_on_malfunction);

  if (argc >= 2)  /* notice command-line arguments */
    {
      if (! strcmp(argv[1], "list") || list_mode)
        {
          const char *header_msg;
          ran_a_test = TRUE;

          /* run all tests with MSG_ONLY set to TRUE */
          header_msg = "Test #  Mode   Test Description\n"
                       "------  -----  ----------------\n";
          for (i = 1; i <= array_size; i++)
            {
              if (do_test_num(opts.prog_name, i, test_funcs,
                              TRUE, &opts, &header_msg, test_pool))
                got_error = TRUE;

              /* Clear the per-function pool */
              svn_pool_clear(test_pool);
              svn_pool_clear(cleanup_pool);
            }
        }
      else
        {
          for (i = 1; i < argc; i++)
            {
              if (svn_ctype_isdigit(argv[i][0]) || argv[i][0] == '-')
                {
                  int test_num = atoi(argv[i]);
                  if (test_num == 0)
                    /* A --option argument, most likely. */
                    continue;

                  ran_a_test = TRUE;
                  if (do_test_num(opts.prog_name, test_num, test_funcs,
                                  FALSE, &opts, NULL, test_pool))
                    got_error = TRUE;

                  /* Clear the per-function pool */
                  svn_pool_clear(test_pool);
                  svn_pool_clear(cleanup_pool);
                }
            }
        }
    }

  if (! ran_a_test)
    {
      /* just run all tests */
      if (max_threads < 1)
        max_threads = array_size;

      if (max_threads == 1 || !parallel)
        {
          for (i = 1; i <= array_size; i++)
            {
              if (do_test_num(opts.prog_name, i, test_funcs,
                              FALSE, &opts, NULL, test_pool))
                got_error = TRUE;

              /* Clear the per-function pool */
              svn_pool_clear(test_pool);
              svn_pool_clear(cleanup_pool);
            }
        }
#if APR_HAS_THREADS
      else
        {
          got_error = do_tests_concurrently(opts.prog_name, test_funcs,
                                            array_size, max_threads,
                                            &opts, test_pool);

          /* Execute all cleanups */
          svn_pool_clear(test_pool);
          svn_pool_clear(cleanup_pool);
        }
#endif
    }

  /* Clean up APR */
  svn_pool_destroy(pool);      /* takes test_pool with it */
  apr_terminate();

  return got_error;
}


svn_boolean_t
svn_test__fs_type_is(const svn_test_opts_t *opts,
                     const char *predicate_value,
                     apr_pool_t *pool)
{
  return (0 == strcmp(predicate_value, opts->fs_type));
}

svn_boolean_t
svn_test__fs_type_not(const svn_test_opts_t *opts,
                      const char *predicate_value,
                      apr_pool_t *pool)
{
  return (0 != strcmp(predicate_value, opts->fs_type));
}
