diff options
| author | Alan Conway <aconway@apache.org> | 2007-06-26 02:11:55 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2007-06-26 02:11:55 +0000 |
| commit | baae218dacf7b5e56b52602ad4fbf2be0b81a2af (patch) | |
| tree | a40207d3c21d96f7df16c7005602fecbd1d90d88 /qpid/cpp/src/tests/unit | |
| parent | b8c5c8d42d8dc73cfc58acd015e0af2b4eac0dcc (diff) | |
| download | qpid-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.cpp | 97 | ||||
| -rw-r--r-- | qpid/cpp/src/tests/unit/Url.cpp | 55 | ||||
| -rw-r--r-- | qpid/cpp/src/tests/unit/logging.cpp | 374 | ||||
| -rw-r--r-- | qpid/cpp/src/tests/unit/test_tools.h | 53 |
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*/ - |
