Merge in util/libtest update
authorBrian Aker <brian@tangent.org>
Tue, 23 Aug 2011 09:11:53 +0000 (02:11 -0700)
committerBrian Aker <brian@tangent.org>
Tue, 23 Aug 2011 09:11:53 +0000 (02:11 -0700)
16 files changed:
bootstrap.sh [new file with mode: 0755]
configure.ac
libtest/binaries.cc [new file with mode: 0644]
libtest/binaries.h [new file with mode: 0644]
libtest/include.am
libtest/test.cc
libtest/test.hpp
libtest/unittest.cc
m4/gearmand.m4 [new file with mode: 0644]
m4/memcached.m4
m4/memcached_sasl.m4
m4/pandora_with_memcached.m4 [deleted file]
tests/libmemcached_world.h
util/include.am
util/logfile.cc [new file with mode: 0644]
util/logfile.hpp [new file with mode: 0644]

diff --git a/bootstrap.sh b/bootstrap.sh
new file mode 100755 (executable)
index 0000000..e1c39ec
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+if test -f configure; then make clean; make merge-clean; make distclean; fi;
+
+rm -r -f autom4te.cache
+./config/autorun.sh
+./configure
+make
index a7590b05c5c459dbbff07e6a9e1e494a9e12957e..045b562f593ae6443ecc8bde695bea5ddfb2ade2 100644 (file)
@@ -55,6 +55,7 @@ AC_SUBST(HASHKIT_LIBRARY_VERSION)
 LT_INIT
 m4_include([m4/memcached.m4])
 m4_include([m4/memcached_sasl.m4])
+m4_include([m4/gearmand.m4])
 
 AM_CONDITIONAL(BUILDING_LIBMEMCACHED, true)
 AM_CONDITIONAL(HAVE_LIBMEMCACHED, false)
diff --git a/libtest/binaries.cc b/libtest/binaries.cc
new file mode 100644 (file)
index 0000000..00a8976
--- /dev/null
@@ -0,0 +1,63 @@
+/*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
+ * 
+ *  libtest
+ *
+ *  Copyright (C) 2011 Data Differential, http://datadifferential.com/
+ *
+ *  This 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 3 of the License, or (at your option) any later version.
+ *
+ *  This 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 this library; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+
+#include <libtest/common.h>
+
+namespace libtest {
+
+bool has_gearmand_binary()
+{
+#if defined(HAVE_GEARMAND_BINARY) && HAVE_GEARMAND_BINARY
+  if (access(GEARMAND_BINARY,R_OK|X_OK) == 0)
+  {
+    return true;
+  }
+#endif
+
+  return false;
+}
+
+bool has_memcached_binary()
+{
+#if defined(HAVE_MEMCACHED_BINARY) && HAVE_MEMCACHED_BINARY
+  if (access(MEMCACHED_BINARY,R_OK|X_OK) == 0)
+  {
+    return true;
+  }
+#endif
+
+  return false;
+}
+
+bool has_memcached_sasl_binary()
+{
+#if defined(HAVE_MEMCACHED_SASL_BINARY) && HAVE_MEMCACHED_SASL_BINARY
+  if (access(MEMCACHED_SASL_BINARY, R_OK|X_OK) == 0)
+  {
+    return true;
+  }
+#endif
+
+  return false;
+}
+
+}
diff --git a/libtest/binaries.h b/libtest/binaries.h
new file mode 100644 (file)
index 0000000..e071016
--- /dev/null
@@ -0,0 +1,36 @@
+/*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
+ * 
+ *  libtest
+ *
+ *  Copyright (C) 2011 Data Differential, http://datadifferential.com/
+ *
+ *  This 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 3 of the License, or (at your option) any later version.
+ *
+ *  This 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 this library; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#pragma once
+
+namespace libtest {
+
+LIBTEST_API
+bool has_memcached_binary();
+
+LIBTEST_API
+bool has_memcached_sasl_binary();
+
+LIBTEST_API
+bool has_gearmand_binary();
+
+} // namespace libtest
+
index 044ca4f8e7bf9e2b8cbcda171936d8cba8c2ca54..d49e5acc75a6d578d3319d9dcac6f100f3c36f84 100644 (file)
@@ -84,12 +84,13 @@ noinst_HEADERS+= \
 
 noinst_LTLIBRARIES+= libtest/libtest.la
 libtest_libtest_la_SOURCES= \
+                           libtest/binaries.cc \
                            libtest/cmdline.cc \
                            libtest/framework.cc \
                            libtest/killpid.cc \
                            libtest/libtool.cc \
-                           libtest/runner.cc \
                            libtest/port.cc \
+                           libtest/runner.cc \
                            libtest/server.cc \
                            libtest/server_container.cc \
                            libtest/signal.cc \
index 89e7c07112e674c6a8a2be1e9c40cbf5c2a9733b..bae5c39ff0922fa75683217cc18a2e43a5e669cb 100644 (file)
@@ -170,7 +170,7 @@ int main(int argc, char *argv[])
 
   world= new Framework();
 
-  if (not world)
+  if (world == NULL)
   {
     Error << "Failed to create Framework()";
     return EXIT_FAILURE;
index 047dd8ce03390f245e5c6c71f95c0672786d154a..db7029436762a9dbe28409eaba5a72eb56dbcc49 100644 (file)
@@ -49,6 +49,7 @@
 #include <libtest/stream.h>
 #include <libtest/cmdline.h>
 #include <libtest/string.hpp>
+#include <libtest/binaries.h>
 
 #pragma once
 
index cee9b52ec1f5e24ea20e54343a301fcb86c69d13..3833a5bd7206bf6f7c69c11b95d25e285fd9cc01 100644 (file)
@@ -219,7 +219,7 @@ static test_return_t _compare_gearman_return_t_test(void *)
 {
   test_skip(HAVE_LIBGEARMAN, true);
 #if defined(HAVE_LIBGEARMAN) && HAVE_LIBGEARMAN
-    test_compare(GEARMAN_SUCCESS, GEARMAN_SUCCESS);
+  test_compare(GEARMAN_SUCCESS, GEARMAN_SUCCESS);
 #endif
 
   return TEST_SUCCESS;
@@ -230,8 +230,9 @@ static test_return_t gearmand_cycle_test(void *object)
   server_startup_st *servers= (server_startup_st*)object;
   test_true(servers);
 
-  if (HAVE_LIBGEARMAN)
+  if (HAVE_LIBGEARMAN and GEARMAND_BINARY)
   {
+    test_true(has_gearmand_binary());
     const char *argv[1]= { "cycle_gearmand" };
     test_true(server_startup(*servers, "gearmand", 9999, 1, argv));
 
@@ -248,6 +249,7 @@ static test_return_t memcached_cycle_test(void *object)
 
   if (MEMCACHED_BINARY and HAVE_LIBMEMCACHED) 
   {
+    test_true(has_memcached_binary());
     const char *argv[1]= { "cycle_memcached" };
     test_true(server_startup(*servers, "memcached", 9998, 1, argv));
 
@@ -264,6 +266,7 @@ static test_return_t memcached_socket_cycle_test(void *object)
 
   if (MEMCACHED_BINARY and HAVE_LIBMEMCACHED)
   {
+    test_true(has_memcached_binary());
     const char *argv[1]= { "cycle_memcached" };
     test_true(servers->start_socket_server("memcached", 9997, 1, argv));
 
@@ -285,6 +288,7 @@ static test_return_t memcached_sasl_test(void *object)
 
   if (MEMCACHED_SASL_BINARY and HAVE_LIBMEMCACHED)
   {
+    test_true(has_memcached_sasl_binary());
     const char *argv[1]= { "cycle_memcached_sasl" };
     test_true(server_startup(*servers, "memcached-sasl", 9996, 1, argv));
 
diff --git a/m4/gearmand.m4 b/m4/gearmand.m4
new file mode 100644 (file)
index 0000000..7765ace
--- /dev/null
@@ -0,0 +1,11 @@
+AX_WITH_PROG(GEARMAND_BINARY,gearmand)
+AS_IF([test -f "$ac_cv_path_GEARMAND_BINARY"],
+      [
+        AC_DEFINE([HAVE_GEARMAND_BINARY], [1], [If Gearmand binary is available])
+        AC_DEFINE_UNQUOTED([GEARMAND_BINARY], "$ac_cv_path_GEARMAND_BINARY", [Name of the gearmand binary used in make test])
+       ],
+       [
+        AC_DEFINE([HAVE_GEARMAND_BINARY], [0], [If Gearmand binary is available])
+        AC_DEFINE([GEARMAND_BINARY], [0], [Name of the gearmand binary used in make test])
+      ])
+
index 0b8592fe546f14657c9d7081d90faa4b63b6a3a4..7d648bf23497cab751d8b76c24b7867cf28ad0ec 100644 (file)
@@ -1,8 +1,10 @@
 AX_WITH_PROG(MEMCACHED_BINARY,memcached)
 AS_IF([test -f "$ac_cv_path_MEMCACHED_BINARY"],
       [
+        AC_DEFINE([HAVE_MEMCACHED_BINARY], [1], [If Memcached binary is available])
         AC_DEFINE_UNQUOTED([MEMCACHED_BINARY], "$ac_cv_path_MEMCACHED_BINARY", [Name of the memcached binary used in make test])
        ],
        [
+        AC_DEFINE([HAVE_MEMCACHED_BINARY], [0], [If Memcached binary is available])
         AC_DEFINE([MEMCACHED_BINARY], [0], [Name of the memcached binary used in make test])
       ])
index 5983c112dc616c49eee86d917050705d5dc5b212..a43e45335d363471f8b07127d659e7ab6b5f1642 100644 (file)
@@ -1,8 +1,10 @@
 AX_WITH_PROG(MEMCACHED_SASL_BINARY,memcached_sasl)
 AS_IF([test -f "$ac_cv_path_MEMCACHED_SASL_BINARY"],
       [
+        AC_DEFINE([HAVE_MEMCACHED_SASL_BINARY], [1], [Name of the memcached_sasl binary used in make test])
         AC_DEFINE_UNQUOTED([MEMCACHED_SASL_BINARY], "$ac_cv_path_MEMCACHED_SASL_BINARY", [Name of the memcached_sasl binary used in make test])
        ],
        [
+        AC_DEFINE([HAVE_MEMCACHED_SASL_BINARY], [0], [Name of the memcached_sasl binary used in make test])
         AC_DEFINE([MEMCACHED_SASL_BINARY], [0], [Name of the memcached_sasl binary used in make test])
       ])
diff --git a/m4/pandora_with_memcached.m4 b/m4/pandora_with_memcached.m4
deleted file mode 100644 (file)
index 4ea906b..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-dnl  Copyright (C) 2009 Sun Microsystems, Inc.
-dnl This file is free software; Sun Microsystems, Inc.
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([_PANDORA_SEARCH_MEMCACHED],[
-
-  AC_ARG_WITH([memcached],
-    [AS_HELP_STRING([--with-memcached],
-      [Memcached binary to use for make test])],
-    [ac_cv_with_memcached="$withval"],
-    [ac_cv_with_memcached=memcached])
-
-  # just ignore the user if --without-memcached is passed.. it is
-  # only used by make test
-  AS_IF([test "x$ac_cv_with_memcached" = "xno"],[
-    ac_cv_with_memcached=memcached
-    MEMCACHED_BINARY=memcached
-  ],[
-    AS_IF([test -f "$ac_cv_with_memcached"],[
-      MEMCACHED_BINARY=$ac_cv_with_memcached
-    ],[
-      AC_PATH_PROG([MEMCACHED_BINARY], [$ac_cv_with_memcached], "no")
-    ])
-  ])
-  AC_DEFINE_UNQUOTED([MEMCACHED_BINARY], "$MEMCACHED_BINARY", 
-            [Name of the memcached binary used in make test])
-  AM_CONDITIONAL([HAVE_MEMCACHED],[test "x$MEMCACHED_BINARY" != "xno"])
-])
-
-AC_DEFUN([PANDORA_HAVE_MEMCACHED],[
-  AC_REQUIRE([_PANDORA_SEARCH_MEMCACHED])
-])
-
-AC_DEFUN([PANDORA_REQUIRE_MEMCACHED],[
-  AC_REQUIRE([PANDORA_HAVE_MEMCACHED])
-  AS_IF([test "x$MEMCACHED_BINARY" = "xno"],[
-    AC_MSG_ERROR(["could not find memcached binary"])
-  ])
-])
-
index 9f38c02498b54220f40db8330c99f82cfdd62a68..ecbb489efbc036b1e938ae69aefd07109ba2b402 100644 (file)
@@ -29,7 +29,13 @@ struct libmemcached_test_container_st
 
 static void *world_create(server_startup_st& servers, test_return_t& error)
 {
-  if (LIBMEMCACHED_WITH_SASL_SUPPORT == 0)
+  if (HAVE_MEMCACHED_BINARY == 0)
+  {
+    error= TEST_FATAL;
+    return NULL;
+  }
+
+  if (servers.sasl() and (LIBMEMCACHED_WITH_SASL_SUPPORT == 0 or MEMCACHED_SASL_BINARY == 0))
   {
     error= TEST_SKIPPED;
     return NULL;
@@ -67,7 +73,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
     {
       if (not server_startup(servers, "memcached-sasl", port, 1, argv))
       {
-        error= TEST_FAILURE;
+        error= TEST_FATAL;
         return NULL;
       }
     }
@@ -75,7 +81,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
     {
       if (not server_startup(servers, "memcached", port, 1, argv))
       {
-        error= TEST_FAILURE;
+        error= TEST_FATAL;
         return NULL;
       }
     }
@@ -88,7 +94,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
       const char *argv[1]= { "memcached" };
       if (not servers.start_socket_server("memcached-sasl", max_port +1, 1, argv))
       {
-        error= TEST_FAILURE;
+        error= TEST_FATAL;
         return NULL;
       }
     }
@@ -97,7 +103,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
       const char *argv[1]= { "memcached" };
       if (not servers.start_socket_server("memcached", max_port +1, 1, argv))
       {
-        error= TEST_FAILURE;
+        error= TEST_FATAL;
         return NULL;
       }
     }
index 5c00525d5d25ad16d0cb4f91616a34da147b7d6b..6f848f381ed9067c50ecca17bc6e4cf36a390c16 100644 (file)
@@ -13,6 +13,7 @@
 noinst_HEADERS+= \
                 util/daemon.hpp \
                 util/instance.hpp \
+                util/logfile.hpp \
                 util/operation.hpp \
                 util/signal.hpp \
                 util/string.hpp \
diff --git a/util/logfile.cc b/util/logfile.cc
new file mode 100644 (file)
index 0000000..c63077c
--- /dev/null
@@ -0,0 +1,96 @@
+/*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
+ * 
+ *  DataDifferential Utility Library
+ *
+ *  Copyright (C) 2011 Data Differential, http://datadifferential.com/
+ *  All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are
+ *  met:
+ *
+ *      * Redistributions of source code must retain the above copyright
+ *  notice, this list of conditions and the following disclaimer.
+ *
+ *      * Redistributions in binary form must reproduce the above
+ *  copyright notice, this list of conditions and the following disclaimer
+ *  in the documentation and/or other materials provided with the
+ *  distribution.
+ *
+ *      * The names of its contributors may not be used to endorse or
+ *  promote products derived from this software without specific prior
+ *  written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *  OWNER 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.
+ *
+ */
+
+#include "config.h"
+
+#include "util/logfile.hpp"
+
+#include <cerrno>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <fcntl.h>
+#include <fstream>
+#include <iostream>
+#include <sstream>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+namespace datadifferential {
+namespace util {
+
+Logfile::Logfile(const std::string &arg) :
+  _filename(arg)
+{
+  time_t tmp= time(NULL);
+  _log_file << "shutdown: " << ctime(&tmp) << std::endl;
+}
+
+Logfile::~Logfile()
+{
+  if (not _filename.empty())
+  {
+    _log_file.close();
+    if (access(_filename.c_str(), F_OK) == -1)
+    { }
+    else if (unlink(_filename.c_str()) == -1)
+    { }
+  }
+}
+
+bool Logfile::open()
+{
+  if (_filename.empty())
+  {
+    _log_file.open("/dev/stderr");
+    return true;
+  }
+
+  _log_file.open(_filename.c_str());
+  if (not _log_file.good())
+  {
+    return false;
+  }
+
+  time_t tmp= time(NULL);
+  _log_file << "startup: " << ctime(&tmp) << std::endl;
+
+  return true;
+}
+
+} /* namespace util */
+} /* namespace datadifferential */
diff --git a/util/logfile.hpp b/util/logfile.hpp
new file mode 100644 (file)
index 0000000..1d2c75a
--- /dev/null
@@ -0,0 +1,66 @@
+/*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
+ * 
+ *  DataDifferential Utility Library
+ *
+ *  Copyright (C) 2011 Data Differential, http://datadifferential.com/
+ *  All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are
+ *  met:
+ *
+ *      * Redistributions of source code must retain the above copyright
+ *  notice, this list of conditions and the following disclaimer.
+ *
+ *      * Redistributions in binary form must reproduce the above
+ *  copyright notice, this list of conditions and the following disclaimer
+ *  in the documentation and/or other materials provided with the
+ *  distribution.
+ *
+ *      * The names of its contributors may not be used to endorse or
+ *  promote products derived from this software without specific prior
+ *  written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *  OWNER 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.
+ *
+ */
+
+#pragma once
+
+#include <string>
+#include <fstream>
+
+namespace datadifferential {
+namespace util {
+
+class Logfile
+{
+public:
+  Logfile(const std::string &arg);
+
+  ~Logfile();
+
+  std::ofstream &log()
+  {
+    return _log_file;
+  }
+
+  bool open();
+
+private:
+  const std::string _filename;
+  std::ofstream _log_file;
+};
+
+} /* namespace util */
+} /* namespace datadifferential */