Fix compilation of the wininet generated tests

Francois Gouget fgouget at free.fr
Fri Aug 13 06:55:46 CDT 2004


Many of the GOPHER_* and INTERNET_* wininet types are defined
differently in the Windows headers. More precisely, where we define both
an A and a W type, the Windows wininet.h only defines one type using the
LPTSTR types :-(

This causes the generated tests to fail to compile with the Windows
headers since winapi_test analyzes the Wine headers and automatically
generates tests that access the A and W types directly.

One solution would be to modify our headers to do as the Windows headers
do. But I believe this is a place where we cannot/should not follow
Windows unless we have a more compelling reason to.

Another solution would be to tell winap_test not to generate any test
for all these types by listing them appropriately in the tests.dat file.
But loosing all these tests would really suck.

So what I did is define a set of macros that remap the A/W types to the
no-extension type if that type is not itself defined as a macro.

This works because *these* A and W structures have the exact same layout
anyway. This has the advantage of letting us keep all our tests while
also letting us to compile them with the Windows headers.

Btw, note that unless I missed a turn somewhere, being able to compile
with the Windows headers is the whole point of the generated tests. The
way they work is that:
 * winapi_test parses and analyses the Wine headers and deducts the
structures size and alignments.
 * it write generated.c files that contain comparisons of
sizeof(struct X) with the hardcoded value computed above. Same for
the alignments.
 * compiling with the Wine headers and running them will always
work unless there is a bug in winapi_test.
 * compiling the test with the Windows headers may result in different
sizes/alignments if the Wine headers got the packign wrong. If that's
the case, the compiler will put in different values for sizeof(struct X)
which will result in something like ok(4==8,"...");
 * Note, for a given binary, you will always get the same result on any
Windows platform and in Wine since all the work has been done by the
compiler. In fact the real test is done at compile time, not at run
time.

Enough talking, here's the patch now.


Changelog:

 * dlls/wininet/tests/wininet_test.h   (new file)
   dlls/wininet/tests/generated.c
   tools/winapi/tests.dat

   Fix compilation of the wininet generated tests with the Windows
headers.


--- /dev/null	2004-08-10 11:44:31.000000000 +0200
+++ dlls/wininet/tests/wininet_test.h	2004-08-13 11:47:28.000000000 +0200
@@ -0,0 +1,84 @@
+/*
+ * Unit test suite for wininet functions
+ *
+ * Copyright 2004 Francois Gouget
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/* The Windows headers don't define A/W types for any of the following
+ * structures and pointers :-(
+ * Because for these structures there's not alignment or packing difference
+ * between the A and W versions, we just define a set of macros so the
+ * generated tests work anyway.
+ */
+#ifndef GOPHER_ABSTRACT_ATTRIBUTE_TYPE
+#define GOPHER_ABSTRACT_ATTRIBUTE_TYPEA GOPHER_ABSTRACT_ATTRIBUTE_TYPE
+#define GOPHER_ABSTRACT_ATTRIBUTE_TYPEW GOPHER_ABSTRACT_ATTRIBUTE_TYPE
+
+#define GOPHER_ADMIN_ATTRIBUTE_TYPEA GOPHER_ADMIN_ATTRIBUTE_TYPE
+#define GOPHER_ADMIN_ATTRIBUTE_TYPEW GOPHER_ADMIN_ATTRIBUTE_TYPE
+#define GOPHER_ASK_ATTRIBUTE_TYPEA GOPHER_ASK_ATTRIBUTE_TYPE
+#define GOPHER_ASK_ATTRIBUTE_TYPEW GOPHER_ASK_ATTRIBUTE_TYPE
+#define GOPHER_ATTRIBUTE_ENUMERATORA GOPHER_ATTRIBUTE_ENUMERATOR
+#define GOPHER_ATTRIBUTE_ENUMERATORW GOPHER_ATTRIBUTE_ENUMERATOR
+#define GOPHER_ATTRIBUTE_TYPEA GOPHER_ATTRIBUTE_TYPE
+#define GOPHER_ATTRIBUTE_TYPEW GOPHER_ATTRIBUTE_TYPE
+#define GOPHER_LOCATION_ATTRIBUTE_TYPEA GOPHER_LOCATION_ATTRIBUTE_TYPE
+#define GOPHER_LOCATION_ATTRIBUTE_TYPEW GOPHER_LOCATION_ATTRIBUTE_TYPE
+#define GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA GOPHER_ORGANIZATION_ATTRIBUTE_TYPE
+#define GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW GOPHER_ORGANIZATION_ATTRIBUTE_TYPE
+#define GOPHER_PROVIDER_ATTRIBUTE_TYPEA GOPHER_PROVIDER_ATTRIBUTE_TYPE
+#define GOPHER_PROVIDER_ATTRIBUTE_TYPEW GOPHER_PROVIDER_ATTRIBUTE_TYPE
+#define GOPHER_SITE_ATTRIBUTE_TYPEA GOPHER_SITE_ATTRIBUTE_TYPE
+#define GOPHER_SITE_ATTRIBUTE_TYPEW GOPHER_SITE_ATTRIBUTE_TYPE
+#define GOPHER_UNKNOWN_ATTRIBUTE_TYPEA GOPHER_UNKNOWN_ATTRIBUTE_TYPE
+#define GOPHER_UNKNOWN_ATTRIBUTE_TYPEW GOPHER_UNKNOWN_ATTRIBUTE_TYPE
+#define GOPHER_VERSION_ATTRIBUTE_TYPEA GOPHER_VERSION_ATTRIBUTE_TYPE
+#define GOPHER_VERSION_ATTRIBUTE_TYPEW GOPHER_VERSION_ATTRIBUTE_TYPE
+#define GOPHER_VIEW_ATTRIBUTE_TYPEA GOPHER_VIEW_ATTRIBUTE_TYPE
+#define GOPHER_VIEW_ATTRIBUTE_TYPEW GOPHER_VIEW_ATTRIBUTE_TYPE
+#define INTERNET_CERTIFICATE_INFOA INTERNET_CERTIFICATE_INFO
+#define INTERNET_CERTIFICATE_INFOW INTERNET_CERTIFICATE_INFO
+#define INTERNET_PROXY_INFOA INTERNET_PROXY_INFO
+#define INTERNET_PROXY_INFOW INTERNET_PROXY_INFO
+
+#define LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA LPGOPHER_ABSTRACT_ATTRIBUTE_TYPE
+#define LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW LPGOPHER_ABSTRACT_ATTRIBUTE_TYPE
+#define LPGOPHER_ADMIN_ATTRIBUTE_TYPEA LPGOPHER_ADMIN_ATTRIBUTE_TYPE
+#define LPGOPHER_ADMIN_ATTRIBUTE_TYPEW LPGOPHER_ADMIN_ATTRIBUTE_TYPE
+#define LPGOPHER_ASK_ATTRIBUTE_TYPEA LPGOPHER_ASK_ATTRIBUTE_TYPE
+#define LPGOPHER_ASK_ATTRIBUTE_TYPEW LPGOPHER_ASK_ATTRIBUTE_TYPE
+#define LPGOPHER_ATTRIBUTE_TYPEA LPGOPHER_ATTRIBUTE_TYPE
+#define LPGOPHER_ATTRIBUTE_TYPEW LPGOPHER_ATTRIBUTE_TYPE
+#define LPGOPHER_LOCATION_ATTRIBUTE_TYPEA LPGOPHER_LOCATION_ATTRIBUTE_TYPE
+#define LPGOPHER_LOCATION_ATTRIBUTE_TYPEW LPGOPHER_LOCATION_ATTRIBUTE_TYPE
+#define LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPE
+#define LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPE
+#define LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA LPGOPHER_PROVIDER_ATTRIBUTE_TYPE
+#define LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW LPGOPHER_PROVIDER_ATTRIBUTE_TYPE
+#define LPGOPHER_SITE_ATTRIBUTE_TYPEA LPGOPHER_SITE_ATTRIBUTE_TYPE
+#define LPGOPHER_SITE_ATTRIBUTE_TYPEW LPGOPHER_SITE_ATTRIBUTE_TYPE
+#define LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA LPGOPHER_UNKNOWN_ATTRIBUTE_TYPE
+#define LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW LPGOPHER_UNKNOWN_ATTRIBUTE_TYPE
+#define LPGOPHER_VERSION_ATTRIBUTE_TYPEA LPGOPHER_VERSION_ATTRIBUTE_TYPE
+#define LPGOPHER_VERSION_ATTRIBUTE_TYPEW LPGOPHER_VERSION_ATTRIBUTE_TYPE
+#define LPGOPHER_VIEW_ATTRIBUTE_TYPEA LPGOPHER_VIEW_ATTRIBUTE_TYPE
+#define LPGOPHER_VIEW_ATTRIBUTE_TYPEW LPGOPHER_VIEW_ATTRIBUTE_TYPE
+#define LPINTERNET_CERTIFICATE_INFOA LPINTERNET_CERTIFICATE_INFO
+#define LPINTERNET_CERTIFICATE_INFOW LPINTERNET_CERTIFICATE_INFO
+#define LPINTERNET_PROXY_INFOA LPINTERNET_PROXY_INFO
+#define LPINTERNET_PROXY_INFOW LPINTERNET_PROXY_INFO
+#endif
Index: dlls/wininet/tests/generated.c
===================================================================
RCS file: /var/cvs/wine/dlls/wininet/tests/generated.c,v
retrieving revision 1.4
diff -u -r1.4 generated.c
--- dlls/wininet/tests/generated.c	4 May 2004 00:41:11 -0000	1.4
+++ dlls/wininet/tests/generated.c	13 Aug 2004 09:32:56 -0000
@@ -15,6 +15,7 @@
 #include "windef.h"
 #include "winbase.h"
 #include "wininet.h"
+#include "wininet_test.h"

 #include "wine/test.h"

@@ -172,6 +173,20 @@
     TEST_TYPE(GOPHER_ATTRIBUTE_ENUMERATORW, 4, 4);
 }

+static void test_pack_GOPHER_ATTRIBUTE_TYPEA(void)
+{
+    /* GOPHER_ATTRIBUTE_TYPEA (pack 4) */
+    TEST_FIELD(GOPHER_ATTRIBUTE_TYPEA, DWORD, CategoryId, 0, 4, 4);
+    TEST_FIELD(GOPHER_ATTRIBUTE_TYPEA, DWORD, AttributeId, 4, 4, 4);
+}
+
+static void test_pack_GOPHER_ATTRIBUTE_TYPEW(void)
+{
+    /* GOPHER_ATTRIBUTE_TYPEW (pack 4) */
+    TEST_FIELD(GOPHER_ATTRIBUTE_TYPEW, DWORD, CategoryId, 0, 4, 4);
+    TEST_FIELD(GOPHER_ATTRIBUTE_TYPEW, DWORD, AttributeId, 4, 4, 4);
+}
+
 static void test_pack_GOPHER_FIND_DATAA(void)
 {
     /* GOPHER_FIND_DATAA (pack 4) */
@@ -423,6 +437,46 @@
     TEST_FIELD(INTERNET_BUFFERSW, DWORD, dwOffsetHigh, 36, 4, 4);
 }

+static void test_pack_INTERNET_CACHE_ENTRY_INFOA(void)
+{
+    /* INTERNET_CACHE_ENTRY_INFOA (pack 4) */
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, dwStructSize, 0, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, LPSTR, lpszSourceUrlName, 4, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, LPSTR, lpszLocalFileName, 8, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, CacheEntryType, 12, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, dwUseCount, 16, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, dwHitRate, 20, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, dwSizeLow, 24, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, dwSizeHigh, 28, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, FILETIME, LastModifiedTime, 32, 8, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, FILETIME, ExpireTime, 40, 8, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, FILETIME, LastAccessTime, 48, 8, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, FILETIME, LastSyncTime, 56, 8, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, LPBYTE, lpHeaderInfo, 64, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, dwHeaderInfoSize, 68, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, LPSTR, lpszFileExtension, 72, 4, 4);
+}
+
+static void test_pack_INTERNET_CACHE_ENTRY_INFOW(void)
+{
+    /* INTERNET_CACHE_ENTRY_INFOW (pack 4) */
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, dwStructSize, 0, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, LPWSTR, lpszSourceUrlName, 4, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, LPWSTR, lpszLocalFileName, 8, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, CacheEntryType, 12, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, dwUseCount, 16, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, dwHitRate, 20, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, dwSizeLow, 24, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, dwSizeHigh, 28, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, FILETIME, LastModifiedTime, 32, 8, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, FILETIME, ExpireTime, 40, 8, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, FILETIME, LastAccessTime, 48, 8, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, FILETIME, LastSyncTime, 56, 8, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, LPBYTE, lpHeaderInfo, 64, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, dwHeaderInfoSize, 68, 4, 4);
+    TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, LPWSTR, lpszFileExtension, 72, 4, 4);
+}
+
 static void test_pack_INTERNET_CERTIFICATE_INFOA(void)
 {
     /* INTERNET_CERTIFICATE_INFOA (pack 4) */
@@ -540,6 +594,18 @@
     TEST_TYPE_POINTER(LPGOPHER_ASK_ATTRIBUTE_TYPEW, 8, 4);
 }

+static void test_pack_LPGOPHER_ATTRIBUTE_TYPEA(void)
+{
+    /* LPGOPHER_ATTRIBUTE_TYPEA */
+    TEST_TYPE(LPGOPHER_ATTRIBUTE_TYPEA, 4, 4);
+}
+
+static void test_pack_LPGOPHER_ATTRIBUTE_TYPEW(void)
+{
+    /* LPGOPHER_ATTRIBUTE_TYPEW */
+    TEST_TYPE(LPGOPHER_ATTRIBUTE_TYPEW, 4, 4);
+}
+
 static void test_pack_LPGOPHER_FIND_DATAA(void)
 {
     /* LPGOPHER_FIND_DATAA */
@@ -736,6 +802,18 @@
     TEST_TYPE_POINTER(LPINTERNET_BUFFERSW, 40, 4);
 }

+static void test_pack_LPINTERNET_CACHE_ENTRY_INFOA(void)
+{
+    /* LPINTERNET_CACHE_ENTRY_INFOA */
+    TEST_TYPE(LPINTERNET_CACHE_ENTRY_INFOA, 4, 4);
+}
+
+static void test_pack_LPINTERNET_CACHE_ENTRY_INFOW(void)
+{
+    /* LPINTERNET_CACHE_ENTRY_INFOW */
+    TEST_TYPE(LPINTERNET_CACHE_ENTRY_INFOW, 4, 4);
+}
+
 static void test_pack_LPINTERNET_CERTIFICATE_INFOA(void)
 {
     /* LPINTERNET_CERTIFICATE_INFOA */
@@ -840,6 +918,8 @@
     test_pack_GOPHER_ASK_ATTRIBUTE_TYPEW();
     test_pack_GOPHER_ATTRIBUTE_ENUMERATORA();
     test_pack_GOPHER_ATTRIBUTE_ENUMERATORW();
+    test_pack_GOPHER_ATTRIBUTE_TYPEA();
+    test_pack_GOPHER_ATTRIBUTE_TYPEW();
     test_pack_GOPHER_FIND_DATAA();
     test_pack_GOPHER_FIND_DATAW();
     test_pack_GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE();
@@ -870,6 +950,8 @@
     test_pack_INTERNET_AUTH_NOTIFY_DATA();
     test_pack_INTERNET_BUFFERSA();
     test_pack_INTERNET_BUFFERSW();
+    test_pack_INTERNET_CACHE_ENTRY_INFOA();
+    test_pack_INTERNET_CACHE_ENTRY_INFOW();
     test_pack_INTERNET_CERTIFICATE_INFOA();
     test_pack_INTERNET_CERTIFICATE_INFOW();
     test_pack_INTERNET_CONNECTED_INFO();
@@ -884,6 +966,8 @@
     test_pack_LPGOPHER_ADMIN_ATTRIBUTE_TYPEW();
     test_pack_LPGOPHER_ASK_ATTRIBUTE_TYPEA();
     test_pack_LPGOPHER_ASK_ATTRIBUTE_TYPEW();
+    test_pack_LPGOPHER_ATTRIBUTE_TYPEA();
+    test_pack_LPGOPHER_ATTRIBUTE_TYPEW();
     test_pack_LPGOPHER_FIND_DATAA();
     test_pack_LPGOPHER_FIND_DATAW();
     test_pack_LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE();
@@ -912,6 +996,8 @@
     test_pack_LPINTERNET_ASYNC_RESULT();
     test_pack_LPINTERNET_BUFFERSA();
     test_pack_LPINTERNET_BUFFERSW();
+    test_pack_LPINTERNET_CACHE_ENTRY_INFOA();
+    test_pack_LPINTERNET_CACHE_ENTRY_INFOW();
     test_pack_LPINTERNET_CERTIFICATE_INFOA();
     test_pack_LPINTERNET_CERTIFICATE_INFOW();
     test_pack_LPINTERNET_CONNECTED_INFO();
Index: tools/winapi/tests.dat
===================================================================
RCS file: /var/cvs/wine/tools/winapi/tests.dat,v
retrieving revision 1.13
diff -u -r1.13 tests.dat
--- tools/winapi/tests.dat	11 Aug 2004 20:52:37 -0000	1.13
+++ tools/winapi/tests.dat	13 Aug 2004 09:29:54 -0000
@@ -1460,6 +1455,7 @@
 "windef.h"
 "winbase.h"
 "wininet.h"
+"wininet_test.h"

 %type

@@ -1476,8 +1472,8 @@
 GOPHER_ATTRIBUTE_ENUMERATORA
 GOPHER_ATTRIBUTE_ENUMERATORW
 GOPHER_ATTRIBUTE_TYPE
-!GOPHER_ATTRIBUTE_TYPEA
-!GOPHER_ATTRIBUTE_TYPEW
+GOPHER_ATTRIBUTE_TYPEA
+GOPHER_ATTRIBUTE_TYPEW
 GOPHER_FIND_DATA
 GOPHER_FIND_DATAA
 GOPHER_FIND_DATAW
@@ -1516,8 +1512,8 @@
 INTERNET_AUTH_NOTIFY_DATA
 INTERNET_BUFFERSA
 INTERNET_BUFFERSW
-!INTERNET_CACHE_ENTRY_INFOA
-!INTERNET_CACHE_ENTRY_INFOW
+INTERNET_CACHE_ENTRY_INFOA
+INTERNET_CACHE_ENTRY_INFOW
 INTERNET_CERTIFICATE_INFO
 INTERNET_CERTIFICATE_INFOA
 INTERNET_CERTIFICATE_INFOW
@@ -1538,8 +1534,8 @@
 LPGOPHER_ASK_ATTRIBUTE_TYPEA
 LPGOPHER_ASK_ATTRIBUTE_TYPEW
 LPGOPHER_ATTRIBUTE_TYPE
-!LPGOPHER_ATTRIBUTE_TYPEA
-!LPGOPHER_ATTRIBUTE_TYPEW
+LPGOPHER_ATTRIBUTE_TYPEA
+LPGOPHER_ATTRIBUTE_TYPEW
 LPGOPHER_FIND_DATAA
 LPGOPHER_FIND_DATAW
 LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE
@@ -1575,8 +1571,8 @@
 LPINTERNET_ASYNC_RESULT
 LPINTERNET_BUFFERSA
 LPINTERNET_BUFFERSW
-!LPINTERNET_CACHE_ENTRY_INFOA
-!LPINTERNET_CACHE_ENTRY_INFOW
+LPINTERNET_CACHE_ENTRY_INFOA
+LPINTERNET_CACHE_ENTRY_INFOW
 LPINTERNET_CERTIFICATE_INFOA
 LPINTERNET_CERTIFICATE_INFOW
 LPINTERNET_CONNECTED_INFO



-- 
Francois Gouget         fgouget at free.fr        http://fgouget.free.fr/
  Any sufficiently advanced Operating System is indistinguishable from Linux



More information about the wine-patches mailing list