diff options
| author | Nat Goodspeed <nat@lindenlab.com> | 2012-01-17 21:40:41 -0500 | 
|---|---|---|
| committer | Nat Goodspeed <nat@lindenlab.com> | 2012-01-17 21:40:41 -0500 | 
| commit | 4bfd84d3be8d33bc6eb0dab22d2b3034de0800c9 (patch) | |
| tree | c3cdcd83be36f7721fe8c517aef6e5180f3138e7 /indra | |
| parent | 2ae9f921f2e1d6bd10e4c334a19312761a914046 (diff) | |
Add tests for child-process args management and for kill() method.
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llcommon/tests/llprocesslauncher_test.cpp | 80 | 
1 files changed, 79 insertions, 1 deletions
| diff --git a/indra/llcommon/tests/llprocesslauncher_test.cpp b/indra/llcommon/tests/llprocesslauncher_test.cpp index 310271e465..4f6a6ed922 100644 --- a/indra/llcommon/tests/llprocesslauncher_test.cpp +++ b/indra/llcommon/tests/llprocesslauncher_test.cpp @@ -23,6 +23,8 @@  #include "apr_thread_proc.h"  #include <boost/foreach.hpp>  #include <boost/function.hpp> +#include <boost/algorithm/string/find_iterator.hpp> +#include <boost/algorithm/string/finder.hpp>  //#include <boost/lambda/lambda.hpp>  //#include <boost/lambda/bind.hpp>  // other Linden headers @@ -513,7 +515,7 @@ namespace tut          set_test_name("setWorkingDirectory()");          // We want to test setWorkingDirectory(). But what directory is          // guaranteed to exist on every machine, under every OS? Have to -        // create one. +        // create one. Naturally, ensure we clean it up when done.          NamedTempDir tempdir;          PythonProcessLauncher py("getcwd()",                                   "import os, sys\n" @@ -523,4 +525,80 @@ namespace tut          py.mPy.setWorkingDirectory(tempdir.getName());          ensure_equals("os.getcwd()", py.run_read(), tempdir.getName());      } + +    template<> template<> +    void object::test<4>() +    { +        set_test_name("clearArguments()"); +        PythonProcessLauncher py("args", +                                 "import sys\n" +                                 // note nonstandard output-file arg! +                                 "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] +        std::string output(py.run_read()); +        boost::split_iterator<std::string::const_iterator> +            li(output, boost::first_finder("\n")), lend; +        ensure("didn't get first arg", li != lend); +        std::string arg(li->begin(), li->end()); +        ensure_equals(arg, "first arg"); +        ++li; +        ensure("didn't get second arg", li != lend); +        arg.assign(li->begin(), li->end()); +        ensure_equals(arg, "second arg"); +        ++li; +        ensure("didn't get output filename?!", li != lend); +        arg.assign(li->begin(), li->end()); +        ensure("output filename empty?!", ! arg.empty()); +        ++li; +        ensure("too many args", li == lend); +    } + +    template<> template<> +    void object::test<5>() +    { +        set_test_name("kill()"); +        PythonProcessLauncher py("kill()", +                                 "import sys, time\n" +                                 "with open(sys.argv[1], 'w') as f:\n" +                                 "    f.write('ok')\n" +                                 "# now sleep; expect caller to kill\n" +                                 "time.sleep(120)\n" +                                 "# if caller hasn't managed to kill by now, bad\n" +                                 "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); +        // 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(out.getName(), "from kill() 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 sleeping. +        py.mPy.kill(); +        // wait for the script to terminate... one way or another. +        while (py.mPy.isRunning()) +        { +            sleep(1); +        } +        // If kill() failed, the script would have woken up on its own and +        // overwritten the file with 'bad'. But if kill() succeeded, it should +        // not have had that chance. +        ensure_equals("kill() script output", readfile(out.getName()), "ok"); +    }  } // namespace tut | 
