/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 "qpid/broker/TopicExchange.h" #include "unit_test.h" #include "test_tools.h" using namespace qpid::broker; Tokens makeTokens(const char** begin, const char** end) { Tokens t; t.insert(t.end(), begin, end); return t; } // Calculate size of an array. #define LEN(a) (sizeof(a)/sizeof(a[0])) // Convert array to token vector #define TOKENS(a) makeTokens(a, a + LEN(a)) #define ASSERT_NORMALIZED(expect, pattern) \ BOOST_CHECK_EQUAL(Tokens(expect), static_cast(TopicPattern(pattern))) QPID_AUTO_TEST_SUITE(TopicExchangeTestSuite) QPID_AUTO_TEST_CASE(testTokens) { Tokens tokens("hello.world"); const char* expect[] = {"hello", "world"}; BOOST_CHECK_EQUAL(TOKENS(expect), tokens); tokens = "a.b.c"; const char* expect2[] = { "a", "b", "c" }; BOOST_CHECK_EQUAL(TOKENS(expect2), tokens); tokens = ""; BOOST_CHECK(tokens.empty()); tokens = "x"; const char* expect3[] = { "x" }; BOOST_CHECK_EQUAL(TOKENS(expect3), tokens); tokens = (".x"); const char* expect4[] = { "", "x" }; BOOST_CHECK_EQUAL(TOKENS(expect4), tokens); tokens = ("x."); const char* expect5[] = { "x", "" }; BOOST_CHECK_EQUAL(TOKENS(expect5), tokens); tokens = ("."); const char* expect6[] = { "", "" }; BOOST_CHECK_EQUAL(TOKENS(expect6), tokens); tokens = (".."); const char* expect7[] = { "", "", "" }; BOOST_CHECK_EQUAL(TOKENS(expect7), tokens); } QPID_AUTO_TEST_CASE(testNormalize) { BOOST_CHECK(TopicPattern("").empty()); ASSERT_NORMALIZED("a.b.c", "a.b.c"); ASSERT_NORMALIZED("a.*.c", "a.*.c"); ASSERT_NORMALIZED("#", "#"); ASSERT_NORMALIZED("#", "#.#.#.#"); ASSERT_NORMALIZED("*.*.*.#", "#.*.#.*.#.#.*"); ASSERT_NORMALIZED("a.*.*.*.#", "a.*.#.*.#.*.#"); ASSERT_NORMALIZED("a.*.*.*.#", "a.*.#.*.#.*"); } QPID_AUTO_TEST_CASE(testPlain) { TopicPattern p("ab.cd.e"); BOOST_CHECK(p.match("ab.cd.e")); BOOST_CHECK(!p.match("abx.cd.e")); BOOST_CHECK(!p.match("ab.cd")); BOOST_CHECK(!p.match("ab.cd..e.")); BOOST_CHECK(!p.match("ab.cd.e.")); BOOST_CHECK(!p.match(".ab.cd.e")); p = ""; BOOST_CHECK(p.match("")); p = "."; BOOST_CHECK(p.match(".")); } QPID_AUTO_TEST_CASE(testStar) { TopicPattern p("a.*.b"); BOOST_CHECK(p.match("a.xx.b")); BOOST_CHECK(!p.match("a.b")); p = "*.x"; BOOST_CHECK(p.match("y.x")); BOOST_CHECK(p.match(".x")); BOOST_CHECK(!p.match("x")); p = "x.x.*"; BOOST_CHECK(p.match("x.x.y")); BOOST_CHECK(p.match("x.x.")); BOOST_CHECK(!p.match("x.x")); BOOST_CHECK(!p.match("q.x.y")); } QPID_AUTO_TEST_CASE(testHash) { TopicPattern p("a.#.b"); BOOST_CHECK(p.match("a.b")); BOOST_CHECK(p.match("a.x.b")); BOOST_CHECK(p.match("a..x.y.zz.b")); BOOST_CHECK(!p.match("a.b.")); BOOST_CHECK(!p.match("q.x.b")); p = "a.#"; BOOST_CHECK(p.match("a")); BOOST_CHECK(p.match("a.b")); BOOST_CHECK(p.match("a.b.c")); p = "#.a"; BOOST_CHECK(p.match("a")); BOOST_CHECK(p.match("x.y.a")); } QPID_AUTO_TEST_CASE(testMixed) { TopicPattern p("*.x.#.y"); BOOST_CHECK(p.match("a.x.y")); BOOST_CHECK(p.match("a.x.p.qq.y")); BOOST_CHECK(!p.match("a.a.x.y")); BOOST_CHECK(!p.match("aa.x.b.c")); p = "a.#.b.*"; BOOST_CHECK(p.match("a.b.x")); BOOST_CHECK(p.match("a.x.x.x.b.x")); } QPID_AUTO_TEST_CASE(testCombo) { TopicPattern p("*.#.#.*.*.#"); BOOST_CHECK(p.match("x.y.z")); BOOST_CHECK(p.match("x.y.z.a.b.c")); BOOST_CHECK(!p.match("x.y")); BOOST_CHECK(!p.match("x")); } QPID_AUTO_TEST_SUITE_END()