testing: bin/memaslap
authorMichael Wallner <mike@php.net>
Tue, 13 Oct 2020 15:16:19 +0000 (17:16 +0200)
committerMichael Wallner <mike@php.net>
Tue, 13 Oct 2020 15:16:19 +0000 (17:16 +0200)
src/bin/memaslap.c
src/bin/memaslap/ms_conn.c
src/bin/memaslap/ms_setting.c
test/CMakeLists.txt
test/conf.h.in
test/tests/bin/memaslap.cpp [new file with mode: 0644]

index c94ead2df39f2c60678cdf2ae3b73a4d158407c6..77f74b3648c7f528fa3e8ea2521ed6be4869b4c3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  memslap
+ *  memaslap
  *
  *  (c) Copyright 2009, Schooner Information Technology, Inc.
  *  All rights reserved.
@@ -41,7 +41,7 @@ ms_stats_t ms_stats;
 /* global statistic structure */
 ms_statistic_t ms_statistic;
 
-#define PROGRAM_NAME    "memslap"
+#define PROGRAM_NAME    "memaslap"
 #define PROGRAM_DESCRIPTION \
                         "Generates workload against memcached servers."
 
@@ -120,7 +120,7 @@ static int ms_check_para(void);
 static void ms_statistic_init(void);
 static void ms_stats_init(void);
 static void ms_print_statistics(int in_time);
-static void ms_print_memslap_stats(struct timeval *start_time,
+static void ms_print_memaslap_stats(struct timeval *start_time,
                                    struct timeval *end_time);
 static void ms_monitor_slap_mode(void);
 
@@ -131,7 +131,7 @@ static void ms_monitor_slap_mode(void);
  * @param description, description of this process
  * @param long_options, global options array
  */
-static __attribute__((noreturn)) void ms_help_command(const char *command_name, const char *description)
+static void ms_help_command(const char *command_name, const char *description)
 {
   char *help_message= NULL;
 
@@ -139,7 +139,7 @@ static __attribute__((noreturn)) void ms_help_command(const char *command_name,
   printf("    %s\n\n", description);
   printf(
     "Usage:\n"
-    "    memslap -hV | -s servers [-F config_file] [-t time | -x exe_num] [...]\n\n"
+    "    memaslap -hV | -s servers [-F config_file] [-t time | -x exe_num] [...]\n\n"
     "Options:\n");
 
   for (int x= 0; long_options[x].name; x++)
@@ -155,15 +155,13 @@ static __attribute__((noreturn)) void ms_help_command(const char *command_name,
 
   printf(
     "\nExamples:\n"
-    "    memslap -s 127.0.0.1:11211 -S 5s\n"
-    "    memslap -s 127.0.0.1:11211 -t 2m -v 0.2 -e 0.05 -b\n"
-    "    memslap -s 127.0.0.1:11211 -F config -t 2m -w 40k -S 20s -o 0.2\n"
-    "    memslap -s 127.0.0.1:11211 -F config -t 2m -T 4 -c 128 -d 20 -P 40k\n"
-    "    memslap -s 127.0.0.1:11211 -F config -t 2m -d 50 -a -n 40\n"
-    "    memslap -s 127.0.0.1:11211,127.0.0.1:11212 -F config -t 2m\n"
-    "    memslap -s 127.0.0.1:11211,127.0.0.1:11212 -F config -t 2m -p 2\n\n");
-
-  exit(0);
+    "    memaslap -s 127.0.0.1:11211 -S 5s\n"
+    "    memaslap -s 127.0.0.1:11211 -t 2m -v 0.2 -e 0.05 -b\n"
+    "    memaslap -s 127.0.0.1:11211 -F config -t 2m -w 40k -S 20s -o 0.2\n"
+    "    memaslap -s 127.0.0.1:11211 -F config -t 2m -T 4 -c 128 -d 20 -P 40k\n"
+    "    memaslap -s 127.0.0.1:11211 -F config -t 2m -d 50 -a -n 40\n"
+    "    memaslap -s 127.0.0.1:11211,127.0.0.1:11212 -F config -t 2m\n"
+    "    memaslap -s 127.0.0.1:11211,127.0.0.1:11212 -F config -t 2m -p 2\n\n");
 } /* ms_help_command */
 
 
@@ -295,7 +293,7 @@ static const char *ms_lookup_help(ms_options_t option)
 
   case OPT_UDP:
     return
-      "UDP support, default memslap uses TCP, TCP port and UDP port of\n"
+      "UDP support, by default memaslap uses TCP; TCP port and UDP port of\n"
       "        server must be same.";
 
   case OPT_EXPIRE:
@@ -442,6 +440,7 @@ static void ms_options_parse(int argc, char *argv[])
 
     case OPT_HELP:     /* --help or -h */
       ms_help_command(PROGRAM_NAME, PROGRAM_DESCRIPTION);
+      exit(0);
       break;
 
     case OPT_SERVERS:     /* --servers or -s */
@@ -660,7 +659,7 @@ static int ms_check_para()
     }
     else
     {
-      fprintf(stderr, "No Servers provided\n\n");
+      fprintf(stderr, "No servers provided\n\n");
       return -1;
     }
   }
@@ -717,11 +716,11 @@ static void ms_print_statistics(int in_time)
 } /* ms_print_statistics */
 
 
-/* used to print the states of memslap */
-static void ms_print_memslap_stats(struct timeval *start_time,
+/* used to print the states of memaslap */
+static void ms_print_memaslap_stats(struct timeval *start_time,
                                    struct timeval *end_time)
 {
-  char buf[1024];
+  char buf[0x2000];
   char *pos= buf;
 
   pos+= snprintf(pos,
@@ -808,11 +807,11 @@ static void ms_print_memslap_stats(struct timeval *start_time,
                           ms_stats.bytes_written
                           + ms_stats.bytes_read) / 1024 / 1024
                  / ((double)time_diff / 1000000));
-  assert(pos <= buf);
+  assert(pos <= (buf + sizeof(buf)));
 
-  fprintf(stdout, "%s", buf);
+  fwrite(buf, 1, pos - buf, stdout);
   fflush(stdout);
-} /* ms_print_memslap_stats */
+} /* ms_print_memaslap_stats */
 
 
 /* the loop of the main thread, wait the work threads to complete */
@@ -892,7 +891,7 @@ static void ms_monitor_slap_mode()
     gettimeofday(&end_time, NULL);
   }
 
-  ms_print_memslap_stats(&start_time, &end_time);
+  ms_print_memaslap_stats(&start_time, &end_time);
 } /* ms_monitor_slap_mode */
 
 
index 71353d5b4806defd0b7f93bc6f611fbd775f130a..39f284b09d1003e69f4f3a4358d8501e8ae0aa36 100644 (file)
@@ -826,7 +826,7 @@ static int ms_network_connect(ms_conn_t *c,
     if (error != EAI_SYSTEM)
       fprintf(stderr, "getaddrinfo(): %s.\n", gai_strerror(error));
     else
-      perror("getaddrinfo()\n");
+      perror("getaddrinfo()");
 
     return -1;
   }
@@ -1169,7 +1169,7 @@ static int ms_ascii_process_line(ms_conn_t *c, char *command)
       {
         printf("<%d ERROR %s\n", c->sfd, strerror(errno));
       }
-      c->currcmd.key_prefix= *(uint64_t *)tokens[KEY_TOKEN].value;
+      memcpy(&c->currcmd.key_prefix, tokens[KEY_TOKEN].value, sizeof(c->currcmd.key_prefix));
 
       /*
        *  We read the \r\n into the string since not doing so is more
index 6cb367a3bef2a1e6d1c7bfeadee93d6bb6f2e2d5..289466e03af2d658d7539a64acf7f388467e43a3 100644 (file)
@@ -320,7 +320,7 @@ static void ms_no_config_file()
   if (fd == NULL)
   {
     fprintf(stderr, "Could not create default configure file %s\n", userpath);
-    perror(strerror(errno));
+    perror("fopen");
     exit(1);
   }
   fprintf(fd, "%s", DEFAULT_CONGIF_STR);
@@ -843,7 +843,7 @@ static void ms_init_random_block()
  */
 static void ms_print_setting()
 {
-  fprintf(stdout, "servers : %s\n", ms_setting.srv_str);
+  fprintf(stdout, "servers: %s\n", ms_setting.srv_str);
   fprintf(stdout, "threads count: %d\n", ms_setting.nthreads);
   fprintf(stdout, "concurrency: %d\n", ms_setting.nconns);
   if (ms_setting.run_time > 0)
index ebb39afe84a755f11b8da79f8ca69ac91b1f7f2d..9ea8cd2ca363a6e404553cbd322be66b18420849 100644 (file)
@@ -8,6 +8,10 @@ check_decl(pipe2 unistd.h)
 check_decl(SOCK_NONBLOCK sys/socket.h)
 check_decl(SOCK_CLOEXEC sys/socket.h)
 
+if(ENABLE_MEMASLAP AND LIBEVENT AND HAVE_C_STDATOMIC)
+    set(HAVE_MEMASLAP 1)
+endif()
+
 file(GLOB_RECURSE TESTING_SRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)
 set(TESTING_ROOT ${CMAKE_CURRENT_BINARY_DIR})
 set_source_files_properties(main.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON)
index 91843964527538ecf40ceade4b0b812a0f5a010a..40101a63caf6c8d16e4f13e9975fa83f3aa4152b 100644 (file)
@@ -1,5 +1,6 @@
 #pragma once
 
+#cmakedefine HAVE_MEMASLAP 1
 #cmakedefine HAVE_PIPE2 1
 #cmakedefine HAVE_SOCK_NONBLOCK 1
 #cmakedefine HAVE_SOCK_CLOEXEC 1
diff --git a/test/tests/bin/memaslap.cpp b/test/tests/bin/memaslap.cpp
new file mode 100644 (file)
index 0000000..e2c6182
--- /dev/null
@@ -0,0 +1,55 @@
+#include "test/lib/common.hpp"
+#include "test/lib/Shell.hpp"
+#include "test/lib/MemcachedCluster.hpp"
+
+#if HAVE_MEMASLAP
+
+using Catch::Matchers::Contains;
+
+TEST_CASE("bin/memaslap") {
+  Shell sh{string{TESTING_ROOT "/../src/bin"}};
+
+  SECTION("no servers provided") {
+    string output;
+    REQUIRE_FALSE(sh.run("memaslap", output));
+    REQUIRE_THAT(output, Contains("No servers provided\n"));
+  }
+
+  SECTION("--help") {
+    string output;
+
+    REQUIRE(sh.run("memaslap --help", output));
+    REQUIRE_THAT(output, Contains("memaslap"));
+    REQUIRE_THAT(output, Contains("v1"));
+    /* FIXME
+    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 servers") {
+    auto test = MemcachedCluster::network();
+    auto examples = {
+        " -t 2s -S 1s",
+        " -t 2s -v 0.2 -e 0.05 -b",
+        " -t 2s -w 40k -S 20s -o 0.2",
+        " -t 2s -T 4 -c 128 -d 20 -P 40k",
+        " -t 2s -d 50 -a -n 10",
+    };
+    string servers{"-s "};
+
+    for (const auto &server : test.cluster.getServers()) {
+      servers += "127.0.0.1:" + to_string(get<int>(server.getSocketOrPort())) + ",";
+    }
+    for (const auto args : examples) {
+      string output;
+      INFO(args);
+      REQUIRE(sh.run("memaslap " + servers + args, output));
+      REQUIRE_THAT(output, Contains("TPS"));
+    }
+  }
+}
+#endif // HAVE_MEMASLAP