Hans Leidekker : dnsapi: Implement and test DnsRecordSetCompare.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 8 15:38:12 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: efe9cedab282c6028ab970a74fe4e1580c22fa94
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=efe9cedab282c6028ab970a74fe4e1580c22fa94

Author: Hans Leidekker <hans at it.vu.nl>
Date:   Mon May  8 16:39:23 2006 +0200

dnsapi: Implement and test DnsRecordSetCompare.

---

 dlls/dnsapi/dnsapi.spec    |    2 +
 dlls/dnsapi/record.c       |   82 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/dnsapi/tests/record.c |   75 +++++++++++++++++++++++++++++++++-------
 3 files changed, 144 insertions(+), 15 deletions(-)

diff --git a/dlls/dnsapi/dnsapi.spec b/dlls/dnsapi/dnsapi.spec
index a2502b8..e6a42b0 100644
--- a/dlls/dnsapi/dnsapi.spec
+++ b/dlls/dnsapi/dnsapi.spec
@@ -86,7 +86,7 @@
 @ stdcall DnsRecordCompare(ptr ptr)
 @ stdcall DnsRecordCopyEx(ptr long long)
 @ stdcall DnsRecordListFree(ptr long)
-@ stub DnsRecordSetCompare
+@ stdcall DnsRecordSetCompare(ptr ptr ptr ptr)
 @ stdcall DnsRecordSetCopyEx(ptr long long)
 @ stub DnsRecordSetDetach
 @ stub DnsRecordStringForType
diff --git a/dlls/dnsapi/record.c b/dlls/dnsapi/record.c
index 08c3cd8..8b68314 100644
--- a/dlls/dnsapi/record.c
+++ b/dlls/dnsapi/record.c
@@ -640,6 +640,88 @@ void WINAPI DnsRecordListFree( PDNS_RECO
 }
 
 /******************************************************************************
+ * DnsRecordSetCompare                     [DNSAPI.@]
+ *
+ */
+BOOL WINAPI DnsRecordSetCompare( PDNS_RECORD set1, PDNS_RECORD set2,
+                                 PDNS_RECORD *diff1, PDNS_RECORD *diff2 )
+{
+    BOOL ret = TRUE;
+    DNS_RECORD *r, *s1, *s2, *t, *u;
+    DNS_RRSET rr1, rr2;
+
+    TRACE( "(%p,%p,%p,%p)\n", set1, set2, diff1, diff2 );
+
+    if (!set1 && !set2) return FALSE;
+
+    if (diff1) *diff1 = NULL;
+    if (diff2) *diff2 = NULL;
+
+    if (set1 && !set2)
+    {
+        if (diff1) *diff1 = DnsRecordSetCopyEx( set1, 0, set1->Flags.S.CharSet );
+        return FALSE;
+    }
+    if (!set1 && set2)
+    {
+        if (diff2) *diff2 = DnsRecordSetCopyEx( set2, 0, set2->Flags.S.CharSet );
+        return FALSE;
+    }
+
+    DNS_RRSET_INIT( rr1 );
+    DNS_RRSET_INIT( rr2 );
+
+    for (r = s1 = set1; (s1 = r); r = r->pNext)
+    {
+        for (t = s2 = set2; (s2 = t); t = t->pNext)
+        {
+            u = DnsRecordCopyEx( r, r->Flags.S.CharSet, t->Flags.S.CharSet );
+            if (!u) goto error;
+
+            if (!DnsRecordCompare( t, u ))
+            {
+                DNS_RRSET_ADD( rr1, u );
+                ret = FALSE;
+            }
+            else dns_free( u );
+        }
+    }
+
+    for (t = s2 = set2; (s2 = t); t = t->pNext)
+    {
+        for (r = s1 = set1; (s1 = r); r = r->pNext)
+        {
+            u = DnsRecordCopyEx( t, t->Flags.S.CharSet, r->Flags.S.CharSet );
+            if (!u) goto error;
+
+            if (!DnsRecordCompare( r, u ))
+            {
+                DNS_RRSET_ADD( rr2, u );
+                ret = FALSE;
+            }
+            else dns_free( u );
+        }
+    }
+
+    DNS_RRSET_TERMINATE( rr1 );
+    DNS_RRSET_TERMINATE( rr2 );
+    
+    if (diff1) *diff1 = rr1.pFirstRR;
+    if (diff2) *diff2 = rr2.pFirstRR;
+
+    return ret;
+
+error:
+    DNS_RRSET_TERMINATE( rr1 );
+    DNS_RRSET_TERMINATE( rr2 );
+
+    DnsRecordListFree( rr1.pFirstRR, DnsFreeRecordList );
+    DnsRecordListFree( rr2.pFirstRR, DnsFreeRecordList );
+    
+    return FALSE;
+}
+
+/******************************************************************************
  * DnsRecordSetCopyEx                      [DNSAPI.@]
  *
  */
diff --git a/dlls/dnsapi/tests/record.c b/dlls/dnsapi/tests/record.c
index 307ecaa..6173e57 100644
--- a/dlls/dnsapi/tests/record.c
+++ b/dlls/dnsapi/tests/record.c
@@ -19,6 +19,7 @@
  */
 
 #include <stdarg.h>
+#include <stdio.h>
 
 #include "windef.h"
 #include "winbase.h"
@@ -30,6 +31,7 @@ #include "wine/test.h"
 static HMODULE dnsapi;
 
 static BOOL        (WINAPI *pDnsRecordCompare)(PDNS_RECORD,PDNS_RECORD);
+static BOOL        (WINAPI *pDnsRecordSetCompare)(PDNS_RECORD,PDNS_RECORD,PDNS_RECORD*,PDNS_RECORD*);
 
 #define GETFUNCPTR(func) p##func = (void *)GetProcAddress( dnsapi, #func ); \
     if (!p##func) return FALSE;
@@ -37,25 +39,18 @@ #define GETFUNCPTR(func) p##func = (void
 static BOOL init_function_ptrs( void )
 {
     GETFUNCPTR( DnsRecordCompare )
+    GETFUNCPTR( DnsRecordSetCompare )
     return TRUE;
 }
 
+static char name1[] = "localhost";
+static char name2[] = "LOCALHOST";
+
+static DNS_RECORDA r1 = { NULL, name1, DNS_TYPE_A, sizeof(DNS_A_DATA), { 0 }, 1200, 0, { { 0xffffffff } } };
+static DNS_RECORDA r2 = { NULL, name1, DNS_TYPE_A, sizeof(DNS_A_DATA), { 0 }, 1200, 0, { { 0xffffffff } } };
+
 static void test_DnsRecordCompare( void )
 {
-    char name1[] = "localhost";
-    char name2[] = "LOCALHOST";
-    static DNS_RECORDA r1, r2;
-           
-    r1.pName = name1;
-    r1.wType = DNS_TYPE_A;
-    r1.wDataLength = sizeof(DNS_A_DATA);
-    r1.Data.A.IpAddress = 0xffffffff;
-
-    r2.pName = name1;
-    r2.wType = DNS_TYPE_A;
-    r2.wDataLength = sizeof(DNS_A_DATA);
-    r2.Data.A.IpAddress = 0xffffffff;
-
     ok( pDnsRecordCompare( (PDNS_RECORD)&r1, (PDNS_RECORD)&r1 ) == TRUE, "failed unexpectedly\n" );
 
     r2.pName = name2;
@@ -74,6 +69,57 @@ static void test_DnsRecordCompare( void 
     ok( pDnsRecordCompare( (PDNS_RECORD)&r1, (PDNS_RECORD)&r2 ) == FALSE, "succeeded unexpectedly\n" );
 }
 
+static void test_DnsRecordSetCompare( void )
+{
+    DNS_RECORD *diff1;
+    DNS_RECORD *diff2;
+    DNS_RRSET rr1, rr2;
+
+    r1.Flags.DW = 0x2019;
+    r2.Flags.DW = 0x2019;
+    r2.Data.A.IpAddress = 0xffffffff;
+
+    DNS_RRSET_INIT( rr1 );
+    DNS_RRSET_INIT( rr2 );
+
+    DNS_RRSET_ADD( rr1, &r1 );
+    DNS_RRSET_ADD( rr2, &r2 );
+
+    DNS_RRSET_TERMINATE( rr1 );
+    DNS_RRSET_TERMINATE( rr2 );
+
+    ok( pDnsRecordSetCompare( NULL, NULL, NULL, NULL ) == FALSE, "succeeded unexpectedly\n" );
+    ok( pDnsRecordSetCompare( rr1.pFirstRR, NULL, NULL, NULL ) == FALSE, "succeeded unexpectedly\n" );
+    ok( pDnsRecordSetCompare( NULL, rr2.pFirstRR, NULL, NULL ) == FALSE, "succeeded unexpectedly\n" );
+
+    diff1 = NULL;
+    diff2 = NULL;
+
+    ok( pDnsRecordSetCompare( NULL, NULL, &diff1, &diff2 ) == FALSE, "succeeded unexpectedly\n" );
+    ok( diff1 == NULL && diff2 == NULL, "unexpected result: %p, %p\n", diff1, diff2 );
+
+    ok( pDnsRecordSetCompare( rr1.pFirstRR, NULL, &diff1, &diff2 ) == FALSE, "succeeded unexpectedly\n" );
+    ok( diff1 != NULL && diff2 == NULL, "unexpected result: %p, %p\n", diff1, diff2 );
+
+    ok( pDnsRecordSetCompare( NULL, rr2.pFirstRR, &diff1, &diff2 ) == FALSE, "succeeded unexpectedly\n" );
+    ok( diff1 == NULL && diff2 != NULL, "unexpected result: %p, %p\n", diff1, diff2 );
+
+    ok( pDnsRecordSetCompare( rr1.pFirstRR, rr2.pFirstRR, NULL, &diff2 ) == TRUE, "failed unexpectedly\n" );
+    ok( diff2 == NULL, "unexpected result: %p\n", diff2 );
+
+    ok( pDnsRecordSetCompare( rr1.pFirstRR, rr2.pFirstRR, &diff1, NULL ) == TRUE, "failed unexpectedly\n" );
+    ok( diff1 == NULL, "unexpected result: %p\n", diff1 );
+
+    ok( pDnsRecordSetCompare( rr1.pFirstRR, rr2.pFirstRR, &diff1, &diff2 ) == TRUE, "failed unexpectedly\n" );
+    ok( diff1 == NULL && diff2 == NULL, "unexpected result: %p, %p\n", diff1, diff2 );
+
+    r2.Data.A.IpAddress = 0;
+
+    ok( pDnsRecordSetCompare( rr1.pFirstRR, rr2.pFirstRR, NULL, &diff2 ) == FALSE, "succeeded unexpectedly\n" );
+    ok( pDnsRecordSetCompare( rr1.pFirstRR, rr2.pFirstRR, &diff1, NULL ) == FALSE, "succeeded unexpectedly\n" );
+    ok( pDnsRecordSetCompare( rr1.pFirstRR, rr2.pFirstRR, &diff1, &diff2 ) == FALSE, "succeeded unexpectedly\n" );
+}
+
 START_TEST(record)
 {
     dnsapi = LoadLibraryA( "dnsapi.dll" );
@@ -86,6 +132,7 @@ START_TEST(record)
     }
 
     test_DnsRecordCompare();
+    test_DnsRecordSetCompare();
 
     FreeLibrary( dnsapi );
 }




More information about the wine-cvs mailing list