1 //+--------------------------------------------------------------
2 //
3 //  For conditions of distribution and use, see copyright notice
4 //  in Flashpix.h
5 //
6 //  Copyright (c) 1999 Digital Imaging Group, Inc.
7 //
8 //  Contents:   DRT main routine
9 //
10 //---------------------------------------------------------------
11 
12 #include "headers.cxx"
13 #include "../../h/dbg.hxx"
14 
15 #include "tests.hxx"
16 #include "illeg.hxx"
17 
18 // Test flags and type
19 typedef ULONG FLAGS;
20 
21 #define TF_NONE                 0x00000000
22 
23 // Suppression flags
24 #define TF_SUPPRESS             0x0000FFFF
25 #define TFS_ILLEGITIMATE        0x00000001
26 #define TFS_16BIT               0x00000002
27 
28 // Enabling flags
29 #define TF_ENABLE               0xFFFF0000
30 #define TFE_DIRECT              0x00010000
31 #define TFE_ANY                 (TFE_DIRECT)
32 
33 // Pointer to a test function
34 typedef void (*TestFn)(void);
35 
36 static struct
37 {
38     char *pszName;
39     char *pszDesc;
40     TestFn tfn;
41     FLAGS flags;
42 } tests[] =
43 {
44     "Create",   "Creation",
45         t_create, TFE_ANY,
46     "Open",     "Opening",
47         t_open, TFE_ANY,
48     "AddRef",   "AddRef/Release",
49         t_addref, TFE_ANY,
50     "DModify",  "Direct modifications",
51         t_dmodify, TFE_DIRECT,
52     "Stat",     "Stat",
53         t_stat, TFE_ANY,
54     "Stream",   "Stream operations",
55         t_stream, TFE_ANY,
56     "Enum",     "Enumerator operations",
57         t_enum, TFE_ANY,
58     "StgCopyTo", "IStorage::CopyTo",
59         t_stgcopyto, TFE_ANY,
60     "MoveCopy", "IStorage::MoveElementTo",
61         t_movecopy, TFE_ANY,
62     "ILockBytes", "ILockBytes usage",
63         t_ilb, TFE_ANY,
64     "StgMisc",  "Miscellaneous Stg functions",
65         t_stgmisc, TFE_ANY,
66     "IllStg", "Illegitimate IStorage calls",
67         i_storage, TFE_ANY | TFS_ILLEGITIMATE,
68     "IllStm", "Illegitimate IStream calls",
69         i_stream, TFE_ANY | TFS_ILLEGITIMATE,
70     "IllEnum", "Illegitimate enumerator calls",
71         i_enum, TFE_ANY | TFS_ILLEGITIMATE
72 };
73 #define NTESTS (sizeof(tests)/sizeof(tests[0]))
74 
75 DWORD dwRootDenyWrite = STGM_SHARE_DENY_WRITE;
76 BOOL fVerbose = FALSE;
77 OLECHAR atcDrtDocfile[_MAX_PATH];
78 
79 static BOOL fRun[NTESTS];
80 #ifdef FLAT
81 static FLAGS flTests = TF_NONE;
82 #else
83 static FLAGS flTests = TF_NONE | TFS_16BIT;
84 #endif
85 
Initialize(void)86 static void Initialize(void)
87 {
88     SetData();
89 }
90 
Uninitialize(void)91 static void Uninitialize(void)
92 {
93     UnsetData();
94 }
95 
FindTest(char * pszName)96 static int FindTest(char *pszName)
97 {
98     int i, cchName;
99 
100     cchName = strlen(pszName);
101     for (i = 0; i<NTESTS; i++)
102         if (!_strnicmp(pszName, tests[i].pszName, cchName))
103             return i;
104     return -1;
105 }
106 
RunTests(void)107 static void RunTests(void)
108 {
109     int i;
110 
111     for (i = 0; i<NTESTS; i++)
112         // For a test to run:
113         // 1)  fRun[test] must be TRUE
114         // 2)  No suppression flags can be set that are not set in flTests
115         // 3)  At least one enabling flag must be set that is set in flTests
116         if (fRun[i] &&
117             (tests[i].flags & ~flTests & TF_SUPPRESS) == 0 &&
118             (tests[i].flags & flTests & TF_ENABLE) != 0)
119         {
120             out("\n----- Test #%2d - %s -----\n", i+1, tests[i].pszDesc);
121             tests[i].tfn();
122             CleanData();
123         }
124 }
125 
Usage(void)126 static void Usage(void)
127 {
128     int i;
129 
130     printf("Usage: drt [options]\n");
131     printf("Options are:\n");
132     printf("  -h        - This message\n");
133     printf("  -d        - Suppress direct tests\n");
134     printf("  -i        - Enable illegitimate tests\n");
135     printf("  -v        - Display test output\n");
136     printf("  -#[+|-]<number>   - Turn test <number> on (+) or off (-)\n");
137     printf("                      No number means all\n");
138     printf("  -n[+|-]<prefix>   - Turn test <prefix> on or off\n");
139     printf("  -N<file>  - Set file to use for tests\n");
140     printf("Prefix can be any prefix of:\n");
141     printf("HR=%lx\n", E_INVALIDARG);
142     for (i = 0; i<NTESTS; i++)
143         printf("  %s\n", tests[i].pszName);
144     exit(1);
145 }
146 
main(int argc,char ** argv)147 int _CRTAPI1 main(int argc, char **argv)
148 {
149     int i, iTest;
150     BOOL fDirect = TRUE;
151 
152     // change the following line to set mem check breakpoints
153     // on win32, using debug CRT.
154     //_CrtSetBreakAlloc();
155 
156     for (i = 0; i<NTESTS; i++)
157         fRun[i] = TRUE;
158     ATOOLE(pszDRTDF, atcDrtDocfile, _MAX_PATH);
159     while (--argc>0)
160     {
161         if (**++argv == '-')
162         {
163             switch(argv[0][1])
164             {
165             case '#':
166                 if (sscanf(argv[0]+3, "%d", &iTest) != 1)
167                     iTest = -1;
168                 else
169                     iTest--;
170                 for (i = 0; i<NTESTS; i++)
171                     if (iTest == -1 || iTest == i)
172                         fRun[i] = argv[0][2] == '+';
173                 break;
174             case 'd':
175                 fDirect = FALSE;
176                 break;
177             case 'i':
178                 flTests |= TFS_ILLEGITIMATE;
179                 break;
180             case 'n':
181                 iTest = FindTest(argv[0]+3);
182                 if (iTest >= 0)
183                     fRun[iTest] = argv[0][2] == '+';
184                 break;
185             case 'N':
186                 ATOOLE(argv[0]+2, atcDrtDocfile, _MAX_PATH);
187                 break;
188             case 'v':
189                 fVerbose = TRUE;
190                 break;
191 
192             case 'h':
193             default:
194                 Usage();
195             }
196         }
197         else
198             Usage();
199     }
200 
201     Initialize();
202 
203     if (fDirect)
204     {
205         out("\n---------- Direct ----------\n");
206         dwRootDenyWrite = STGM_SHARE_EXCLUSIVE;
207         flTests |= TFE_DIRECT;
208         RunTests();
209         flTests &= ~TFE_DIRECT;
210     }
211 
212     printf("Storage DRT - PASSED\n");
213 
214     Uninitialize();
215 
216     return(0);
217 }
218