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: " |