Tests for lzexpand dll

Evan G. Parry eparry at cs.hmc.edu
Fri Nov 12 21:19:47 CST 2004


This patch adds tests for the lzexpand dlls, specifically testing the
functions LZOpen, LZRead, and LZCopy fairly extensively.

All tests currently succeed under both Wine and Windows XP, except for
two.  The first is exluded with a #if 0.  Some versions of Windows do
not open the file "file.xx_" if "file.xxx" does not exist, while some
do.  We exclude the test for this behavior for now.

This other is marked with a todo() below.  Wine handles reading beyond
the end of the file by returning the number of bytes actually read.
Windows fails with an LZERROR_READ error.

Changelog:
   * configure.ac
     added dlls/lzexpand/tests/Makefile to be generated
   * dlls/lzexpand/tests/Makefile.in
     standard Makefile.in for tests
   * dlls/lzexpand/tests/lzexpand_main.c
     actual test code for LZOpen, LZRead, and LZCopy


diff -Naur wine/configure.ac~ wine/configure.ac
--- configure.ac~	Thu Nov  4 13:15:33 2004
+++ configure.ac	Tue Nov  9 23:20:05 2004
@@ -1633,6 +1665,7 @@
 dlls/kernel/Makefile
 dlls/kernel/tests/Makefile
 dlls/lzexpand/Makefile
+dlls/lzexpand/tests/Makefile
 dlls/mapi32/Makefile
 dlls/mapi32/tests/Makefile
 dlls/mlang/Makefile
diff -Naur wine/dlls/lzexpand/tests/Makefile.in~ wine/dlls/lzexpand/tests/Makefile.in
--- dlls/lzexpand/tests/Makefile.in~	Wed Dec 31 16:00:00 1969
+++ dlls/lzexpand/tests/Makefile.in	Tue Nov  9 23:12:43 2004
@@ -0,0 +1,14 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+TESTDLL   = lz32.dll
+IMPORTS   = lz32
+EXTRALIBS =
+
+CTESTS = \
+	lzexpand_main.c
+
+ at MAKE_TEST_RULES@
+
+### Dependencies:
diff -Naur wine/dlls/lzexpand/tests/lzexpand_main.c~ wine/dlls/lzexpand/tests/lzexpand_main.c
--- dlls/lzexpand/tests/lzexpand_main.c~	Wed Dec 31 16:00:00 1969
+++ dlls/lzexpand/tests/lzexpand_main.c	Wed Nov 10 22:57:21 2004
@@ -0,0 +1,224 @@
+/*
+ * Unit test suite for lz32 functions
+ *
+ * Copyright 2004 Evan Parry, Daniel Kegel
+ *
+ * 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
+ */
+
+#include <stdarg.h>
+#include <windef.h>
+#include <winbase.h>
+#include <stdlib.h>
+
+#ifndef STANDALONE
+#include "wine/test.h"
+#define ok2 ok
+#else
+/* To build outside Wine tree, compile with cl -DSTANDALONE -D_X86_ lzexpand_main.c lz32.lib */
+#include <assert.h>
+#include <stdio.h>
+#define START_TEST(name) main(int argc, char **argv)
+#define ok(condition, msg)       \
+	do { if(!(condition)) {  \
+		fprintf(stderr,"failed at %d, msg:" msg "\n",__LINE__); \
+		exit(1);         \
+	} } while(0)
+#define ok2(condition, msg, arg) \
+        do { if(!(condition)) {  \
+		fprintf(stderr,"failed at %d, msg:" msg "\n",__LINE__, arg); \
+		exit(1);         \
+	} } while(0)
+#define todo_wine
+#endif
+
+#include <winerror.h>
+#include <lzexpand.h>
+
+static char* filename_ = "testfile.xx_";
+static char* filename = "testfile.xxx";
+static char* filename2 = "testfile.yyy";
+
+/* This is the hex string representation of the file created by compressing
+   a simple text file with the contents "This is a test file."
+ 
+   The file was created using COMPRESS.EXE from the Windows Server 2003
+   Resource Kit from Microsoft.  The resource kit was retrieved from the
+   following URL:  
+
+   http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en
+ */
+static const unsigned char compressed_file[] = 
+  {0x53,0x5A,0x44,0x44,0x88,0xF0,0x27,0x33,0x41,
+   0x74,0x75,0x14,0x00,0x00,0xDF,0x54,0x68,0x69,
+   0x73,0x20,0xF2,0xF0,0x61,0x20,0xFF,0x74,0x65,
+   0x73,0x74,0x20,0x66,0x69,0x6C,0x03,0x65,0x2E};
+static const DWORD compressed_file_size = sizeof(compressed_file);
+
+static const char uncompressed_data[] = "This is a test file.";
+static const DWORD uncompressed_data_size = sizeof(uncompressed_data) - 1;
+
+static char *buf;
+
+static void test_lzopenfile(void)
+{
+  OFSTRUCT test;
+  DWORD retval;
+  INT file;
+
+  /* Check for non-existent file. */
+  file = LZOpenFile("badfilename_", &test, OF_READ);
+  ok(file == LZERROR_BADINHANDLE, 
+     "LZOpenFile succeeded on nonexistent file\n");
+  LZClose(file);
+
+  /* Create an empty file. */
+  file = LZOpenFile(filename_, &test, OF_CREATE);
+  ok(file >= 0, "LZOpenFile failed on creation\n");
+  LZClose(file);
+  retval = GetFileAttributes(filename_);
+  ok2(retval != INVALID_FILE_ATTRIBUTES, "GetFileAttributes: error %ld\n", 
+     GetLastError());
+
+  /* Check various opening options. */
+  file = LZOpenFile(filename_, &test, OF_READ);
+  ok(file >= 0, "LZOpenFile failed on read\n");
+  LZClose(file);
+  file = LZOpenFile(filename_, &test, OF_WRITE);
+  ok(file >= 0, "LZOpenFile failed on write\n");
+  LZClose(file);
+  file = LZOpenFile(filename_, &test, OF_READWRITE);
+  ok(file >= 0, "LZOpenFile failed on read/write\n");
+  LZClose(file);
+  file = LZOpenFile(filename_, &test, OF_EXIST);
+  ok(file >= 0, "LZOpenFile failed on read/write\n");
+  LZClose(file);
+
+
+  /* If the file "foo.xxx" does not exist, LZOpenFile should then
+     check for the file "foo.xx_" and open that -- at least on some
+     operating systems.  Doesn't seem to on my copy of Win98.   
+     The Wine testing guidelines say we should accept the behavior of
+     any valid version of Windows.  Thus it seems we cannot check this?!
+     Revisit this at some point to see if this can be tested somehow.
+   */
+#if 0
+  file = LZOpenFile(filename, &test, OF_EXIST);
+  ok(file != LZERROR_BADINHANDLE, 
+     "LZOpenFile \"filename_\" check failed\n");
+  LZClose(file);
+#endif
+
+  /* Delete the file then make sure it doesn't exist anymore. */
+  file = LZOpenFile(filename_, &test, OF_DELETE);
+  ok(file >= 0, "LZOpenFile failed on delete\n");
+  LZClose(file);
+
+  retval = GetFileAttributes(filename_);
+  ok(retval == INVALID_FILE_ATTRIBUTES, 
+     "GetFileAttributes succeeded on deleted file\n");
+  
+}
+
+static void test_lzread(void)
+{
+  HANDLE file;
+  DWORD ret;
+  int cfile;
+  OFSTRUCT test;
+
+  /* Create the compressed file. */
+  file = CreateFile(filename_, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, 0);
+  ok(file != INVALID_HANDLE_VALUE, "Could not create test file\n");
+  ok2(WriteFile(file, compressed_file, compressed_file_size, &ret, 0),
+     "WriteFile: error %ld\n", GetLastError());
+  ok(ret == compressed_file_size, "Wrote wrong number of bytes with WriteFile?\n");
+  CloseHandle(file);
+
+  cfile = LZOpenFile(filename_, &test, OF_READ);
+  ok(cfile > 0, "LZOpenFile failed\n");
+
+  ret = LZRead(cfile, buf, uncompressed_data_size);
+  ok(ret == uncompressed_data_size, "Read wrong number of bytes\n");
+
+  /* Compare what we read with what we think we should read. */
+  ok(memcmp(buf, uncompressed_data, uncompressed_data_size) == 0,
+     "buffer contents mismatch\n");
+
+  todo_wine {
+     /* Wine returns the number of bytes actually read instead of an error */
+     ret = LZRead(cfile, buf, uncompressed_data_size);
+     ok(ret == LZERROR_READ, "Expected read-past-EOF to return LZERROR_READ\n");
+  }
+
+  LZClose(cfile);
+
+  ret = DeleteFile(filename_);
+  ok2(ret, "DeleteFile: error %ld\n", GetLastError());
+}
+
+static void test_lzcopy(void)
+{
+  HANDLE file;
+  DWORD ret;
+  int source, dest;
+  OFSTRUCT stest, dtest;
+
+  /* Create the compressed file. */
+  file = CreateFile(filename_, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, 0);
+  ok2(file != INVALID_HANDLE_VALUE, 
+     "CreateFile: error %ld\n", GetLastError());
+  ok2(WriteFile(file, compressed_file, compressed_file_size, &ret, 0),
+     "WriteFile error %ld\n", GetLastError());
+  ok(ret == compressed_file_size, "Wrote wrong number of bytes\n");
+  CloseHandle(file);
+
+  source = LZOpenFile(filename_, &stest, OF_READ);
+  ok(source >= 0, "LZOpenFile failed on compressed file\n");
+  dest = LZOpenFile(filename2, &dtest, OF_CREATE);
+  ok2(dest >= 0, "LZOpenFile failed on creating new file %d\n", dest);
+
+  ret = LZCopy(source, dest);
+  ok(ret > 0, "LZCopy error\n");
+
+  LZClose(source);
+  LZClose(dest);
+
+  file = CreateFile(filename2, GENERIC_READ, 0, NULL, OPEN_EXISTING,
+		    0, 0);
+  ok2(file != INVALID_HANDLE_VALUE,
+     "CreateFile: error %ld\n", GetLastError());
+
+  ok2(ReadFile(file, buf, uncompressed_data_size*2, &ret, 0) &&
+     ret == uncompressed_data_size, "ReadFile: error %ld\n", GetLastError());
+  /* Compare what we read with what we think we should read. */
+  ok(!memcmp(buf, uncompressed_data, uncompressed_data_size),
+     "buffer contents mismatch\n");
+  CloseHandle(file);
+
+  ret = DeleteFile(filename_);
+  ok2(ret, "DeleteFile: error %ld\n", GetLastError());
+  ret = DeleteFile(filename2);
+  ok2(ret, "DeleteFile: error %ld\n", GetLastError());
+}
+
+START_TEST(lzexpand_main)
+{
+  buf = malloc(uncompressed_data_size * 2);
+  test_lzopenfile();
+  test_lzread();
+  test_lzcopy();
+  free(buf);
+}



More information about the wine-patches mailing list