summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2009-08-11 15:27:08 +0000
committerTed Ross <tross@apache.org>2009-08-11 15:27:08 +0000
commite9256dc65a9f9a05e0f802039a6569f8f6824930 (patch)
tree363ed5b1271af49faae9fd5a6c2ecc1325c304f3 /cpp
parentba9a0311f80e2d65711f490534a2a3d1854637ee (diff)
downloadqpid-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.am5
-rw-r--r--cpp/bindings/qmf/python/Makefile.am12
-rw-r--r--cpp/bindings/qmf/ruby/qmf.rb1
-rw-r--r--cpp/bindings/qmf/ruby/ruby.i15
-rw-r--r--cpp/bindings/qmf/tests/Makefile.am20
-rwxr-xr-xcpp/bindings/qmf/tests/agent_ruby.rb99
-rwxr-xr-xcpp/bindings/qmf/tests/python_console.py83
-rwxr-xr-xcpp/bindings/qmf/tests/run_interop_tests67
-rw-r--r--cpp/configure.ac2
-rw-r--r--cpp/src/qmf/Agent.cpp2
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;
}