f388a44da0fa4e608dbbc21cc635749a299bae1d
[openafs.git] / src / usd / test / usd_test.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 * /
11 /* usd_test.c: Tests the usd library by opening a tape device,
12  *         writing a few blocks of data to it, doing a fsf, bsf
13  */
14 #include <afsconfig.h>
15 #include <afs/param.h>
16
17 #include <stdio.h>
18 #include <afs/usd.h>
19 #ifdef AFS_NT40_ENV
20 #include <windows.h>
21 #include <winbase.h>
22 #endif
23
24 static char *whoami;
25 usd_handle_t hTape;
26
27 #define USDTEST_DEBUG        0  /* set to 1, to print tape pos info */
28
29 static int err_exit(char *action, char *msg, int rcode);
30 static int bufeql(char *buf1, char *buf2, int size);
31 static int Rewind(usd_handle_t hTape);
32 static int WriteEOF(usd_handle_t hTape, int cnt);
33 static int ForwardSpace(usd_handle_t hTape, int cnt);
34 static int BackSpace(usd_handle_t hTape, int cnt);
35 static int PrepTape(usd_handle_t hTape);
36 static int ShutdownTape(usd_handle_t hTape);
37 static int PrintTapePos(usd_handle_t hTape);
38
39 int
40 main(int argc, char **argv)
41 {
42     int rcode;
43     afs_uint32 xferd;
44     char *filename = argv[1];
45     char buf1[1024], buf2[1024];
46     int i;
47
48     whoami = argv[0];
49     if (argc < 2) {
50         printf(" Usage: %s <tape device name>\n", whoami);
51         exit(1);
52     }
53     rcode =
54         usd_Open(filename, (USD_OPEN_RDWR | USD_OPEN_WLOCK), 0777, &hTape);
55
56     if (rcode) {
57         printf("%s:Can't open device. Err %d\n", whoami, rcode);
58         return 1;
59     }
60     PrepTape(hTape);
61
62     Rewind(hTape);
63     Rewind(hTape);
64     Rewind(hTape);
65     PrintTapePos(hTape);
66     /* Write test - write 10 blocks of random data */
67     printf("%s: Beginning Write Test\n", whoami);
68     i = 10;
69     for (i = 0; i < 10; i++) {
70         rcode = USD_WRITE(hTape, buf1, 1024, &xferd);
71         if (rcode || xferd != 1024) {
72             printf("%s: Write test failed. Err %d\n", whoami, rcode);
73             return 1;
74         }
75         PrintTapePos(hTape);
76     }
77
78     WriteEOF(hTape, 1);
79
80     PrintTapePos(hTape);
81     printf("%s: Write Test Passed.\n", whoami);
82
83     Rewind(hTape);
84     printf("%s: Rewind Test passed\n", whoami);
85     PrintTapePos(hTape);
86
87     /* Read test - read the 10 blocks written */
88     printf("%s: Beginning read test\n", whoami);
89     for (i = 0; i < 10; i++) {
90         rcode = USD_READ(hTape, buf2, 1024, &xferd);
91         err_exit("read", "Read Test Failed", rcode);
92         PrintTapePos(hTape);
93         if (xferd != 1024)
94             err_exit("read", "Read Test Failed. Wrong no. of bytes read.", 1);
95         if (bufeql(buf1, buf2, 1024) == 0) {
96             printf("%s: Read test failed\n", whoami);
97             exit(1);
98         }
99     }
100     printf("%s: Read Test passed\n", whoami);
101
102     Rewind(hTape);
103     PrintTapePos(hTape);
104     /* WEOF - Test */
105     for (i = 0; i < 5; i++) {
106         /* write data block */
107         *buf1 = i;
108         rcode = USD_WRITE(hTape, buf1, 1024, &xferd);
109         err_exit("Write", "Write EOF Test Failed", rcode);
110
111         /* write EOF mark */
112         rcode = WriteEOF(hTape, 1);
113         err_exit("WEOF", "Write EOF Test Failed", rcode);
114         PrintTapePos(hTape);
115     }
116     printf("%s: WEOF Test passed\n", whoami);
117
118     Rewind(hTape);
119     /* fsf/bsf test */
120     ForwardSpace(hTape, 2);
121     PrintTapePos(hTape);
122     rcode = USD_READ(hTape, buf2, 1024, &xferd);
123     err_exit("read", "FSF Test Failed", rcode);
124     if (*buf2 != 2)
125         err_exit("FSF", "FSF Test Failed", 1);
126
127     ForwardSpace(hTape, 2);
128     PrintTapePos(hTape);
129     rcode = USD_READ(hTape, buf2, 1024, &xferd);
130     err_exit("read", "FSF Test Failed", rcode);
131     if (*buf2 != 4)
132         err_exit("FSF", "FSF Test Failed", 1);
133
134     printf("%s: FSF Test passed\n", whoami);
135
136     BackSpace(hTape, 4);
137     ForwardSpace(hTape, 1);
138     rcode = USD_READ(hTape, buf2, 1024, &xferd);
139     err_exit("read", "FSF Test Failed", rcode);
140     if (*buf2 != 1)
141         err_exit("BSF", "FSF Test Failed", 1);
142
143     printf("%s: BSF Test Passed\n", whoami);
144
145     ShutdownTape(hTape);
146     rcode = USD_CLOSE(hTape);
147     if (rcode) {
148         printf("%s:Can't close device. Err %d\n", whoami, rcode);
149         return 1;
150     }
151     printf("%s: usd library, all tests passed!\n", whoami);
152 }
153
154
155 static int
156 err_exit(char *action, char *msg, int rcode)
157 {
158     if (!rcode)
159         return 0;
160     printf("%s:Can't %s device. Err %d\n %s \n", whoami, action, rcode, msg);
161
162     /* Now shutdown and close the tape */
163     ShutdownTape(hTape);
164     rcode = USD_CLOSE(hTape);
165     if (rcode) {
166         printf("%s:Can't close device. Err %d\n", whoami, rcode);
167         return 1;
168     }
169     exit(1);
170 }
171
172
173 static int
174 bufeql(char *buf1, char *buf2, int size)
175 {
176     while (size--) {
177         if (*buf1 != *buf2)
178             return 0;
179
180         ++buf1;
181         ++buf2;
182     }
183     return 1;
184 }
185
186
187 static int
188 Rewind(usd_handle_t hTape)
189 {
190     usd_tapeop_t tapeop;
191     int rcode;
192
193     tapeop.tp_op = USDTAPE_REW;
194     tapeop.tp_count = 1;
195     rcode = USD_IOCTL(hTape, USD_IOCTL_TAPEOPERATION, (void *)&tapeop);
196     err_exit("rewind", "Rewind Test Failed", rcode);
197     return 0;
198 }
199
200 static int
201 WriteEOF(usd_handle_t hTape, int cnt)
202 {
203     usd_tapeop_t tapeop;
204     int rcode;
205
206     tapeop.tp_op = USDTAPE_WEOF;
207     tapeop.tp_count = cnt;
208     rcode = USD_IOCTL(hTape, USD_IOCTL_TAPEOPERATION, (void *)&tapeop);
209     err_exit("rewind", "Rewind Test Failed", rcode);
210     return 0;
211 }
212
213 static int
214 ForwardSpace(usd_handle_t hTape, int cnt)
215 {
216     usd_tapeop_t tapeop;
217     int rcode;
218
219     tapeop.tp_op = USDTAPE_FSF;
220     tapeop.tp_count = cnt;
221     rcode = USD_IOCTL(hTape, USD_IOCTL_TAPEOPERATION, (void *)&tapeop);
222     err_exit("FSF", "FSF Test Failed", rcode);
223     return 0;
224 }
225
226 static int
227 BackSpace(usd_handle_t hTape, int cnt)
228 {
229     usd_tapeop_t tapeop;
230     int rcode;
231
232     tapeop.tp_op = USDTAPE_BSF;
233     tapeop.tp_count = cnt;
234     rcode = USD_IOCTL(hTape, USD_IOCTL_TAPEOPERATION, (void *)&tapeop);
235     err_exit("BSF", "BSF Test Failed", rcode);
236     return 0;
237 }
238
239 static int
240 PrepTape(usd_handle_t hTape)
241 {
242     usd_tapeop_t tapeop;
243     int rcode;
244
245     tapeop.tp_op = USDTAPE_PREPARE;
246     tapeop.tp_count = 0;
247     rcode = USD_IOCTL(hTape, USD_IOCTL_TAPEOPERATION, (void *)&tapeop);
248     err_exit("PREPARE", "Tape Prepare Test Failed", rcode);
249     return 0;
250 }
251
252
253 static int
254 ShutdownTape(usd_handle_t hTape)
255 {
256     usd_tapeop_t tapeop;
257     int rcode;
258
259     tapeop.tp_op = USDTAPE_SHUTDOWN;
260     tapeop.tp_count = 0;
261     rcode = USD_IOCTL(hTape, USD_IOCTL_TAPEOPERATION, (void *)&tapeop);
262     if (rcode) {                /* can't call err_exit() here for fear of recursion */
263         printf("%s: Tape Shutdown Failed with code %d\n", whoami, rcode);
264         exit(1);
265     }
266     return 0;
267 }
268
269 #ifdef AFS_NT40_ENV
270 static int
271 PrintTapePos(usd_handle_t hTape)
272 {
273     DWORD rcode;
274     DWORD part, offLow, offHi;
275
276     rcode =
277         GetTapePosition(hTape->handle, TAPE_ABSOLUTE_POSITION, &part, &offLow,
278                         &offHi);
279     if (rcode != NO_ERROR)
280         err_exit("GetTapePosition", "Get Tape Pos test Failed", 1);
281
282     if (USDTEST_DEBUG)
283         printf("%s: Cur Tape Block : %d \n", whoami, offLow);
284
285     return (offLow);
286 }
287 #else
288 static int
289 PrintTapePos(usd_handle_t hTape)
290 {
291     afs_hyper_t startOff, stopOff;
292     int rcode;
293
294     hset64(startOff, 0, 0);
295     hset64(stopOff, 0, 0);
296
297     rcode = USD_SEEK(hTape, startOff, SEEK_CUR, &stopOff);
298     err_exit("Seek", "Tape Seek Test Failed", rcode);
299
300     if (USDTEST_DEBUG)
301         printf("%s: Cur Tape Pos : %d bytes\n", whoami, stopOff.low);
302
303     return (stopOff.low);
304 }
305 #endif