Sync libtest.
authorBrian Aker <brian@tangent.org>
Mon, 26 Mar 2012 18:36:47 +0000 (11:36 -0700)
committerBrian Aker <brian@tangent.org>
Mon, 26 Mar 2012 18:36:47 +0000 (11:36 -0700)
libtest/cmdline.cc
libtest/cmdline.h
libtest/fatal.hpp
libtest/server.cc
libtest/server.h
libtest/server_container.cc
libtest/test.cc
libtest/unittest.cc

index b93d8aba096b10fa5cf0a81307877f18e159ea6c..cad294671f22fca0310cf0f1dd507480fde9098c 100644 (file)
@@ -116,7 +116,7 @@ Application::Application(const std::string& arg, const bool _use_libtool_arg) :
     {
       if (libtool() == NULL)
       {
-        throw "libtool requested, but know libtool was found";
+        throw fatal_message("libtool requested, but know libtool was found");
       }
     }
 
@@ -143,6 +143,7 @@ Application::Application(const std::string& arg, const bool _use_libtool_arg) :
 
 Application::~Application()
 {
+  murder();
   delete_argv();
 }
 
@@ -234,6 +235,7 @@ Application::error_t Application::run(const char *args[])
 
   if (spawn_ret)
   {
+    _pid= -1;
     return Application::INVALID;
   }
 
@@ -300,6 +302,7 @@ bool Application::slurp()
     return false;
   }
 
+  bool data_was_read= false;
   if (fds[0].revents & POLLIN)
   {
     ssize_t read_length;
@@ -320,6 +323,8 @@ bool Application::slurp()
 
         break;
       }
+
+      data_was_read= true;
       _stdout_buffer.reserve(read_length +1);
       for (size_t x= 0; x < read_length; x++)
       {
@@ -351,6 +356,8 @@ bool Application::slurp()
 
         break;
       }
+
+      data_was_read= true;
       _stderr_buffer.reserve(read_length +1);
       for (size_t x= 0; x < read_length; x++)
       {
@@ -360,12 +367,15 @@ bool Application::slurp()
     }
   }
 
-  return true;
+  return data_was_read;
 }
 
-Application::error_t Application::wait()
+Application::error_t Application::wait(bool nohang)
 {
-  fatal_assert(_pid != -1);
+  if (_pid == -1)
+  {
+    return Application::INVALID;
+  }
 
   slurp();
 
@@ -373,7 +383,7 @@ Application::error_t Application::wait()
   {
     int status= 0;
     pid_t waited_pid;
-    if ((waited_pid= waitpid(_pid, &status, 0)) == -1)
+    if ((waited_pid= waitpid(_pid, &status, nohang ? WNOHANG : 0)) == -1)
     {
       switch (errno)
       {
@@ -385,6 +395,10 @@ Application::error_t Application::wait()
         Error << "Error occured while waitpid(" << strerror(errno) << ") on pid " << int(_pid);
       }
     }
+    else if (waited_pid == 0)
+    {
+      exit_code= Application::SUCCESS;
+    }
     else
     {
       if (waited_pid != _pid)
@@ -453,7 +467,7 @@ void Application::Pipe::reset()
 
   if (pipe(_fd) == -1)
   {
-    throw strerror(errno);
+    throw fatal_message(strerror(errno));
   }
   _open[0]= true;
   _open[1]= true;
@@ -478,13 +492,13 @@ void Application::Pipe::dup_for_spawn(const close_t& arg, posix_spawn_file_actio
   if ((ret= posix_spawn_file_actions_adddup2(&file_actions, _fd[type], newfildes )) < 0)
   {
     Error << "posix_spawn_file_actions_adddup2(" << strerror(ret) << ")";
-    throw strerror(ret);
+    throw fatal_message(strerror(ret));
   }
 
   if ((ret= posix_spawn_file_actions_addclose(&file_actions, _fd[type])) < 0)
   {
     Error << "posix_spawn_file_actions_adddup2(" << strerror(ret) << ")";
-    throw strerror(ret);
+    throw fatal_message(strerror(ret));
   }
 }
 
@@ -640,7 +654,7 @@ int exec_cmdline(const std::string& command, const char *args[], bool use_libtoo
     return int(ret);
   }
 
-  return int(app.wait());
+  return int(app.wait(false));
 }
 
 const char *gearmand_binary() 
index 0f0699251d80461d85775472069249bf57d20619..7b0afc5ffc27310374ac7e3457d1c5e7d8df7536 100644 (file)
@@ -74,7 +74,7 @@ public:
   void add_option(const std::string&, const std::string&);
   void add_long_option(const std::string& option_name, const std::string& option_value);
   error_t run(const char *args[]= NULL);
-  error_t wait();
+  error_t wait(bool nohang= true);
 
   libtest::vchar_t stdout_result() const
   {
@@ -120,6 +120,11 @@ public:
     return  _gdb_filename;
   }
 
+  pid_t pid() const
+  {
+    return _pid;
+  }
+
 private:
   void create_argv(const char *args[]);
   void delete_argv();
index 23f47bd9d65b9decad8286ee03ad864160a0be98..61fe4b02acb210c65bf0e4e2f7a6c00f8ecfcd9e 100644 (file)
@@ -55,5 +55,5 @@ private:
 
 } // namespace libtest
 
-#define fatal_message(__mesg) libtest::fatal(LIBYATL_DEFAULT_PARAM, __mesg)
-#define fatal_assert(__assert) if((__assert)) {} else { libtest::fatal(LIBYATL_DEFAULT_PARAM, #__assert); }
+#define fatal_message(__mesg) libtest::fatal(LIBYATL_DEFAULT_PARAM, "%s", __mesg)
+#define fatal_assert(__assert) if((__assert)) {} else { libtest::fatal(LIBYATL_DEFAULT_PARAM, "%s", #__assert); }
index 55713d45ced450d831bb71d971c98b6371156b02..da341f9528d5c08bebeea22524a3ec9adf695cf5 100644 (file)
@@ -90,16 +90,6 @@ Server::Server(const std::string& host_arg, const in_port_t port_arg,
 
 Server::~Server()
 {
-  if (has_pid() and not kill(_pid))
-  {
-    Error << "Unable to kill:" << *this;
-  }
-
-  Application::error_t ret;
-  if (Application::SUCCESS !=  (ret= _app.wait()))
-  {
-    Error << "Application::wait() " << _running << " " << ret << ": " << _app.stderr_result();
-  }
 }
 
 bool Server::check()
@@ -119,13 +109,12 @@ bool Server::cycle()
   uint32_t limit= 3;
 
   // 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()))
+         is_pid_valid(_app.pid()))
   {
-    if (kill(current_pid))
+    if (kill())
     {
-      Log << "Killed existing server," << *this << " with pid:" << current_pid;
+      Log << "Killed existing server," << *this;
       dream(0, 50000);
       continue;
     }
@@ -134,7 +123,7 @@ bool Server::cycle()
   // For whatever reason we could not kill it, and we reached limit
   if (limit == 0)
   {
-    Error << "Reached limit, could not kill server pid:" << current_pid;
+    Error << "Reached limit, could not kill server";
     return false;
   }
 
@@ -148,15 +137,15 @@ bool Server::wait_for_pidfile() const
   return wait.successful();
 }
 
+bool Server::has_pid() const
+{
+  return (_pid > 1);
+}
+
+
 bool Server::start()
 {
   // If we find that we already have a pid then kill it.
-  if (has_pid() and kill(_pid) == false)
-  {
-    Error << "Could not kill() existing server during start() pid:" << _pid;
-    return false;
-  }
-
   if (has_pid() == false)
   {
     fatal_message("has_pid() failed, programer error");
@@ -402,9 +391,9 @@ bool Server::args(Application& app)
   return true;
 }
 
-bool Server::kill(pid_t pid_arg)
+bool Server::kill()
 {
-  if (check_pid(pid_arg) and kill_pid(pid_arg)) // If we kill it, reset
+  if (check_pid(_app.pid()) and kill_pid(_app.pid())) // If we kill it, reset
   {
     if (broken_pid_file() and pid_file().empty() == false)
     {
index 68d5e2265053458a32864d3ed22f58eff4fd18cf..1aa16ca0a19767b95664e5f4fe3055d1608ecf65 100644 (file)
@@ -202,10 +202,7 @@ public:
     return _pid;
   }
 
-  bool has_pid() const
-  {
-    return (_pid > 1);
-  }
+  bool has_pid() const;
 
   virtual bool wait_for_pidfile() const;
 
@@ -228,7 +225,7 @@ public:
 
   std::string log_and_pid();
 
-  bool kill(pid_t pid_arg);
+  bool kill();
   bool start();
   bool command(libtest::Application& app);
 
index 1b5229ccd50484c6414d7fa78b5146a5210c2f02..d406c16e497a15591739a58977c5d24bb9d7f665 100644 (file)
@@ -82,7 +82,7 @@ bool server_startup_st::shutdown(uint32_t number_of_host)
   {
     Server* tmp= servers[number_of_host];
 
-    if (tmp and tmp->has_pid() and not tmp->kill(tmp->pid()))
+    if (tmp and tmp->has_pid() and tmp->kill() == false)
     { }
     else
     {
@@ -119,7 +119,7 @@ void server_startup_st::shutdown()
 {
   for (std::vector<Server *>::iterator iter= servers.begin(); iter != servers.end(); iter++)
   {
-    if ((*iter)->has_pid() and not (*iter)->kill((*iter)->pid()))
+    if ((*iter)->has_pid() and (*iter)->kill() == false)
     {
       Error << "Unable to kill:" <<  *(*iter);
     }
index 3e5713c90485b004fa06c24e86272721f46e50ec..fb18e0ea892772767961cd06c285c40c1dd298b9 100644 (file)
@@ -350,6 +350,11 @@ int main(int argc, char *argv[])
             }
           }
 
+          catch (libtest::fatal &e)
+          {
+            Error << "Fatal exception was thrown: " << e.what();
+            return_code= TEST_FAILURE;
+          }
           catch (std::exception &e)
           {
             Error << "Exception was thrown: " << e.what();
index 10d6c062de2cc8b3a814b78d7806d51f81fad0c7..d295b5a9a4c2e2f21559ead27757c7888259d2f1 100644 (file)
@@ -471,6 +471,8 @@ static test_return_t application_echo_fubar_BINARY(void *)
   test_compare(Application::SUCCESS, true_app.run(args));
   test_compare(Application::SUCCESS, true_app.wait());
 
+  while (true_app.slurp() == false) {} ;
+
   libtest::vchar_t response;
   make_vector(response, test_literal_param("fubar\n"));
   test_compare(response, true_app.stdout_result());
@@ -486,6 +488,7 @@ static test_return_t application_echo_fubar_BINARY2(void *)
 
   test_compare(Application::SUCCESS, true_app.run());
   test_compare(Application::SUCCESS, true_app.wait());
+
   libtest::vchar_t response;
   make_vector(response, test_literal_param("fubar\n"));
   test_compare(response, true_app.stdout_result());