summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llcommon/tests/llleap_test.cpp67
1 files changed, 38 insertions, 29 deletions
diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp
index 0ca8c9b684..bef3bf1543 100644
--- a/indra/llcommon/tests/llleap_test.cpp
+++ b/indra/llcommon/tests/llleap_test.cpp
@@ -83,8 +83,21 @@ namespace tut
llleap_data():
reader(".py",
// This logic is adapted from vita.viewerclient.receiveEvent()
- "import re\n"
+ boost::lambda::_1 <<
+ "import os\n"
"import sys\n"
+ // Don't forget that this Python script is written to some
+ // temp directory somewhere! Its __file__ is useless in
+ // finding indra/lib/python. Use our __FILE__, with
+ // raw-string syntax to deal with Windows pathnames.
+ "mydir = os.path.dirname(r'" << __FILE__ << "')\n"
+ "try:\n"
+ " from llbase import llsd\n"
+ "except ImportError:\n"
+ // We expect mydir to be .../indra/llcommon/tests.
+ " sys.path.insert(0,\n"
+ " os.path.join(mydir, os.pardir, os.pardir, 'lib', 'python'))\n"
+ " from indra.base import llsd\n"
"LEFTOVER = ''\n"
"class ProtocolError(Exception):\n"
" pass\n"
@@ -113,29 +126,28 @@ namespace tut
" parts[-1] = parts[-1][:excess]\n"
" data = ''.join(parts)\n"
" assert len(data) == length\n"
- " return data\n"
- "\n"
- "def put(req):\n"
- " sys.stdout.write(':'.join((str(len(req)), req)))\n"
- " sys.stdout.flush()\n"
+ " return llsd.parse(data)\n"
"\n"
"# deal with initial stdin message\n"
- // this will throw if the initial write to stdin
- // doesn't follow len:data protocol
- "_initial = get()\n"
- "_match = re.search(r\"'pump':'(.*?)'\", _initial)\n"
- // this will throw if we couldn't find
- // 'pump':'etc.' in the initial write
- "_reply = _match.group(1)\n"
+ // this will throw if the initial write to stdin doesn't
+ // follow len:data protocol, or if we couldn't find 'pump'
+ // in the dict
+ "_reply = get()['pump']\n"
"\n"
"def replypump():\n"
" return _reply\n"
"\n"
- "def escape(str):\n"
- " return ''.join(('\\\\'+c if c in r\"\\'\" else c) for c in str)\n"
+ "def put(req):\n"
+ " sys.stdout.write(':'.join((str(len(req)), req)))\n"
+ " sys.stdout.flush()\n"
+ "\n"
+ "def send(pump, data):\n"
+ " put(llsd.format_notation(dict(pump=pump, data=data)))\n"
"\n"
- "def quote(str):\n"
- " return \"'%s'\" % escape(str)\n"),
+ "def request(pump, data):\n"
+ " # we expect 'data' is a dict\n"
+ " data['reply'] = _reply\n"
+ " send(pump, data)\n"),
// Get the actual pathname of the NamedExtTempFile and trim off
// the ".py" extension. (We could cache reader.getName() in a
// separate member variable, but I happen to know getName() just
@@ -297,21 +309,18 @@ namespace tut
"import sys\n"
"from " << reader_module << " import *\n"
// make a request on our little API
- "put(\"{'pump':'" << api.getName() << "','data':{'reply':'%s'}}\" %\n"
- " replypump())\n"
+ "request(pump='" << api.getName() << "', data={})\n"
// wait for its response
"resp = get()\n"
- // We expect "{'data':'ack','pump':'%s'}", but
- // don't depend on the order of the keys.
- "result = 'bad: ' + resp\n"
- "if resp.startswith('{') and resp.endswith('}'):\n"
- " expect = set((\"'data':'ack'\", \"'pump':'%s'\" % replypump()))\n"
- " actual = set(resp[1:-1].split(','))\n"
- " if actual == expect:\n"
- " result = ''\n"
- "put(\"{'pump':'" << result.getName() << "','data':%s}\" %\n"
- " quote(result))\n");
+ "result = '' if resp == dict(pump=replypump(), data='ack')\\\n"
+ " else 'bad: ' + str(resp)\n"
+ "send(pump='" << result.getName() << "', data=result)\n");
waitfor(LLLeap::create(get_test_name(), sv(list_of(PYTHON)(script.getName()))));
result.ensure();
}
+
+ // TODO:
+ // many many small messages buffered in both directions
+ // very large message in both directions (md5)
+
} // namespace tut