#include <cstdlib>
#include <sys/types.h>
+#include <cerrno>
+#include <cassert>
+
#include <libtest/test.hpp>
+
+using namespace libtest;
*
*/
-#include <config.h>
+#include <libtest/common.h>
#include <libtest/failed.h>
{
for (Failures::iterator iter= failures.begin(); iter != failures.end(); iter++)
{
- std::cerr << "\t" << (*iter).collection << " " << (*iter).test << std::endl;
+ Error << "\t" << (*iter).collection << " " << (*iter).test;
}
- std::cerr << std::endl;
}
-/* uTest Copyright (C) 2011 Data Differential, http://datadifferential.com/
+/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
+ *
+ * uTest, libtest
+ *
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
+ *
+ * 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.
*
- * Use and distribution licensed under the BSD license. See
- * the COPYING file in the parent directory for full text.
*/
+
#include <libtest/common.h>
#include <iostream>
+using namespace libtest;
+
static test_return_t _runner_default(test_callback_fn func, void *p)
{
if (func)
{
if (test_failed(_destroy(_creators_ptr)))
{
- std::cerr << "Failure in _destroy(), some resources may not have been cleaned up." << std::endl;
+ Error << "Failure in _destroy(), some resources may not have been cleaned up.";
}
}
}
-/* uTest Copyright (C) 2011 Data Differential, http://datadifferential.com/
+/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
+ *
+ * uTest, libtest
+ *
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
+ *
+ * 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.
*
- * Use and distribution licensed under the BSD license. See
- * the COPYING file in the parent directory for full text.
*/
+
#pragma once
/**
*
*/
-#include <config.h>
+#include <libtest/common.h>
-#include <cerrno>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <libtest/killpid.h>
+#include <libtest/stream.h>
+
+using namespace libtest;
bool kill_pid(pid_t pid_arg)
{
{
case EPERM:
perror(__func__);
- std::cerr << __func__ << " -> Does someone else have a process running locally for " << int(pid_arg) << "?" << std::endl;
+ Error << __func__ << " -> Does someone else have a process running locally for " << int(pid_arg) << "?";
return false;
case ESRCH:
perror(__func__);
- std::cerr << "Process " << int(pid_arg) << " not found." << std::endl;
+ Error << "Process " << int(pid_arg) << " not found.";
return false;
default:
case ECHILD:
return true;
}
- std::cerr << std::endl << "Error occured while waitpid(" << strerror(errno) << ") on pid " << int(pid_arg) << std::endl;
+
+ Error << "Error occured while waitpid(" << strerror(errno) << ") on pid " << int(pid_arg);
+
return false;
}
#include <libtest/common.h>
-#include <cassert>
-#include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <libtest/killpid.h>
#include <libtest/wait.h>
-#define CERR_PREFIX std::endl << __FILE__ << ":" << __LINE__ << " "
-
#define SOCKET_FILE "/tmp/memcached.socket"
static pid_t __getpid(server_st& server)
if (pid > 0 and kill_pid(pid))
{
- std::cerr << CERR_PREFIX << "Killed existing server," << *server << " with pid:" << pid << std::endl;
+ Error << "Killed existing server," << *server << " with pid:" << pid;
continue;
}
else if (libmemcached_util_flush(server->hostname(), server->port(), NULL)) // If we can flush it, we will just use it
{
- std::cerr << CERR_PREFIX << "Found server on port " << int(server->port()) << ", flushed it!" << std::endl;
+ Error << "Found server on port " << int(server->port()) << ", flushed it!";
server->set_used();
return true;
} // No idea what is wrong here, so we need to find a different port
bool server_startup(server_startup_st *construct)
{
+ Log;
if (getenv(((char *)"MEMCACHED_SERVERS")))
{
construct->server_list= getenv(((char *)"MEMCACHED_SERVERS"));
- printf("servers %s\n", construct->server_list.c_str());
+ Log << "MEMCACHED_SERVERS " << construct->server_list;
construct->count= 0;
}
else
while (not cycle_server(server))
{
- std::cerr << CERR_PREFIX << "Found server " << *server << ", could not flush it, so trying next port." << std::endl;
+ Error << "Found server " << *server << ", could not flush it, so trying next port.";
port_base++;
server->set_port(in_port_t(x +TEST_PORT_BASE +port_base));
}
if (server->is_used())
{
- std::cerr << std::endl << "Using server at : " << server << std::endl;
+ Log << "Using server at : " << server;
}
else
{
if (not server->start())
{
- std::cerr << CERR_PREFIX << "Failed system(" << buffer << ")" << std::endl;
+ Error << "Failed system(" << buffer << ")";
delete server;
return false;
}
- std::cerr << "STARTING SERVER: " << buffer << " pid:" << server->pid() << std::endl;
+ Log << "STARTING SERVER: " << buffer << " pid:" << server->pid();
}
construct->push_server(server);
if (not cycle_server(server))
{
- std::cerr << CERR_PREFIX << "Found server " << server << ", could not flush it, failing since socket file is not available." << std::endl;
+ Error << "Found server " << server << ", could not flush it, failing since socket file is not available.";
return false;
}
if (server->is_used())
{
- std::cerr << std::endl << "Using server at : " << *server << std::endl;
+ Log << "Using server at : " << *server;
}
else
{
if (not server->start())
{
- std::cerr << CERR_PREFIX << "Failed system(" << buffer << ")" << std::endl;
+ Error << "Failed system(" << buffer << ")";
delete server;
return false;
}
- std::cerr << "STARTING SERVER: " << buffer << " pid:" << server->pid() << std::endl;
+ Log << "STARTING SERVER: " << buffer << " pid:" << server->pid();
}
set_default_socket(server->hostname());
construct->push_server(server);
construct->server_list= server_config_string;
}
+ Log;
+
srandom((unsigned int)time(NULL));
- std::cerr << std::endl;
return true;
}
--- /dev/null
+/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
+ *
+ * uTest, libtest
+ *
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
+ *
+ * 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 <iostream>
+#include <cassert>
+#include <sstream>
+#include <ctime>
+#include <ostream>
+
+namespace libtest {
+namespace stream {
+
+namespace detail {
+
+template<class Ch, class Tr, class A>
+ class cerr {
+ private:
+
+ public:
+ typedef std::basic_ostringstream<Ch, Tr, A> stream_buffer;
+
+ public:
+ void operator()(const stream_buffer &s)
+ {
+ std::cerr << std::endl << s.str() << std::endl;
+ }
+ };
+
+template<class Ch, class Tr, class A>
+ class cout {
+ private:
+
+ public:
+ typedef std::basic_ostringstream<Ch, Tr, A> stream_buffer;
+
+ public:
+ void operator()(const stream_buffer &s)
+ {
+ std::cout << s.str() << std::endl;
+ }
+ };
+
+template<class Ch, class Tr, class A>
+ class clog {
+ private:
+
+ public:
+ typedef std::basic_ostringstream<Ch, Tr, A> stream_buffer;
+
+ public:
+ void operator()(const stream_buffer &s)
+ {
+ std::cerr << s.str() << std::endl;
+ }
+ };
+
+template<template <class Ch, class Tr, class A> class OutputPolicy, class Ch = char, class Tr = std::char_traits<Ch>, class A = std::allocator<Ch> >
+ class log {
+ private:
+ typedef OutputPolicy<Ch, Tr, A> output_policy;
+ const char *_filename;
+ int _line_number;
+
+ public:
+ log(const char *filename, int line_number) :
+ _filename(filename),
+ _line_number(line_number)
+ {
+ if (_filename)
+ {
+ arg << _filename << ":" << _line_number << " ";
+ }
+ }
+
+ ~log()
+ {
+ output_policy()(arg);
+ }
+
+ public:
+ template<class T>
+ log &operator<<(const T &x)
+ {
+ arg << x;
+ return *this;
+ }
+
+ private:
+ typename output_policy::stream_buffer arg;
+ };
+}
+
+class cerr : public detail::log<detail::cerr> {
+public:
+ cerr(const char *filename, int line_number) :
+ log(filename, line_number)
+ { }
+};
+
+class clog : public detail::log<detail::clog> {
+public:
+ clog(const char *filename, int line_number) :
+ log(filename, line_number)
+ { }
+};
+
+class cout : public detail::log<detail::cout> {
+public:
+ cout(const char *filename, int line_number) :
+ log(filename, line_number)
+ { }
+};
+
+
+} // namespace stream
+
+#define Error stream::cerr(__FILE__, __LINE__)
+
+#define Out stream::cout(NULL, __LINE__)
+
+#define Log stream::clog(NULL, __LINE__)
+
+} // namespace libtest
-/* uTest
- * Copyright (C) 2011 Data Differential, http://datadifferential.com/
- * Copyright (C) 2006-2009 Brian Aker
- * All rights reserved.
+/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
+ *
+ * uTest, libtest
+ *
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
+ * Copyright (C) 2006-2009 Brian Aker
+ *
+ * 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.
*
- * Use and distribution licensed under the BSD license. See
- * the COPYING file in the parent directory for full text.
*/
+
+
#include <libtest/common.h>
#include <cassert>
#include <ctime>
#include <fnmatch.h>
#include <iostream>
-#include <cerrno>
#include <signal.h>
static Framework *world= NULL;
static volatile shutdown_t __shutdown= SHUTDOWN_RUNNING;
+pthread_mutex_t shutdown_mutex= PTHREAD_MUTEX_INITIALIZER;
+
+static bool is_shutdown()
+{
+ bool ret;
+ pthread_mutex_lock(&shutdown_mutex);
+ ret= bool(__shutdown != SHUTDOWN_RUNNING);
+ pthread_mutex_unlock(&shutdown_mutex);
+
+ return ret;
+}
+
+static void set_shutdown(shutdown_t arg)
+{
+ pthread_mutex_lock(&shutdown_mutex);
+ __shutdown= arg;
+ pthread_mutex_unlock(&shutdown_mutex);
+}
static void *sig_thread(void *arg)
{
sigset_t *set= (sigset_t *) arg;
- for (;__shutdown == SHUTDOWN_RUNNING;)
+ while (is_shutdown())
{
int sig;
int error;
case SIGSEGV:
case SIGINT:
case SIGABRT:
- std::cerr << std::endl << "Signal handling thread got signal " << strsignal(sig) << std::endl;
- __shutdown= SHUTDOWN_FORCED;
+ Error << "Signal handling thread got signal " << strsignal(sig);
+ set_shutdown(SHUTDOWN_FORCED);
break;
default:
- std::cerr << std::endl << "Signal handling thread got unexpected signal " << strsignal(sig) << std::endl;
+ Error << "Signal handling thread got unexpected signal " << strsignal(sig);
case SIGUSR1:
break;
}
int error;
if ((error= pthread_sigmask(SIG_BLOCK, &set, NULL)) != 0)
{
- std::cerr << __FILE__ << ":" << __LINE__ << " died during pthread_sigmask(" << strerror(error) << ")" << std::endl;
+ Error << " died during pthread_sigmask(" << strerror(error) << ")";
exit(EXIT_FAILURE);
}
if ((error= pthread_create(&thread, NULL, &sig_thread, (void *) &set)) != 0)
{
- std::cerr << __FILE__ << ":" << __LINE__ << " died during pthread_create(" << strerror(error) << ")" << std::endl;
+ Error << " died during pthread_create(" << strerror(error) << ")";
exit(EXIT_FAILURE);
}
}
void *creators_ptr= world->create(error);
if (test_failed(error))
{
- std::cerr << "create() failed" << std::endl;
+ Error << "create() failed";
return EXIT_FAILURE;
}
wildcard= argv[2];
}
- for (collection_st *next= world->collections; next->name and __shutdown == SHUTDOWN_RUNNING; next++)
+ for (collection_st *next= world->collections; next->name and (not is_shutdown()); next++)
{
test_return_t collection_rc= TEST_SUCCESS;
bool failed= false;
switch (collection_rc)
{
case TEST_SUCCESS:
- std::cerr << std::endl << next->name << std::endl << std::endl;
break;
case TEST_FATAL:
case TEST_FAILURE:
- std::cerr << std::endl << next->name << " [ failed ]" << std::endl << std::endl;
+ Error << next->name << " [ failed ]";
stats.collection_failed++;
goto cleanup;
case TEST_SKIPPED:
- std::cerr << std::endl << next->name << " [ skipping ]" << std::endl << std::endl;
+ Log << next->name << " [ skipping ]";
stats.collection_skipped++;
goto cleanup;
test_assert(0, "Allocation failure, or unknown return");
}
+ Log << "Collection: " << next->name;
+
for (test_st *run= next->tests; run->name; run++)
{
struct timeval start_time, end_time;
if (wildcard && fnmatch(wildcard, run->name, 0))
{
- continue;
+ continue;
}
- std::cerr << "\tTesting " << run->name;
-
test_return_t return_code;
if (test_success(return_code= world->item.startup(creators_ptr)))
{
}
else
{
- std::cerr << __FILE__ << ":" << __LINE__ << " item.flush(failure)" << std::endl;
+ Error << " item.flush(failure)";
}
}
else
{
- std::cerr << __FILE__ << ":" << __LINE__ << " item.startup(failure)" << std::endl;
+ Error << " item.startup(failure)";
}
stats.total++;
- std::cerr << "\t\t\t\t\t";
-
switch (return_code)
{
case TEST_SUCCESS:
- std::cerr << load_time / 1000 << "." << load_time % 1000;
- stats.success++;
- break;
+ Log << "\tTesting " << run->name << "\t\t\t\t\t" << load_time / 1000 << "." << load_time % 1000 << "[ " << test_strerror(return_code) << " ]";
+ stats.success++;
+ break;
case TEST_FATAL:
case TEST_FAILURE:
- stats.failed++;
- failed= true;
- break;
+ stats.failed++;
+ failed= true;
+ Error << "\tTesting " << run->name << "\t\t\t\t\t" << "[ " << test_strerror(return_code) << " ]";
+ break;
case TEST_SKIPPED:
- stats.skipped++;
- skipped= true;
- break;
+ stats.skipped++;
+ skipped= true;
+ Log << "\tTesting " << run->name << "\t\t\t\t\t" << "[ " << test_strerror(return_code) << " ]";
+ break;
case TEST_MEMORY_ALLOCATION_FAILURE:
- test_assert(0, "Memory Allocation Error");
+ test_assert(0, "Memory Allocation Error");
}
- std::cerr << "[ " << test_strerror(return_code) << " ]" << std::endl;
-
if (test_failed(world->on_error(return_code, creators_ptr)))
{
+ Error << "Failed while running on_error()";
break;
}
}
world->shutdown(creators_ptr);
}
- if (__shutdown == SHUTDOWN_RUNNING)
+ if (not is_shutdown())
{
- __shutdown= SHUTDOWN_GRACEFUL;
+ set_shutdown(SHUTDOWN_GRACEFUL);
+ pthread_kill(thread, SIGUSR1);
}
if (__shutdown == SHUTDOWN_FORCED)
{
- std::cerr << std::endl << std::endl << "Tests were aborted." << std::endl << std::endl;
+ Error << "Tests were aborted.";
}
else if (stats.collection_failed or stats.collection_skipped)
{
- std::cerr << std::endl << std::endl << "Some test failures and/or skipped test occurred." << std::endl << std::endl;
+ Error << "Some test failures and/or skipped test occurred.";
}
else
{
- std::cout << std::endl << std::endl << "All tests completed successfully." << std::endl << std::endl;
+ Log << "All tests completed successfully.";
}
stats_print(&stats);
+ Error << " ";
void *retval;
- pthread_kill(thread, SIGUSR1);
pthread_join(thread, &retval);
+ Error << " word";
delete world;
+ Error << " after word";
return stats.failed == 0 and __shutdown == SHUTDOWN_GRACEFUL ? EXIT_SUCCESS : EXIT_FAILURE;
}
-/* uTest
- * Copyright (C) 2011 Data Differential, http://datadifferential.com/
- * Copyright (C) 2006-2009 Brian Aker
- * All rights reserved.
+/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
+ *
+ * uTest, libtest
+ *
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
+ * Copyright (C) 2006-2009 Brian Aker
+ *
+ * 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.
*
- * Use and distribution licensed under the BSD license. See
- * the COPYING file in the parent directory for full text.
*/
+
/*
Structures for generic tests.
*/
#include <libtest/collection.h>
#include <libtest/framework.h>
#include <libtest/get.h>
+#include <libtest/stream.h>
#pragma once
return TEST_SUCCESS;
}
+static test_return_t kill_test(memcached_st *)
+{
+ static struct timespec global_sleep_value= { 2, 0 };
+
+#ifdef WIN32
+ sleep(1);
+#else
+ nanosleep(&global_sleep_value, NULL);
+#endif
+
+ return TEST_SUCCESS;
+}
+
test_st ping_tests[] ={
{"alive", true, (test_callback_fn*)alive },
{0, 0, 0}
{0, 0, 0}
};
+test_st kill_tests[] ={
+ {"kill", true, (test_callback_fn*)kill_test },
+ {0, 0, 0}
+};
+
collection_st collection[] ={
{"libmemcached_util_ping()", 0, 0, ping_tests},
{"libmemcached_util_getpid()", 0, 0, getpid_tests},
+ {"kill", 0, 0, kill_tests},
{0, 0, 0, 0}
};