From: Michael Wallner Date: Tue, 29 Sep 2020 13:50:37 +0000 (+0200) Subject: testing: more bin tests X-Git-Tag: 1.1.0-beta1~236^2~33 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=cd7d49d55430dae18dff248f26619f6b1a4fca3a;p=m6w6%2Flibmemcached testing: more bin tests --- diff --git a/src/bin/memstat.cc b/src/bin/memstat.cc index 6021dbc5..48ba3b6a 100644 --- a/src/bin/memstat.cc +++ b/src/bin/memstat.cc @@ -167,7 +167,7 @@ int main(int argc, char *argv[]) { if (memcached_failed(memcached_version(memc))) { - std::cerr << "Unable to obtain server version"; + std::cerr << "Unable to obtain server version" << std::endl; exit(EXIT_FAILURE); } @@ -179,8 +179,9 @@ int main(int argc, char *argv[]) { memcached_stat_st *memc_stat= memcached_stat(memc, NULL, &rc); - if (memc_stat == NULL) + if (memc_stat == NULL || rc != MEMCACHED_SUCCESS) { + std::cerr << memcached_last_error_message(memc) << std::endl; exit(EXIT_FAILURE); } diff --git a/test/tests/bin/memping.cpp b/test/tests/bin/memping.cpp new file mode 100644 index 00000000..ab56fa12 --- /dev/null +++ b/test/tests/bin/memping.cpp @@ -0,0 +1,55 @@ +#include "test/lib/common.hpp" +#include "test/lib/Shell.hpp" +#include "test/lib/Server.hpp" +#include "test/lib/ReturnMatcher.hpp" + +using Catch::Matchers::Contains; + +TEST_CASE("bin/memping") { + Shell sh{string{TESTING_ROOT "/../src/bin"}}; + + SECTION("no servers provided") { + string output; + REQUIRE_FALSE(sh.run("memping", output)); + REQUIRE(output == "No Servers provided\n"); + } + + SECTION("--help") { + string output; + REQUIRE(sh.run("memping --help", output)); + REQUIRE_THAT(output, Contains("memping")); + REQUIRE_THAT(output, Contains("v1")); + REQUIRE_THAT(output, Contains("help")); + REQUIRE_THAT(output, Contains("version")); + REQUIRE_THAT(output, Contains("option")); + REQUIRE_THAT(output, Contains("--")); + REQUIRE_THAT(output, Contains("=")); + } + + SECTION("with server") { + Server server{MEMCACHED_BINARY, {"-p", random_port_string}}; + MemcachedPtr memc; + LoneReturnMatcher test{*memc}; + + REQUIRE(server.ensureListening()); + auto port = get(server.getSocketOrPort()); + auto comm = "memping --servers=localhost:" + to_string(port) + " "; + + REQUIRE_SUCCESS(memcached_server_add(*memc, "localhost", port)); + + SECTION("okay") { + string output; + REQUIRE(sh.run(comm, output)); + REQUIRE(output.empty()); + } + + SECTION("connection failure") { + server.signal(SIGKILL); + server.wait(); + + string output; + REQUIRE_FALSE(sh.run(comm, output)); + REQUIRE_THAT(output, Contains("CONNECTION FAILURE") || Contains("SERVER HAS FAILED")); + } + } +} diff --git a/test/tests/bin/memrm.cpp b/test/tests/bin/memrm.cpp new file mode 100644 index 00000000..b4a7fd01 --- /dev/null +++ b/test/tests/bin/memrm.cpp @@ -0,0 +1,75 @@ +#include "test/lib/common.hpp" +#include "test/lib/Shell.hpp" +#include "test/lib/Server.hpp" +#include "test/lib/Retry.hpp" +#include "test/lib/ReturnMatcher.hpp" + +using Catch::Matchers::Contains; + +TEST_CASE("bin/memrm") { + Shell sh{string{TESTING_ROOT "/../src/bin"}}; + + SECTION("no servers provided") { + string output; + REQUIRE_FALSE(sh.run("memrm", output)); + REQUIRE(output == "No Servers provided\n"); + } + + SECTION("--help") { + string output; + REQUIRE(sh.run("memrm --help", output)); + REQUIRE_THAT(output, Contains("memrm")); + REQUIRE_THAT(output, Contains("v1")); + REQUIRE_THAT(output, Contains("help")); + REQUIRE_THAT(output, Contains("version")); + REQUIRE_THAT(output, Contains("option")); + REQUIRE_THAT(output, Contains("--")); + REQUIRE_THAT(output, Contains("=")); + } + + SECTION("with server") { + Server server{MEMCACHED_BINARY, {"-p", random_port_string}}; + MemcachedPtr memc; + LoneReturnMatcher test{*memc}; + + REQUIRE(server.ensureListening()); + auto port = get(server.getSocketOrPort()); + auto comm = "memrm --servers=localhost:" + to_string(port) + " "; + + REQUIRE_SUCCESS(memcached_server_add(*memc, "localhost", port)); + + SECTION("not found") { + string output; + REQUIRE(sh.run(comm + "-v key1", output)); + REQUIRE_THAT(output, Contains("Could not find key \"key1\"")); + } + + SECTION("okay") { + + REQUIRE_SUCCESS(memcached_set(*memc, S("key1"), S("val1"), 0, 0)); + REQUIRE_SUCCESS(memcached_set(*memc, S("key2"), S("val2"), 0, 0)); + + this_thread::sleep_for(500ms); + + string output; + REQUIRE(sh.run(comm + "key1", output)); + REQUIRE(output.empty()); + + memcached_return_t rc; + REQUIRE(nullptr == memcached_get(*memc, S("key1"), nullptr, nullptr, &rc)); + REQUIRE_RC(MEMCACHED_NOTFOUND, rc); + Malloced val(memcached_get(*memc, S("key2"), nullptr, nullptr, &rc)); + REQUIRE(*val); + REQUIRE_SUCCESS(rc); + } + + SECTION("connection failure") { + server.signal(SIGKILL); + server.wait(); + + string output; + REQUIRE_FALSE(sh.run(comm + " -v key2", output)); + REQUIRE_THAT(output, Contains("CONNECTION FAILURE") || Contains("SERVER HAS FAILED")); + } + } +} diff --git a/test/tests/bin/memstat.cpp b/test/tests/bin/memstat.cpp new file mode 100644 index 00000000..87db31d4 --- /dev/null +++ b/test/tests/bin/memstat.cpp @@ -0,0 +1,70 @@ +#include "test/lib/common.hpp" +#include "test/lib/Shell.hpp" +#include "test/lib/Server.hpp" +#include "test/lib/Retry.hpp" +#include "test/lib/ReturnMatcher.hpp" + +using Catch::Matchers::Contains; + +TEST_CASE("bin/memstat") { + Shell sh{string{TESTING_ROOT "/../src/bin"}}; + + SECTION("no servers provided") { + string output; + REQUIRE_FALSE(sh.run("memstat", output)); + REQUIRE(output == "No Servers provided\n"); + } + + SECTION("--help") { + string output; + REQUIRE(sh.run("memstat --help", output)); + REQUIRE_THAT(output, Contains("memstat")); + REQUIRE_THAT(output, Contains("v1")); + REQUIRE_THAT(output, Contains("help")); + REQUIRE_THAT(output, Contains("version")); + REQUIRE_THAT(output, Contains("option")); + REQUIRE_THAT(output, Contains("--")); + REQUIRE_THAT(output, Contains("=")); + } + + SECTION("with server") { + Server server{MEMCACHED_BINARY, {"-p", random_port_string}}; + MemcachedPtr memc; + LoneReturnMatcher test{*memc}; + + REQUIRE(server.ensureListening()); + auto port = get(server.getSocketOrPort()); + auto comm = "memstat --servers=localhost:" + to_string(port) + + ",localhost:" + to_string(port) + " "; + + REQUIRE_SUCCESS(memcached_server_add(*memc, "localhost", port)); + + SECTION("okay") { + SECTION("version") { + REQUIRE_SUCCESS(memcached_version(*memc)); + auto inst = memcached_server_instance_by_position(*memc, 0); + + string output; + REQUIRE(sh.run(comm + "--server-version", output)); + REQUIRE_THAT(output, Contains("localhost:" + to_string(port) + " " + + to_string(memcached_server_major_version(inst)) + "." + + to_string(memcached_server_minor_version(inst)) + "." + + to_string(memcached_server_micro_version(inst)))); + } + SECTION("analyze") { + string output; + REQUIRE(sh.run(comm + "--analyze", output)); + REQUIRE_THAT(output, Contains("Number of Servers Analyzed : 2")); + } + } + + SECTION("connection failure") { + server.signal(SIGKILL); + server.wait(); + + string output; + REQUIRE_FALSE(sh.run(comm + "--analyze", output)); + REQUIRE_THAT(output, Contains("CONNECTION FAILURE") || Contains("SERVER HAS FAILED")); + } + } +} diff --git a/tests/memping.cc b/tests/memping.cc deleted file mode 100644 index 0712efd2..00000000 --- a/tests/memping.cc +++ /dev/null @@ -1,121 +0,0 @@ -/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: - * - * Test memping - * - * Copyright (C) 2011-2013 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. - * - */ - - -/* - Test that we are cycling the servers we are creating during testing. -*/ - -#include "mem_config.h" - -#include "libtest/test.hpp" -#include "libmemcached-1.0/memcached.h" - -using namespace libtest; - -#ifndef __INTEL_COMPILER -#pragma GCC diagnostic ignored "-Wstrict-aliasing" -#endif - -static std::string executable("src/bin/memping"); - -static test_return_t help_test(void *) -{ - const char *args[]= { "--help", 0 }; - - test_compare(EXIT_SUCCESS, exec_cmdline(executable, args, true)); - - return TEST_SUCCESS; -} - -static test_return_t ping_TEST(void *) -{ - char buffer[1024]; - snprintf(buffer, sizeof(buffer), "--servers=localhost:%d", int(default_port())); - const char *args[]= { buffer, 0 }; - - test_compare(EXIT_SUCCESS, exec_cmdline(executable, args, true)); - - return TEST_SUCCESS; -} - -static test_return_t NOT_FOUND_TEST(void *) -{ - char buffer[1024]; - snprintf(buffer, sizeof(buffer), "--servers=nonexist.libmemcached.org:%d", int(default_port())); - const char *args[]= { buffer, 0 }; - - test_compare(EXIT_FAILURE, exec_cmdline(executable, args, true)); - - return TEST_SUCCESS; -} - -test_st memping_TESTS[] ={ - {"--help", true, help_test }, - {"ping(FOUND)", true, ping_TEST }, - {"ping(NOT_FOUND)", true, NOT_FOUND_TEST }, - {0, 0, 0} -}; - -collection_st collection[] ={ - {"memping", 0, 0, memping_TESTS }, - {0, 0, 0, 0} -}; - -static void *world_create(server_startup_st& servers, test_return_t& error) -{ - if (libtest::has_memcached() == false) - { - error= TEST_SKIPPED; - return NULL; - } - - if (server_startup(servers, "memcached", libtest::default_port(), NULL) == false) - { - error= TEST_FAILURE; - } - - return &servers; -} - - -void get_world(libtest::Framework* world) -{ - world->collections(collection); - world->create(world_create); -} - - diff --git a/tests/memrm.cc b/tests/memrm.cc deleted file mode 100644 index e3c807be..00000000 --- a/tests/memrm.cc +++ /dev/null @@ -1,171 +0,0 @@ -/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: - * - * Test memrm - * - * 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. - * - */ - - -/* - Test that we are cycling the servers we are creating during testing. -*/ - -#include "mem_config.h" - -#include "libtest/test.hpp" -#include "libmemcached-1.0/memcached.h" - -using namespace libtest; - -#ifndef __INTEL_COMPILER -#pragma GCC diagnostic ignored "-Wstrict-aliasing" -#endif - -static std::string executable("./src/bin/memrm"); - -static test_return_t quiet_test(void *) -{ - const char *args[]= { "--quiet", 0 }; - - test_compare(EXIT_FAILURE, exec_cmdline(executable, args, true)); - return TEST_SUCCESS; -} - -static test_return_t help_test(void *) -{ - const char *args[]= { "--help", 0 }; - - test_compare(EXIT_SUCCESS, exec_cmdline(executable, args, true)); - - return TEST_SUCCESS; -} - -static test_return_t rm_test(void *) -{ - char buffer[1024]; - snprintf(buffer, sizeof(buffer), "--server=localhost:%d", int(default_port())); - - memcached_st *memc= memcached(buffer, strlen(buffer)); - test_true(memc); - - test_compare(MEMCACHED_SUCCESS, - memcached_set(memc, test_literal_param("foo"), 0, 0, 0, 0)); - - memcached_return_t rc; - test_null(memcached_get(memc, test_literal_param("foo"), 0, 0, &rc)); - test_compare(MEMCACHED_SUCCESS, rc); - - char memrm_buffer[1024]; - snprintf(memrm_buffer, sizeof(memrm_buffer), "--servers=localhost:%d", int(default_port())); - const char *args[]= { buffer, "foo", 0 }; - test_compare(EXIT_SUCCESS, exec_cmdline(executable, args, true)); - - test_null(memcached_get(memc, test_literal_param("foo"), 0, 0, &rc)); - test_compare(MEMCACHED_NOTFOUND, rc); - - memcached_free(memc); - - return TEST_SUCCESS; -} - -static test_return_t NOT_FOUND_TEST(void *) -{ - char buffer[1024]; - snprintf(buffer, sizeof(buffer), "--server=localhost:%d", int(default_port())); - const char *args[]= { buffer, "foo", 0 }; - - memcached_st *memc= memcached(buffer, strlen(buffer)); - test_true(memc); - - memcached_return_t rc; - test_null(memcached_get(memc, test_literal_param("foo"), 0, 0, &rc)); - test_compare(MEMCACHED_NOTFOUND, rc); - - test_compare(EXIT_SUCCESS, exec_cmdline(executable, args, true)); - - test_null(memcached_get(memc, test_literal_param("foo"), 0, 0, &rc)); - test_compare(MEMCACHED_NOTFOUND, rc); - - memcached_free(memc); - - return TEST_SUCCESS; -} - -static test_return_t multiple_NOT_FOUND_TEST(void *) -{ - char buffer[1024]; - snprintf(buffer, sizeof(buffer), "--servers=localhost:%d", int(default_port())); - const char *args[]= { buffer, "protocols", "foo", "mine", "bar", "dog", "cat", "foo", "mine", - "eye", "for", "the", "to", "not", "know", "what", "I", "should", "be", "doing", 0 }; - - test_compare(EXIT_SUCCESS, exec_cmdline(executable, args, true)); - - return TEST_SUCCESS; -} - -test_st memrm_tests[] ={ - {"--quiet", true, quiet_test }, - {"--help", true, help_test }, - {"rm(FOUND)", true, rm_test }, - {"rm(NOT_FOUND)", true, NOT_FOUND_TEST }, - {"multiple rm(NOT_FOUND)", true, multiple_NOT_FOUND_TEST }, - {0, 0, 0} -}; - -collection_st collection[] ={ - {"memrm", 0, 0, memrm_tests }, - {0, 0, 0, 0} -}; - -static void *world_create(server_startup_st& servers, test_return_t& error) -{ - if (libtest::has_memcached() == false) - { - error= TEST_SKIPPED; - return NULL; - } - - if (server_startup(servers, "memcached", libtest::default_port(), NULL) == false) - { - error= TEST_FAILURE; - } - - return &servers; -} - - -void get_world(libtest::Framework* world) -{ - world->collections(collection); - world->create(world_create); -} - diff --git a/tests/memstat.cc b/tests/memstat.cc deleted file mode 100644 index 516ff7d9..00000000 --- a/tests/memstat.cc +++ /dev/null @@ -1,130 +0,0 @@ -/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: - * - * Test memstat - * - * 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. - * - */ - - -/* - Test that we are cycling the servers we are creating during testing. -*/ - -#include "mem_config.h" - -#include "libtest/test.hpp" -#include "libmemcached-1.0/memcached.h" - -using namespace libtest; - -#ifndef __INTEL_COMPILER -#pragma GCC diagnostic ignored "-Wstrict-aliasing" -#endif - -static std::string executable("./src/bin/memstat"); - -static test_return_t help_test(void *) -{ - const char *args[]= { "--help", 0 }; - - test_compare(EXIT_SUCCESS, exec_cmdline(executable, args, true)); - - return TEST_SUCCESS; -} - -static test_return_t binary_TEST(void *) -{ - char buffer[1024]; - snprintf(buffer, sizeof(buffer), "--servers=localhost:%d", int(libtest::default_port())); - const char *args[]= { buffer, " --binary ", 0 }; - - test_compare(EXIT_SUCCESS, exec_cmdline(executable, args, true)); - return TEST_SUCCESS; -} - -static test_return_t server_version_TEST(void *) -{ - char buffer[1024]; - snprintf(buffer, sizeof(buffer), "--servers=localhost:%d", int(libtest::default_port())); - const char *args[]= { buffer, " --server-version", 0 }; - - test_compare(EXIT_SUCCESS, exec_cmdline(executable, args, true)); - return TEST_SUCCESS; -} - -static test_return_t binary_server_version_TEST(void *) -{ - char buffer[1024]; - snprintf(buffer, sizeof(buffer), "--servers=localhost:%d", int(libtest::default_port())); - const char *args[]= { buffer, " --binary --server-version", 0 }; - - test_compare(EXIT_SUCCESS, exec_cmdline(executable, args, true)); - - return TEST_SUCCESS; -} - -test_st memstat_tests[] ={ - {"--help", 0, help_test}, - {"--binary", 0, binary_TEST}, - {"--server-version", 0, server_version_TEST}, - {"--binary --server-version", 0, binary_server_version_TEST}, - {0, 0, 0} -}; - -collection_st collection[] ={ - {"memstat", 0, 0, memstat_tests }, - {0, 0, 0, 0} -}; - -static void *world_create(server_startup_st& servers, test_return_t& error) -{ - if (libtest::has_memcached() == false) - { - error= TEST_SKIPPED; - return NULL; - } - - if (server_startup(servers, "memcached", libtest::default_port(), NULL) == false) - { - error= TEST_SKIPPED; - } - - return &servers; -} - - -void get_world(libtest::Framework* world) -{ - world->collections(collection); - world->create(world_create); -} -