Fixes to test memcp
authorBrian Aker <brian@tangent.org>
Fri, 3 May 2013 20:00:36 +0000 (16:00 -0400)
committerBrian Aker <brian@tangent.org>
Fri, 3 May 2013 20:00:36 +0000 (16:00 -0400)
clients/memcp.cc
libtest/cmdline.cc
libtest/tmpfile.cc
libtest/tmpfile.hpp
tests/cli.am
tests/memcp.cc

index 7986e24812d337c403dd9f52e6c2e7ad2192b2b0..7aa805f95865a019e9c982816c8d704397bd33cc 100644 (file)
@@ -194,7 +194,13 @@ int main(int argc, char *argv[])
     }
 
     struct stat sbuf;
-    (void)fstat(fd, &sbuf);
+    if (fstat(fd, &sbuf) == -1)
+    {
+      std::cerr << "memcp " << argv[optind] << " " << strerror(errno) << std::endl;
+      optind++;
+      exit_code= EXIT_FAILURE;
+      continue;
+    }
 
     char *ptr= rindex(argv[optind], '/');
     if (ptr)
@@ -215,27 +221,33 @@ int main(int argc, char *argv[])
             ptr, opt_flags, (unsigned long)opt_expires);
     }
 
-    char *file_buffer_ptr;
-    if ((file_buffer_ptr= (char *)malloc(sizeof(char) * (size_t)sbuf.st_size)) == NULL)
+    // The file may be empty
+    char *file_buffer_ptr= NULL;
+    if (sbuf.st_size > 0)
     {
-      std::cerr << "Error allocating file buffer(" << strerror(errno) << ")" << std::endl;
-      close(fd);
-      exit(EXIT_FAILURE);
-    }
+      if ((file_buffer_ptr= (char *)malloc(sizeof(char) * (size_t)sbuf.st_size)) == NULL)
+      {
+        std::cerr << "Error allocating file buffer(" << strerror(errno) << ")" << std::endl;
+        close(fd);
+        exit(EXIT_FAILURE);
+      }
 
-    ssize_t read_length;
-    if ((read_length= ::read(fd, file_buffer_ptr, (size_t)sbuf.st_size)) == -1)
-    {
-      std::cerr << "Error while reading file " << file_buffer_ptr << " (" << strerror(errno) << ")" << std::endl;
-      close(fd);
-      exit(EXIT_FAILURE);
-    }
+      ssize_t read_length;
+      if ((read_length= ::read(fd, file_buffer_ptr, (size_t)sbuf.st_size)) == -1)
+      {
+        std::cerr << "Error while reading file " << file_buffer_ptr << " (" << strerror(errno) << ")" << std::endl;
+        close(fd);
+        free(file_buffer_ptr);
+        exit(EXIT_FAILURE);
+      }
 
-    if (read_length != sbuf.st_size)
-    {
-      std::cerr << "Failure while reading file. Read length was not equal to stat() length" << std::endl;
-      close(fd);
-      exit(EXIT_FAILURE);
+      if (read_length != sbuf.st_size)
+      {
+        std::cerr << "Failure while reading file. Read length was not equal to stat() length" << std::endl;
+        close(fd);
+        free(file_buffer_ptr);
+        exit(EXIT_FAILURE);
+      }
     }
 
     memcached_return_t rc;
@@ -261,7 +273,6 @@ int main(int argc, char *argv[])
     if (memcached_failed(rc))
     {
       std::cerr << "Error occrrured during memcached_set(): " << memcached_last_error_message(memc) << std::endl;
-      ::close(fd);
       exit_code= EXIT_FAILURE;
     }
 
index 3ecf63df31ac2275325043cdd53b15f2a8fd452c..94c41814a0af35236d8cb6b37f13783427699311 100644 (file)
@@ -409,7 +409,7 @@ bool Application::slurp()
 
 Application::error_t Application::join()
 {
-  pid_t waited_pid= waitpid(_pid, &_status, 0);
+  pid_t waited_pid= waitpid(_pid, &_status, WUNTRACED);
   slurp();
   if (waited_pid == _pid and WIFEXITED(_status) == false)
   {
index a88c0edea95c2380e80b490bf8bd4b580ad61765..425a21e7b730fe15c3ae73c9041a17b5dcbc8992 100644 (file)
@@ -40,7 +40,7 @@
 
 namespace libtest {
 
-std::string create_tmpfile(const std::string& name)
+std::string create_tmpfile(const std::string& name, int& fd)
 {
   libtest::vchar_t file_buffer;
   file_buffer.resize(FILENAME_MAX);
@@ -49,15 +49,22 @@ std::string create_tmpfile(const std::string& name)
   int length= snprintf(&file_buffer[0], file_buffer.size(), "var/tmp/%s.XXXXXX", name.c_str());
   fatal_assert(length > 0);
 
-  int fd;
   if ((fd= mkstemp(&file_buffer[0])) == -1)
   {
     throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "mkstemp() failed on %s with %s", &file_buffer[0], strerror(errno));
   }
-  close(fd);
-  unlink(&file_buffer[0]);
 
   return &file_buffer[0];
 }
 
+std::string create_tmpfile(const std::string& name)
+{
+  int fd;
+  std::string ret_file= create_tmpfile(name, fd);
+  close(fd);
+  unlink(ret_file.c_str());
+
+  return ret_file.c_str();
+}
+
 } // namespace libtest
index 0eb8dca2f31ca752130c574cf15e273efe3b6fcd..9283b84ad1659b3091838e70fefc18204204354a 100644 (file)
@@ -40,6 +40,7 @@
 
 namespace libtest {
 
+std::string create_tmpfile(const std::string&, int&);
 std::string create_tmpfile(const std::string&);
 
 } // namespace libtest
index 573be2af0edaa17f213a9babf2c319e992a56d61..df206e5cd4472505224838d7183e46ad24b61cd7 100644 (file)
@@ -99,6 +99,12 @@ tests_memdump_LDADD=  libtest/libtest.la $(TESTS_LDADDS)
 check_PROGRAMS+= tests/memdump
 noinst_PROGRAMS+= tests/memdump
 
+test-memcp: tests/memcp
+       tests/memcp
+
+gdb-memcp: tests/memcp
+       @$(GDB_COMMAND) tests/memcp
+
 test-memstat: tests/memstat
        tests/memstat
 
index 440f1b1dec8a41a07a6ed1a15d05b7b037a3b75b..7fca2d3621ad22662606da303051a0155a2603d5 100644 (file)
@@ -44,6 +44,8 @@
 #include <libtest/test.hpp>
 #include <libmemcached-1.0/memcached.h>
 
+#include <sys/stat.h>
+
 using namespace libtest;
 
 #ifndef __INTEL_COMPILER
@@ -63,11 +65,20 @@ static test_return_t help_test(void *)
 
 static test_return_t server_test(void *)
 {
+  int fd;
+  std::string tmp_file= create_tmpfile("memcp", fd);
+  ASSERT_TRUE(tmp_file.c_str());
+  struct stat buf;
+  ASSERT_EQ(fstat(fd, &buf), 0);
+  ASSERT_EQ(buf.st_size, 0);
+
   char buffer[1024];
   snprintf(buffer, sizeof(buffer), "--servers=localhost:%d", int(default_port()));
-  const char *args[]= { buffer, 0 };
+  const char *args[]= { buffer, tmp_file.c_str(), 0 };
 
   test_compare(EXIT_SUCCESS, exec_cmdline(executable, args, true));
+  close(fd);
+  unlink(tmp_file.c_str());
 
   return TEST_SUCCESS;
 }