blob: 7b8888ff64ebec81d9f304f8add0d05c41b5c0ef [file] [log] [blame]
/*
* Copyright (c) 2017-2019, 2021 Apple Inc. All rights reserved.
*
* Licensed 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
*
* https://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 "unittest_common.h"
#import <XCTest/XCTest.h>
// This DNS message was gleaned from a uDNS query request packet that was captured with Wireshark.
uint8_t udns_query_request_message[28] = { // contains 1 question for www.f5.com
0x31, 0xca, // transaction id
0x01, 0x00, // flags
0x00, 0x01, // 1 question
0x00, 0x00, // no anwsers
0x00, 0x00, // no authoritative answers
0x00, 0x00, // no additionals
0x03, 0x77, 0x77, 0x77, 0x02, 0x66, 0x35, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01
};
// This DNS message was gleaned from a uDNS query request packet that was captured with Wireshark.
// Then the header id (more specifically, the msg->h.id) was deliberately cleared to force code
// path to traverse regression case, <rdar://problem/28556513>.
uint8_t udns_query_request_message_with_invalid_id[28] = { // contains 1 question for www.f5.com, msg->h.id = 0
0x00, 0x00, // transaction id
0x01, 0x00, // flags
0x00, 0x01, // 1 question
0x00, 0x00, // no anwsers
0x00, 0x00, // no authoritative answers
0x00, 0x00, // no additionals
0x03, 0x77, 0x77, 0x77, 0x02, 0x66, 0x35, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01
};
uint8_t arp_request_packet[28] = { // contains 1 question for www.f5.com, msg->h.id = 0
0x00, 0x01, // hardware type: enet
0x08, 0x00, // protocol type: IP
0x06, // hardware size
0x04, // Protcol size
0x00, 0x01, // opcode request
0x24, 0x01, 0xc7, 0x24, 0x35, 0x00, // Sender mac addr
0x11, 0xe2, 0x14, 0x01, // Sender ip addr
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // target mac addr
0x11, 0xe2, 0x17, 0xbe // target ip addr
};
mDNSlocal void InitmDNSStorage(mDNS *const m)
{
memset(m, 0, sizeof(mDNS));
}
@interface mDNSCoreReceiveTest : XCTestCase
{
}
@end
@implementation mDNSCoreReceiveTest
- (void)setUp
{
mDNSPlatformTimeInit();
mDNS_LoggingEnabled = 0;
mDNS_PacketLoggingEnabled = 0;
}
- (void)tearDown {
}
- (void)testValidQueryReq
{
mDNS *const m = &mDNSStorage;
mDNSAddr srcaddr, dstaddr;
mDNSIPPort srcport, dstport;
DNSMessage * msg;
const mDNSu8 * end;
// Init unit test environment and verify no error occurred.
mStatus result = init_mdns_environment(mDNStrue);
XCTAssertEqual(result, mStatus_NoError);
// Used random values for srcaddr and srcport
srcaddr.type = mDNSAddrType_IPv4;
srcaddr.ip.v4.b[0] = 192;
srcaddr.ip.v4.b[1] = 168;
srcaddr.ip.v4.b[2] = 1;
srcaddr.ip.v4.b[3] = 10;
srcport.NotAnInteger = swap16((mDNSu16)53);
// Used random values for dstaddr and dstport
dstaddr.type = mDNSAddrType_IPv4;
dstaddr.ip.v4.b[0] = 192;
dstaddr.ip.v4.b[1] = 168;
dstaddr.ip.v4.b[2] = 1;
dstaddr.ip.v4.b[3] = 20;
dstport.NotAnInteger = swap16((mDNSu16)49339);
// Set message to a DNS message (copied from a WireShark packet)
msg = (DNSMessage *)udns_query_request_message;
end = udns_query_request_message + sizeof(udns_query_request_message);
// Execute mDNSCoreReceive using a valid DNS message
mDNSCoreReceive(m, msg, end, &srcaddr, srcport, &dstaddr, dstport, (mDNSInterfaceID)((uintptr_t)if_nametoindex("en0")));
// Verify that mDNSCoreReceiveQuery traversed the normal code path
XCTAssertEqual(m->mDNSStats.NormalQueries, 1);
}
- (void)testNullDstQueryReqTest
{
mDNS *const m = &mDNSStorage;
mDNSAddr srcaddr;
mDNSIPPort srcport, dstport;
DNSMessage * msg;
const mDNSu8 * end;
// This test case does not require setup of interfaces, the record's cache, or pending questions
// so m is initialized to all zeros.
InitmDNSStorage(m);
// Used random values for srcaddr and srcport
srcaddr.type = mDNSAddrType_IPv4;
srcaddr.ip.v4.b[0] = 192;
srcaddr.ip.v4.b[1] = 168;
srcaddr.ip.v4.b[2] = 1;
srcaddr.ip.v4.b[3] = 10;
srcport.NotAnInteger = swap16((mDNSu16)53);
// Used random value for dstport
dstport.NotAnInteger = swap16((mDNSu16)49339);
// Set message to a DNS message (copied from a WireShark packet)
msg = (DNSMessage *)udns_query_request_message_with_invalid_id;
end = udns_query_request_message_with_invalid_id + sizeof(udns_query_request_message_with_invalid_id);
// Execute mDNSCoreReceive to regress <rdar://problem/28556513>
mDNSCoreReceive(m, msg, end, &srcaddr, srcport, NULL, dstport, (mDNSInterfaceID)((uintptr_t)if_nametoindex("en0")));
// Verify that mDNSCoreReceiveQuery was NOT traversed through the normal code path
XCTAssertEqual(m->mDNSStats.NormalQueries, 0);
// Verify code path that previously crashed, in <rdar://problem/28556513>, now traverses successfully
// by checking a counter that was incremented on code path that crashed.
XCTAssertEqual(m->MPktNum, 1);
}
#if 0
- (void)testPerformanceExample {
// This is an example of a performance test case.
[self measureBlock:^{
// Put the code you want to measure the time of here.
}];
}
#endif
@end