From: Brian Aker Date: Mon, 12 Mar 2012 07:21:40 +0000 (-0700) Subject: Improvements on valgrind detection. X-Git-Tag: 1.0.5~2 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=750f7447e014aab84e69e42b21feb1d996b2cf13;p=awesomized%2Flibmemcached Improvements on valgrind detection. --- 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/include.am b/libtest/include.am index 7cbbb1de..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 \ diff --git a/libtest/memcached.cc b/libtest/memcached.cc index 81068aef..678c3cf1 100644 --- a/libtest/memcached.cc +++ b/libtest/memcached.cc @@ -88,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; @@ -236,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; @@ -365,9 +366,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; diff --git a/libtest/server.cc b/libtest/server.cc index 34d367ef..b6564b3a 100644 --- a/libtest/server.cc +++ b/libtest/server.cc @@ -66,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(); } @@ -74,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), @@ -90,6 +93,11 @@ Server::~Server() } } +bool Server::validate() +{ + return _magic == MAGIC_MEMORY; +} + // If the server exists, kill it bool Server::cycle() { @@ -97,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)) { 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 ff44228a..5be04f98 100644 --- a/libtest/server_container.cc +++ b/libtest/server_container.cc @@ -121,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")); 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/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 0272ee7e..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,34 +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 - if (getenv("TESTS_ENVIRONMENT") and strstr(getenv("TESTS_ENVIRONMENT"), "valgrind")) - { - 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; @@ -713,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 }, @@ -832,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/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) {