diff options
author | Alan Conway <aconway@apache.org> | 2008-11-20 18:29:20 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2008-11-20 18:29:20 +0000 |
commit | 24f410931d76bc37dd575436a7b11a87b6aef0c9 (patch) | |
tree | 49ee770cf521f3a0bba881cee7219082ee89b2c2 /cpp/src/tests/Url.cpp | |
parent | 5b93ee887ca64e26fb2440bab4c9785ea3de2e79 (diff) | |
download | qpid-python-24f410931d76bc37dd575436a7b11a87b6aef0c9.tar.gz |
Replaced boost.spirit-based URL parser with simple recursive descent parser.
boost.spirit has some known thread-safety issues and appears to be causing
qpid clients to crash in several scenarios.
The new parser is trivially thread safe and relatively easy to extend.
It's a simple recursive descent parser, sufficient for simple grammars
like those used in URL formats. It's not intended to be a
full-featured parser framework like spirit.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@719317 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/tests/Url.cpp')
-rw-r--r-- | cpp/src/tests/Url.cpp | 53 |
1 files changed, 28 insertions, 25 deletions
diff --git a/cpp/src/tests/Url.cpp b/cpp/src/tests/Url.cpp index 4684ab4a7c..f3b42a7208 100644 --- a/cpp/src/tests/Url.cpp +++ b/cpp/src/tests/Url.cpp @@ -28,37 +28,40 @@ using namespace boost::assign; QPID_AUTO_TEST_SUITE(UrlTestSuite) -QPID_AUTO_TEST_CASE(testUrl_str) { - Url url; - url.push_back(TcpAddress("foo.com")); - url.push_back(TcpAddress("bar.com", 6789)); - BOOST_CHECK_EQUAL("amqp:tcp:foo.com:5672,tcp:bar.com:6789", url.str()); - BOOST_CHECK(Url().str().empty()); -} - +#define URL_CHECK_STR(STR) BOOST_CHECK_EQUAL(Url(STR).str(), STR) +#define URL_CHECK_INVALID(STR) BOOST_CHECK_THROW(Url(STR), Url::Invalid) -QPID_AUTO_TEST_CASE(testUrl_parse) { - Url url; - url.parse("amqp:foo.com,tcp:bar.com:1234"); - BOOST_CHECK_EQUAL(2u, url.size()); - BOOST_CHECK_EQUAL("foo.com", url[0].get<TcpAddress>()->host); - BOOST_CHECK_EQUAL("amqp:tcp:foo.com:5672,tcp:bar.com:1234", url.str()); +QPID_AUTO_TEST_CASE(TestParseTcp) { + URL_CHECK_STR("amqp:tcp:host:42"); + URL_CHECK_STR("amqp:tcp:host-._~%ff%23:42"); // unreserved chars and pct encoded hex. - url.parse("amqp:foo/ignorethis"); - BOOST_CHECK_EQUAL("amqp:tcp:foo:5672", url.str()); + // Check defaults + BOOST_CHECK_EQUAL(Url("amqp:host:42").str(), "amqp:tcp:host:42"); + BOOST_CHECK_EQUAL(Url("amqp:tcp:host").str(), "amqp:tcp:host:5672"); + BOOST_CHECK_EQUAL(Url("amqp:tcp:").str(), "amqp:tcp:127.0.0.1:5672"); + BOOST_CHECK_EQUAL(Url("amqp:").str(), "amqp:tcp:127.0.0.1:5672"); + BOOST_CHECK_EQUAL(Url("amqp::42").str(), "amqp:tcp:127.0.0.1:42"); - url.parse("amqp:"); - BOOST_CHECK_EQUAL("amqp:tcp::5672", url.str()); + URL_CHECK_INVALID("amqp::badHost!#$#"); + URL_CHECK_INVALID("amqp::host:badPort"); +} - try { - url.parse("invalid url"); - BOOST_FAIL("Expected InvalidUrl exception"); - } - catch (const Url::InvalidUrl&) {} +QPID_AUTO_TEST_CASE(TestParseExample) { + URL_CHECK_STR("amqp:example:x"); + URL_CHECK_INVALID("amqp:example:badExample"); +} - url.parseNoThrow("invalid url"); - BOOST_CHECK(url.empty()); +QPID_AUTO_TEST_CASE(TestParseMultiAddress) { + URL_CHECK_STR("amqp:tcp:host:0,example:y,tcp:foo:0,example:1"); + URL_CHECK_STR("amqp:example:z,tcp:foo:0"); + URL_CHECK_INVALID("amqp:tcp:h:0,"); + URL_CHECK_INVALID(",amqp:tcp:h"); } +QPID_AUTO_TEST_CASE(TestInvalidAddress) { + URL_CHECK_INVALID("xxxx"); + URL_CHECK_INVALID(""); +} + QPID_AUTO_TEST_SUITE_END() |