You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2007/06/07 16:29:25 UTC
svn commit: r545190 - in /incubator/qpid/trunk/qpid/cpp: ./ src/
src/qpid/cluster/ src/tests/ src/tests/unit/
Author: aconway
Date: Thu Jun 7 07:29:24 2007
New Revision: 545190
URL: http://svn.apache.org/viewvc?view=rev&rev=545190
Log:
Build support for clustering, initial CPG wrapper & tests.
- src/qpid/cluster/Cpg.cpp: C++ wrapper for the openais CPG library.
- src/tests/unit/Cpg.cpp: verify CPG functions in make check.
- makefiles etc.: build cluster stuff only if openais is installed.
Added:
incubator/qpid/trunk/qpid/cpp/src/cluster.mk
incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/
incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.cpp (with props)
incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.h (with props)
incubator/qpid/trunk/qpid/cpp/src/tests/ais_unit_tests (with props)
incubator/qpid/trunk/qpid/cpp/src/tests/cluster.mk
incubator/qpid/trunk/qpid/cpp/src/tests/unit/Cpg.cpp (with props)
Removed:
incubator/qpid/trunk/qpid/cpp/src/tests/run-python-tests
Modified:
incubator/qpid/trunk/qpid/cpp/README
incubator/qpid/trunk/qpid/cpp/bootstrap
incubator/qpid/trunk/qpid/cpp/configure.ac
incubator/qpid/trunk/qpid/cpp/qpidc.spec.in
incubator/qpid/trunk/qpid/cpp/src/Makefile.am
incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am
incubator/qpid/trunk/qpid/cpp/src/tests/README
incubator/qpid/trunk/qpid/cpp/src/tests/unit/logging.cpp
incubator/qpid/trunk/qpid/cpp/src/tests/unit/test_tools.h
Modified: incubator/qpid/trunk/qpid/cpp/README
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/README?view=diff&rev=545190&r1=545189&r2=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/README (original)
+++ incubator/qpid/trunk/qpid/cpp/README Thu Jun 7 07:29:24 2007
@@ -39,6 +39,8 @@
* boost <http://www.boost.org> (1.33.1)
* cppunit <http://cppunit.sourceforge.net> (1.11.4)
* libdaemon <http://www.stud.uni-hamburg.de/users/lennart/projects/libdaemon> (0.10)
+ * opeais <http://www.openais.org/> (0.80.2)
+
Using tools:
* boost-jam <http://boost.sourceforge.net/> (3.1.13)
@@ -52,30 +54,30 @@
* graphviz <http://www.graphviz.org/> (2.12)
* JDK 5.0 <http://java.sun.com/j2se/1.5.0/> (1.5.0.11)
-=== Optional tools ===
-
-Building from a source distribution does not require:
-
- * autoconf
- * automake
- * JDK 5.0
-
-Building without testing does not require:
+=== Optional tools an libraries ===
- * cppunit
-
-Building without documentaion does not require:
+If openais is not installed the broker will be built without cluster
+functionality.
+The following are only required if you generate documentation.
+(Source distributions contain pre-generated documentation.)
* help2man
* doxygen
* graphviz
+cppunit is not required if you do not build/run the tests.
+
+If building from a source distribution you do not need:
+ * autoconf
+ * automake
+ * JDK 5.0
+
=== Installing as root ===
On linux most packages can be installed using your distribution's package
management tool. For example on Fedora:
- # yum install apr-devel boost-devel cppunit-devel libdaemon-devel
+ # yum install apr-devel boost-devel cppunit-devel libdaemon-devel openais-devel
# yum install pkgconfig doxygen graphviz help2man
Modified: incubator/qpid/trunk/qpid/cpp/bootstrap
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/bootstrap?view=diff&rev=545190&r1=545189&r2=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/bootstrap (original)
+++ incubator/qpid/trunk/qpid/cpp/bootstrap Thu Jun 7 07:29:24 2007
@@ -11,7 +11,7 @@
# Generate (for automake) lots of repetitive parts of tests/Makefile.am.
(cd src/tests && rm -f gen.mk
- perl -ne '/^include / or print' Makefile.am \
+ perl -ne '/^(include |if |else|endif)/ or print' Makefile.am \
| make -f - abs_srcdir=`dirname $(pwd)` gen.mk > /dev/null )
automake
Modified: incubator/qpid/trunk/qpid/cpp/configure.ac
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/configure.ac?view=diff&rev=545190&r1=545189&r2=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/configure.ac (original)
+++ incubator/qpid/trunk/qpid/cpp/configure.ac Thu Jun 7 07:29:24 2007
@@ -158,10 +158,20 @@
# Check for headers from required devel kits.
missing=""
-AC_CHECK_HEADERS([libdaemon/daemon.h],,[missing="$missing libdaemon development files"])
-AC_CHECK_HEADERS([boost/shared_ptr.hpp],,[missing="$missing boost developement files"])
+AC_CHECK_HEADERS([libdaemon/daemon.h],,[missing="$missing libdaemon"])
+AC_CHECK_HEADERS([boost/shared_ptr.hpp],,[missing="$missing boost"])
test -z "$missing" ||
AC_MSG_ERROR([Missing required headers. Install the folowing packages or -devel rpms: $missing.])
+
+# Enable/disable cluster functionality based on presence of openais
+AC_CHECK_HEADER([openais/cpg.h],[cluster=yes],[cluster=no])
+AM_CONDITIONAL([CLUSTER], test x$cluster = xyes)
+if test x$cluster = xyes; then
+ LDFLAGS="$LDFLAGS -L/usr/lib/openais -L/usr/lib64/openais"
+ CPPFLAGS+=-DCLUSTER
+ AC_CHECK_LIB([cpg], [cpg_initialize], [],
+ [AC_MSG_ERROR([Cannot find library -lcpg. Install openais.])])
+fi
AC_CONFIG_FILES([
qpidc.spec
Modified: incubator/qpid/trunk/qpid/cpp/qpidc.spec.in
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/qpidc.spec.in?view=diff&rev=545190&r1=545189&r2=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/qpidc.spec.in (original)
+++ incubator/qpid/trunk/qpid/cpp/qpidc.spec.in Thu Jun 7 07:29:24 2007
@@ -53,6 +53,7 @@
Summary: An AMQP message broker daemon
Group: System Environment/Daemons
Requires: %name = %version-%release
+Requires: openais
%description -n %{qpidd}
A message broker daemon that receives stores and routes messages using
@@ -63,6 +64,7 @@
Group: Development/System
Requires: %name-devel = %version-%release
Requires: %{qpidd} = %version-%release
+Requires: openais-devel
%description -n %{qpidd}-devel
Libraries and header files for developing extensions to the
Modified: incubator/qpid/trunk/qpid/cpp/src/Makefile.am
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/Makefile.am?view=diff&rev=545190&r1=545189&r2=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/Makefile.am Thu Jun 7 07:29:24 2007
@@ -103,6 +103,10 @@
lib_LTLIBRARIES = libqpidcommon.la libqpidbroker.la libqpidclient.la
+if CLUSTER
+include cluster.mk
+endif
+
# The logger library uses boost::date_time to format time.
# We have to disable the unused parameters warning to get around
# unused parameters in boost::date_time headers. So we build it
@@ -209,16 +213,16 @@
libqpidclient_la_LIBADD = libqpidcommon.la
libqpidclient_la_SOURCES = \
- qpid/client/ClientConnection.cpp \
- qpid/client/ClientChannel.cpp \
- qpid/client/ClientExchange.cpp \
- qpid/client/ClientQueue.cpp \
- qpid/client/BasicMessageChannel.cpp \
- qpid/client/MessageMessageChannel.cpp \
- qpid/client/Connector.cpp \
- qpid/client/IncomingMessage.cpp \
- qpid/client/MessageListener.cpp \
- qpid/client/ResponseHandler.cpp \
+ qpid/client/ClientConnection.cpp \
+ qpid/client/ClientChannel.cpp \
+ qpid/client/ClientExchange.cpp \
+ qpid/client/ClientQueue.cpp \
+ qpid/client/BasicMessageChannel.cpp \
+ qpid/client/MessageMessageChannel.cpp \
+ qpid/client/Connector.cpp \
+ qpid/client/IncomingMessage.cpp \
+ qpid/client/MessageListener.cpp \
+ qpid/client/ResponseHandler.cpp \
qpid/client/ReturnedMessageHandler.cpp
nobase_include_HEADERS = \
Added: incubator/qpid/trunk/qpid/cpp/src/cluster.mk
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/cluster.mk?view=auto&rev=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/cluster.mk (added)
+++ incubator/qpid/trunk/qpid/cpp/src/cluster.mk Thu Jun 7 07:29:24 2007
@@ -0,0 +1,11 @@
+#-*-Makefile-*-
+# Cluster library makefile fragment, to be included in Makefile.am
+#
+
+lib_LTLIBRARIES += libqpidcluster.la
+
+libqpidcluster_la_SOURCES = \
+ qpid/cluster/Cpg.cpp \
+ qpid/cluster/Cpg.h
+
+libqpidcluster_la_LIBADD= -lcpg
Added: incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.cpp?view=auto&rev=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.cpp (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.cpp Thu Jun 7 07:29:24 2007
@@ -0,0 +1,62 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed 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.
+ *
+ */
+
+#include "Cpg.h"
+
+namespace qpid {
+namespace cluster {
+
+using namespace std;
+
+string Cpg::errorStr(cpg_error_t err, const std::string& msg) {
+ switch (err) {
+ case CPG_OK: return msg+": ok";
+ case CPG_ERR_LIBRARY: return msg+": library";
+ case CPG_ERR_TIMEOUT: return msg+": timeout";
+ case CPG_ERR_TRY_AGAIN: return msg+": try again";
+ case CPG_ERR_INVALID_PARAM: return msg+": invalid param";
+ case CPG_ERR_NO_MEMORY: return msg+": no memory";
+ case CPG_ERR_BAD_HANDLE: return msg+": bad handle";
+ case CPG_ERR_ACCESS: return msg+": access";
+ case CPG_ERR_NOT_EXIST: return msg+": not exist";
+ case CPG_ERR_EXIST: return msg+": exist";
+ case CPG_ERR_NOT_SUPPORTED: return msg+": not supported";
+ case CPG_ERR_SECURITY: return msg+": security";
+ case CPG_ERR_TOO_MANY_GROUPS: return msg+": too many groups";
+ default:
+ assert(0);
+ return ": unknown";
+ };
+}
+
+std::string Cpg::cantJoinMsg(const Name& group) {
+ return "Cannot join CPG group "+group.str();
+}
+
+std::string Cpg::cantLeaveMsg(const Name& group) {
+ return "Cannot leave CPG group "+group.str();
+}
+
+std::string Cpg::cantMcastMsg(const Name& group) {
+ return "Cannot mcast to CPG group "+group.str();
+}
+
+}} // namespace qpid::cpg
+
+
+
Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.cpp
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.h?view=auto&rev=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.h (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.h Thu Jun 7 07:29:24 2007
@@ -0,0 +1,122 @@
+#ifndef CPG_H
+#define CPG_H
+
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed 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.
+ *
+ */
+
+#include <stdexcept>
+#include <cassert>
+#ifdef CLUSTER
+extern "C" {
+#include <openais/cpg.h>
+}
+#endif
+namespace qpid {
+namespace cluster {
+
+/**
+ * Lightweight C++ interface to cpg.h operations.
+ * Manages a single CPG handle, initialized in ctor, finialzed in destructor.
+ * On error all functions throw Cpg::Exception
+ */
+class Cpg {
+ public:
+ // FIXME aconway 2007-06-01: qpid::Exception
+ struct Exception : public std::runtime_error {
+ Exception(const std::string& msg) : runtime_error(msg) {}
+ };
+
+ struct Name : public cpg_name {
+ Name(const char* s) { copy(s, strlen(s)); }
+ Name(const char* s, size_t n) { copy(s,n); }
+ Name(const std::string& s) { copy(s.data(), s.size()); }
+ void copy(const char* s, size_t n) {
+ assert(n < CPG_MAX_NAME_LENGTH);
+ memcpy(value, s, n);
+ length=n;
+ }
+
+ std::string str() const { return std::string(value, length); }
+ };
+
+ static inline std::string str(const cpg_name& n) {
+ return std::string(n.value, n.length);
+ }
+
+ // TODO aconway 2007-06-01: when cpg handle supports a context pointer
+ // use callback objects (boost::function) instead of free functions.
+ //
+ /** Open a CPG handle.
+ *@param deliver - free function called when a message is delivered.
+ *@param reconfig - free function called when CPG configuration changes.
+ */
+ Cpg(cpg_deliver_fn_t deliver, cpg_confchg_fn_t reconfig) {
+ cpg_callbacks_t callbacks = { deliver, reconfig };
+ check(cpg_initialize(&handle, &callbacks), "Cannot initialize CPG");
+ }
+
+ /** Disconnect */
+ ~Cpg() {
+ check(cpg_finalize(handle), "Cannot finalize CPG");
+ }
+
+ /** Dispatch CPG events.
+ *@param type one of
+ * - CPG_DISPATCH_ONE - dispatch exactly one event.
+ * - CPG_DISPATCH_ALL - dispatch all available events, don't wait.
+ * - CPG_DISPATCH_BLOCKING - blocking dispatch loop.
+ */
+ void dispatch(cpg_dispatch_t type) {
+ check(cpg_dispatch(handle,type), "Error in CPG dispatch");
+ }
+
+ void join(const Name& group) {
+ check(cpg_join(handle, const_cast<Name*>(&group)),cantJoinMsg(group));
+ };
+
+ void leave(const Name& group) {
+ check(cpg_leave(handle,const_cast<Name*>(&group)),cantLeaveMsg(group));
+ }
+
+ void mcast(const Name& group, const iovec* iov, int iovLen) {
+ check(cpg_mcast_joined(
+ handle, CPG_TYPE_AGREED, const_cast<iovec*>(iov), iovLen),
+ cantMcastMsg(group));
+ }
+
+ private:
+ static std::string errorStr(cpg_error_t err, const std::string& msg);
+ static std::string cantJoinMsg(const Name&);
+ static std::string cantLeaveMsg(const Name&);
+ static std::string cantMcastMsg(const Name&);
+
+ static void check(cpg_error_t result, const std::string& msg) {
+ // TODO aconway 2007-06-01: Logging and exceptions.
+ if (result != CPG_OK)
+ throw Exception(errorStr(result, msg));
+ }
+ cpg_handle_t handle;
+};
+
+
+
+}} // namespace qpid::cluster
+
+
+
+#endif /*!CPG_H*/
Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.h
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cpg.h
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am?view=diff&rev=545190&r1=545189&r2=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am Thu Jun 7 07:29:24 2007
@@ -1,14 +1,19 @@
AM_CXXFLAGS = $(WARNING_CFLAGS) $(CPPUNIT_CXXFLAGS) $(APR_CXXFLAGS)
INCLUDES = -I$(srcdir)/.. -I$(srcdir)/../gen -I$(top_builddir)/src/gen
-
-# Unit test programs
+#
+# Unit test programs.
+#
UNIT_TESTS=
UNIT_TESTS+=logging
logging_SOURCES=unit/logging.cpp unit/test_tools.h
logging_LDADD=-lboost_unit_test_framework -lboost_regex $(lib_common)
+if CLUSTER
+include cluster.mk
+endif
+
# NB: CppUnit test libraries below will be migrated to boost test programs.
# UNIT_TESTS+= ...
@@ -63,7 +68,8 @@
topic_listener \
topic_publisher
-check_PROGRAMS = $(UNIT_TESTS) $(testprogs) interop_runner
+
+check_PROGRAMS = $(UNIT_TESTS) $(AIS_UNIT_TESTS) $(testprogs) interop_runner
# FIXME aconway 2007-05-30: TESTS_ENVIRONMENT should have ./run_test
# as below to run valgrind on all test programs.
@@ -73,7 +79,7 @@
TESTS_ENVIRONMENT = VALGRIND=$(VALGRIND) srcdir=$(srcdir)
SYSTEM_TESTS = client_test quick_topictest
-TESTS = $(UNIT_TESTS) run-unit-tests start_broker $(SYSTEM_TESTS) python_tests kill_broker daemon_test
+TESTS = $(UNIT_TESTS) run-unit-tests $(RUN_AIS_TESTS) start_broker $(SYSTEM_TESTS) python_tests kill_broker daemon_test
EXTRA_DIST = \
test_env \
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/README
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/README?view=diff&rev=545190&r1=545189&r2=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/README (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/README Thu Jun 7 07:29:24 2007
@@ -57,7 +57,7 @@
The ./start_broker "test" launches the broker, ./kill_broker" kills it.
Tests in between assume the broker is running.
-./run-python-tests: runs ../python/run_tests. This is the main set of
+./python_tests: runs ../python/run_tests. This is the main set of
system testss for the broker.
Other C++ client test executables and scripts under client/test are
Added: incubator/qpid/trunk/qpid/cpp/src/tests/ais_unit_tests
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/ais_unit_tests?view=auto&rev=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/ais_unit_tests (added)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/ais_unit_tests Thu Jun 7 07:29:24 2007
@@ -0,0 +1,2 @@
+#!/bin/sh
+make check-ais
Propchange: incubator/qpid/trunk/qpid/cpp/src/tests/ais_unit_tests
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/qpid/trunk/qpid/cpp/src/tests/cluster.mk
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/cluster.mk?view=auto&rev=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/cluster.mk (added)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/cluster.mk Thu Jun 7 07:29:24 2007
@@ -0,0 +1,23 @@
+#-*-Makefile-*-
+# Cluster tests makefile fragment, to be included in Makefile.am
+#
+
+lib_cluster = $(abs_builddir)/../libqpidcluster.la
+#
+# AIS_UNIT_TESTS must be called with gid=ais. They are run
+# separately under sudo -u ais.
+#
+AIS_UNIT_TESTS=
+
+AIS_UNIT_TESTS+=Cpg
+Cpg_SOURCES=unit/Cpg.cpp
+Cpg_LDADD=-lboost_unit_test_framework $(lib_cluster)
+
+RUN_AIS_TESTS=ais_unit_tests # Run ais unit tests via check-ais.
+
+# The chmod is a horrible hack to allow libtools annoying wrapers to
+# relink the executable when run as user ais.
+check-ais: $(AIS_UNIT_TESTS)
+ chmod a+rwx . .libs
+ sudo -u ais $(MAKE) check TESTS=$(AIS_UNIT_TESTS)
+
Added: incubator/qpid/trunk/qpid/cpp/src/tests/unit/Cpg.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/unit/Cpg.cpp?view=auto&rev=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/unit/Cpg.cpp (added)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/unit/Cpg.cpp Thu Jun 7 07:29:24 2007
@@ -0,0 +1,97 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed 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.
+ *
+ */
+
+#define BOOST_AUTO_TEST_MAIN // Must come before #include<boost/test/*>
+#include "test_tools.h"
+#include "qpid/cluster/Cpg.h"
+#include <string>
+#include <iostream>
+#include <iterator>
+#include <vector>
+#include <algorithm>
+
+using namespace std;
+using namespace qpid::cluster;
+
+// For debugging: op << for CPG types.
+
+ostream& operator<<(ostream& o, const cpg_name* n) {
+ return o << qpid::cluster::Cpg::str(*n);
+}
+
+ostream& operator<<(ostream& o, const cpg_address& a) {
+ return o << "(" << a.nodeid <<","<<a.pid<<","<<a.reason<<")";
+}
+
+template <class T>
+ostream& operator<<(ostream& o, const pair<T*, int>& array) {
+ o << "{ ";
+ ostream_iterator<cpg_address> i(o, " ");
+ copy(array.first, array.first+array.second, i);
+ cout << "}";
+ return o;
+}
+
+const string testGroup("foo");
+vector<string> delivered;
+vector<int> configChanges;
+
+void testDeliver (
+ cpg_handle_t /*handle*/,
+ struct cpg_name *group,
+ uint32_t /*nodeid*/,
+ uint32_t /*pid*/,
+ void* msg,
+ int msg_len)
+{
+ BOOST_CHECK_EQUAL(testGroup, Cpg::str(*group));
+ delivered.push_back(string((char*)msg,msg_len));
+}
+
+void testConfigChange(
+ cpg_handle_t /*handle*/,
+ struct cpg_name *group,
+ struct cpg_address */*members*/, int nMembers,
+ struct cpg_address */*left*/, int /*nLeft*/,
+ struct cpg_address */*joined*/, int /*nJoined*/
+)
+{
+ BOOST_CHECK_EQUAL(testGroup, Cpg::str(*group));
+ configChanges.push_back(nMembers);
+}
+
+BOOST_AUTO_TEST_CASE(basic) {
+ // Verify basic functionality of cpg. This will catch any
+ // openais configuration or permission errors.
+ //
+ Cpg cpg(&testDeliver, &testConfigChange);
+ Cpg::Name group("foo");
+
+ cpg.join(group);
+ iovec iov = { (void*)"Hello!", 6 };
+ cpg.mcast(group, &iov, 1);
+ cpg.leave(group);
+
+ cpg.dispatch(CPG_DISPATCH_ONE); // Wait for at least one.
+ cpg.dispatch(CPG_DISPATCH_ALL);
+ BOOST_REQUIRE_EQUAL(1u, delivered.size());
+ BOOST_CHECK_EQUAL("Hello!", delivered.front());
+ BOOST_REQUIRE_EQUAL(2u, configChanges.size());
+ BOOST_CHECK_EQUAL(1, configChanges[0]);
+ BOOST_CHECK_EQUAL(0, configChanges[1]);
+}
Propchange: incubator/qpid/trunk/qpid/cpp/src/tests/unit/Cpg.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/qpid/trunk/qpid/cpp/src/tests/unit/Cpg.cpp
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/unit/logging.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/unit/logging.cpp?view=diff&rev=545190&r1=545189&r2=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/unit/logging.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/unit/logging.cpp Thu Jun 7 07:29:24 2007
@@ -16,6 +16,7 @@
*
*/
+#define BOOST_AUTO_TEST_MAIN // Must come before #include<boost/test/*>
#include "test_tools.h"
#include "qpid/log/Logger.h"
#include "qpid/log/Options.h"
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/unit/test_tools.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/unit/test_tools.h?view=diff&rev=545190&r1=545189&r2=545190
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/unit/test_tools.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/unit/test_tools.h Thu Jun 7 07:29:24 2007
@@ -19,7 +19,6 @@
*
*/
-#define BOOST_AUTO_TEST_MAIN // Must come before #include<boost/test/*>
#include <boost/test/auto_unit_test.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/regex.hpp>
@@ -51,3 +50,4 @@
BOOST_CHECK_PREDICATE(regexPredicate, (re)(text))
#endif /*!TEST_TOOLS_H*/
+