3 * Copyright (c) 2020 Project CHIP Authors
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 #include <mdns/minimal/QueryReplyFilter.h>
18 #include <support/UnitTestRegistration.h>
20 #include <nlunit-test.h>
25 using namespace mdns::Minimal;
27 const QNamePart kName1[] = { "some", "local" };
28 const QNamePart kName2[] = { "something", "else" };
29 const QNamePart kName3[] = { "more", "specific", "some", "local" };
30 const QNamePart kName4[] = { "this", "is", "a", "test" };
33 QueryData buildQueryData(QType qType, QClass qClass, const uint8_t (&query)[N])
35 return QueryData(qType, qClass, false, query, BytesRange(query, query + N));
38 void TestQueryReplyFilter(nlTestSuite * inSuite, void * inContext)
40 const uint8_t query[] = {
41 4, 's', 'o', 'm', 'e', //
42 5, 'l', 'o', 'c', 'a', 'l', //
46 // sanity test that the serialized qname was build correctly
47 NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) == FullQName(kName1));
48 NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) != FullQName(kName2));
49 NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) != FullQName(kName3));
50 NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) != FullQName(kName4));
54 inSuite, QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
55 NL_TEST_ASSERT(inSuite,
56 QueryReplyFilter(buildQueryData(QType::A, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
58 NL_TEST_ASSERT(inSuite,
59 QueryReplyFilter(buildQueryData(QType::ANY, QClass::IN, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
61 NL_TEST_ASSERT(inSuite,
62 QueryReplyFilter(buildQueryData(QType::A, QClass::IN, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
66 inSuite, !QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName2)));
69 inSuite, !QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName3)));
72 inSuite, !QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName4)));
76 !QueryReplyFilter(buildQueryData(QType::AAAA, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
79 inSuite, !QueryReplyFilter(buildQueryData(QType::SRV, QClass::IN, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
82 inSuite, !QueryReplyFilter(buildQueryData(QType::PTR, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
85 void TestLongerQueryPath(nlTestSuite * inSuite, void * inContext)
87 const uint8_t query[] = {
88 4, 'm', 'o', 'r', 'e', //
89 8, 's', 'p', 'e', 'c', 'i', 'f', 'i', 'c', //
90 4, 's', 'o', 'm', 'e', //
91 5, 'l', 'o', 'c', 'a', 'l', //
95 // sanity test that the serialized qname was build correctly
96 NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) != FullQName(kName1));
97 NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) != FullQName(kName2));
98 NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) == FullQName(kName3));
99 NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) != FullQName(kName4));
102 inSuite, !QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
104 inSuite, QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName3)));
107 const nlTest sTests[] = {
108 NL_TEST_DEF("TestQueryReplyFilter", TestQueryReplyFilter), //
109 NL_TEST_DEF("TestLongerQueryPath", TestLongerQueryPath), //
110 NL_TEST_SENTINEL() //
115 int TestQueryReplyFilter(void)
117 nlTestSuite theSuite = { "QueryReplyFilter", sTests, nullptr, nullptr };
118 nlTestRunner(&theSuite, nullptr);
119 return nlTestRunnerStats(&theSuite);
122 CHIP_REGISTER_TEST_SUITE(TestQueryReplyFilter)