home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 8
/
CDASC08.ISO
/
NEWS
/
676
/
XMSIF
/
XMSTEST3.C
< prev
Wrap
C/C++ Source or Header
|
1993-10-07
|
23KB
|
607 lines
/***************************************************************************
* xmstest3.c *
* MODULE: XMSIF *
* OS: DOS *
* VERSION: 1.0 *
* DATE: 12/08/91 *
* *
* Copyright (c) 1991 James W. Birdsall. All Rights Reserved. *
* *
* Requires xmsif.h, testutil.h, and xmstest.h to compile. *
* Compiles under Borland C++ 2.0, Turbo C 2.0, or MSC 6.00A. *
* *
* Regression test and example for XMSIF. See XMSTEST.C for more detail. *
* *
***************************************************************************/
/*
** system includes <>
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
** custom includes ""
*/
#include "xmsif.h"
#include "xmstest.h"
#include "testutil.h"
/*
** local #defines
*/
/*
** misc: copyright strings, version macros, etc.
*/
/*
** typedefs
*/
/*
** global variables
*/
extern int testno;
extern char *gblmsg;
/*
** static globals
*/
/*
** function prototypes
*/
/*
** functions
*/
/***************************************************************************
* FUNCTION: DO_UMB_TESTS *
* *
* DESCRIPTION: *
* *
* Does UMB tests. *
* *
* ENTRY: *
* *
* None. *
* *
* EXIT: *
* *
* Void. *
* *
* CONSTRAINTS/SIDE EFFECTS: *
* *
***************************************************************************/
void do_UMB_tests(void)
{
unsigned long largest, allsize;
unsigned long allsize2;
unsigned long finalsize;
void far *handle;
int status;
int haveUMB = 0;
int goodallcore = 1;
gblmsg = " UMB TESTS";
/* are there UMBs in this system? */
TESTHEADER();
printf("Testing UMBcoreleft() and UMBallcoreleft(), determining whether\n");
printf("there are UMBs in this system.\n");
largest = UMBcoreleft();
weirdcodechk("UMBcoreleft()", 0, (void far *) NULL, 0, 0);
allsize = UMBallcoreleft();
if (_XMMerror != 0)
{
printf("UMBallcoreleft() returned unexpected code 0x%X\n",
(unsigned int) _XMMerror);
printf("Another broken system. *sigh*.\n");
printf("Values returned by UMBallcoreleft() are junk.\n");
allsize = ((largest == 0L) ? 0L : (384L * 1024L));
goodallcore = 0;
}
if ((largest == 0L) && (allsize == 0L))
{
printf("No UMBs found.\n");
}
else
{
haveUMB = 1;
}
if (allsize < largest)
{
printf("UMBallcoreleft() reports total size smaller than size of\n");
printf("largest UMB (from UMBcoreleft()).\n");
exit(3);
}
/* the theoretical max on UMBs is 384K (1024K - 640K) */
if (((allsize & 0xF) != 0L) || (allsize > (384L * 1024L)))
{
printf("UMBallcoreleft() returned weird value %lu\n", allsize);
exit(3);
}
else if (goodallcore != 0)
{
printf("UMBallcoreleft() reports %lu bytes in UMBs.\n", allsize);
}
if (((largest & 0xF) != 0L) || (largest > (384L * 1024L)))
{
printf("UMBcoreleft() returned weird value %lu\n", largest);
exit(3);
}
else
{
printf("UMBcoreleft() reports largest UMB is %lu bytes.\n", largest);
}
TESTTAILER();
/* try allocating a UMB */
TESTHEADER();
printf("Testing UMBalloc().\nShould %s.\n",
((haveUMB == 0) ? "fail" : "succeed"));
handle = UMBalloc(((haveUMB == 0) ? (largest) : (largest - 1)), &finalsize);
weirdcodechk("UMBalloc()", 0, (void far *) NULL, 0, 0);
if (handle == (void far *) NULL)
{
if (haveUMB != 0)
{
printf("UMBalloc() returned NULL.\n");
exit(3);
}
}
else
{
if (haveUMB == 0)
{
printf("UMBalloc() didn't return NULL.\n");
exit(3);
}
}
if (finalsize != largest)
{
printf("Size rounding didn't happen.\n");
UMBfree(handle);
exit(3);
}
if (goodallcore != 0)
{
allsize2 = UMBallcoreleft();
weirdcodechk("UMBallcoreleft()", 0, (void far *) NULL, 0, 0);
if (allsize2 != (allsize - finalsize))
{
printf("Total dropped weirdly from %lu to %lu\n", allsize,
allsize2);
UMBfree(handle);
exit(3);
}
}
TESTTAILER();
/* free it */
if (haveUMB != 0)
{
TESTHEADER();
printf("Testing UMBfree().\nShould succeed.\n");
status = UMBfree(handle);
TRIPLECHECK("UMBfree()", status, 0, (void far *) NULL, 0, 0);
if (goodallcore != 0)
{
allsize2 = UMBallcoreleft();
weirdcodechk("UMBallcoreleft()", 0, (void far *) NULL, 0, 0);
if (allsize2 != allsize)
{
printf(
"Total before UMBalloc(): %lu Total after UMBfree(): %lu\n",
allsize, allsize2);
exit(3);
}
}
}
return;
} /* end of do_UMB_tests() */
/***************************************************************************
* FUNCTION: DO_ICOPY_TESTS *
* *
* DESCRIPTION: *
* *
* Tests interval copy functions (_XMMicopy() and macros). *
* *
* ENTRY: *
* *
* None. *
* *
* EXIT: *
* *
* Void. *
* *
* CONSTRAINTS/SIDE EFFECTS: *
* *
***************************************************************************/
void do_icopy_tests(void)
{
int handle;
unsigned char far *realbuf;
unsigned char far *guard1, far *guard2, far *guard3;
unsigned char far *testbuf;
unsigned char far *testbuf2;
int status;
unsigned long start, stop, total;
/* first, allocate some XMS to test with */
handle = XMMalloc(MINFREE);
weirdcodechk("XMMalloc", 0, (void far *) NULL, 0, 0);
/* next, allocate a conventional memory buffer */
realbuf = (unsigned char far *) LMALLOC((MINFREE/1024L) + 3);
if (realbuf == (unsigned char far *) NULL)
{
printf("Can't allocate conventional buffer. Aborting.\n");
XMMfree(handle);
exit(3);
}
/*
** Since we can't access EMBs directly, the only way we have of getting
** data there is via the copy functions, which we're trying to test. So
** the first round of tests will copy data from one half of the
** conventional memory to the other, something which we can verify
** directly.
**
** Since _XMMcopy is symmetrical, we only need to give one direction
** a real workout.
*/
guard1 = realbuf;
FMEMSET(guard1, GUARDVAL, 1024);
testbuf = (unsigned char far *) normptr(guard1 + 1024);
guard2 = (unsigned char far *) normptr(testbuf + HALFLEN);
FMEMSET(guard2, GUARDVAL, 1024);
testbuf2 = (unsigned char far *) normptr(guard2 + 1024);
guard3 = (unsigned char far *) normptr(testbuf2 + HALFLEN);
FMEMSET(guard3, GUARDVAL, 1024);
gblmsg = " INTERVAL COPY TESTS CONVENTIONAL-CONVENTIONAL";
/* fill first buffer with incrementing words */
farincwordfill(testbuf, HALFLEN, 0);
/* fill second buffer with zero */
FMEMSET(testbuf2, 0, HALFLEN);
/* test one-element copy */
TESTHEADER();
printf("_XMMicopy(): one-element copy.\nShould succeed.\n");
status = _XMMicopy(1L, 50, 1, 0, (unsigned long) testbuf, 0,
(unsigned long) testbuf2, 1);
TRIPLECHECK("_XMMicopy()", status, 0, (void far *) realbuf, handle, 0);
GUARDCHECK(handle);
SRCWORDCHECK(testbuf, HALFLEN);
CPYWORDCHECK(testbuf2, 50);
ZEROCHECK((testbuf2 + 50), (HALFLEN - 50));
TESTTAILER();
/* restore destination pattern */
FMEMSET(testbuf2, 0, HALFLEN);
/* test multi-element copies, even and odd skips */
TESTHEADER();
printf("_XMMicopy(): multi-element copies with even and odd skips.\n");
printf("Should succeed.\n");
status = _XMMicopy((HALFLEN / 5L), 2, 3, 0, (unsigned long) testbuf, 0,
(unsigned long) testbuf2, 3);
TRIPLECHECK("_XMMicopy()", status, 0, (void far *) realbuf, handle, 0);
status = _XMMicopy((HALFLEN / 5L), 3, 2, 0, (unsigned long)(testbuf + 2), 0,
(unsigned long)(testbuf2 + 2), 2);
TRIPLECHECK("_XMMicopy()", status, 0, (void far *) realbuf, handle, 0);
GUARDCHECK(handle);
SRCWORDCHECK(testbuf, HALFLEN);
CPYWORDCHECK(testbuf2, HALFLEN);
TESTTAILER();
/* restore destination pattern */
FMEMSET(testbuf2, 0, HALFLEN);
/* test multi-element copy, zero skip */
TESTHEADER();
printf("_XMMicopy(): multi-element copy with zero skip.\n");
printf("Should succeed.\n");
status = _XMMicopy((HALFLEN / 1024L), 1024, 0, 0, (unsigned long) testbuf,
0, (unsigned long) testbuf2, 0);
TRIPLECHECK("_XMMicopy()", status, 0, (void far *) realbuf, handle, 0);
GUARDCHECK(handle);
SRCWORDCHECK(testbuf, HALFLEN);
CPYWORDCHECK(testbuf2, HALFLEN);
TESTTAILER();
/*
** Now, try various copies to EMB, then copy HALFLEN of EMB back to
** testbuf2 for checking.
*/
gblmsg = " INTERVAL COPY TESTS CONVENTIONAL-EMB";
/* restore destination pattern */
FMEMSET(testbuf2, 0, HALFLEN);
status = XMMcopyto(HALFLEN, testbuf2, handle, 0L);
TRIPLECHECK("XMMcopyto()", status, 0, (void far *) realbuf, handle, 0);
/* test odd and even skips */
TESTHEADER();
printf("_XMMicopy(): odd and even skips to zero.\n");
printf("Should succeed.\n");
status = _XMMicopy((HALFLEN / 5L), 3, 2, 0, (unsigned long) testbuf,
handle, 0L, 0);
TRIPLECHECK("_XMMicopy()", status, 0, (void far *) realbuf, handle, 0);
status = _XMMicopy((HALFLEN / 5L), 2, 3, 0, (unsigned long)(testbuf + 3),
handle, 24576L, 0);
TRIPLECHECK("_XMMicopy()", status, 0, (void far *) realbuf, handle, 0);
status = _XMMicopy((HALFLEN / 5L), 3, 0, handle, 0L, 0,
(unsigned long) testbuf2, 2);
TRIPLECHECK("_XMMicopy()", status, 0, (void far *) realbuf, handle, 0);
status = _XMMicopy((HALFLEN / 5L), 2, 0, handle, 24576L, 0,
(unsigned long)(testbuf2 + 3), 3);
TRIPLECHECK("_XMMicopy()", status, 0, (void far *) realbuf, handle, 0);
GUARDCHECK(handle);
SRCWORDCHECK(testbuf, HALFLEN);
CPYWORDCHECK(testbuf2, HALFLEN);
TESTTAILER();
/* restore destination pattern */
FMEMSET(testbuf2, 0, HALFLEN);
status = XMMcopyto(HALFLEN, testbuf2, handle, 0L);
TRIPLECHECK("XMMcopyto()", status, 0, (void far *) realbuf, handle, 0);
/* test zero skip */
TESTHEADER();
printf("XMMicopyto() and XMMicopyfrom(): zero skip.\nShould succeed.\n");
status = XMMicopyto((HALFLEN / 5L), 5, 0, testbuf, handle, 0L);
TRIPLECHECK("XMMicopyto()", status, 0, (void far *) realbuf, handle, 0);
status = XMMicopyfrom((HALFLEN / 16L), 16, 0, handle, 0L, testbuf2);
TRIPLECHECK("XMMicopyto()", status, 0, (void far *) realbuf, handle, 0);
GUARDCHECK(handle);
SRCWORDCHECK(testbuf, HALFLEN);
CPYWORDCHECK(testbuf2, HALFLEN);
TESTTAILER();
/*
** Try some copies with bad offsets, etc., just to make sure _XMMicopy()
** is passing along error data from driver OK. _XMMicopy() does no
** size checking on its own because it has no idea what the size of
** the block is.
*/
gblmsg = " INTERVAL COPY TESTS CONVENTIONAL-EMB ERRORS";
/* try copy with bad starting offset */
TESTHEADER();
printf("XMMicopyto(): copying to bad offset.\n");
printf("Should fail.\n");
status = XMMicopyto(50L, 2, 2, testbuf, handle, (MINFREE + 1L));
nofailcheck("XMMicopyto()", status, (void far *) realbuf, handle, 0);
weirdretchk("XMMicopyto()", status, (void far *) realbuf, handle, 0);
weirdcodechk("XMMicopyto()", XMM_BADDESTOFF, (void far *) realbuf,handle,0);
SRCWORDCHECK(testbuf, HALFLEN);
TESTTAILER();
/* try copy with bad ending offset */
TESTHEADER();
printf("XMMicopyfrom(): copying block that will run off end.\n");
status = XMMicopyfrom(50L, 2, 2, handle, (MINFREE - 10L), testbuf2);
nofailcheck("XMMicopyfrom()", status, (void far *) realbuf, handle, 0);
weirdretchk("XMMicopyfrom()", status, (void far *) realbuf, handle, 0);
weirdcodechk("XMMicopyfrom()", XMM_BADSRCOFF,(void far *)realbuf,handle,0);
TESTTAILER();
/* try copy with source skip too big */
TESTHEADER();
printf("_XMMicopy(): source skip too big.\nShould fail.\n");
status = _XMMicopy(10, 2, 32769U, 0, (unsigned long) testbuf, handle,0L,2);
nofailcheck("_XMMicopy()", status, (void far *) realbuf, handle, 0);
weirdretchk("_XMMicopy()", status, (void far *) realbuf, handle, 0);
weirdcodechk("_XMMicopy()", XMM_SKTOOBIG, (void far *) realbuf, handle, 0);
SRCWORDCHECK(testbuf, HALFLEN);
TESTTAILER();
/* try copy with dest skip too big */
TESTHEADER();
printf("_XMMicopy(): dest skip too big.\nShould fail.\n");
status = _XMMicopy(10, 2, 2, 0, (unsigned long) testbuf, handle,0L,32769U);
nofailcheck("_XMMicopy()", status, (void far *) realbuf, handle, 0);
weirdretchk("_XMMicopy()", status, (void far *) realbuf, handle, 0);
weirdcodechk("_XMMicopy()", XMM_SKTOOBIG, (void far *) realbuf, handle, 0);
SRCWORDCHECK(testbuf, HALFLEN);
TESTTAILER();
/* try copy with element size too big */
TESTHEADER();
printf("_XMMicopy(): element size too big.\nShould fail.\n");
status = _XMMicopy(10, 16385, 2, 0, (unsigned long) testbuf, handle, 0L, 2);
nofailcheck("_XMMicopy()", status, (void far *) realbuf, handle, 0);
weirdretchk("_XMMicopy()", status, (void far *) realbuf, handle, 0);
weirdcodechk("_XMMicopy()", XMM_ELTOOBIG, (void far *) realbuf, handle, 0);
SRCWORDCHECK(testbuf, HALFLEN);
TESTTAILER();
/*
** Now, let's do some speed tests (and make sure that we can handle
** blocks > 64K). We're going to have to write over the middle
** guard block to do it, and move the upper guard block.
*/
gblmsg = " INTERVAL COPY TESTS CONVENTIONAL-EMB SPEED";
guard2 = (unsigned char far *) normptr(testbuf2 + HALFLEN - 1024);
FMEMSET(guard2, GUARDVAL, 1024);
LFMEMSET(testbuf, 0, MINFREE);
status = XMMcopyto(MINFREE, testbuf, handle, 0L);
TRIPLECHECK("XMMcopyto()", status, 0, (void far *) realbuf, handle, 0);
lfarincwordfill(testbuf, MINFREE, 0);
/* first, copy MINFREE bytes by words in two passes */
TESTHEADER();
printf("XMMicopyto(): copy %lu bytes by words in two passes.\n", MINFREE);
printf("Should succeed.\n");
start = get_tick();
status = XMMicopyto((MINFREE / 4L), 2, 2, testbuf, handle, 0L);
stop = get_tick();
total = stop - start;
TRIPLECHECK("XMMicopyto()", status, 0, (void far *) realbuf, handle, 0);
if ((farmemcheck(guard1, 1024, GUARDVAL) != 0) ||
(farmemcheck(guard2, 1024, GUARDVAL) != 0))
{
printf("Copy corrupted guard buffers.\n");
XMMfree(handle);
LFREE(realbuf);
exit(3);
}
start = get_tick();
status = XMMicopyto((MINFREE / 4L), 2, 2, (testbuf + 2), handle, 2L);
stop = get_tick();
total += (stop - start);
TRIPLECHECK("XMMicopyto()", status, 0, (void far *) realbuf, handle, 0);
if ((farmemcheck(guard1, 1024, GUARDVAL) != 0) ||
(farmemcheck(guard2, 1024, GUARDVAL) != 0))
{
printf("Copy corrupted guard buffers.\n");
XMMfree(handle);
LFREE(realbuf);
exit(3);
}
status = XMMcopyfrom(MINFREE, handle, 0L, testbuf);
TRIPLECHECK("XMMcopyfrom()", status, 0, (void far *) realbuf, handle, 0);
if ((farmemcheck(guard1, 1024, GUARDVAL) != 0) ||
(farmemcheck(guard2, 1024, GUARDVAL) != 0))
{
printf("Copy corrupted guard buffers.\n");
XMMfree(handle);
LFREE(realbuf);
exit(3);
}
CPYWORDCHECK(testbuf, MINFREE);
printf("Succeeded. Took %lu ticks.\n", total);
TESTTAILER();
/* restore patterns */
LFMEMSET(testbuf, 0, MINFREE);
status = XMMcopyto(MINFREE, testbuf, handle, 0L);
TRIPLECHECK("XMMcopyto()", status, 0, (void far *) realbuf, handle, 0);
lfarincwordfill(testbuf, MINFREE, 0);
/* copy MINFREE bytes by fives in two passes */
TESTHEADER();
printf("XMMicopyto(): copy %lu bytes by fives in two passes.\n", MINFREE);
printf("Should succeed.\n");
start = get_tick();
status = XMMicopyto((MINFREE / 10L), 5, 5, testbuf, handle, 0L);
stop = get_tick();
total = stop - start;
TRIPLECHECK("XMMicopyto()", status, 0, (void far *) realbuf, handle, 0);
if ((farmemcheck(guard1, 1024, GUARDVAL) != 0) ||
(farmemcheck(guard2, 1024, GUARDVAL) != 0))
{
printf("Copy corrupted guard buffers.\n");
XMMfree(handle);
LFREE(realbuf);
exit(3);
}
start = get_tick();
status = XMMicopyto((MINFREE / 10L), 5, 5, (testbuf + 5), handle, 5L);
stop = get_tick();
total += (stop - start);
TRIPLECHECK("XMMicopyto()", status, 0, (void far *) realbuf, handle, 0);
if ((farmemcheck(guard1, 1024, GUARDVAL) != 0) ||
(farmemcheck(guard2, 1024, GUARDVAL) != 0))
{
printf("Copy corrupted guard buffers.\n");
XMMfree(handle);
LFREE(realbuf);
exit(3);
}
status = XMMcopyfrom(MINFREE, handle, 0L, testbuf);
TRIPLECHECK("XMMcopyfrom()", status, 0, (void far *) realbuf, handle, 0);
if ((farmemcheck(guard1, 1024, GUARDVAL) != 0) ||
(farmemcheck(guard2, 1024, GUARDVAL) != 0))
{
printf("Copy corrupted guard buffers.\n");
XMMfree(handle);
LFREE(realbuf);
exit(3);
}
CPYWORDCHECK(testbuf, MINFREE);
printf("Succeeded. Took %lu ticks.\n", total);
TESTTAILER();
/* restore patterns */
LFMEMSET(testbuf, 0, MINFREE);
status = XMMcopyto(MINFREE, testbuf, handle, 0L);
TRIPLECHECK("XMMcopyto()", status, 0, (void far *) realbuf, handle, 0);
lfarincwordfill(testbuf, MINFREE, 0);
/* copy MINFREE bytes individually in two passes */
TESTHEADER();
printf("XMMicopyto(): copy %lu bytes individually in two passes.\n",
MINFREE);
printf("Should succeed.\n");
start = get_tick();
status = XMMicopyto((MINFREE / 2L), 1, 1, testbuf, handle, 0L);
stop = get_tick();
total = stop - start;
TRIPLECHECK("XMMicopyto()", status, 0, (void far *) realbuf, handle, 0);
if ((farmemcheck(guard1, 1024, GUARDVAL) != 0) ||
(farmemcheck(guard2, 1024, GUARDVAL) != 0))
{
printf("Copy corrupted guard buffers.\n");
XMMfree(handle);
LFREE(realbuf);
exit(3);
}
start = get_tick();
status = XMMicopyto((MINFREE / 2L), 1, 1, (testbuf + 1), handle, 1L);
stop = get_tick();
total += (stop - start);
TRIPLECHECK("XMMicopyto()", status, 0, (void far *) realbuf, handle, 0);
if ((farmemcheck(guard1, 1024, GUARDVAL) != 0) ||
(farmemcheck(guard2, 1024, GUARDVAL) != 0))
{
printf("Copy corrupted guard buffers.\n");
XMMfree(handle);
LFREE(realbuf);
exit(3);
}
status = XMMcopyfrom(MINFREE, handle, 0L, testbuf);
TRIPLECHECK("XMMcopyfrom()", status, 0, (void far *) realbuf, handle, 0);
if ((farmemcheck(guard1, 1024, GUARDVAL) != 0) ||
(farmemcheck(guard2, 1024, GUARDVAL) != 0))
{
printf("Copy corrupted guard buffers.\n");
XMMfree(handle);
LFREE(realbuf);
exit(3);
}
CPYWORDCHECK(testbuf, MINFREE);
printf("Succeeded. Took %lu ticks.\n", total);
TESTTAILER();
/*
** Clean up.
*/
LFREE(realbuf);
test_XMMfree(handle);
return;
} /* end of do_icopy_tests() */