1 #include "mDNSCoreReceiveTest.h"
2 #include "unittest_common.h"
4 int InitmDNSCoreReceiveTest(void);
5 int ValidQueryReqTest(void);
6 int NullDstQueryReqTest(void);
7 int ReceiveArpLogMsgTest(void);
8 void InitmDNSStorage(mDNS
*const m
);
10 // This DNS message was gleaned from a uDNS query request packet that was captured with Wireshark.
11 uint8_t udns_query_request_message
[28] = { // contains 1 question for www.f5.com
12 0x31, 0xca, // transaction id
14 0x00, 0x01, // 1 question
15 0x00, 0x00, // no anwsers
16 0x00, 0x00, // no authoritative answers
17 0x00, 0x00, // no additionals
18 0x03, 0x77, 0x77, 0x77, 0x02, 0x66, 0x35, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01
21 // This DNS message was gleaned from a uDNS query request packet that was captured with Wireshark.
22 // Then the header id (more specifically, the msg->h.id) was deliberately cleared to force code
23 // path to traverse regression case, <rdar://problem/28556513>.
24 uint8_t udns_query_request_message_with_invalid_id
[28] = { // contains 1 question for www.f5.com, msg->h.id = 0
25 0x00, 0x00, // transaction id
27 0x00, 0x01, // 1 question
28 0x00, 0x00, // no anwsers
29 0x00, 0x00, // no authoritative answers
30 0x00, 0x00, // no additionals
31 0x03, 0x77, 0x77, 0x77, 0x02, 0x66, 0x35, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01
34 uint8_t arp_request_packet
[28] = { // contains 1 question for www.f5.com, msg->h.id = 0
35 0x00, 0x01, // hardware type: enet
36 0x08, 0x00, // protocol type: IP
37 0x06, // hardware size
39 0x00, 0x01, // opcode request
40 0x24, 0x01, 0xc7, 0x24, 0x35, 0x00, // Sender mac addr
41 0x11, 0xe2, 0x14, 0x01, // Sender ip addr
42 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // target mac addr
43 0x11, 0xe2, 0x17, 0xbe // target ip addr
45 UNITTEST_HEADER(mDNSCoreReceiveTest
)
46 UNITTEST_TEST(InitmDNSCoreReceiveTest
)
47 UNITTEST_TEST(ValidQueryReqTest
)
48 UNITTEST_TEST(NullDstQueryReqTest
)
49 UNITTEST_TEST(ReceiveArpLogMsgTest
)
52 UNITTEST_HEADER(InitmDNSCoreReceiveTest
)
53 mDNSPlatformTimeInit();
55 mDNS_LoggingEnabled
= 0;
56 mDNS_PacketLoggingEnabled
= 0;
59 UNITTEST_HEADER(ReceiveArpLogMsgTest
)
60 // Init unit test environment and verify no error occurred.
61 mStatus result
= init_mdns_environment(mDNStrue
);
62 UNITTEST_ASSERT(result
== mStatus_NoError
);
64 UNITTEST_ASSERT(result
== mStatus_NoError
);
65 ArpLogMsgTest(&mDNSStorage
, (const ARP_EthIP
*) arp_request_packet
, primary_interfaceID
);
66 UNITTEST_ASSERT(result
== mStatus_NoError
);
69 UNITTEST_HEADER(ValidQueryReqTest
)
70 mDNS
*const m
= &mDNSStorage
;
71 mDNSAddr srcaddr
, dstaddr
;
72 mDNSIPPort srcport
, dstport
;
76 // This test case does not require setup of interfaces, the record's cache, or pending questions
77 // so m is initialized to all zeros.
80 // Used random values for srcaddr and srcport
81 srcaddr
.type
= mDNSAddrType_IPv4
;
82 srcaddr
.ip
.v4
.b
[0] = 192;
83 srcaddr
.ip
.v4
.b
[1] = 168;
84 srcaddr
.ip
.v4
.b
[2] = 1;
85 srcaddr
.ip
.v4
.b
[3] = 10;
86 srcport
.NotAnInteger
= swap16((mDNSu16
)53);
88 // Used random values for dstaddr and dstport
89 dstaddr
.type
= mDNSAddrType_IPv4
;
90 dstaddr
.ip
.v4
.b
[0] = 192;
91 dstaddr
.ip
.v4
.b
[1] = 168;
92 dstaddr
.ip
.v4
.b
[2] = 1;
93 dstaddr
.ip
.v4
.b
[3] = 20;
94 dstport
.NotAnInteger
= swap16((mDNSu16
)49339);
96 // Set message to a DNS message (copied from a WireShark packet)
97 msg
= (DNSMessage
*)udns_query_request_message
;
98 end
= udns_query_request_message
+ sizeof(udns_query_request_message
);
100 // Execute mDNSCoreReceive using a valid DNS message
101 mDNSCoreReceive(m
, msg
, end
, &srcaddr
, srcport
, &dstaddr
, dstport
, if_nametoindex("en0"));
103 // Verify that mDNSCoreReceiveQuery traversed the normal code path
104 UNITTEST_ASSERT(m
->mDNSStats
.NormalQueries
== 1);
108 UNITTEST_HEADER(NullDstQueryReqTest
)
110 mDNS
*const m
= &mDNSStorage
;
112 mDNSIPPort srcport
, dstport
;
116 // This test case does not require setup of interfaces, the record's cache, or pending questions
117 // so m is initialized to all zeros.
120 // Used random values for srcaddr and srcport
121 srcaddr
.type
= mDNSAddrType_IPv4
;
122 srcaddr
.ip
.v4
.b
[0] = 192;
123 srcaddr
.ip
.v4
.b
[1] = 168;
124 srcaddr
.ip
.v4
.b
[2] = 1;
125 srcaddr
.ip
.v4
.b
[3] = 10;
126 srcport
.NotAnInteger
= swap16((mDNSu16
)53);
128 // Used random value for dstport
129 dstport
.NotAnInteger
= swap16((mDNSu16
)49339);
131 // Set message to a DNS message (copied from a WireShark packet)
132 msg
= (DNSMessage
*)udns_query_request_message_with_invalid_id
;
133 end
= udns_query_request_message_with_invalid_id
+ sizeof(udns_query_request_message_with_invalid_id
);
135 // Execute mDNSCoreReceive to regress <rdar://problem/28556513>
136 mDNSCoreReceive(m
, msg
, end
, &srcaddr
, srcport
, NULL
, dstport
, if_nametoindex("en0"));
138 // Verify that mDNSCoreReceiveQuery was NOT traversed through the normal code path
139 UNITTEST_ASSERT(m
->mDNSStats
.NormalQueries
== 0);
141 // Verify code path that previously crashed, in <rdar://problem/28556513>, now traverses successfully
142 // by checking a counter that was incremented on code path that crashed.
143 UNITTEST_ASSERT(m
->MPktNum
== 1);
147 void InitmDNSStorage(mDNS
*const m
)
149 memset(m
, 0, sizeof(mDNS
));