diff options
| author | Nat Goodspeed <nat@lindenlab.com> | 2011-05-10 08:21:21 -0400 | 
|---|---|---|
| committer | Nat Goodspeed <nat@lindenlab.com> | 2011-05-10 08:21:21 -0400 | 
| commit | 8e8eb76eb9d0efabc82fec194f6edb4838c49955 (patch) | |
| tree | 33b55d2c87c1c10e7136385d872e29d3fffc30fe /indra/newview | |
| parent | a5118ccd6721afdf4f8c71cba6007eb7be4d7c19 (diff) | |
CHOP-661: add and use code to listen on next available server port.
In indra/llmessage/tests/testrunner.py, introduce new freeport() function to
try a caller-specified expression (such as instantiating an object that will
listen on a server port) with a range of candidate port numbers until the
expression produces a value instead of EADDRINUSE exception.
Change test_llsdmessage_peer.py and test_llxmlrpc_peer.py to use freeport() to
construct their server class inline BEFORE launching the thread that will run
it, then pass that server's serve_forever method to daemon thread. Also set
os.environ["PORT"] to selected environment variable before running subject
test program.
In indra/llmessage/tests/commtest.h, introduce commtest_data::getport() to
read port number from specified environment variable, throwing exception if
variable not set or non-numeric. Construct default LLHost from getport("PORT")
instead of hardcoded constant.
Change indra/newview/tests/llxmlrpclistener_test.cpp to use commtest_data::
getport("PORT") instead of hardcoded constant. Also use LLSD::with() rather
than older LLSD::insert() syntax.
HOWEVER -- I am irritated to discover that llxmlrpclistener_test IS NOT RUN or
even built by newview/CMakeLists.txt! It's not even commented out -- it's
entirely deleted! I am determined to restore this test. However, as it will
take some fiddling with new link-time dependencies, that will be a separate
commit.
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/tests/llxmlrpclistener_test.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/tests/test_llxmlrpc_peer.py | 21 | 
2 files changed, 20 insertions, 12 deletions
| diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp index 4d5df1043e..711c2a3d51 100644 --- a/indra/newview/tests/llxmlrpclistener_test.cpp +++ b/indra/newview/tests/llxmlrpclistener_test.cpp @@ -40,8 +40,10 @@  #include "llevents.h"  #include "lleventfilter.h"  #include "llsd.h" +#include "llhost.h"  #include "llcontrol.h"  #include "tests/wrapllerrs.h" +#include "tests/commtest.h"  LLControlGroup gSavedSettings("Global"); @@ -54,7 +56,8 @@ namespace tut      {          data():              pumps(LLEventPumps::instance()), -            uri("http://127.0.0.1:8000") +            uri(std::string("http://") + +                LLHost("127.0.0.1", commtest_data::getport("PORT")).getString())          {              // These variables are required by machinery used by              // LLXMLRPCTransaction. The values reflect reality for this test @@ -145,7 +148,7 @@ namespace tut          pumps.obtain("LLXMLRPCTransaction").post(request);          // Set the timer          F32 timeout(10); -        watchdog.eventAfter(timeout, LLSD().insert("timeout", 0)); +        watchdog.eventAfter(timeout, LLSD().with("timeout", 0));          // and pump "mainloop" until we get something, whether from          // LLXMLRPCListener or from the watchdog filter.          LLTimer timer; @@ -182,7 +185,7 @@ namespace tut          pumps.obtain("LLXMLRPCTransaction").post(request);          // Set the timer          F32 timeout(10); -        watchdog.eventAfter(timeout, LLSD().insert("timeout", 0)); +        watchdog.eventAfter(timeout, LLSD().with("timeout", 0));          // and pump "mainloop" until we get something, whether from          // LLXMLRPCListener or from the watchdog filter.          LLTimer timer; @@ -218,7 +221,7 @@ namespace tut          pumps.obtain("LLXMLRPCTransaction").post(request);          // Set the timer          F32 timeout(10); -        watchdog.eventAfter(timeout, LLSD().insert("timeout", 0)); +        watchdog.eventAfter(timeout, LLSD().with("timeout", 0));          // and pump "mainloop" until we get something, whether from          // LLXMLRPCListener or from the watchdog filter.          LLTimer timer; diff --git a/indra/newview/tests/test_llxmlrpc_peer.py b/indra/newview/tests/test_llxmlrpc_peer.py index 1c7204a6b6..281b72a058 100644 --- a/indra/newview/tests/test_llxmlrpc_peer.py +++ b/indra/newview/tests/test_llxmlrpc_peer.py @@ -37,7 +37,7 @@ from SimpleXMLRPCServer import SimpleXMLRPCServer  mydir = os.path.dirname(__file__)       # expected to be .../indra/newview/tests/  sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))  sys.path.insert(1, os.path.join(mydir, os.pardir, os.pardir, "llmessage", "tests")) -from testrunner import run, debug +from testrunner import freeport, run, debug  class TestServer(SimpleXMLRPCServer):      def _dispatch(self, method, params): @@ -66,11 +66,16 @@ class TestServer(SimpleXMLRPCServer):          # Suppress error output as well          pass -class ServerRunner(Thread): -    def run(self): -        server = TestServer(('127.0.0.1', 8000)) -        debug("Starting XMLRPC server...\n") -        server.serve_forever() -  if __name__ == "__main__": -    sys.exit(run(server=ServerRunner(name="xmlrpc"), *sys.argv[1:])) +    # Instantiate a TestServer on the first free port in the specified port +    # range. Doing this inline is better than in a daemon thread: if it blows +    # up here, we'll get a traceback. If it blew up in some other thread, the +    # traceback would get eaten and we'd run the subject test program anyway. +    xmlrpcd, port = freeport(xrange(8000, 8020), +                             lambda port: TestServer(('127.0.0.1', port))) +    # Pass the selected port number to the subject test program via the +    # environment. We don't want to impose requirements on the test program's +    # command-line parsing -- and anyway, for C++ integration tests, that's +    # performed in TUT code rather than our own. +    os.environ["PORT"] = str(port) +    sys.exit(run(server=Thread(name="xmlrpc", target=xmlrpcd.serve_forever), *sys.argv[1:])) | 
