Whamcloud - gitweb
b=11512
[fs/lustre-release.git] / libsysio / tests / test_strided.pl
1 #!/usr/bin/perl -w
2
3 #
4 # strided IO test: Perform a series of different reads/writes
5 #                  using readx and writex with different buffer
6 #                  configurations 
7 #
8
9 use IPC::Open2;
10
11 use strict;
12 use FindBin;
13 use lib "$FindBin::Bin";
14 use helper;
15
16 sub usage
17 {
18   print "Usage: ./test_rw.pl [-alpha] <file>: Write to/read from file\n";
19   exit(-1);
20 }
21
22 sub verify_result
23 {
24         my ($cmdfh, $outfh, $cmdstr, $exp_val, $eq_op) = @_;
25         my $print_err = 0;
26
27         my $res = helper::verify_cmd($cmdfh, $outfh, $cmdstr);
28         $res = oct($res);
29
30         if ($eq_op eq "!=") {
31                 if ($res != $exp_val) {
32                         print STDOUT "Error! $cmdstr returned $res insted of $exp_val\n";
33                         system("killall test_driver");
34                         exit(1);
35                 }
36         } else {
37                 if ($eq_op eq ">") {
38                         if ($res > $exp_val) {
39                                 $print_err = 1;
40                         }
41                 } elsif ($eq_op eq "<")  {
42                         if ($res < $exp_val) {
43                                 $print_err = 1;
44                         }
45                 } elsif ($eq_op eq "==") {
46                         if ($res == $exp_val) {
47                                 $print_err = 1;
48                         }
49                 }
50                 if ($print_err == 1) {
51                         print STDOUT "Error! $cmdstr returned $res\n";
52                 }
53         }
54
55 }
56
57 # Initilize the iovec number $vecnum
58 # in the iovec buffer $vecname with buffer
59 # pos $buf and using len $veclen
60 sub set_iovec
61 {
62         my ($cmdfh, $outfh, $vecname, $vecnum, $buf, $veclen) = @_;
63
64         my $cmdstr = 'CALL init_iovec $'.$buf." 0 $veclen ";
65         $cmdstr .= "$vecnum ".'$'."$vecname\n";
66
67         helper::send_cmd($cmdfh, $outfh, "init_iovec", $cmdstr);
68         helper::verify_cmd($cmdfh, $outfh, "init_iovec");
69 }
70
71
72 sub setup_xtvecs
73 {
74         my ($cmdfh, $outfh) = @_;
75
76         # Get size of iovecs
77         my $cmdstr = '$xtvsize = CALL sizeof xtvec'."\n";
78         helper::send_cmd($cmdfh, $outfh, "sizeof", $cmdstr);
79         my $size = helper::verify_cmd($cmdfh, $outfh, "sizeof xtvec");
80         $size = oct($size);
81         $size = $size * 2;
82
83         # Allocate iovec buffer
84         $cmdstr = '$xtvbuf'." = ALLOC $size\n";
85         helper::send_cmd($cmdfh, $outfh, "alloc", $cmdstr);
86         
87
88         # Now initilize xtvbuf
89         $cmdstr = "CALL init_xtvec 0 100 0 ". '$xtvbuf'."\n";
90         helper::send_cmd($cmdfh, $outfh, "init_xtvec", $cmdstr);
91         helper::verify_cmd($cmdfh, $outfh, "init_xtvec");
92
93         $cmdstr = "CALL init_xtvec 1000 100 1 ". '$xtvbuf'."\n";
94         helper::send_cmd($cmdfh, $outfh, "init_xtvec", $cmdstr);
95         helper::verify_cmd($cmdfh, $outfh, "init_xtvec");
96 }
97
98 sub check_buf
99 {
100
101         my ($cmdfh, $outfh, $bufsize, $bufname, 
102                         $readcmd, $digit, $offset) = @_;
103         
104         my $cmdstr = 'CALL checkbuf $'. "$bufname $bufsize $digit $offset\n";
105         helper::send_cmd($cmdfh, $outfh, "checkbuf", $cmdstr);
106         my $res = helper::verify_cmd($cmdfh, $outfh, "checkbuf");
107         $res = oct($res);
108
109         if ($res != 0) {
110                 print STDOUT "$readcmd did not return all $digit 's\n";
111
112 }
113
114 # Fill given buffer with $digit up to $size
115 # starting at $offset
116 sub fill_buf
117 {
118         my ($cmdfh, $outfh, $buf, $digit, $size, $off) = @_;
119
120         my $cmdstr = "CALL setbuf $digit $size ".'$'."$buf $off\n";
121         helper::send_cmd($cmdfh, $outfh, "setbuf", $cmdstr);            
122 }
123
124 sub alloc_iovbuf
125 {
126         my ($cmdfh, $outfh, $numbufs, $num) = @_;
127
128         # Get size of iovecs
129         my $cmdstr = '$iovsize = CALL sizeof iovec'."\n";
130         helper::send_cmd($cmdfh, $outfh, "sizeof", $cmdstr);
131         my $size = helper::verify_cmd($cmdfh, $outfh, "sizeof iovec");
132         $size = oct($size);
133         $size = $size * $numbufs;
134
135         # Allocate iovec buffer
136         $cmdstr = '$iovbuf'."$num = ALLOC $size\n";
137         helper::send_cmd($cmdfh, $outfh, "alloc", $cmdstr);
138
139         my $retstr = "iovbuf".$num;
140         
141         return $retstr;
142 }
143
144 sub do_rwcalls
145 {
146         my ($cmdfh, $outfh, $fh) = @_;
147
148         # Allocate and initilize xtvecs
149         setup_xtvecs($cmdfh, $outfh);
150
151         # Allocate 2 different iovecs, one for cases
152         # (a) and (d) and one for cases (b) and (c)
153         my $iovbuf1 = alloc_iovbuf($cmdfh, $outfh, 3, 0);
154         my $iovbuf2 = alloc_iovbuf($cmdfh, $outfh, 1, 1);
155         
156         # Allocate four buffers, each 200 bytes long
157         my $cmdstr = '$buf1 '. "= ALLOC 200\n";
158         helper::send_cmd($cmdfh, $outfh, "alloc", $cmdstr);
159         $cmdstr = '$buf2 '. "= ALLOC 200\n";
160         helper::send_cmd($cmdfh, $outfh, "alloc", $cmdstr);
161         $cmdstr = '$buf3 '. "= ALLOC 200\n";
162         helper::send_cmd($cmdfh, $outfh, "alloc", $cmdstr);
163         $cmdstr = '$buf4 '. "= ALLOC 200\n";
164         helper::send_cmd($cmdfh, $outfh, "alloc", $cmdstr);
165         
166         # Case (a):
167         #  xtvec[] = { { 0, 100 }, {1000, 100} }
168         #  iovec[] = { { buf1, 50}, {buf2, 50}, {buf3, 100}
169
170         # Fill each of the 3 buffers of.  They will be filled
171         # as follows:
172         #  buf1 -->    0- 49:  1
173         #       -->   49-200:  2
174         #  buf2 -->    0- 49:  3
175         #       -->   49-200:  4
176         #  buf3 -->    0-100:  5
177         #       -->  100-200:  6
178         fill_buf($cmdfh, $outfh, "buf1", 1, 50, 0);
179         fill_buf($cmdfh, $outfh, "buf1", 2, 150, 50);
180         fill_buf($cmdfh, $outfh, "buf2", 3, 50, 0);
181         fill_buf($cmdfh, $outfh, "buf2", 4, 150, 50);
182         fill_buf($cmdfh, $outfh, "buf3", 5, 100, 0);
183         fill_buf($cmdfh, $outfh, "buf3", 6, 100, 100);
184
185         # Initiize iovecs
186         set_iovec($cmdfh, $outfh, $iovbuf1, 0, "buf1", 50);
187         set_iovec($cmdfh, $outfh, $iovbuf1, 1, "buf2", 50);
188         set_iovec($cmdfh, $outfh, $iovbuf1, 2, "buf3", 100);
189
190         # Write out to $fh
191         $cmdstr = 'CALL writex $'."$fh $iovbuf1 3 ".'$xtvbuf '."2\n";
192         helper::send_cmd($cmdfh, $outfh, "writex", $cmdstr);
193         verify_result($cmdfh, $outfh, "writex (case a)", 200, "!=");
194
195         # Clear out the buffers
196         fill_buf($cmdfh, $outfh, "buf1", 0, 200, 0);
197         fill_buf($cmdfh, $outfh, "buf2", 0, 200, 0);
198         fill_buf($cmdfh, $outfh, "buf3", 0, 200, 0);
199
200         # Read it back
201         $cmdstr = 'CALL readx $'."$fh $iovbuf1 3 ".'$xtvbuf '."2\n";
202         helper::send_cmd($cmdfh, $outfh, "readx", $cmdstr);
203         verify_result($cmdfh, $outfh, "readx (case a)", 200, "!=");
204
205         # Make sure we got what we expected...
206         check_buf($cmdfh, $outfh, 50, "buf1", "readx (case a)", 1, 0);
207         check_buf($cmdfh, $outfh, 50, "buf2", "readx (case a)", 3, 0);
208         check_buf($cmdfh, $outfh, 100, "buf3", "readx (case a)", 5, 0);
209
210   # Case (b):
211         #  xtvec[] = { { 0, 100 }, {1000, 100} }
212         #  iovec[] = { { buf4, 200} }
213
214
215         # Fill buf4 with 7's...
216         fill_buf($cmdfh, $outfh, "buf4", 7, 200, 0);
217
218         # Initiize iovecs
219         set_iovec($cmdfh, $outfh, $iovbuf2, 0, "buf4", 200);
220
221         # Write out to $fh
222         $cmdstr = 'CALL writex $'."$fh ".'$'."$iovbuf2 1 ".'$xtvbuf '."2\n";
223         helper::send_cmd($cmdfh, $outfh, "writex", $cmdstr);
224         verify_result($cmdfh, $outfh, "writex (case b)", 200, "!=");
225
226         # Clear out the buffer
227         fill_buf($cmdfh, $outfh, "buf4", 0, 200, 0);
228
229         # Read it back
230         $cmdstr = 'CALL readx $'."$fh $iovbuf2 1 ".'$xtvbuf '."2\n";
231         helper::send_cmd($cmdfh, $outfh, "readx", $cmdstr);
232         verify_result($cmdfh, $outfh, "readx (case b)", 200, "!=");
233
234         # Make sure we got what we expected...
235         check_buf($cmdfh, $outfh, 200, "buf4", "readx (case b)", 7, 0);
236
237
238         # Case (c):
239         #  xtvec[] = { { 0, 100 }, {1000, 100} }
240         #  iovec[] = { { buf4, 40} }
241
242         # Fill buf4 with 8's...
243         fill_buf($cmdfh, $outfh, "buf4", 8, 200, 0);
244
245         # Initiize iovecs
246         set_iovec($cmdfh, $outfh, $iovbuf2, 0, "buf4", 40);
247
248         # Write out to $fh
249         $cmdstr = 'CALL writex $'."$fh $iovbuf2 1 ".'$xtvbuf '."2\n";
250         helper::send_cmd($cmdfh, $outfh, "writex", $cmdstr);
251         verify_result($cmdfh, $outfh, "writex (case c)", 40, "!=");
252
253         # Clear out the buffer
254         fill_buf($cmdfh, $outfh, "buf4", 0, 200, 0);
255
256         # Read it back
257         $cmdstr = 'CALL readx $'."$fh $iovbuf2 1 ".'$xtvbuf '."2\n";
258         helper::send_cmd($cmdfh, $outfh, "readx", $cmdstr);
259         verify_result($cmdfh, $outfh, "readx (case c)", 40, "!=");
260
261         # Make sure we got what we expected...
262         check_buf($cmdfh, $outfh, 40, "buf4", "readx (case c)", 8, 0);
263
264
265         # Case (d):
266         #  xtvec[] = { { 0, 100 }, {1000, 100} }
267         #  iovec[] = { { buf1, 40}, {buf2, 150}, {buf3, 200} }
268
269         # Fill each of the 3 buffers of.  They will be filled
270         # as follows:
271         #  buf1 -->    0- 39:  1
272         #       -->   39-200:  2
273         #  buf2 -->    0-150:  3
274         #       -->  150-200:  4
275         #  buf3 -->    0-  9:  5
276         #       -->   10-200:  6
277         fill_buf($cmdfh, $outfh, "buf1", 1, 40, 0);
278         fill_buf($cmdfh, $outfh, "buf1", 2, 160, 40);
279         fill_buf($cmdfh, $outfh, "buf2", 3, 150, 0);
280         fill_buf($cmdfh, $outfh, "buf2", 4, 50, 150);
281         fill_buf($cmdfh, $outfh, "buf3", 5, 10, 0);
282         fill_buf($cmdfh, $outfh, "buf3", 6, 190, 10);
283
284         # Initiize iovecs
285         set_iovec($cmdfh, $outfh, $iovbuf1, 0, "buf1", 40);
286         set_iovec($cmdfh, $outfh, $iovbuf1, 1, "buf2", 150);
287         set_iovec($cmdfh, $outfh, $iovbuf1, 2, "buf3", 200);
288
289         # Write out to $fh
290         $cmdstr = 'CALL writex $'."$fh $iovbuf1 3 ".'$xtvbuf '."2\n";
291         helper::send_cmd($cmdfh, $outfh, "writex", $cmdstr);
292         verify_result($cmdfh, $outfh, "writex (case d)", 200, "!=");
293
294         # Clear out the buffers
295         fill_buf($cmdfh, $outfh, "buf1", 0, 200, 0);
296         fill_buf($cmdfh, $outfh, "buf2", 0, 200, 0);
297         fill_buf($cmdfh, $outfh, "buf3", 0, 200, 0);
298
299         # Read it back
300         $cmdstr = 'CALL readx $'."$fh $iovbuf1 3 ".'$xtvbuf '."2\n";
301         helper::send_cmd($cmdfh, $outfh, "readx", $cmdstr);
302         verify_result($cmdfh, $outfh, "readx (case d)", 200, "!=");
303
304         # Make sure we got what we expected...
305         check_buf($cmdfh, $outfh, 40, "buf1", "readx (case d)", 1, 0);
306         check_buf($cmdfh, $outfh, 150, "buf2", "readx (case d)", 3, 0);
307         check_buf($cmdfh, $outfh, 10, "buf3", "readx (case d)", 5, 0);
308
309         # Case (e):
310   #  xtvec[] = { { 0, 100 }, {1000, 100} }
311   #  iovec[] = { { buf1, 30}, {buf2, 30}, {buf3, 30} }
312
313         # Fill each of the 3 buffers as follows:
314         # buf1 -->   0- 30: 1
315         #      -->  30-200: 2
316         # buf2 -->   0- 30: 3
317         #      -->  30-200: 4
318         # buf3 -->   0- 30: 5
319         #      -->  30-200: 6
320         fill_buf($cmdfh, $outfh, "buf1", 1, 30, 0);
321         fill_buf($cmdfh, $outfh, "buf1", 2, 170, 30);
322         fill_buf($cmdfh, $outfh, "buf2", 3, 30, 0);
323         fill_buf($cmdfh, $outfh, "buf2", 4, 170, 30);
324         fill_buf($cmdfh, $outfh, "buf3", 5, 30, 0);
325         fill_buf($cmdfh, $outfh, "buf3", 6, 170, 30);
326
327                 # Initiize iovecs
328         set_iovec($cmdfh, $outfh, $iovbuf1, 0, "buf1", 30);
329         set_iovec($cmdfh, $outfh, $iovbuf1, 1, "buf2", 30);
330         set_iovec($cmdfh, $outfh, $iovbuf1, 2, "buf3", 30);
331
332         # Write out to $fh
333         $cmdstr = 'CALL writex $'."$fh $iovbuf1 3 ".'$xtvbuf '."2\n";
334         helper::send_cmd($cmdfh, $outfh, "writex", $cmdstr);
335         verify_result($cmdfh, $outfh, "writex (case e)", 90, "!=");
336
337         # Clear out the buffers
338         fill_buf($cmdfh, $outfh, "buf1", 0, 200, 0);
339         fill_buf($cmdfh, $outfh, "buf2", 0, 200, 0);
340         fill_buf($cmdfh, $outfh, "buf3", 0, 200, 0);
341
342         # Read it back
343         $cmdstr = 'CALL readx $'."$fh $iovbuf1 3 ".'$xtvbuf '."2\n";
344         helper::send_cmd($cmdfh, $outfh, "readx", $cmdstr);
345         verify_result($cmdfh, $outfh, "readx (case e)", 90, "!=");
346
347         # Make sure we got what we expected...
348         check_buf($cmdfh, $outfh, 30, "buf1", "readx (case e)", 1, 0);
349         check_buf($cmdfh, $outfh, 30, "buf2", "readx (case e)", 3, 0);
350         check_buf($cmdfh, $outfh, 30, "buf3", "readx (case e)", 5, 0);
351         
352   # Case (f):
353   #  xtvec[] = { { 0, 100 }, {1000, 100} }
354   #  iovec[] = { { buf1, 30}, {buf2, 90}, {buf3, 200} }
355
356         # Fill each of the 3 buffers as follows:
357         # buf1 -->   0- 30: 1
358         #      -->  30-200: 2
359         # buf2 -->   0- 70: 3
360   #      -->  70- 90: 4
361         #      -->  90-200: 5
362         # buf3 -->   0-200: 6
363         fill_buf($cmdfh, $outfh, "buf1", 1, 30, 0);
364         fill_buf($cmdfh, $outfh, "buf1", 2, 170, 30);
365         fill_buf($cmdfh, $outfh, "buf2", 3, 70, 0);
366         fill_buf($cmdfh, $outfh, "buf2", 4, 90, 70);
367         fill_buf($cmdfh, $outfh, "buf2", 5, 110, 90);
368         fill_buf($cmdfh, $outfh, "buf3", 6, 200, 0);
369
370                 # Initiize iovecs
371         set_iovec($cmdfh, $outfh, $iovbuf1, 0, "buf1", 30);
372         set_iovec($cmdfh, $outfh, $iovbuf1, 1, "buf2", 90);
373         set_iovec($cmdfh, $outfh, $iovbuf1, 2, "buf3", 200);
374
375         # Write out to $fh
376         $cmdstr = 'CALL writex $'."$fh $iovbuf1 3 ".'$xtvbuf '."2\n";
377         helper::send_cmd($cmdfh, $outfh, "writex", $cmdstr);
378         verify_result($cmdfh, $outfh, "writex (case f)", 200, "!=");
379
380         # Clear out the buffers
381         fill_buf($cmdfh, $outfh, "buf1", 0, 200, 0);
382         fill_buf($cmdfh, $outfh, "buf2", 0, 200, 0);
383         fill_buf($cmdfh, $outfh, "buf3", 0, 200, 0);
384
385         # Read it back
386         $cmdstr = 'CALL readx $'."$fh $iovbuf1 3 ".'$xtvbuf '."2\n";
387         helper::send_cmd($cmdfh, $outfh, "readx", $cmdstr);
388         verify_result($cmdfh, $outfh, "readx (case f)", 200, "!=");
389
390         # Make sure we got what we expected...
391         check_buf($cmdfh, $outfh, 30, "buf1", "readx (case f)", 1, 0);
392         check_buf($cmdfh, $outfh, 70, "buf2", "readx (case f)", 3, 0);
393         check_buf($cmdfh, $outfh, 20, "buf2", "readx (case f)", 4, 70);
394         check_buf($cmdfh, $outfh, 70, "buf3", "readx (case f)", 6, 0);
395         
396 }
397
398
399 sub process_cmd
400 {
401   my ($file, $is_alpha) = @_;
402   
403   # Get tests directory
404   my $testdir = $FindBin::Bin;
405
406   eval {
407       if ($is_alpha == 0) {
408                                         open2(\*OUTFILE, \*CMDFILE, "$testdir/test_driver --np");
409       } else {
410                                         open2(\*OUTFILE, \*CMDFILE, 
411                                                                 "yod -quiet -sz 1 $testdir/test_driver --np");
412       }
413   };
414
415   if ($@) {
416     if ($@ =~ /^open2/) {
417       warn "open2 failed: $!\n$@\n";
418       return;
419     }
420     die;
421
422   }
423
424   my $outfh = \*OUTFILE;
425   my $cmdfh = \*CMDFILE;
426
427   if ($is_alpha == 0) {
428     helper::send_cmd($cmdfh, $outfh, "init", "CALL init\n");
429   }
430   
431   # Open file
432   my $cmdstr = '$fd = CALL open '."$file O_RDWR|O_CREAT|O_TRUNC S_IRWXU\n";
433   helper::send_cmd($cmdfh, $outfh, "open", $cmdstr);
434         helper::verify_cmd($cmdfh, $outfh, $cmdstr);
435
436    
437         do_rwcalls($cmdfh, $outfh, "fd");
438
439   # Clean up
440   $cmdstr = 'CALL close $fd'."\n";
441   helper::send_cmd($cmdfh, $outfh, "close", $cmdstr);
442
443 #       system("rm -f $file");
444   helper::print_and_exit($cmdfh, $outfh, 0, "strided IO test successful\n");
445 }
446
447 my $currarg = 0;
448 my $is_alpha = 0;
449
450 if (@ARGV < 1) {
451   usage;
452 } elsif (@ARGV > 1 ) {
453   if ($ARGV[$currarg++] eq "-alpha") {
454     $is_alpha = 1;
455   }
456 }
457
458 my $file = $ARGV[$currarg];
459
460 process_cmd($file, $is_alpha);
461
462 exit 0;