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*/
+