From 8e8eb76eb9d0efabc82fec194f6edb4838c49955 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 10 May 2011 08:21:21 -0400 Subject: 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. --- indra/llmessage/tests/commtest.h | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'indra/llmessage/tests/commtest.h') diff --git a/indra/llmessage/tests/commtest.h b/indra/llmessage/tests/commtest.h index 32035783e2..0fef596df2 100644 --- a/indra/llmessage/tests/commtest.h +++ b/indra/llmessage/tests/commtest.h @@ -35,6 +35,13 @@ #include "llhost.h" #include "stringize.h" #include +#include +#include + +struct CommtestError: public std::runtime_error +{ + CommtestError(const std::string& what): std::runtime_error(what) {} +}; /** * This struct is shared by a couple of standalone comm tests (ADD_COMM_BUILD_TEST). @@ -55,13 +62,24 @@ struct commtest_data replyPump("reply"), errorPump("error"), success(false), - host("127.0.0.1", 8000), + host("127.0.0.1", getport("PORT")), server(STRINGIZE("http://" << host.getString() << "/")) { replyPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, true)); errorPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, false)); } + static int getport(const std::string& var) + { + const char* port = getenv(var.c_str()); + if (! port) + { + throw CommtestError("missing $PORT environment variable"); + } + // This will throw, too, if the value of PORT isn't numeric. + return boost::lexical_cast(port); + } + bool outcome(const LLSD& _result, bool _success) { // std::cout << "commtest_data::outcome(" << _result << ", " << _success << ")\n"; -- cgit v1.2.3