From: Continuous Integration Date: Tue, 13 Mar 2012 16:06:21 +0000 (-0700) Subject: Merging bzr://gaz.tangent.org/libmemcached/build/ to Build branch X-Git-Tag: 1.0.7~15^2^2 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=f02c19ff29b536ff136568995e4c06789af35258;hp=de7e5645d23b4042a3707654ef27fe6648eba80f;p=m6w6%2Flibmemcached Merging bzr://gaz.tangent.org/libmemcached/build/ to Build branch --- diff --git a/ChangeLog b/ChangeLog index 7a60fb07..cb158281 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,8 @@ 1.0.5 - -* Version is now parsed directly in the parser, which makes buffered -operations now work with it.. - -* memstat has been extended so that it can be used to find the version of the -server. +* Version is now parsed directly in the parser, which makes buffered operations now work with it.. +* memstat has been extended so that it can be used to find the version of the server. +* Update documentation. +* Fixes for compile issues on Debian and Ubuntu 1.0.4 Thu Jan 26 22:33:54 PST 2012 diff --git a/configure.ac b/configure.ac index 1fe4f774..965ad3bf 100644 --- a/configure.ac +++ b/configure.ac @@ -7,7 +7,7 @@ # Use and distribution licensed under the BSD license. See # the COPYING file in this directory for full text. -AC_INIT([libmemcached],[1.0.4],[http://libmemcached.org/]) +AC_INIT([libmemcached],[1.0.5],[http://libmemcached.org/]) AC_CONFIG_AUX_DIR(config) diff --git a/libtest/binaries.cc b/libtest/binaries.cc index 33cde3b7..e437f969 100644 --- a/libtest/binaries.cc +++ b/libtest/binaries.cc @@ -20,6 +20,7 @@ */ +#include #include namespace libtest { diff --git a/libtest/blobslap_worker.cc b/libtest/blobslap_worker.cc index fe1cdce3..caddbdd7 100644 --- a/libtest/blobslap_worker.cc +++ b/libtest/blobslap_worker.cc @@ -20,6 +20,7 @@ */ +#include #include #include diff --git a/libtest/cmdline.cc b/libtest/cmdline.cc index efe03040..e774113a 100644 --- a/libtest/cmdline.cc +++ b/libtest/cmdline.cc @@ -19,12 +19,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include using namespace libtest; #include #include +#include #include #include #include @@ -351,26 +353,24 @@ void Application::Pipe::reset() close(WRITE); int ret; - if ((ret= pipe(_fd)) < 0) + if (pipe(_fd) == -1) { - throw strerror(ret); + throw strerror(errno); } _open[0]= true; _open[1]= true; { - ret= fcntl(_fd[0], F_GETFL, 0); - if (ret == -1) + if ((ret= fcntl(_fd[0], F_GETFL, 0)) == -1) { - Error << "fcntl(F_GETFL) " << strerror(ret); - throw strerror(ret); + Error << "fcntl(F_GETFL) " << strerror(errno); + throw strerror(errno); } - ret= fcntl(_fd[0], F_SETFL, ret | O_NONBLOCK); - if (ret == -1) + if ((ret= fcntl(_fd[0], F_SETFL, ret | O_NONBLOCK)) == -1) { - Error << "fcntl(F_SETFL) " << strerror(ret); - throw strerror(ret); + Error << "fcntl(F_SETFL) " << strerror(errno); + throw strerror(errno); } } } @@ -406,11 +406,12 @@ void Application::Pipe::close(const close_t& arg) if (_open[type]) { int ret; - if ((ret= ::close(_fd[type])) < 0) + if (::close(_fd[type]) == -1) { - Error << "close(" << strerror(ret) << ")"; + Error << "close(" << strerror(errno) << ")"; } _open[type]= false; + _fd[type]= -1; } } @@ -523,21 +524,19 @@ std::string Application::arguments() void Application::delete_argv() { - if (built_argv == NULL) - { - return; - } - - for (size_t x= 0; x < _argc; x++) + if (built_argv) { - if (built_argv[x]) + for (size_t x= 0; x < _argc; x++) { - ::free(built_argv[x]); + if (built_argv[x]) + { + ::free(built_argv[x]); + } } + delete[] built_argv; + built_argv= NULL; + _argc= 0; } - delete[] built_argv; - built_argv= NULL; - _argc= 0; } diff --git a/libtest/common.h b/libtest/common.h index 1e50bf08..05f273a7 100644 --- a/libtest/common.h +++ b/libtest/common.h @@ -25,8 +25,6 @@ #pragma once -#include - #include #include #include diff --git a/libtest/comparison.cc b/libtest/comparison.cc new file mode 100644 index 00000000..121df252 --- /dev/null +++ b/libtest/comparison.cc @@ -0,0 +1,37 @@ +/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: + * + * libtest + * + * Copyright (C) 2012 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 +#include + +namespace libtest { + +bool _in_valgrind(const char*, int, const char*) +{ + if (bool(getenv("TESTS_ENVIRONMENT")) and strstr(getenv("TESTS_ENVIRONMENT"), "valgrind")) + { + return true; + } + + return TEST_SUCCESS; +} + +} // namespace libtest diff --git a/libtest/comparison.hpp b/libtest/comparison.hpp index bcb7558e..98ea1c8b 100644 --- a/libtest/comparison.hpp +++ b/libtest/comparison.hpp @@ -34,6 +34,8 @@ namespace libtest { +bool _in_valgrind(const char *file, int line, const char *func); + template bool _compare_truth_hint(const char *file, int line, const char *func, T_comparable __expected, const char *assertation_label, T_hint __hint) { @@ -47,11 +49,15 @@ bool _compare_truth_hint(const char *file, int line, const char *func, T_compara } template -bool _compare(const char *file, int line, const char *func, const T1_comparable& __expected, const T2_comparable& __actual) +bool _compare(const char *file, int line, const char *func, const T1_comparable& __expected, const T2_comparable& __actual, bool use_io) { if (__expected != __actual) { - libtest::stream::make_cerr(file, line, func) << "Expected \"" << __expected << "\" got \"" << __actual << "\""; + if (use_io) + { + libtest::stream::make_cerr(file, line, func) << "Expected \"" << __expected << "\" got \"" << __actual << "\""; + } + return false; } @@ -83,11 +89,14 @@ bool _truth(const char *file, int line, const char *func, T_comparable __truth) } template -bool _compare_hint(const char *file, int line, const char *func, T1_comparable __expected, T2_comparable __actual, T_hint __hint) +bool _compare_hint(const char *file, int line, const char *func, T1_comparable __expected, T2_comparable __actual, T_hint __hint, bool io_error= true) { if (__expected != __actual) { - libtest::stream::make_cerr(file, line, func) << "Expected \"" << __expected << "\" got \"" << __actual << "\"" << " Additionally: \"" << __hint << "\""; + if (io_error) + { + libtest::stream::make_cerr(file, line, func) << "Expected \"" << __expected << "\" got \"" << __actual << "\"" << " Additionally: \"" << __hint << "\""; + } return false; } diff --git a/libtest/core.cc b/libtest/core.cc index 3e30444a..fac66616 100644 --- a/libtest/core.cc +++ b/libtest/core.cc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include diff --git a/libtest/cpu.cc b/libtest/cpu.cc index d75df955..10bb303c 100644 --- a/libtest/cpu.cc +++ b/libtest/cpu.cc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include diff --git a/libtest/dream.cc b/libtest/dream.cc index 32dece35..c03bd902 100644 --- a/libtest/dream.cc +++ b/libtest/dream.cc @@ -20,6 +20,7 @@ */ +#include #include namespace libtest { diff --git a/libtest/failed.cc b/libtest/failed.cc index 11e237dc..88b84664 100644 --- a/libtest/failed.cc +++ b/libtest/failed.cc @@ -20,6 +20,7 @@ */ +#include #include #include diff --git a/libtest/fatal.cc b/libtest/fatal.cc index 36683a48..4cef2047 100644 --- a/libtest/fatal.cc +++ b/libtest/fatal.cc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include diff --git a/libtest/framework.cc b/libtest/framework.cc index 1541e7da..a9730a0e 100644 --- a/libtest/framework.cc +++ b/libtest/framework.cc @@ -20,6 +20,7 @@ */ +#include #include #include diff --git a/libtest/gearmand.cc b/libtest/gearmand.cc index 4a544f10..85307fcf 100644 --- a/libtest/gearmand.cc +++ b/libtest/gearmand.cc @@ -20,6 +20,7 @@ */ +#include #include #include diff --git a/libtest/http.cc b/libtest/http.cc index 5309d504..920fd021 100644 --- a/libtest/http.cc +++ b/libtest/http.cc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include + #include #if defined(HAVE_CURL_CURL_H) && HAVE_CURL_CURL_H @@ -27,6 +29,39 @@ class CURL; #endif + +static void cleanup_curl(void) +{ +#if defined(HAVE_CURL_CURL_H) && HAVE_CURL_CURL_H + curl_global_cleanup(); +#endif +} + +static void initialize_curl_startup() +{ +#if defined(HAVE_CURL_CURL_H) && HAVE_CURL_CURL_H + if (curl_global_init(CURL_GLOBAL_ALL)) + { + fatal_message("curl_global_init(CURL_GLOBAL_ALL) failed"); + } +#endif + + if (atexit(cleanup_curl)) + { + fatal_message("atexit() failed"); + } +} + +static pthread_once_t start_key_once= PTHREAD_ONCE_INIT; +void initialize_curl(void) +{ + int ret; + if (pthread_once(&start_key_once, initialize_curl_startup) != 0) + { + fatal_message(strerror(ret)); + } +} + namespace libtest { namespace http { @@ -58,6 +93,13 @@ static void init(CURL *curl, const std::string& url) } } +HTTP::HTTP(const std::string& url_arg) : + _url(url_arg), + _response(0) +{ + initialize_curl(); +} + bool GET::execute() { if (HAVE_LIBCURL) diff --git a/libtest/http.hpp b/libtest/http.hpp index 012d7a07..bbc23b97 100644 --- a/libtest/http.hpp +++ b/libtest/http.hpp @@ -28,10 +28,7 @@ namespace http { class HTTP { public: - HTTP(const std::string& url_arg) : - _url(url_arg), - _response(0) - { } + HTTP(const std::string& url_arg); virtual bool execute()= 0; diff --git a/libtest/include.am b/libtest/include.am index 92dc7d27..accd98ae 100644 --- a/libtest/include.am +++ b/libtest/include.am @@ -21,7 +21,8 @@ # LIBTOOL_COMMAND= ${abs_top_builddir}/libtool --mode=execute -VALGRIND_COMMAND= $(LIBTOOL_COMMAND) valgrind --error-exitcode=1 --leak-check=yes --show-reachable=yes --track-fds=yes --malloc-fill=A5 --free-fill=DE +VALGRIND_EXEC_COMMAND= $(LIBTOOL_COMMAND) valgrind --error-exitcode=1 --leak-check=yes --show-reachable=yes --track-fds=yes --malloc-fill=A5 --free-fill=DE +VALGRIND_COMMAND= TESTS_ENVIRONMENT="valgrind" $(VALGRIND_EXEC_COMMAND) HELGRIND_COMMAND= $(LIBTOOL_COMMAND) valgrind --tool=helgrind --read-var-info=yes --error-exitcode=1 --read-var-info=yes DRD_COMMAND= $(LIBTOOL_COMMAND) valgrind --tool=drd GDB_COMMAND= $(LIBTOOL_COMMAND) gdb -f -x libtest/run.gdb @@ -33,7 +34,7 @@ export DRD_COMMAND export GDB_COMMAND valgrind: - @echo make check TESTS_ENVIRONMENT="\"$(VALGRIND_COMMAND)\"" + @echo make check TESTS_ENVIRONMENT="\"$(VALGRIND_EXEC_COMMAND)\"" gdb: @echo make check TESTS_ENVIRONMENT="\"$(GDB_COMMAND)\"" @@ -100,6 +101,7 @@ noinst_LTLIBRARIES+= libtest/libtest.la libtest_libtest_la_SOURCES= \ libtest/binaries.cc \ libtest/cmdline.cc \ + libtest/comparison.cc \ libtest/core.cc \ libtest/cpu.cc \ libtest/dream.cc \ @@ -210,7 +212,7 @@ test-unittest: libtest/unittest @libtest/unittest valgrind-unittest: libtest/unittest - @$(VALGRIND_COMMAND) libtest/unittest + @$(VALGRIND_COMMAND) libtest/unittest TESTS_ENVIRONMENT="valgrind" gdb-unittest: libtest/unittest @$(GDB_COMMAND) libtest/unittest diff --git a/libtest/is_local.cc b/libtest/is_local.cc index dfc303b2..ec3322af 100644 --- a/libtest/is_local.cc +++ b/libtest/is_local.cc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include diff --git a/libtest/killpid.cc b/libtest/killpid.cc index 79f6a3f8..cfc9316f 100644 --- a/libtest/killpid.cc +++ b/libtest/killpid.cc @@ -20,6 +20,7 @@ */ +#include #include #include diff --git a/libtest/libtool.cc b/libtest/libtool.cc index 90f0035e..5beea9b9 100644 --- a/libtest/libtool.cc +++ b/libtest/libtool.cc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include diff --git a/libtest/memcached.cc b/libtest/memcached.cc index c5358bf5..5327e9b8 100644 --- a/libtest/memcached.cc +++ b/libtest/memcached.cc @@ -20,6 +20,7 @@ */ +#include #include #include @@ -87,7 +88,8 @@ public: // Memcached is slow to start, so we need to do this if (pid_file().empty() == false) { - if (error_is_ok and not wait_for_pidfile()) + if (error_is_ok and + wait_for_pidfile() == false) { Error << "Pidfile was not found:" << pid_file(); return -1; @@ -121,7 +123,7 @@ public: bool ping() { // Memcached is slow to start, so we need to do this - if (not pid_file().empty()) + if (pid_file().empty() == false) { if (wait_for_pidfile() == false) { @@ -135,7 +137,7 @@ public: if (has_socket()) { - ret= libmemcached_util_ping(socket().c_str(), 0, &rc); + ret= libmemcached_util_ping(socket().c_str(), 0, &rc); } else { @@ -235,9 +237,9 @@ public: pid_t get_pid(bool error_is_ok) { // Memcached is slow to start, so we need to do this - if (not pid_file().empty()) + if (pid_file().empty() == false) { - if (error_is_ok and not wait_for_pidfile()) + if (error_is_ok and wait_for_pidfile() == false) { Error << "Pidfile was not found:" << pid_file(); return -1; @@ -342,7 +344,11 @@ public: class MemcachedSaSL : public Memcached { public: - MemcachedSaSL(const std::string& host_arg, const in_port_t port_arg, const bool is_socket_arg, const std::string& username_arg, const std::string &password_arg) : + MemcachedSaSL(const std::string& host_arg, + const in_port_t port_arg, + const bool is_socket_arg, + const std::string& username_arg, + const std::string &password_arg) : Memcached(host_arg, port_arg, is_socket_arg, username_arg, password_arg) { } @@ -364,9 +370,10 @@ public: pid_t get_pid(bool error_is_ok) { // Memcached is slow to start, so we need to do this - if (not pid_file().empty()) + if (pid_file().empty() == false) { - if (error_is_ok and not wait_for_pidfile()) + if (error_is_ok and + wait_for_pidfile() == false) { Error << "Pidfile was not found:" << pid_file(); return -1; @@ -457,7 +464,7 @@ bool Memcached::build(size_t argc, const char *argv[]) bool MemcachedLight::build(size_t argc, const char *argv[]) { - for (int x= 0 ; x < argc ; x++) + for (size_t x= 0 ; x < argc ; x++) { add_option(argv[x]); } diff --git a/libtest/port.cc b/libtest/port.cc index b6820335..2561343d 100644 --- a/libtest/port.cc +++ b/libtest/port.cc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include diff --git a/libtest/runner.cc b/libtest/runner.cc index b205b0e7..6b8d0d48 100644 --- a/libtest/runner.cc +++ b/libtest/runner.cc @@ -20,6 +20,7 @@ */ +#include #include namespace libtest { diff --git a/libtest/server.cc b/libtest/server.cc index e554039a..b6564b3a 100644 --- a/libtest/server.cc +++ b/libtest/server.cc @@ -20,6 +20,7 @@ */ +#include #include #include @@ -65,7 +66,7 @@ std::ostream& operator<<(std::ostream& output, const Server &arg) output << " Socket:" << arg.socket(); } - if (not arg.running().empty()) + if (arg.running().empty() == false) { output << " Exec:" << arg.running(); } @@ -73,7 +74,10 @@ std::ostream& operator<<(std::ostream& output, const Server &arg) return output; // for multiple << operators } +#define MAGIC_MEMORY 123570 + Server::Server(const std::string& host_arg, const in_port_t port_arg, bool is_socket_arg) : + _magic(MAGIC_MEMORY), _is_socket(is_socket_arg), _pid(-1), _port(port_arg), @@ -89,6 +93,11 @@ Server::~Server() } } +bool Server::validate() +{ + return _magic == MAGIC_MEMORY; +} + // If the server exists, kill it bool Server::cycle() { @@ -96,7 +105,8 @@ bool Server::cycle() // Try to ping, and kill the server #limit number of times pid_t current_pid; - while (--limit and is_pid_valid(current_pid= get_pid())) + while (--limit and + is_pid_valid(current_pid= get_pid())) { if (kill(current_pid)) { @@ -167,7 +177,7 @@ bool Server::start() if (Application::SUCCESS != (ret= app.wait())) { - Error << "Application::wait() " << app.print() << " " << ret; + Error << "Application::wait() " << _running << " " << ret; return false; } @@ -180,9 +190,11 @@ bool Server::start() { Wait wait(pid_file(), 8); - if (not wait.successful()) + if (wait.successful() == false) { - Error << "Unable to open pidfile for: " << _running; + libtest::fatal(LIBYATL_DEFAULT_PARAM, + "Unable to open pidfile for: %s", + _running.c_str()); } } diff --git a/libtest/server.h b/libtest/server.h index df2bbee8..1b6841d5 100644 --- a/libtest/server.h +++ b/libtest/server.h @@ -39,6 +39,7 @@ private: typedef std::vector< std::pair > Options; private: + uint64_t _magic; bool _is_socket; std::string _socket; std::string _sasl; @@ -229,6 +230,8 @@ public: bool start(); bool command(libtest::Application& app); + bool validate(); + protected: bool set_pid_file(); Options _options; diff --git a/libtest/server_container.cc b/libtest/server_container.cc index 6d0c785e..579f901c 100644 --- a/libtest/server_container.cc +++ b/libtest/server_container.cc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include @@ -120,11 +121,26 @@ void server_startup_st::restart() } } +#define MAGIC_MEMORY 123575 +server_startup_st::server_startup_st() : + _magic(MAGIC_MEMORY), + _socket(false), + _sasl(false), + _count(5), + udp(0) +{ } + server_startup_st::~server_startup_st() { shutdown_and_remove(); } +bool server_startup_st::validate() +{ + return _magic == MAGIC_MEMORY; +} + + bool server_startup_st::is_debug() const { return bool(getenv("LIBTEST_MANUAL_GDB")); @@ -235,7 +251,6 @@ bool server_startup(server_startup_st& construct, const std::string& server_type } else if (server->start() == false) { - Error << "Failed to start " << *server; delete server; return false; } @@ -313,7 +328,7 @@ bool server_startup_st::start_socket_server(const std::string& server_type, cons /* We will now cycle the server we have created. */ - if (not server->cycle()) + if (server->cycle() == false) { Error << "Could not start up server " << *server; delete server; diff --git a/libtest/server_container.h b/libtest/server_container.h index 4e81dafd..29ecb97d 100644 --- a/libtest/server_container.h +++ b/libtest/server_container.h @@ -35,6 +35,7 @@ namespace libtest { class server_startup_st { private: + uint64_t _magic; std::string server_list; bool _socket; bool _sasl; @@ -47,12 +48,10 @@ public: uint8_t udp; std::vector servers; - server_startup_st() : - _socket(false), - _sasl(false), - _count(5), - udp(0) - { } + server_startup_st(); + ~server_startup_st(); + + bool validate(); bool start_socket_server(const std::string& server_type, const in_port_t try_port, int argc, const char *argv[]); @@ -114,8 +113,6 @@ public: void push_server(Server *); Server *pop_server(); - - ~server_startup_st(); }; bool server_startup(server_startup_st&, const std::string&, in_port_t try_port, int argc, const char *argv[]); diff --git a/libtest/signal.cc b/libtest/signal.cc index 42e6d78d..bc9da4bc 100644 --- a/libtest/signal.cc +++ b/libtest/signal.cc @@ -20,6 +20,7 @@ */ +#include #include #include diff --git a/libtest/socket.cc b/libtest/socket.cc index 21fade0b..832f0c4a 100644 --- a/libtest/socket.cc +++ b/libtest/socket.cc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include static char global_socket[1024]= { 0 }; diff --git a/libtest/strerror.cc b/libtest/strerror.cc index d081bafc..0739d625 100644 --- a/libtest/strerror.cc +++ b/libtest/strerror.cc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include namespace libtest { diff --git a/libtest/test.cc b/libtest/test.cc index 66d258a0..cafc48d4 100644 --- a/libtest/test.cc +++ b/libtest/test.cc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include @@ -35,10 +36,6 @@ #include -#if defined(HAVE_CURL_CURL_H) && HAVE_CURL_CURL_H -#include -#endif - #ifndef __INTEL_COMPILER #pragma GCC diagnostic ignored "-Wold-style-cast" #endif @@ -74,32 +71,11 @@ static long int timedif(struct timeval a, struct timeval b) return s + us; } -static void cleanup_curl(void) -{ -#if defined(HAVE_CURL_CURL_H) && HAVE_CURL_CURL_H - curl_global_cleanup(); -#endif -} - #include #include int main(int argc, char *argv[]) { -#if defined(HAVE_CURL_CURL_H) && HAVE_CURL_CURL_H - if (curl_global_init(CURL_GLOBAL_ALL)) - { - Error << "curl_global_init(CURL_GLOBAL_ALL) failed"; - return EXIT_FAILURE; - } -#endif - - if (atexit(cleanup_curl)) - { - Error << "atexit() failed"; - return EXIT_FAILURE; - } - bool opt_repeat= false; std::string collection_to_run; @@ -192,15 +168,9 @@ int main(int argc, char *argv[]) try { do { exit_code= EXIT_SUCCESS; - Framework *world= new Framework(); + Framework world; - if (world == NULL) - { - Error << "Failed to create Framework()"; - return EXIT_FAILURE; - } - - assert(sigignore(SIGPIPE) == 0); + fatal_assert(sigignore(SIGPIPE) == 0); libtest::SignalThread signal; if (not signal.setup()) @@ -211,10 +181,10 @@ int main(int argc, char *argv[]) Stats stats; - get_world(world); + get_world(&world); test_return_t error; - void *creators_ptr= world->create(error); + void *creators_ptr= world.create(error); switch (error) { @@ -223,11 +193,9 @@ int main(int argc, char *argv[]) case TEST_SKIPPED: Out << "SKIP " << argv[0]; - delete world; return EXIT_SUCCESS; case TEST_FAILURE: - delete world; return EXIT_FAILURE; } @@ -250,7 +218,7 @@ int main(int argc, char *argv[]) wildcard= argv[2]; } - for (collection_st *next= world->collections; next and next->name and (not signal.is_shutdown()); next++) + for (collection_st *next= world.collections; next and next->name and (not signal.is_shutdown()); next++) { bool failed= false; bool skipped= false; @@ -262,11 +230,11 @@ int main(int argc, char *argv[]) stats.collection_total++; - test_return_t collection_rc= world->startup(creators_ptr); + test_return_t collection_rc= world.startup(creators_ptr); if (collection_rc == TEST_SUCCESS and next->pre) { - collection_rc= world->runner()->pre(next->pre, creators_ptr); + collection_rc= world.runner()->pre(next->pre, creators_ptr); } switch (collection_rc) @@ -303,20 +271,20 @@ int main(int argc, char *argv[]) test_return_t return_code; try { - if (test_success(return_code= world->item.startup(creators_ptr))) + if (test_success(return_code= world.item.startup(creators_ptr))) { - if (test_success(return_code= world->item.flush(creators_ptr, run))) + if (test_success(return_code= world.item.flush(creators_ptr, run))) { // @note pre will fail is SKIPPED is returned - if (test_success(return_code= world->item.pre(creators_ptr))) + if (test_success(return_code= world.item.pre(creators_ptr))) { { // Runner Code gettimeofday(&start_time, NULL); - assert(world->runner()); + assert(world.runner()); assert(run->test_fn); try { - return_code= world->runner()->run(run->test_fn, creators_ptr); + return_code= world.runner()->run(run->test_fn, creators_ptr); } // Special case where check for the testing of the exception // system. @@ -339,7 +307,7 @@ int main(int argc, char *argv[]) } // @todo do something if post fails - (void)world->item.post(creators_ptr); + (void)world.item.post(creators_ptr); } else if (return_code == TEST_SKIPPED) { } @@ -394,7 +362,7 @@ int main(int argc, char *argv[]) throw fatal_message("invalid return code"); } - if (test_failed(world->on_error(return_code, creators_ptr))) + if (test_failed(world.on_error(return_code, creators_ptr))) { Error << "Failed while running on_error()"; signal.set_shutdown(SHUTDOWN_GRACEFUL); @@ -402,7 +370,7 @@ int main(int argc, char *argv[]) } } - (void) world->runner()->post(next->post, creators_ptr); + (void) world.runner()->post(next->post, creators_ptr); cleanup: if (failed == false and skipped == false) @@ -420,7 +388,7 @@ cleanup: stats.collection_skipped++; } - world->shutdown(creators_ptr); + world.shutdown(creators_ptr); Outn(); } @@ -451,8 +419,6 @@ cleanup: stats_print(&stats); - delete world; - Outn(); // Generate a blank to break up the messages if make check/test has been run } while (exit_code == EXIT_SUCCESS and opt_repeat); } @@ -460,13 +426,13 @@ cleanup: { std::cerr << e.what() << std::endl; } - catch (std::bad_alloc& e) + catch (std::exception& e) { std::cerr << e.what() << std::endl; } catch (...) { - std::cerr << "Unknown exception halted execution" << std::endl; + std::cerr << "Unknown exception halted execution." << std::endl; } return exit_code; diff --git a/libtest/test.h b/libtest/test.h index abd4e2aa..a79109f1 100644 --- a/libtest/test.h +++ b/libtest/test.h @@ -89,10 +89,19 @@ do \ } while (0) #define test_true_hint test_true_got -#define test_skip(A,B) \ +#define test_skip(__expected, __actual) \ do \ { \ - if ((A) != (B)) \ + if (libtest::_compare(__FILE__, __LINE__, __func__, ((__expected)), ((__actual)), false) == false) \ + { \ + return TEST_SKIPPED; \ + } \ +} while (0) + +#define test_skip_valgrind() \ +do \ +{ \ + if (libtest::_in_valgrind(__FILE__, __LINE__, __func__)) \ { \ return TEST_SKIPPED; \ } \ @@ -132,7 +141,7 @@ do \ #define test_compare(__expected, __actual) \ do \ { \ - if (not libtest::_compare(__FILE__, __LINE__, __func__, ((__expected)), ((__actual)))) \ + if (libtest::_compare(__FILE__, __LINE__, __func__, ((__expected)), ((__actual)), true) == false) \ { \ libtest::create_core(); \ return TEST_FAILURE; \ @@ -166,7 +175,7 @@ do \ #define test_compare_warn(__expected, __actual) \ do \ { \ - void(libtest::_compare(__FILE__, __LINE__, __func__, (__expected), (__actual))); \ + void(libtest::_compare(__FILE__, __LINE__, __func__, (__expected), (__actual)), true); \ } while (0) #define test_compare_warn_hint(__expected, __actual, __hint) \ diff --git a/libtest/unittest.cc b/libtest/unittest.cc index 7f0c7404..0f82a560 100644 --- a/libtest/unittest.cc +++ b/libtest/unittest.cc @@ -63,7 +63,7 @@ static test_return_t GDB_COMMAND_test(void *) static test_return_t test_success_equals_one_test(void *) { - test_skip(HAVE_LIBMEMCACHED, true); + test_skip(HAVE_LIBMEMCACHED, 1); #if defined(HAVE_LIBMEMCACHED) && HAVE_LIBMEMCACHED test_zero(MEMCACHED_SUCCESS); #endif @@ -110,7 +110,7 @@ static test_return_t local_not_test(void *) } // unsetenv() will cause issues with valgrind - _compare(__FILE__, __LINE__, __func__, 0, unsetenv("LIBTEST_LOCAL")); + _compare(__FILE__, __LINE__, __func__, 0, unsetenv("LIBTEST_LOCAL"), true); test_compare(0, unsetenv("LIBTEST_LOCAL")); test_false(test_is_local()); @@ -228,14 +228,16 @@ static test_return_t _compare_gearman_return_t_test(void *) static test_return_t gearmand_cycle_test(void *object) { server_startup_st *servers= (server_startup_st*)object; - test_true(servers); + test_true(servers and servers->validate()); #if defined(HAVE_GEARMAND_BINARY) && HAVE_GEARMAND_BINARY test_true(has_gearmand_binary()); -#else - test_skip(true, has_gearmand_binary()); #endif + test_skip(true, has_gearmand_binary()); + + Error << " " << has_gearmand_binary(); + test_true(server_startup(*servers, "gearmand", get_free_port(), 0, NULL)); return TEST_SUCCESS; @@ -253,6 +255,29 @@ static test_return_t memcached_light_cycle_TEST(void *object) return TEST_SUCCESS; } +static test_return_t skip_shim(bool a, bool b) +{ + test_skip(a, b); + return TEST_SUCCESS; +} + +static test_return_t test_skip_true_TEST(void *object) +{ + test_compare(true, true); + test_compare(false, false); + test_compare(TEST_SUCCESS, skip_shim(true, true)); + test_compare(TEST_SUCCESS, skip_shim(false, false)); + + return TEST_SUCCESS; +} + +static test_return_t test_skip_false_TEST(void *object) +{ + test_compare(TEST_SKIPPED, skip_shim(true, false)); + test_compare(TEST_SKIPPED, skip_shim(false, true)); + return TEST_SUCCESS; +} + static test_return_t memcached_cycle_test(void *object) { server_startup_st *servers= (server_startup_st*)object; @@ -293,10 +318,7 @@ static test_return_t memcached_sasl_test(void *object) server_startup_st *servers= (server_startup_st*)object; test_true(servers); - if (getenv("TESTS_ENVIRONMENT")) - { - return TEST_SKIPPED; - } + test_skip(false, bool(getenv("TESTS_ENVIRONMENT"))); if (MEMCACHED_SASL_BINARY) { @@ -361,27 +383,19 @@ static test_return_t application_true_fubar_BINARY(void *) static test_return_t application_doesnotexist_BINARY(void *) { + test_skip_valgrind(); + Application true_app("doesnotexist"); const char *args[]= { "--fubar", 0 }; #if defined(TARGET_OS_OSX) && TARGET_OS_OSX test_compare(Application::INVALID, true_app.run(args)); + test_compare(Application::FAILURE, true_app.wait()); #else test_compare(Application::SUCCESS, true_app.run(args)); + test_compare(Application::INVALID, true_app.wait()); #endif - // Behavior is different if we are running under valgrind - if (getenv("TESTS_ENVIRONMENT") and strstr(getenv("TESTS_ENVIRONMENT"), "valgrind")) - { - test_compare(Application::FAILURE, true_app.wait()); - } - else - { -#if defined(TARGET_OS_OSX) && TARGET_OS_OSX - test_compare(Application::FAILURE, true_app.wait()); -#else - test_compare(Application::INVALID, true_app.wait()); -#endif - } + test_compare(0, true_app.stdout_result().size()); return TEST_SUCCESS; @@ -706,6 +720,12 @@ test_st memcached_tests[] ={ {0, 0, 0} }; +test_st test_skip_TESTS[] ={ + {"true, true", 0, test_skip_true_TEST }, + {"true, false", 0, test_skip_false_TEST }, + {0, 0, 0} +}; + test_st environment_tests[] ={ {"LIBTOOL_COMMAND", 0, LIBTOOL_COMMAND_test }, {"VALGRIND_COMMAND", 0, VALGRIND_COMMAND_test }, @@ -825,6 +845,7 @@ test_st http_tests[] ={ collection_st collection[] ={ {"environment", 0, 0, environment_tests}, {"return values", 0, 0, tests_log}, + {"test_skip()", 0, 0, test_skip_TESTS }, {"local", 0, 0, local_log}, {"directories", 0, 0, directories_tests}, {"comparison", 0, 0, comparison_tests}, diff --git a/libtest/vchar.cc b/libtest/vchar.cc index 779cfbba..9e0b92a4 100644 --- a/libtest/vchar.cc +++ b/libtest/vchar.cc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include namespace libtest { diff --git a/tests/libmemcached-1.0/generate.cc b/tests/libmemcached-1.0/generate.cc index 4411d77f..da31fe0c 100644 --- a/tests/libmemcached-1.0/generate.cc +++ b/tests/libmemcached-1.0/generate.cc @@ -51,6 +51,8 @@ #define GLOBAL_COUNT 10000 #define GLOBAL2_COUNT 100 +using namespace libtest; + static pairs_st *global_pairs; static const char *global_keys[GLOBAL_COUNT]; static size_t global_keys_length[GLOBAL_COUNT]; diff --git a/tests/libmemcached-1.0/setup_and_teardowns.cc b/tests/libmemcached-1.0/setup_and_teardowns.cc index 9bf0e92a..093be490 100644 --- a/tests/libmemcached-1.0/setup_and_teardowns.cc +++ b/tests/libmemcached-1.0/setup_and_teardowns.cc @@ -44,6 +44,7 @@ #include +using namespace libtest; memcached_return_t return_value_based_on_buffering(memcached_st *memc) {