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 | e6566439f627e375f12f77044819bbb37b585348 (patch) | |
tree | 18c52172d536b53df57e82a274a31bcfabc35f7b /cpp/src/tests/unit/logging.cpp | |
parent | 87c376ebc8fe6af86dc8aef8dcec03510ff5dcc0 (diff) | |
download | qpid-python-e6566439f627e375f12f77044819bbb37b585348.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/qpid@550658 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/tests/unit/logging.cpp')
-rw-r--r-- | cpp/src/tests/unit/logging.cpp | 374 |
1 files changed, 0 insertions, 374 deletions
diff --git a/cpp/src/tests/unit/logging.cpp b/cpp/src/tests/unit/logging.cpp deleted file mode 100644 index c80bf7b337..0000000000 --- a/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"); -} |