Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / src / lib / mdns / minimal / tests / TestQueryReplyFilter.cpp
1 /*
2  *
3  *    Copyright (c) 2020 Project CHIP Authors
4  *
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
8  *
9  *        http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  */
17 #include <mdns/minimal/QueryReplyFilter.h>
18 #include <support/UnitTestRegistration.h>
19
20 #include <nlunit-test.h>
21
22 namespace {
23
24 using namespace chip;
25 using namespace mdns::Minimal;
26
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" };
31
32 template <size_t N>
33 QueryData buildQueryData(QType qType, QClass qClass, const uint8_t (&query)[N])
34 {
35     return QueryData(qType, qClass, false, query, BytesRange(query, query + N));
36 }
37
38 void TestQueryReplyFilter(nlTestSuite * inSuite, void * inContext)
39 {
40     const uint8_t query[] = {
41         4, 's', 'o', 'm', 'e',      //
42         5, 'l', 'o', 'c', 'a', 'l', //
43         0                           //
44     };
45
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));
51
52     // Acceptable cases
53     NL_TEST_ASSERT(
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)));
57
58     NL_TEST_ASSERT(inSuite,
59                    QueryReplyFilter(buildQueryData(QType::ANY, QClass::IN, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
60
61     NL_TEST_ASSERT(inSuite,
62                    QueryReplyFilter(buildQueryData(QType::A, QClass::IN, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
63
64     // Reject cases
65     NL_TEST_ASSERT(
66         inSuite, !QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName2)));
67
68     NL_TEST_ASSERT(
69         inSuite, !QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName3)));
70
71     NL_TEST_ASSERT(
72         inSuite, !QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName4)));
73
74     NL_TEST_ASSERT(
75         inSuite,
76         !QueryReplyFilter(buildQueryData(QType::AAAA, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
77
78     NL_TEST_ASSERT(
79         inSuite, !QueryReplyFilter(buildQueryData(QType::SRV, QClass::IN, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
80
81     NL_TEST_ASSERT(
82         inSuite, !QueryReplyFilter(buildQueryData(QType::PTR, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
83 }
84
85 void TestLongerQueryPath(nlTestSuite * inSuite, void * inContext)
86 {
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',                //
92         0                                          //
93     };
94
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));
100
101     NL_TEST_ASSERT(
102         inSuite, !QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1)));
103     NL_TEST_ASSERT(
104         inSuite, QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName3)));
105 }
106
107 const nlTest sTests[] = {
108     NL_TEST_DEF("TestQueryReplyFilter", TestQueryReplyFilter), //
109     NL_TEST_DEF("TestLongerQueryPath", TestLongerQueryPath),   //
110     NL_TEST_SENTINEL()                                         //
111 };
112
113 } // namespace
114
115 int TestQueryReplyFilter(void)
116 {
117     nlTestSuite theSuite = { "QueryReplyFilter", sTests, nullptr, nullptr };
118     nlTestRunner(&theSuite, nullptr);
119     return nlTestRunnerStats(&theSuite);
120 }
121
122 CHIP_REGISTER_TEST_SUITE(TestQueryReplyFilter)