summaryrefslogtreecommitdiff
path: root/qpid/cpp/src/tests/unit
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2007-06-26 02:11:55 +0000
committerAlan Conway <aconway@apache.org>2007-06-26 02:11:55 +0000
commitbaae218dacf7b5e56b52602ad4fbf2be0b81a2af (patch)
treea40207d3c21d96f7df16c7005602fecbd1d90d88 /qpid/cpp/src/tests/unit
parentb8c5c8d42d8dc73cfc58acd015e0af2b4eac0dcc (diff)
downloadqpid-python-baae218dacf7b5e56b52602ad4fbf2be0b81a2af.tar.gz
2007-06-25 <aconway@redhat.com>
Cluster class implementing cluster membership map. * src/qpid/cluster/Cluster.cpp: Cluster membership implementation. * src/qpid/cluster/Cpg.cpp: Support for boost::function callbacks. * src/tests/Url.cpp: Implements AMQP-95 URL format. * xml/cluster.xml: Cluster join method. Build/packaging * README: Remove mention of openais till clustering is functional. For now it is optional and we depend on an unpackaged version. * configure.ac: Check openais has cpg_local_get(). * Makefile.am: Added cluster.xml to EXTRA_DIST. * src/generate.sh: add cluster.xml to codegen. * src/tests/Makefile.am: - Generate individual "sudo -u ais" wrappers for openais tests. - Drop "unit" directory, all unit tests in "tests" directory Minor changes: * src/qpid/sys/posix/Socket.cpp: * src/qpid/sys/posix/PosixAcceptor.cpp: * src/qpid/sys/posix/EventChannelAcceptor.cpp: * src/qpid/sys/apr/APRAcceptor.cpp: * src/qpid/sys/Acceptor.h (getHost): Added getHost() * src/tests/.valgrind.supp-default: Suppress benign valgrind warning in libcpg. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@550658 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src/tests/unit')
-rw-r--r--qpid/cpp/src/tests/unit/Cpg.cpp97
-rw-r--r--qpid/cpp/src/tests/unit/Url.cpp55
-rw-r--r--qpid/cpp/src/tests/unit/logging.cpp374
-rw-r--r--qpid/cpp/src/tests/unit/test_tools.h53
4 files changed, 0 insertions, 579 deletions
diff --git a/qpid/cpp/src/tests/unit/Cpg.cpp b/qpid/cpp/src/tests/unit/Cpg.cpp
deleted file mode 100644
index 74c6532338..0000000000
--- a/qpid/cpp/src/tests/unit/Cpg.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *
- * 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]);
-}
diff --git a/qpid/cpp/src/tests/unit/Url.cpp b/qpid/cpp/src/tests/unit/Url.cpp
deleted file mode 100644
index a8b415e641..0000000000
--- a/qpid/cpp/src/tests/unit/Url.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *
- * 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/Url.h"
-#include <boost/assign.hpp>
-
-using namespace std;
-using namespace qpid;
-using namespace boost::assign;
-
-BOOST_AUTO_TEST_CASE(testUrl_str) {
- Url url;
- url.push_back(TcpAddress("foo.com"));
- url.push_back(TcpAddress("bar.com", 6789));
-
- BOOST_CHECK_EQUAL(
- url.str(), "amqp:tcp:foo.com:5672,tcp:bar.com:6789");
- BOOST_CHECK_EQUAL(Url().str(), "amqp:");
-}
-
-
-BOOST_AUTO_TEST_CASE(testUrl_ctor) {
- BOOST_CHECK_EQUAL(
- Url("amqp:foo.com,tcp:bar.com:1234").str(),
- "amqp:tcp:foo.com:5672,tcp:bar.com:1234");
- BOOST_CHECK_EQUAL(
- Url("amqp:foo/ignorethis").str(),
- "amqp:tcp:foo:5672");
- BOOST_CHECK_EQUAL("amqp:tcp::5672", Url("amqp:").str());
- BOOST_CHECK_EQUAL(0u, Url("xxx", nothrow).size());
- try {
- Url invalid("xxx");
- BOOST_FAIL("Expected InvalidUrl exception");
- }
- catch (const Url::InvalidUrl&) {}
-}
-
-
diff --git a/qpid/cpp/src/tests/unit/logging.cpp b/qpid/cpp/src/tests/unit/logging.cpp
deleted file mode 100644
index c80bf7b337..0000000000
--- a/qpid/cpp/src/tests/unit/logging.cpp
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- *
- * 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/log/Logger.h"
-#include "qpid/log/Options.h"
-#include "qpid/memory.h"
-#include "qpid/CommonOptions.h"
-#include <boost/test/floating_point_comparison.hpp>
-#include <boost/format.hpp>
-#include <exception>
-#include <time.h>
-#include <fstream>
-
-
-using namespace std;
-using namespace boost;
-using namespace qpid::log;
-
-BOOST_AUTO_TEST_CASE(testStatementInit) {
- Statement s=QPID_LOG_STATEMENT_INIT(debug); int line=__LINE__;
- BOOST_CHECK(!s.enabled);
- BOOST_CHECK_EQUAL(string(__FILE__), s.file);
- BOOST_CHECK_EQUAL(line, s.line);
- BOOST_CHECK_EQUAL(string("void testStatementInit()"), s.function);
- BOOST_CHECK_EQUAL(debug, s.level);
-}
-
-
-BOOST_AUTO_TEST_CASE(testSelector_enable) {
- Selector s;
- // Simple enable
- s.enable(debug,"foo");
- BOOST_CHECK(s.isEnabled(debug,"foo"));
- BOOST_CHECK(!s.isEnabled(error,"foo"));
- BOOST_CHECK(!s.isEnabled(error,"bar"));
-
- // Substring match
- BOOST_CHECK(s.isEnabled(debug, "bazfoobar"));
- BOOST_CHECK(!s.isEnabled(debug, "bazbar"));
-
- // Different levels for different substrings.
- s.enable(info, "bar");
- BOOST_CHECK(s.isEnabled(debug, "foobar"));
- BOOST_CHECK(s.isEnabled(info, "foobar"));
- BOOST_CHECK(!s.isEnabled(debug, "bar"));
- BOOST_CHECK(!s.isEnabled(info, "foo"));
-
- // Enable-strings
- s.enable("notice:blob");
- BOOST_CHECK(s.isEnabled(notice, "blob"));
- s.enable("error+:oops");
- BOOST_CHECK(s.isEnabled(error, "oops"));
- BOOST_CHECK(s.isEnabled(critical, "oops"));
-}
-
-Logger& clearLogger() {
- Logger::instance().clear();
- return Logger::instance();
-}
-
-BOOST_AUTO_TEST_CASE(testStatementEnabled) {
- // Verify that the logger enables and disables log statements.
- Logger& l=clearLogger();
- l.select(Selector(debug));
- Statement s=QPID_LOG_STATEMENT_INIT(debug);
- BOOST_CHECK(!s.enabled);
- Statement::Initializer init(s);
- BOOST_CHECK(s.enabled);
-
- Statement s2=QPID_LOG_STATEMENT_INIT(warning);
- Statement::Initializer init2(s2);
- BOOST_CHECK(!s2.enabled);
-
- l.select(Selector(warning));
- BOOST_CHECK(!s.enabled);
- BOOST_CHECK(s2.enabled);
-}
-
-struct TestOutput : public Logger::Output {
- vector<string> msg;
- vector<Statement> stmt;
-
- TestOutput() {
- Logger::instance().output(qpid::make_auto_ptr<Logger::Output>(this));
- }
- void log(const Statement& s, const string& m) {
- msg.push_back(m);
- stmt.push_back(s);
- }
- string last() { return msg.back(); }
-};
-
-using boost::assign::list_of;
-
-BOOST_AUTO_TEST_CASE(testLoggerOutput) {
- Logger& l=clearLogger();
- l.select(Selector(debug));
- Statement s=QPID_LOG_STATEMENT_INIT(debug);
- TestOutput* out=new TestOutput();
-
- // Verify message is output.
- l.log(s, "foo");
- vector<string> expect=list_of("foo\n");
- BOOST_CHECK_EQUAL(expect, out->msg);
-
- // Verify multiple outputs
- TestOutput* out2=new TestOutput();
- l.log(Statement(), "baz");
- expect.push_back("baz\n");
- BOOST_CHECK_EQUAL(expect, out->msg);
- expect.erase(expect.begin());
- BOOST_CHECK_EQUAL(expect, out2->msg);
-}
-
-BOOST_AUTO_TEST_CASE(testMacro) {
- Logger& l = clearLogger();
- l.select(Selector(info));
- TestOutput* out=new TestOutput();
- QPID_LOG(info, "foo");
- vector<string> expect=list_of("foo\n");
- BOOST_CHECK_EQUAL(expect, out->msg);
- BOOST_CHECK_EQUAL(__FILE__, out->stmt.front().file);
- BOOST_CHECK_EQUAL("void testMacro()", out->stmt.front().function);
-
- // Not enabled:
- QPID_LOG(debug, "bar");
- BOOST_CHECK_EQUAL(expect, out->msg);
-
- QPID_LOG(info, 42 << " bingo");
- expect.push_back("42 bingo\n");
- BOOST_CHECK_EQUAL(expect, out->msg);
-}
-
-BOOST_AUTO_TEST_CASE(testLoggerFormat) {
- Logger& l=clearLogger();
- l.select(Selector(critical));
- TestOutput* out=new TestOutput();
-
- // Time format is YYY-Month-dd hh:mm:ss
- l.format(Logger::TIME);
- QPID_LOG(critical, "foo");
- string re("\\d\\d\\d\\d-[A-Z][a-z]+-\\d\\d \\d\\d:\\d\\d:\\d\\d foo\n");
- BOOST_CHECK_REGEX(re, out->last());
-
- l.format(Logger::FILE);
- QPID_LOG(critical, "foo");
- BOOST_CHECK_EQUAL(out->last(), string(__FILE__)+": foo\n");
-
- l.format(Logger::FILE|Logger::LINE);
- QPID_LOG(critical, "foo");
- BOOST_CHECK_REGEX(string(__FILE__)+":\\d+: foo\n", out->last());
-
- l.format(Logger::FUNCTION);
- QPID_LOG(critical, "foo");
- BOOST_CHECK_EQUAL("void testLoggerFormat(): foo\n", out->last());
-
- l.format(Logger::LEVEL);
- QPID_LOG(critical, "foo");
- BOOST_CHECK_EQUAL("critical foo\n", out->last());
-
- l.format(~0); // Everything
- QPID_LOG(critical, "foo");
- re=".* critical \\[[0-9a-f]*] "+string(__FILE__)+":\\d+:void testLoggerFormat\\(\\): foo\n";
- BOOST_CHECK_REGEX(re, out->last());
-}
-
-BOOST_AUTO_TEST_CASE(testOstreamOutput) {
- Logger& l=clearLogger();
- l.select(Selector(error));
- ostringstream os;
- l.output(os);
- QPID_LOG(error, "foo");
- QPID_LOG(error, "bar");
- QPID_LOG(error, "baz");
- BOOST_CHECK_EQUAL("foo\nbar\nbaz\n", os.str());
- l.clear();
-}
-
-#if 0 // This test requires manual intervention. Normally disabled.
-BOOST_AUTO_TEST_CASE(testSyslogOutput) {
- Logger& l = clearLogger();
- l.select(Selector(info));
- l.syslog("qpid_test");
- QPID_LOG(info, "Testing QPID");
- BOOST_ERROR("Manually verify that /var/log/messages contains a recent line 'Testing QPID'");
-}
-#endif // 0
-
-int count() {
- static int n = 0;
- return n++;
-}
-
-int loggedCount() {
- static int n = 0;
- QPID_LOG(debug, "counting: " << n);
- return n++;
-}
-
-
-using namespace qpid::sys;
-
-// Measure CPU time.
-clock_t timeLoop(int times, int (*fp)()) {
- clock_t start=clock();
- while (times-- > 0)
- (*fp)();
- return clock() - start;
-}
-
-// Overhead test disabled because it consumes a ton of CPU and takes
-// forever under valgrind. Not friendly for regular test runs.
-//
-#if 0
-BOOST_AUTO_TEST_CASE(testOverhead) {
- // Ensure that the ratio of CPU time for an incrementing loop
- // with and without disabled log statements is in acceptable limits.
- //
- int times=100000000;
- clock_t noLog=timeLoop(times, count);
- clock_t withLog=timeLoop(times, loggedCount);
- double ratio=double(withLog)/double(noLog);
-
- // NB: in initial tests the ratio was consistently below 1.5,
- // 2.5 is reasonable and should avoid spurios failures
- // due to machine load.
- //
- BOOST_CHECK_SMALL(ratio, 2.5);
-}
-#endif // 0
-
-Statement statement(
- Level level, const char* file="", int line=0, const char* fn=0)
-{
- Statement s={0, file, line, fn, level};
- return s;
-}
-
-
-struct TestOptions : public Options {
- TestOptions(int argc, char** argv) {
- qpid::po::options_description desc;
- addTo(desc);
- qpid::parseOptions(desc, argc, argv);
- }
-};
-
-#define ARGC(argv) (sizeof(argv)/sizeof(char*))
-
-BOOST_AUTO_TEST_CASE(testOptionsParse) {
- char* argv[]={
- 0,
- "--log.enable", "error+:foo",
- "--log.enable", "debug:bar",
- "--log.enable", "info",
- "--log.output", "x",
- "--log.output", "y",
- "--log.level", "yes",
- "--log.source", "1",
- "--log.thread", "true",
- "--log.function", "YES"
- };
- TestOptions opts(ARGC(argv), argv);
- vector<string> expect=list_of("error+:foo")("debug:bar")("info");
- BOOST_CHECK_EQUAL(expect, opts.selectors);
- expect=list_of("x")("y");
- BOOST_CHECK_EQUAL(expect, opts.outputs);
- BOOST_CHECK(opts.level);
- BOOST_CHECK(opts.source);
- BOOST_CHECK(opts.function);
- BOOST_CHECK(opts.thread);
-}
-
-BOOST_AUTO_TEST_CASE(testOptionsDefault) {
- Options opts;
- vector<string> expect=list_of("stderr");
- BOOST_CHECK_EQUAL(expect, opts.outputs);
- expect=list_of("error+");
- BOOST_CHECK_EQUAL(expect, opts.selectors);
- BOOST_CHECK(opts.time && opts.level);
- BOOST_CHECK(!(opts.source || opts.function || opts.thread));
-}
-
-BOOST_AUTO_TEST_CASE(testSelectorFromOptions) {
- char* argv[]={
- 0,
- "--log.enable", "error+:foo",
- "--log.enable", "debug:bar",
- "--log.enable", "info"
- };
- TestOptions opts(ARGC(argv), argv);
- vector<string> expect=list_of("error+:foo")("debug:bar")("info");
- BOOST_CHECK_EQUAL(expect, opts.selectors);
- Selector s(opts);
- BOOST_CHECK(!s.isEnabled(warning, "x"));
- BOOST_CHECK(!s.isEnabled(debug, "x"));
- BOOST_CHECK(s.isEnabled(debug, "bar"));
- BOOST_CHECK(s.isEnabled(error, "foo"));
- BOOST_CHECK(s.isEnabled(critical, "foo"));
-}
-
-BOOST_AUTO_TEST_CASE(testOptionsFormat) {
- Logger& l = clearLogger();
- Options opts;
- BOOST_CHECK_EQUAL(Logger::TIME|Logger::LEVEL, l.format(opts));
- char* argv[]={
- 0,
- "--log.time", "no",
- "--log.level", "no",
- "--log.source", "1",
- "--log.thread", "1"
- };
- qpid::po::options_description desc;
- opts.addTo(desc);
- qpid::parseOptions(desc, ARGC(argv), argv);
- BOOST_CHECK_EQUAL(
- Logger::FILE|Logger::LINE|Logger::THREAD, l.format(opts));
- opts = Options(); // Clear.
- char* argv2[]={
- 0,
- "--log.level", "no",
- "--log.thread", "true",
- "--log.function", "YES",
- "--log.time", "YES"
- };
- qpid::po::options_description desc2;
- opts.addTo(desc2);
- qpid::parseOptions(desc2, ARGC(argv2), argv2);
- BOOST_CHECK_EQUAL(
- Logger::THREAD|Logger::FUNCTION|Logger::TIME,
- l.format(opts));
-}
-
-
-BOOST_AUTO_TEST_CASE(testLoggerConfigure) {
- Logger& l = clearLogger();
- Options opts;
- char* argv[]={
- 0,
- "--log.time", "no",
- "--log.source", "yes",
- "--log.output", "logging.tmp",
- "--log.enable", "critical"
- };
- qpid::po::options_description desc;
- opts.addTo(desc);
- qpid::parseOptions(desc, ARGC(argv), argv);
- l.configure(opts, "test");
- QPID_LOG(critical, "foo"); int srcline=__LINE__;
- ifstream log("logging.tmp");
- string line;
- getline(log, line);
- string expect=(format("critical %s:%d: foo")%__FILE__%srcline).str();
- BOOST_CHECK_EQUAL(expect, line);
- log.close();
- unlink("logging.tmp");
-}
diff --git a/qpid/cpp/src/tests/unit/test_tools.h b/qpid/cpp/src/tests/unit/test_tools.h
deleted file mode 100644
index faa198af9a..0000000000
--- a/qpid/cpp/src/tests/unit/test_tools.h
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef TEST_TOOLS_H
-#define TEST_TOOLS_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 <boost/test/auto_unit_test.hpp>
-#include <boost/assign/list_of.hpp>
-#include <boost/regex.hpp>
-#include <vector>
-
-/** Stream operator so BOOST_CHECK_EQUALS works on vectors. */
-namespace std {
-template <class T>
-ostream& operator <<(ostream& o, const vector<T>& v) {
- o << " {";
- typename vector<T>::const_iterator i = v.begin();
- if (i != v.end())
- o << *i++;
- while (i != v.end())
- o << ", " << *i++;
- return o << "}";
-}
-} // namespace std
-
-/** NB: order of parameters is regex first, in line with
- * CHECK(expected, actual) convention.
- */
-inline bool regexPredicate(const std::string& re, const std::string& text) {
- return boost::regex_match(text, boost::regex(re));
-}
-
-/** Check for regular expression match. You must #include <boost/regex.hpp> */
-#define BOOST_CHECK_REGEX(re, text) \
- BOOST_CHECK_PREDICATE(regexPredicate, (re)(text))
-
-#endif /*!TEST_TOOLS_H*/
-