]> git.saurik.com Git - apple/mdnsresponder.git/blobdiff - unittests/unittest_common.c
mDNSResponder-1096.100.3.tar.gz
[apple/mdnsresponder.git] / unittests / unittest_common.c
index 397180598c2ac7f042fc30e2d6f0c15061ffde6d..66216c4f0a8705fb7a6085d3976f3b4e64d1c910 100644 (file)
@@ -82,7 +82,7 @@ mDNSexport mStatus start_client_request(request_state* req, char *msgbuf, size_t
        init_client_request(req, msgbuf, msgsz, op);
 
        mStatus result = handle_client_request_ut((void*)req);
-       DNSQuestion* q = &req->u.queryrecord.q;
+       DNSQuestion* q = &req->u.queryrecord.op.q;
        q->LocalSocket = socket;
        return result;
 }
@@ -94,7 +94,7 @@ mDNSexport void receive_response(const request_state* req, DNSMessage *msg, size
        mDNSAddr srcaddr;
        mDNSIPPort srcport, dstport;
        const mDNSu8 * end;
-       DNSQuestion *q = (DNSQuestion *)&req->u.queryrecord.q;
+       DNSQuestion *q = (DNSQuestion *)&req->u.queryrecord.op.q;
        UInt8* data = (UInt8*)msg;
 
        // Used same values for DNS server as specified during init of unit test
@@ -117,6 +117,48 @@ mDNSexport void receive_response(const request_state* req, DNSMessage *msg, size
        mDNSCoreReceive(m, msg, end, &srcaddr, srcport, &primary_v4, dstport, primary_interfaceID);
 }
 
+mDNSexport void receive_suspicious_response_ut(const request_state* req, DNSMessage *msg, size_t msgSize, mDNSOpaque16 suspiciousqid, mDNSBool goodLastQID)
+{
+    mDNS *m = &mDNSStorage;
+    mDNSAddr srcaddr;
+    mDNSIPPort srcport, dstport;
+    const mDNSu8 * end;
+    DNSQuestion *q = (DNSQuestion *)&req->u.queryrecord.op.q;
+    UInt8* data = (UInt8*)msg;
+
+    // Used same values for DNS server as specified during init of unit test
+    srcaddr.type                = mDNSAddrType_IPv4;
+    srcaddr.ip.v4.NotAnInteger    = dns_server_ipv4.NotAnInteger;
+    srcport.NotAnInteger        = client_resp_src_port;
+
+    // Used random value for dstport
+    dstport.NotAnInteger = swap16((mDNSu16)client_resp_dst_port);
+
+    // Set DNS message (that was copied from a WireShark packet)
+    end = (const mDNSu8 *)msg + msgSize;
+
+    // Set socket info that mDNSCoreReceive uses to verify socket context
+    q->LocalSocket->ss.port.NotAnInteger = swap16((mDNSu16)client_resp_dst_port);
+    if (suspiciousqid.NotAnInteger)
+    {
+        q->TargetQID.NotAnInteger = swap16(suspiciousqid.NotAnInteger);
+        if (goodLastQID)
+        {
+            q->LastTargetQID.b[0] = data[0];
+            q->LastTargetQID.b[1] = data[1];
+        }
+        else q->LastTargetQID.NotAnInteger = 0;
+    }
+    else
+    {
+        q->TargetQID.b[0] = data[0];
+        q->TargetQID.b[1] = data[1];
+    }
+
+    // Execute mDNSCoreReceive which copies two DNS records into the cache
+    mDNSCoreReceive(m, msg, end, &srcaddr, srcport, &primary_v4, dstport, primary_interfaceID);
+}
+
 mDNSexport  size_t get_reply_len(char* name, uint16_t rdlen)
 {
        size_t len = sizeof(DNSServiceFlags);
@@ -155,3 +197,71 @@ mDNSexport void get_ip(const char *const name, struct sockaddr_storage *result)
        if (aiList) freeaddrinfo(aiList);
 }
 
+// The AddDNSServer_ut function adds a dns server to mDNSResponder's list.
+mDNSexport mStatus AddDNSServerScoped_ut(mDNSInterfaceID interfaceID, ScopeType scoped)
+{
+    mDNS *m = &mDNSStorage;
+    m->timenow = 0;
+    mDNS_Lock(m);
+    domainname  d;
+    mDNSAddr    addr;
+    mDNSIPPort  port;
+    mDNSs32     serviceID      = 0;
+    mDNSu32     timeout        = dns_server_timeout;
+    mDNSBool    cellIntf       = 0;
+    mDNSBool    isExpensive    = 0;
+    mDNSBool    isConstrained  = 0;
+    mDNSBool    isCLAT46       = mDNSfalse;
+    mDNSu32     resGroupID     = dns_server_resGroupID;
+    mDNSBool    reqA           = mDNStrue;
+    mDNSBool    reqAAAA        = mDNStrue;
+    mDNSBool    reqDO          = mDNSfalse;
+    d.c[0]                     = 0;
+    addr.type                  = mDNSAddrType_IPv4;
+    addr.ip.v4.NotAnInteger    = dns_server_ipv4.NotAnInteger;
+    port.NotAnInteger          = client_resp_src_port;
+    mDNS_AddDNSServer(m, &d, interfaceID, serviceID, &addr, port, scoped, timeout,
+                      cellIntf, isExpensive, isConstrained, isCLAT46, resGroupID,
+                      reqA, reqAAAA, reqDO);
+    mDNS_Unlock(m);
+    return mStatus_NoError;
+}
+
+mDNSexport mStatus AddDNSServer_ut(void)
+{
+    return AddDNSServerScoped_ut(primary_interfaceID, kScopeNone);
+}
+
+mDNSexport mStatus  force_uDNS_SetupDNSConfig_ut(mDNS *const m)
+{
+    m->p->LastConfigGeneration = 0;
+    return uDNS_SetupDNSConfig(m);
+}
+
+mDNSexport mStatus verify_cache_addr_order_for_domain_ut(mDNS *const m, mDNSu8* octet, mDNSu32 count, const domainname *const name)
+{
+    mStatus result = mStatus_NoError;
+    const CacheGroup *cg = CacheGroupForName(m, DomainNameHashValue(name), name);
+    if (cg)
+    {
+        mDNSu32 i;
+        CacheRecord **rp = (CacheRecord **)&cg->members;
+        for (i = 0 ; *rp && i < count ; i++ )
+        {
+            if ((*rp)->resrec.rdata->u.ipv4.b[3] != octet[i])
+            {
+                LogInfo ("Octet %d compare failed %d != %d", i, (*rp)->resrec.rdata->u.ipv4.b[3], octet[i]);
+                break;
+            }
+            rp = &(*rp)->next;
+        }
+        if (i != count) result = mStatus_Invalid;
+    }
+    else
+    {
+        LogInfo ("Cache group not found");
+        result = mStatus_Invalid;
+    }
+
+    return result;
+}