summaryrefslogtreecommitdiff
path: root/qpid/tests/src/py/qpid_tests/client
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/tests/src/py/qpid_tests/client')
-rwxr-xr-xqpid/tests/src/py/qpid_tests/client/client-api-example-tests.py338
-rw-r--r--qpid/tests/src/py/qpid_tests/client/log4j.conf25
2 files changed, 363 insertions, 0 deletions
diff --git a/qpid/tests/src/py/qpid_tests/client/client-api-example-tests.py b/qpid/tests/src/py/qpid_tests/client/client-api-example-tests.py
new file mode 100755
index 0000000000..3140a83b7d
--- /dev/null
+++ b/qpid/tests/src/py/qpid_tests/client/client-api-example-tests.py
@@ -0,0 +1,338 @@
+#!/usr/bin/env python
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+"""
+ client-api-examples-interop.py
+
+"""
+
+"""
+
+** TODO Add XML Exchange tests
+
+"""
+
+import os
+import shlex
+import subprocess
+import unittest
+import uuid
+import re
+from time import sleep
+
+import logging
+
+logging.basicConfig(level=logging.DEBUG,
+ format='%(asctime)s %(levelname)s %(message)s',
+ filename='./client-api-example-tests.log',
+ filemode='w')
+
+#######################################################################################
+#
+# !!! Configure your paths here !!!
+#
+#######################################################################################
+
+## If you set qpid_root on a source tree, from the default install for
+## this script, you're good to go. If running from elsewhere against a
+## source tree, set QPID_ROOT. If running from an installed system,
+## set QPID_CPP_EXAMPLES, QPID_PYTHON_EXAMPLES, QPID_PYTHON_TOOLS,
+## etc. to the directories below.
+
+qpid_root = os.getenv("QPID_ROOT", os.path.abspath("../../../../../../qpid"))
+logging.debug("Qpid Root: " + qpid_root)
+
+qpid_broker = os.getenv("QPID_BROKER", "localhost:5672")
+logging.debug("Qpid Broker: " + qpid_broker)
+
+########################################################################################
+#
+# If you are working from a source tree, setting the above paths is
+# sufficient.
+#
+# If your examples are installed somewhere else, you have to tell us
+# where examples in each language are kept
+#
+########################################################################################
+
+cpp_examples_path = os.getenv("QPID_CPP_EXAMPLES", qpid_root + "/cpp/examples/messaging/")
+
+python_examples_path = os.getenv("QPID_PYTHON_EXAMPLES", qpid_root + "/python/examples/api/")
+python_path = os.getenv("PYTHONPATH", qpid_root+"/python:" + qpid_root+"/extras/qmf/src/py")
+os.environ["PYTHONPATH"] = python_path
+logging.debug("PYTHONPATH: " + os.environ["PYTHONPATH"])
+
+python_tools_path = os.getenv("QPID_PYTHON_TOOLS", qpid_root + "/tools/src/py/")
+logging.debug("QPID_PYTHON_TOOLS: " + python_tools_path)
+
+java_qpid_home = os.getenv("QPID_HOME", qpid_root + "/java/build/lib/")
+os.environ["QPID_HOME"] = java_qpid_home
+logging.debug("Java's QPID_HOME: " + os.environ["QPID_HOME"])
+java_examples_path = os.getenv("QPID_JAVA_EXAMPLES", qpid_root + "/java/client/example/")
+find = "find " + java_qpid_home + " -name '*.jar'"
+args = shlex.split(find)
+popen = subprocess.Popen(args, stdout=subprocess.PIPE)
+out, err = popen.communicate()
+os.environ["CLASSPATH"] = java_examples_path + ":" + re.sub("\\n", ":", out)
+logging.debug("Java CLASSPATH = " + os.environ["CLASSPATH"])
+
+java_invoke = "java " + "-Dlog4j.configuration=log4j.conf "
+
+############################################################################################
+
+
+drains = [
+ {'lang': 'CPP', 'command': cpp_examples_path + "drain" },
+ {'lang': 'PYTHON', 'command': python_examples_path + "drain"},
+ {'lang': 'JAVA', 'command': java_invoke + "org.apache.qpid.example.Drain"}
+ ]
+
+spouts = [
+ {'lang': 'CPP', 'command': cpp_examples_path + "spout" },
+ {'lang': 'PYTHON', 'command': python_examples_path + "spout"},
+ {'lang': 'JAVA', 'command': java_invoke + "org.apache.qpid.example.Spout"}
+ ]
+
+mapSenders = [
+ {'lang': 'CPP', 'command': cpp_examples_path + "map_sender" },
+ {'lang': 'JAVA', 'command': java_invoke + "org.apache.qpid.example.MapSender"}
+ ]
+
+mapReceivers = [
+ {'lang': 'CPP', 'command': cpp_examples_path + "map_receiver" },
+ {'lang': 'JAVA', 'command': java_invoke + "org.apache.qpid.example.MapReceiver"}
+ ]
+
+
+hellos = [
+ {'lang': 'CPP', 'command': cpp_examples_path + "hello_world" },
+ {'lang': 'PYTHON', 'command': python_examples_path + "hello" },
+ {'lang': 'JAVA', 'command': java_invoke + "org.apache.qpid.example.Hello"}
+ ]
+
+wockyClients = [
+ {'lang': 'CPP', 'command': cpp_examples_path + "client" },
+ ]
+
+wockyServers = [
+ {'lang': 'CPP', 'command': cpp_examples_path + "server" },
+ ]
+
+
+shortWait = 0.5
+longWait = 3 # use sparingly!
+
+class TestDrainSpout(unittest.TestCase):
+
+ # setUp / tearDown
+
+ def setUp(self):
+ logging.debug('----------------------------')
+ logging.debug('START: ' + self.tcaseName())
+
+ def tearDown(self):
+ pass
+
+ #############################################################################
+ #
+ # Lemmas
+ #
+ #############################################################################
+
+ def tcaseName(self):
+ return re.split('[.]', self.id())[-1]
+
+ # Python utilities
+
+ def qpid_config(self, args):
+ commandS = python_tools_path + "qpid-config" + ' ' + args
+ args = shlex.split(commandS)
+ logging.debug("qpid_config(): " + commandS)
+ popen = subprocess.Popen(args, stdout=subprocess.PIPE)
+ out, err = popen.communicate()
+ logging.debug("qpid-config() - out=" + str(out) + ", err=" + str(err))
+
+ # Send / receive methods in various languages
+
+ def send(self, spout=spouts[0], content="", destination="amq.topic", create=1, wait=0):
+ if wait:
+ sleep(wait)
+
+ createS = ";{create:always}" if create else ""
+ addressS = "'" + destination + createS + "'"
+ brokerS = "-b " + qpid_broker
+ if spout['lang']=='CPP':
+ contentS = " ".join(['--content',"'"+content+"'"]) if content else ""
+ commandS = " ".join([spout['command'], brokerS, contentS, addressS])
+ elif spout['lang']=='PYTHON':
+ commandS = " ".join([spout['command'], brokerS, addressS, content])
+ elif spout['lang']=='JAVA':
+ brokerS = "-b guest:guest@" + qpid_broker
+ commandS = " ".join([spout['command'], brokerS, "--content="+"'"+content+"'", addressS])
+ else:
+ raise "Ain't no such language ...."
+ logging.debug("send(): " + commandS)
+ args = shlex.split(commandS)
+ popen = subprocess.Popen(args, stdout=subprocess.PIPE)
+ out, err = popen.communicate()
+ logging.debug("send() - out=" + str(out) + ", err=" + str(err))
+
+
+ def receive(self, drain=drains[0], destination="amq.topic", delete=1):
+ deleteS = ";{delete:always}" if delete else ""
+ addressS = "'" + destination + deleteS + "'"
+ brokerS = "-b " + qpid_broker
+ optionS = "-c 1 -t 30"
+ if drain['lang']=='CPP':
+ commandS = " ".join([drain['command'], optionS, brokerS, optionS, addressS])
+ elif drain['lang']=='PYTHON':
+ commandS = " ".join([drain['command'], brokerS, optionS, addressS])
+ elif drain['lang']=='JAVA':
+ brokerS = "-b guest:guest@" + qpid_broker
+ commandS = " ".join([drain['command'], brokerS, optionS, addressS])
+ else:
+ raise "Ain't no such language ...."
+ logging.debug("receive() " + commandS)
+ args = shlex.split(commandS)
+ popen = subprocess.Popen(args, stdout=subprocess.PIPE)
+ out, err = popen.communicate()
+ logging.debug("receive() - out=" + str(out) + ", err=" + str(err))
+ return out
+
+ def subscribe(self, drain=drains[0], destination="amq.topic", create=0):
+ optionS = "-t 30 -c 1"
+ brokerS = "-b " + qpid_broker
+ if drain['lang']=='CPP':
+ commandS = " ".join([drain['command'], brokerS, optionS, destination])
+ elif drain['lang']=='PYTHON':
+ commandS = " ".join([drain['command'], brokerS, optionS, destination])
+ elif drain['lang']=='JAVA':
+ logging.debug("Java working directory: ")
+ brokerS = "-b guest:guest@" + qpid_broker
+ commandS = " ".join([drain['command'], brokerS, optionS, destination])
+ else:
+ logging.debug("subscribe() - no such language!")
+ raise "Ain't no such language ...."
+ logging.debug("subscribe() " + commandS)
+ args = shlex.split(commandS)
+ return subprocess.Popen(args, stdout=subprocess.PIPE)
+
+ def listen(self, popen):
+ out,err = popen.communicate()
+ logging.debug("listen(): out=" + str(out) + ", err=" + str(err))
+ return out
+
+ #############################################################################
+ #
+ # Tests
+ #
+ #############################################################################
+
+ # Hello world!
+
+ def test_hello_world(self):
+ for hello_world in hellos:
+ args = shlex.split(hello_world['command'])
+ popen = subprocess.Popen(args, stdout=subprocess.PIPE)
+ out = popen.communicate()[0]
+ logging.debug(out)
+ self.assertTrue(out.find("world!") > 0)
+
+ def test_jabberwocky(self):
+ for i, s in enumerate(wockyServers):
+ for j, c in enumerate(wockyClients):
+ args = shlex.split(s['command'])
+ server = subprocess.Popen(args, stdout=subprocess.PIPE)
+ args = shlex.split(c['command'])
+ client = subprocess.Popen(args, stdout=subprocess.PIPE)
+ out = client.communicate()[0]
+ logging.debug(out)
+ self.assertTrue(out.find("BRILLIG") >= 0)
+ server.terminate()
+
+ def test_maps(self):
+ for s in mapSenders:
+ for r in mapReceivers:
+ args = shlex.split(s['command'])
+ sender = subprocess.Popen(args, stdout=subprocess.PIPE)
+ args = shlex.split(r['command'])
+ receiver = subprocess.Popen(args, stdout=subprocess.PIPE)
+ out = receiver.communicate()[0]
+ logging.debug(out)
+ sender.terminate()
+
+ def test_queues(self):
+ for i, s in enumerate(spouts):
+ for j, d in enumerate(drains):
+ content = self.tcaseName() + ": " + s['lang'] + str(i) + " => " + d['lang'] + str(j)
+ self.send(s, content=content, destination="hello_world", create=1)
+ out = self.receive(d, destination="hello_world", delete=1)
+ self.assertTrue(out.find(content) >= 0)
+
+ def test_direct_exchange(self):
+ for i, s in enumerate(spouts):
+ for j, d in enumerate(drains):
+ content = self.tcaseName() + ": " + s['lang'] + str(i) + " => " + d['lang'] + str(j)
+ popen1 = self.subscribe(d, destination="amq.direct/subject")
+ popen2 = self.subscribe(d, destination="amq.direct/subject")
+ self.send(s, content=content, destination="amq.direct/subject", create=0, wait=2)
+ out1 = self.listen(popen1)
+ out2 = self.listen(popen2)
+ self.assertTrue(out1.find(self.tcaseName()) >= 0)
+ self.assertTrue(out2.find(self.tcaseName()) >= 0)
+
+ def test_fanout_exchange(self):
+ for i, s in enumerate(spouts):
+ for j, d in enumerate(drains):
+ content = self.tcaseName() + ": " + s['lang'] + str(i) + " => " + d['lang'] + str(j)
+ popen1 = self.subscribe(d, destination="amq.fanout")
+ popen2 = self.subscribe(d, destination="amq.fanout")
+ self.send(s, content=content, destination="amq.fanout", create=0, wait=2)
+ out1 = self.listen(popen1)
+ out2 = self.listen(popen2)
+ self.assertTrue(out1.find(self.tcaseName()) >= 0)
+ self.assertTrue(out2.find(self.tcaseName()) >= 0)
+
+
+ def test_topic_exchange(self):
+ for i, s in enumerate(spouts):
+ for j, d in enumerate(drains):
+ content = self.tcaseName() + ": " + s['lang'] + str(i) + " => " + d['lang'] + str(j)
+ popen1 = self.subscribe(d, destination="amq.topic" + "/" + s['lang'] + "." + d['lang'])
+ popen2 = self.subscribe(d, destination="amq.topic" + "/" + "*" + "." + d['lang'])
+ popen3 = self.subscribe(d, destination="amq.topic" + "/" + s['lang'] + "." + "*")
+ popen4 = self.subscribe(d, destination="amq.topic" + "/" + "#" + "." + d['lang'])
+ self.send(s, content=content, destination="amq.topic"+ "/" + s['lang'] + "." + d['lang'], create=0, wait=4)
+ out1 = self.listen(popen1)
+ out2 = self.listen(popen2)
+ out3 = self.listen(popen3)
+ out4 = self.listen(popen4)
+ logging.debug("out1:"+out1)
+ logging.debug("out2:"+out2)
+ logging.debug("out3:"+out3)
+ logging.debug("out4:"+out4)
+ self.assertTrue(out1.find(self.tcaseName()) >= 0)
+ self.assertTrue(out2.find(self.tcaseName()) >= 0)
+ self.assertTrue(out3.find(self.tcaseName()) >= 0)
+ self.assertTrue(out4.find(self.tcaseName()) >= 0)
+
+
+if __name__ == '__main__':
+ unittest.main()
+
diff --git a/qpid/tests/src/py/qpid_tests/client/log4j.conf b/qpid/tests/src/py/qpid_tests/client/log4j.conf
new file mode 100644
index 0000000000..2c7bd74e29
--- /dev/null
+++ b/qpid/tests/src/py/qpid_tests/client/log4j.conf
@@ -0,0 +1,25 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+log4j.logger.org.apache.qpid=WARN, console
+log4j.additivity.org.apache.qpid=false
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Threshold=all
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=%t %d %p [%c{4}] %m%n