diff options
author | Ted Ross <tross@apache.org> | 2009-08-11 15:27:08 +0000 |
---|---|---|
committer | Ted Ross <tross@apache.org> | 2009-08-11 15:27:08 +0000 |
commit | e9256dc65a9f9a05e0f802039a6569f8f6824930 (patch) | |
tree | 363ed5b1271af49faae9fd5a6c2ecc1325c304f3 /cpp | |
parent | ba9a0311f80e2d65711f490534a2a3d1854637ee (diff) | |
download | qpid-python-e9256dc65a9f9a05e0f802039a6569f8f6824930.tar.gz |
Cleaned up the makefiles in the QMF bindings area.
Added tests for the QMF bindings.
Removed spurious "cout" prints from qmf/Agent.cpp
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@803156 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/bindings/qmf/Makefile.am | 5 | ||||
-rw-r--r-- | cpp/bindings/qmf/python/Makefile.am | 12 | ||||
-rw-r--r-- | cpp/bindings/qmf/ruby/qmf.rb | 1 | ||||
-rw-r--r-- | cpp/bindings/qmf/ruby/ruby.i | 15 | ||||
-rw-r--r-- | cpp/bindings/qmf/tests/Makefile.am | 20 | ||||
-rwxr-xr-x | cpp/bindings/qmf/tests/agent_ruby.rb | 99 | ||||
-rwxr-xr-x | cpp/bindings/qmf/tests/python_console.py | 83 | ||||
-rwxr-xr-x | cpp/bindings/qmf/tests/run_interop_tests | 67 | ||||
-rw-r--r-- | cpp/configure.ac | 2 | ||||
-rw-r--r-- | cpp/src/qmf/Agent.cpp | 2 |
10 files changed, 293 insertions, 13 deletions
diff --git a/cpp/bindings/qmf/Makefile.am b/cpp/bindings/qmf/Makefile.am index 1693248e9d..68312a4208 100644 --- a/cpp/bindings/qmf/Makefile.am +++ b/cpp/bindings/qmf/Makefile.am @@ -17,6 +17,9 @@ # under the License. # +if HAVE_SWIG + EXTRA_DIST = qmfengine.i -SUBDIRS = ruby +SUBDIRS = ruby tests +endif diff --git a/cpp/bindings/qmf/python/Makefile.am b/cpp/bindings/qmf/python/Makefile.am index 9bb1b00d50..7b3f4d3be7 100644 --- a/cpp/bindings/qmf/python/Makefile.am +++ b/cpp/bindings/qmf/python/Makefile.am @@ -21,27 +21,27 @@ if HAVE_PYTHON_DEVEL INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/src/qmf -I$(top_srcdir)/src -I$(top_builddir)/src -EXTRA_DIST = python.i - generated_file_list = \ qmfengine.cpp \ qmfengine.py +EXTRA_DIST = python.i +BUILT_SOURCES = $(generated_file_list) + $(generated_file_list): $(srcdir)/python.i $(srcdir)/../qmfengine.i swig -python -c++ -Wall -I/usr/include $(INCLUDES) $(QPID_CXXFLAGS) -I$(top_srcdir)/src/qmf -o qmfengine.cpp $(srcdir)/python.i -AM_CPPFLAGS = $(QPID_CXXFLAGS) $(INCLUDES) -I$(srcdir)/qmf -I$(PYTHON_INC) -AM_CXXFLAGS = $(QPID_CXXFLAGS) - pylibdir = $(PYTHON_LIB) lib_LTLIBRARIES = _qmfengine.la _qmfengine_la_LDFLAGS = -avoid-version -module -shrext "$(PYTHON_SO)" _qmfengine_la_LIBADD = $(PYTHON_LIBS) -L$(top_builddir)/src/.libs -lqpidclient $(top_builddir)/src/libqmfcommon.la - +_qmfengine_la_CXXFLAGS = $(INCLUDES) -I$(srcdir)/qmf -I$(PYTHON_INC) _qmfengine_la_SOURCES = \ qmfengine.cpp +CLEANFILES = $(generated_file_list) + endif # HAVE_PYTHON_DEVEL diff --git a/cpp/bindings/qmf/ruby/qmf.rb b/cpp/bindings/qmf/ruby/qmf.rb index fd4f09977a..ea6b16f636 100644 --- a/cpp/bindings/qmf/ruby/qmf.rb +++ b/cpp/bindings/qmf/ruby/qmf.rb @@ -172,7 +172,6 @@ module Qmf @by_hash[@map.key(a)] = by_key(@map.key(a)) a += 1 end - end def [] (key) diff --git a/cpp/bindings/qmf/ruby/ruby.i b/cpp/bindings/qmf/ruby/ruby.i index 76f8a18dcf..cf69e2863a 100644 --- a/cpp/bindings/qmf/ruby/ruby.i +++ b/cpp/bindings/qmf/ruby/ruby.i @@ -18,7 +18,6 @@ */ %include stl.i -%trackobjects; %module qmfengine @@ -32,9 +31,19 @@ $result = (VALUE) $1; } +%typemap (in) uint16_t +{ + $1 = FIX2UINT ($input); +} + +%typemap (out) uint16_t +{ + $result = UINT2NUM((unsigned short) $1); +} + %typemap (in) uint32_t { - $1 = FIX2UINT ((uint32_t) $input); + $1 = FIX2UINT ($input); } %typemap (out) uint32_t @@ -48,7 +57,7 @@ %typemap (in) uint64_t { - $1 = FIX2ULONG ((uint64_t) $input); + $1 = FIX2ULONG ($input); } %typemap (out) uint64_t diff --git a/cpp/bindings/qmf/tests/Makefile.am b/cpp/bindings/qmf/tests/Makefile.am new file mode 100644 index 0000000000..c4f78492fc --- /dev/null +++ b/cpp/bindings/qmf/tests/Makefile.am @@ -0,0 +1,20 @@ +# +# 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. +# + +TESTS = run_interop_tests diff --git a/cpp/bindings/qmf/tests/agent_ruby.rb b/cpp/bindings/qmf/tests/agent_ruby.rb new file mode 100755 index 0000000000..d395810cb6 --- /dev/null +++ b/cpp/bindings/qmf/tests/agent_ruby.rb @@ -0,0 +1,99 @@ +#!/usr/bin/ruby + +# +# 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. +# + +require 'qmf' +require 'socket' + +class Model + attr_reader :parent_class, :child_class + + def initialize + @parent_class = Qmf::SchemaObjectClass.new("org.apache.qpid.qmf", "parent") + @parent_class.add_property(Qmf::SchemaProperty.new("name", Qmf::TYPE_SSTR, :index => true)) + @parent_class.add_property(Qmf::SchemaProperty.new("state", Qmf::TYPE_SSTR)) + @parent_class.add_property(Qmf::SchemaProperty.new("uint32val", Qmf::TYPE_UINT32)) + @parent_class.add_statistic(Qmf::SchemaStatistic.new("queryCount", Qmf::TYPE_UINT32, :unit => "query", :desc => "Query count")) + + method = Qmf::SchemaMethod.new("create_child", :desc => "Create a new child object") + method.add_argument(Qmf::SchemaArgument.new("child_name", Qmf::TYPE_LSTR, :dir => Qmf::DIR_IN)) + method.add_argument(Qmf::SchemaArgument.new("child_ref", Qmf::TYPE_REF, :dir => Qmf::DIR_OUT)) + + @parent_class.add_method(method) + + @child_class = Qmf::SchemaObjectClass.new("org.apache.qpid.qmf", "child") + @child_class.add_property(Qmf::SchemaProperty.new("name", Qmf::TYPE_SSTR, :index => true)) + end + + def register(agent) + agent.register_class(@parent_class) + agent.register_class(@child_class) + end +end + + +class App < Qmf::AgentHandler + def get_query(context, query, userId) +# puts "Query: user=#{userId} context=#{context} class=#{query.class_name} object_num=#{query.object_id.object_num_low if query.object_id}" + #@parent.inc_attr("queryCount") + if query.class_name == 'parent' + @agent.query_response(context, @parent) + end + @agent.query_complete(context) + end + + def method_call(context, name, object_id, args, userId) +# puts "Method: user=#{userId} context=#{context} method=#{name} object_num=#{object_id.object_num_low if object_id} args=#{args}" + oid = @agent.alloc_object_id(2) + args['child_ref'] = oid + @child = Qmf::QmfObject.new(@model.child_class) + @child.set_attr("name", args.by_key("child_name")) + @child.set_object_id(oid) + @agent.method_response(context, 0, "OK", args) + end + + def main + @settings = Qmf::ConnectionSettings.new + @settings.host = ARGV[0] if ARGV.size > 0 + @settings.port = ARGV[1].to_i if ARGV.size > 1 + @connection = Qmf::Connection.new(@settings) + @agent = Qmf::Agent.new(self) + + @model = Model.new + @model.register(@agent) + + @agent.set_connection(@connection) + + @parent = Qmf::QmfObject.new(@model.parent_class) + @parent.set_attr("name", "Parent One") + @parent.set_attr("state", "OPERATIONAL") + @parent.set_attr("uint32val", 0xa5a5a5a5) + + oid = @agent.alloc_object_id(1) + @parent.set_object_id(oid) + + sleep + end +end + +app = App.new +app.main + + diff --git a/cpp/bindings/qmf/tests/python_console.py b/cpp/bindings/qmf/tests/python_console.py new file mode 100755 index 0000000000..3add79bc51 --- /dev/null +++ b/cpp/bindings/qmf/tests/python_console.py @@ -0,0 +1,83 @@ +#!/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. +# + +import sys +from qpid.testlib import TestBase010, testrunner +from qpid.datatypes import Message +from qpid.queue import Empty +from time import sleep + +def scan_args(name, default=None, args=sys.argv[1:]): + if (name in args): + pos = args.index(name) + return args[pos + 1] + elif default: + return default + else: + print "Please specify extra argument: %s" % name + sys.exit(2) + +def extract_args(name, args): + if (name in args): + pos = args.index(name) + del args[pos:pos+2] + else: + return None + +class QmfInteropTests(TestBase010): + + def test_A_agent_presence(self): + self.startQmf(); + qmf = self.qmf + + agents = [] + count = 0 + while len(agents) == 0: + agents = qmf.getObjects(_class="agent") + sleep(1) + count += 1 + if count > 5: + self.fail("Timed out waiting for remote agent") + + def test_B_basic_types(self): + self.startQmf(); + qmf = self.qmf + + parents = qmf.getObjects(_class="parent") + self.assertEqual(len(parents), 1) + self.assertEqual(parents[0].uint32val, 0xA5A5A5A5) + + def getProperty(self, msg, name): + for h in msg.headers: + if hasattr(h, name): return getattr(h, name) + return None + + def getAppHeader(self, msg, name): + headers = self.getProperty(msg, "application_headers") + if headers: + return headers[name] + return None + + +if __name__ == '__main__': + args = sys.argv[1:] + args.append("python_console") + + if not testrunner.run(args): sys.exit(1) diff --git a/cpp/bindings/qmf/tests/run_interop_tests b/cpp/bindings/qmf/tests/run_interop_tests new file mode 100755 index 0000000000..d9f08d5627 --- /dev/null +++ b/cpp/bindings/qmf/tests/run_interop_tests @@ -0,0 +1,67 @@ +#!/bin/sh + +# +# 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. +# + +# Run the qmf interoperability tests. +MY_DIR=`dirname \`which $0\`` +QPID_DIR=${MY_DIR}/../../../.. +BUILD_DIR=../../.. +PYTHON_DIR=${QPID_DIR}/python +BROKER_DIR=${BUILD_DIR}/src +API_DIR=${BUILD_DIR}/bindings/qmf +SPEC_DIR=${QPID_DIR}/specs + +trap stop_broker INT TERM QUIT + +start_broker() { + ${BROKER_DIR}/qpidd --daemon --port 0 --no-data-dir --no-module-dir --auth no > _qpidd.port + BROKER_PORT=`cat _qpidd.port` +} + +stop_broker() { + ${BROKER_DIR}/qpidd -q --port $BROKER_PORT + echo "Broker stopped" +} + +start_ruby_agent() { + ruby -I${MY_DIR}/../ruby -I${API_DIR}/ruby/.libs ${MY_DIR}/agent_ruby.rb localhost $BROKER_PORT & + AGENT_PID=$! +} + +stop_ruby_agent() { + kill $AGENT_PID +} + +if test -d ${PYTHON_DIR} ; then + start_broker + echo "Running qmf interop tests using broker on port $BROKER_PORT" + PYTHONPATH=${PYTHON_DIR} + export PYTHONPATH + echo " Ruby Agent vs. Pure-Python Console" + start_ruby_agent + echo " Ruby agent started at pid $AGENT_PID" + ${MY_DIR}/python_console.py -v -s ${SPEC_DIR}/amqp.0-10-qpid-errata.xml -b localhost:$BROKER_PORT $@ + RETCODE=$? + stop_ruby_agent + stop_broker + if test x$RETCODE != x0; then + echo "FAIL qmf interop tests"; exit 1; + fi +fi diff --git a/cpp/configure.ac b/cpp/configure.ac index 6d7ed16871..28df58ef44 100644 --- a/cpp/configure.ac +++ b/cpp/configure.ac @@ -514,6 +514,8 @@ AC_CONFIG_FILES([ examples/tradedemo/Makefile bindings/qmf/Makefile bindings/qmf/ruby/Makefile + bindings/qmf/tests/Makefile + bindings/qmf/python/qmf/Makefile managementgen/Makefile etc/Makefile src/Makefile diff --git a/cpp/src/qmf/Agent.cpp b/cpp/src/qmf/Agent.cpp index 64d34f7ecd..6d59ae2750 100644 --- a/cpp/src/qmf/Agent.cpp +++ b/cpp/src/qmf/Agent.cpp @@ -239,7 +239,6 @@ AgentImpl::AgentImpl(char* _label, bool i) : AgentImpl::~AgentImpl() { - cout << "AgentImpl::~AgentImpl" << endl; } void AgentImpl::setStoreDir(char* path) @@ -859,7 +858,6 @@ Agent::Agent(char* label, bool internalStore) Agent::~Agent() { - cout << "Agent::~Agent" << endl; delete impl; } |