diff options
Diffstat (limited to 'indra/llcommon/tests')
| -rw-r--r-- | indra/llcommon/tests/llprocess_test.cpp (renamed from indra/llcommon/tests/llprocesslauncher_test.cpp) | 130 | ||||
| -rw-r--r-- | indra/llcommon/tests/llsdserialize_test.cpp | 13 | 
2 files changed, 66 insertions, 77 deletions
| diff --git a/indra/llcommon/tests/llprocesslauncher_test.cpp b/indra/llcommon/tests/llprocess_test.cpp index 057f83631e..55e22abd81 100644 --- a/indra/llcommon/tests/llprocesslauncher_test.cpp +++ b/indra/llcommon/tests/llprocess_test.cpp @@ -1,8 +1,8 @@  /** - * @file   llprocesslauncher_test.cpp + * @file   llprocess_test.cpp   * @author Nat Goodspeed   * @date   2011-12-19 - * @brief  Test for llprocesslauncher. + * @brief  Test for llprocess.   *    * $LicenseInfo:firstyear=2011&license=viewerlgpl$   * Copyright (c) 2011, Linden Research, Inc. @@ -12,7 +12,7 @@  // Precompiled header  #include "linden_common.h"  // associated header -#include "llprocesslauncher.h" +#include "llprocess.h"  // STL headers  #include <vector>  #include <list> @@ -32,6 +32,7 @@  #include "../test/manageapr.h"  #include "../test/namedtempfile.h"  #include "stringize.h" +#include "llsdutil.h"  #if defined(LL_WINDOWS)  #define sleep(secs) _sleep((secs) * 1000) @@ -88,7 +89,7 @@ static std::string readfile(const std::string& pathname, const std::string& desc  }  /** - * Construct an LLProcessLauncher to run a Python script. + * Construct an LLProcess to run a Python script.   */  struct PythonProcessLauncher  { @@ -106,30 +107,30 @@ struct PythonProcessLauncher          const char* PYTHON(getenv("PYTHON"));          tut::ensure("Set $PYTHON to the Python interpreter", PYTHON); -        mPy.setExecutable(PYTHON); -        mPy.addArgument(mScript.getName()); +        mParams["executable"] = PYTHON; +        mParams["args"].append(mScript.getName());      }      /// Run Python script and wait for it to complete.      void run()      { -        tut::ensure_equals(STRINGIZE("Couldn't launch " << mDesc << " script"), -                           mPy.launch(), 0); -        // One of the irritating things about LLProcessLauncher is that +        mPy = LLProcess::create(mParams); +        tut::ensure(STRINGIZE("Couldn't launch " << mDesc << " script"), mPy); +        // One of the irritating things about LLProcess is that          // there's no API to wait for the child to terminate -- but given          // its use in our graphics-intensive interactive viewer, it's          // understandable. -        while (mPy.isRunning()) +        while (mPy->isRunning())          {              sleep(1);          }      }      /** -     * Run a Python script using LLProcessLauncher, expecting that it will +     * Run a Python script using LLProcess, expecting that it will       * write to the file passed as its sys.argv[1]. Retrieve that output.       * -     * Until January 2012, LLProcessLauncher provided distressingly few +     * Until January 2012, LLProcess provided distressingly few       * mechanisms for a child process to communicate back to its caller --       * not even its return code. We've introduced a convention by which we       * create an empty temp file, pass the name of that file to our child @@ -141,13 +142,14 @@ struct PythonProcessLauncher      {          NamedTempFile out("out", ""); // placeholder          // pass name of this temporary file to the script -        mPy.addArgument(out.getName()); +        mParams["args"].append(out.getName());          run();          // assuming the script wrote to that file, read it          return readfile(out.getName(), STRINGIZE("from " << mDesc << " script"));      } -    LLProcessLauncher mPy; +    LLSD mParams; +    LLProcessPtr mPy;      std::string mDesc;      NamedTempFile mScript;  }; @@ -203,13 +205,13 @@ private:  *****************************************************************************/  namespace tut  { -    struct llprocesslauncher_data +    struct llprocess_data      {          LLAPRPool pool;      }; -    typedef test_group<llprocesslauncher_data> llprocesslauncher_group; -    typedef llprocesslauncher_group::object object; -    llprocesslauncher_group llprocesslaunchergrp("llprocesslauncher"); +    typedef test_group<llprocess_data> llprocess_group; +    typedef llprocess_group::object object; +    llprocess_group llprocessgrp("llprocess");      struct Item      { @@ -502,17 +504,6 @@ namespace tut      template<> template<>      void object::test<2>()      { -        set_test_name("set/getExecutable()"); -        LLProcessLauncher child; -        child.setExecutable("nonsense string"); -        ensure_equals("setExecutable() 0", child.getExecutable(), "nonsense string"); -        child.setExecutable("python"); -        ensure_equals("setExecutable() 1", child.getExecutable(), "python"); -    } - -    template<> template<> -    void object::test<3>() -    {          set_test_name("setWorkingDirectory()");          // We want to test setWorkingDirectory(). But what directory is          // guaranteed to exist on every machine, under every OS? Have to @@ -524,14 +515,14 @@ namespace tut                                   "with open(sys.argv[1], 'w') as f:\n"                                   "    f.write(os.getcwd())\n");          // Before running, call setWorkingDirectory() -        py.mPy.setWorkingDirectory(tempdir.getName()); +        py.mParams["cwd"] = tempdir.getName();          ensure_equals("os.getcwd()", py.run_read(), tempdir.getName());      }      template<> template<> -    void object::test<4>() +    void object::test<3>()      { -        set_test_name("clearArguments()"); +        set_test_name("arguments");          PythonProcessLauncher py("args",                                   "from __future__ import with_statement\n"                                   "import sys\n" @@ -539,15 +530,11 @@ namespace tut                                   "with open(sys.argv[3], 'w') as f:\n"                                   "    for arg in sys.argv[1:]:\n"                                   "        print >>f, arg\n"); -        // We expect that PythonProcessLauncher has already called -        // addArgument() with the name of its own NamedTempFile. But let's -        // change it up. -        py.mPy.clearArguments(); -        // re-add script pathname -        py.mPy.addArgument(py.mScript.getName()); // sys.argv[0] -        py.mPy.addArgument("first arg");          // sys.argv[1] -        py.mPy.addArgument("second arg");         // sys.argv[2] -        // run_read() calls addArgument() one more time, hence [3] +        // We expect that PythonProcessLauncher has already appended +        // its own NamedTempFile to mParams["args"] (sys.argv[0]). +        py.mParams["args"].append("first arg");          // sys.argv[1] +        py.mParams["args"].append("second arg");         // sys.argv[2] +        // run_read() appends() one more argument, hence [3]          std::string output(py.run_read());          boost::split_iterator<std::string::const_iterator>              li(output, boost::first_finder("\n")), lend; @@ -567,7 +554,7 @@ namespace tut      }      template<> template<> -    void object::test<5>() +    void object::test<4>()      {          set_test_name("explicit kill()");          PythonProcessLauncher py("kill()", @@ -581,8 +568,9 @@ namespace tut                                   "with open(sys.argv[1], 'w') as f:\n"                                   "    f.write('bad')\n");          NamedTempFile out("out", "not started"); -        py.mPy.addArgument(out.getName()); -        ensure_equals("couldn't launch kill() script", py.mPy.launch(), 0); +        py.mParams["args"].append(out.getName()); +        py.mPy = LLProcess::create(py.mParams); +        ensure("couldn't launch kill() script", py.mPy);          // Wait for the script to wake up and do its first write          int i = 0, timeout = 60;          for ( ; i < timeout; ++i) @@ -594,9 +582,9 @@ namespace tut          // If we broke this loop because of the counter, something's wrong          ensure("script never started", i < timeout);          // script has performed its first write and should now be sleeping. -        py.mPy.kill(); +        py.mPy->kill();          // wait for the script to terminate... one way or another. -        while (py.mPy.isRunning()) +        while (py.mPy->isRunning())          {              sleep(1);          } @@ -607,11 +595,11 @@ namespace tut      }      template<> template<> -    void object::test<6>() +    void object::test<5>()      {          set_test_name("implicit kill()");          NamedTempFile out("out", "not started"); -        LLProcessLauncher::ll_pid_t pid(0); +        LLProcess::id pid(0);          {              PythonProcessLauncher py("kill()",                                       "from __future__ import with_statement\n" @@ -623,10 +611,11 @@ namespace tut                                       "# if caller hasn't managed to kill by now, bad\n"                                       "with open(sys.argv[1], 'w') as f:\n"                                       "    f.write('bad')\n"); -            py.mPy.addArgument(out.getName()); -            ensure_equals("couldn't launch kill() script", py.mPy.launch(), 0); -            // Capture ll_pid_t for later -            pid = py.mPy.getProcessID(); +            py.mParams["args"].append(out.getName()); +            py.mPy = LLProcess::create(py.mParams); +            ensure("couldn't launch kill() script", py.mPy); +            // Capture id for later +            pid = py.mPy->getProcessID();              // Wait for the script to wake up and do its first write              int i = 0, timeout = 60;              for ( ; i < timeout; ++i) @@ -638,10 +627,10 @@ namespace tut              // If we broke this loop because of the counter, something's wrong              ensure("script never started", i < timeout);              // Script has performed its first write and should now be sleeping. -            // Destroy the LLProcessLauncher, which should kill the child. +            // Destroy the LLProcess, which should kill the child.          }          // wait for the script to terminate... one way or another. -        while (LLProcessLauncher::isRunning(pid)) +        while (LLProcess::isRunning(pid))          {              sleep(1);          } @@ -652,14 +641,14 @@ namespace tut      }      template<> template<> -    void object::test<7>() +    void object::test<6>()      { -        set_test_name("orphan()"); +        set_test_name("autokill");          NamedTempFile from("from", "not started");          NamedTempFile to("to", ""); -        LLProcessLauncher::ll_pid_t pid(0); +        LLProcess::id pid(0);          { -            PythonProcessLauncher py("orphan()", +            PythonProcessLauncher py("autokill",                                       "from __future__ import with_statement\n"                                       "import sys, time\n"                                       "with open(sys.argv[1], 'w') as f:\n" @@ -678,25 +667,24 @@ namespace tut                                       "# okay, saw 'go', write 'ack'\n"                                       "with open(sys.argv[1], 'w') as f:\n"                                       "    f.write('ack')\n"); -            py.mPy.addArgument(from.getName()); -            py.mPy.addArgument(to.getName()); -            ensure_equals("couldn't launch kill() script", py.mPy.launch(), 0); -            // Capture ll_pid_t for later -            pid = py.mPy.getProcessID(); +            py.mParams["args"].append(from.getName()); +            py.mParams["args"].append(to.getName()); +            py.mParams["autokill"] = false; +            py.mPy = LLProcess::create(py.mParams); +            ensure("couldn't launch kill() script", py.mPy); +            // Capture id for later +            pid = py.mPy->getProcessID();              // Wait for the script to wake up and do its first write              int i = 0, timeout = 60;              for ( ; i < timeout; ++i)              {                  sleep(1); -                if (readfile(from.getName(), "from orphan() script") == "ok") +                if (readfile(from.getName(), "from autokill script") == "ok")                      break;              }              // If we broke this loop because of the counter, something's wrong              ensure("script never started", i < timeout); -            // Script has performed its first write and should now be waiting -            // for us. Orphan it. -            py.mPy.orphan(); -            // Now destroy the LLProcessLauncher, which should NOT kill the child! +            // Now destroy the LLProcess, which should NOT kill the child!          }          // If the destructor killed the child anyway, give it time to die          sleep(2); @@ -707,12 +695,12 @@ namespace tut              outf << "go";          } // flush and close.          // now wait for the script to terminate... one way or another. -        while (LLProcessLauncher::isRunning(pid)) +        while (LLProcess::isRunning(pid))          {              sleep(1);          } -        // If the LLProcessLauncher destructor implicitly called kill(), the +        // If the LLProcess destructor implicitly called kill(), the          // script could not have written 'ack' as we expect. -        ensure_equals("orphan() script output", readfile(from.getName()), "ack"); +        ensure_equals("autokill script output", readfile(from.getName()), "ack");      }  } // namespace tut diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp index 4359e9afb9..7756ba6226 100644 --- a/indra/llcommon/tests/llsdserialize_test.cpp +++ b/indra/llcommon/tests/llsdserialize_test.cpp @@ -40,7 +40,7 @@ typedef U32 uint32_t;  #include <fcntl.h>  #include <sys/stat.h>  #include <sys/wait.h> -#include "llprocesslauncher.h" +#include "llprocess.h"  #endif  #include "boost/range.hpp" @@ -1557,14 +1557,15 @@ namespace tut              }  #else  // LL_DARWIN, LL_LINUX -            LLProcessLauncher py; -            py.setExecutable(PYTHON); -            py.addArgument(scriptfile.getName()); -            ensure_equals(STRINGIZE("Couldn't launch " << desc << " script"), py.launch(), 0); +            LLSD params; +            params["executable"] = PYTHON; +            params["args"].append(scriptfile.getName()); +            LLProcessPtr py(LLProcess::create(params)); +            ensure(STRINGIZE("Couldn't launch " << desc << " script"), py);              // Implementing timeout would mean messing with alarm() and              // catching SIGALRM... later maybe...              int status(0); -            if (waitpid(py.getProcessID(), &status, 0) == -1) +            if (waitpid(py->getProcessID(), &status, 0) == -1)              {                  int waitpid_errno(errno);                  ensure_equals(STRINGIZE("Couldn't retrieve rc from " << desc << " script: " | 
