--- /dev/null
+/* 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 <config.h>
+#include <libtest/common.h>
+
+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
namespace libtest {
+bool _in_valgrind(const char *file, int line, const char *func);
+
template <class T_comparable, class T_hint>
bool _compare_truth_hint(const char *file, int line, const char *func, T_comparable __expected, const char *assertation_label, T_hint __hint)
{
}
template <class T1_comparable, class T2_comparable>
-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;
}
}
template <class T1_comparable, class T2_comparable, class T_hint>
-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;
}
#
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
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)\""
libtest_libtest_la_SOURCES= \
libtest/binaries.cc \
libtest/cmdline.cc \
+ libtest/comparison.cc \
libtest/core.cc \
libtest/cpu.cc \
libtest/dream.cc \
// 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;
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;
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;
output << " Socket:" << arg.socket();
}
- if (not arg.running().empty())
+ if (arg.running().empty() == false)
{
output << " Exec:" << arg.running();
}
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),
}
}
+bool Server::validate()
+{
+ return _magic == MAGIC_MEMORY;
+}
+
// If the server exists, kill it
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))
{
typedef std::vector< std::pair<std::string, std::string> > Options;
private:
+ uint64_t _magic;
bool _is_socket;
std::string _socket;
std::string _sasl;
bool start();
bool command(libtest::Application& app);
+ bool validate();
+
protected:
bool set_pid_file();
Options _options;
}
}
+#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"));
class server_startup_st
{
private:
+ uint64_t _magic;
std::string server_list;
bool _socket;
bool _sasl;
uint8_t udp;
std::vector<Server *> 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[]);
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[]);
} 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; \
} \
#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; \
#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) \
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
}
// 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());
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;
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;
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)
{
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;
{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 },
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},
#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];
#include <sys/stat.h>
+using namespace libtest;
memcached_return_t return_value_based_on_buffering(memcached_st *memc)
{