Merge
authorBrian Aker <brian@tangent.org>
Mon, 19 Sep 2011 04:24:57 +0000 (21:24 -0700)
committerBrian Aker <brian@tangent.org>
Mon, 19 Sep 2011 04:24:57 +0000 (21:24 -0700)
libtest/unittest.cc
libtest/wait.cc

index 3833a5bd7206bf6f7c69c11b95d25e285fd9cc01..6fb9260fb4229a85df1de24f299d2ae23bfa9869 100644 (file)
@@ -298,6 +298,33 @@ static test_return_t memcached_sasl_test(void *object)
   return TEST_SKIPPED;
 }
 
+static test_return_t wait_BINARY(void *)
+{
+  const char *args[]= { "--quiet", 0 };
+
+  test_true(exec_cmdline("libtest/wait", args));
+
+  return TEST_SUCCESS;
+}
+
+static test_return_t wait_help_BINARY(void *)
+{
+  const char *args[]= { "--quiet", "--help", 0 };
+
+  test_true(exec_cmdline("libtest/wait", args));
+
+  return TEST_SUCCESS;
+}
+
+static test_return_t wait_version_BINARY(void *)
+{
+  const char *args[]= { "--quiet", "--version", 0 };
+
+  test_true(exec_cmdline("libtest/wait", args));
+
+  return TEST_SUCCESS;
+}
+
 test_st gearmand_tests[] ={
 #if 0
   {"pause", 0, pause_test },
@@ -355,6 +382,13 @@ test_st comparison_tests[] ={
   {0, 0, 0}
 };
 
+test_st cmdline_tests[] ={
+  {"wait --quiet", 0, wait_BINARY },
+  {"wait --quiet --help", 0, wait_help_BINARY },
+  {"wait --quiet --version", 0, wait_version_BINARY },
+  {0, 0, 0}
+};
+
 collection_st collection[] ={
   {"environment", 0, 0, environment_tests},
   {"return values", 0, 0, tests_log},
@@ -363,6 +397,7 @@ collection_st collection[] ={
   {"comparison", 0, 0, comparison_tests},
   {"gearmand", 0, 0, gearmand_tests},
   {"memcached", 0, 0, memcached_tests},
+  {"cmdline", 0, 0, cmdline_tests},
   {0, 0, 0, 0}
 };
 
index 759d881f4b8eab4863f162852c3a726b5299dfe9..cf2277e6d94e58a71a9a5e32f8a0e35495ecfbdf 100644 (file)
 #include <config.h>
 
 #include <cstdlib>
+#include <fcntl.h>
+#include <getopt.h>
+#include <iostream>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
 #include <libtest/wait.h>
 
+static void version_command(const char *command_name, int major_version, int minor_version)
+{
+  std::cout << command_name << " " << major_version << "." << minor_version << std::endl;
+  exit(EXIT_SUCCESS);
+}
+
+static void help_command(const char *command_name,
+                         int major_version, int minor_version,
+                         const struct option *long_options)
+{
+  std::cout << command_name << " " << major_version << "." << minor_version << std::endl;
+  std::cout << "Current options. A '=' means the option takes a value." << std::endl << std::endl;
+
+  for (uint32_t x= 0; long_options[x].name; x++)
+  {
+    std::cout << "\t --" << long_options[x].name << char(long_options[x].has_arg ? '=' : ' ') << std::endl;
+  }
+
+  std::cout << std::endl;
+  exit(EXIT_SUCCESS);
+}
+
+static void close_stdio(void)
+{
+  int fd;
+  if ((fd = open("/dev/null", O_RDWR, 0)) < 0)
+  {
+    return;
+  }
+  else
+  {
+    if (dup2(fd, STDIN_FILENO) < 0)
+    {
+      return;
+    }
+
+    if (dup2(fd, STDOUT_FILENO) < 0)
+    {
+      return;
+    }
+
+    if (dup2(fd, STDERR_FILENO) < 0)
+    {
+      return;
+    }
+
+    if (fd > STDERR_FILENO)
+    {
+      close(fd);
+    }
+  }
+}
+
+enum {
+  OPT_HELP,
+  OPT_QUIET,
+  OPT_VERSION
+};
+
+static void options_parse(int argc, char *argv[])
+{
+  static struct option long_options[]=
+  {
+    { "version", no_argument, NULL, OPT_VERSION},
+    { "help", no_argument, NULL, OPT_HELP},
+    { "quiet", no_argument, NULL, OPT_QUIET},
+    {0, 0, 0, 0},
+  };
+
+  bool opt_version= false;
+  bool opt_help= false;
+  int option_index= 0;
+
+  while (1)
+  {
+    int option_rv= getopt_long(argc, argv, "Vhvds:", long_options, &option_index);
+    if (option_rv == -1) 
+    {
+      break;
+    }
+
+    switch (option_rv)
+    {
+    case OPT_HELP: /* --help or -h */
+      opt_help= true;
+      break;
+
+    case OPT_QUIET:
+      close_stdio();
+      break;
+
+    case '?':
+      /* getopt_long already printed an error message. */
+      exit(EXIT_SUCCESS);
+
+    default:
+      abort();
+    }
+  }
+
+  if (opt_version)
+  {
+    version_command(argv[0], 1, 0);
+    exit(EXIT_SUCCESS);
+  }
+
+  if (opt_help)
+  {
+    help_command(argv[0], 1, 0, long_options);
+    exit(EXIT_SUCCESS);
+  }
+}
+
 int main(int argc, char *argv[])
 {
+  options_parse(argc, argv);
+
   if (argc == 2)
   {
     libtest::Wait wait(argv[1]);