SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

001 /* Copyright (C) 2005,2006 David Decotigny
002 
003    This program is free software; you can redistribute it and/or
004    modify it under the terms of the GNU General Public License
005    as published by the Free Software Foundation; either version 2
006    of the License, or (at your option) any later version.
007    
008    This program is distributed in the hope that it will be useful,
009    but WITHOUT ANY WARRANTY; without even the implied warranty of
010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
011    GNU General Public License for more details.
012    
013    You should have received a copy of the GNU General Public License
014    along with this program; if not, write to the Free Software
015    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
016    USA. 
017 */
018 
019 #include <crt.h>
020 #include <libc.h>
021 #include <stdarg.h>
022 #include <string.h>
023 #include <debug.h>
024 #include <drivers/devices.h>
025 
026 #include "fstest_utils.h"
027 
028 /**
029  * @file blktest.c
030  *
031  * Block devices tests
032  */
033 static int test_device(char const* path, char magic)
034 {
035   char wrbuff[32767];
036   char rdbuff[32767];
037   int fd, fdcheck, i;
038   char * mem;
039 
040   fd = open(path, O_RDWR);
041   if (fd < 0)
042     {
043       bochs_printf("Cannot open %s: error %d\n", path, fd);
044       return -1;
045     }
046   
047   bochs_printf("Testing %s...\n", path);
048 
049   /* Basic seek tests */
050   TEST_EXPECT_CONDITION(lseek(fd, 2*512, SEEK_SET), RETVAL == 2*512);
051   TEST_EXPECT_CONDITION(write(fd, wrbuff, 1), RETVAL == 1);
052   TEST_EXPECT_CONDITION(lseek(fd, 4*512, SEEK_SET), RETVAL == 4*512);
053   TEST_EXPECT_CONDITION(read(fd, rdbuff, 1), RETVAL == 1);
054 
055   /* Prepare to write a large chunk */
056   for (i = 0 ; i < sizeof(wrbuff) ; i ++)
057     wrbuff[i] = magic + i;
058   memset(rdbuff, 0xaa, sizeof(wrbuff));
059   TEST_EXPECT_CONDITION(lseek(fd, 3*512 + 43, SEEK_SET), RETVAL == 3*512 + 43);
060   TEST_EXPECT_CONDITION(write(fd, wrbuff, sizeof(wrbuff)),
061                         RETVAL == sizeof(wrbuff));
062   TEST_EXPECT_CONDITION(write(fd, rdbuff, sizeof(rdbuff)),
063                         RETVAL == sizeof(rdbuff));
064 
065   memset(rdbuff, 0xbb, sizeof(rdbuff));
066   TEST_EXPECT_CONDITION(lseek(fd, 3*512 + 47, SEEK_SET), RETVAL == 3*512 + 47);
067   TEST_EXPECT_CONDITION(read(fd, rdbuff, sizeof(wrbuff)),
068                         RETVAL == sizeof(wrbuff));
069   TEST_EXPECT_CONDITION(memcmp(rdbuff, wrbuff+4, sizeof(wrbuff)-4),
070                         RETVAL == 0);
071 
072   fdcheck = open(path, O_RDONLY);
073 
074 #define MAPOFFS (50*4096)
075 
076   /* Test mmap private mappings */
077   TEST_EXPECT_CONDITION(mem = mmap(NULL, sizeof(wrbuff), PROT_READ,
078                                    MAP_PRIVATE, fd, MAPOFFS + 3),
079                         (void*)RETVAL == NULL);
080   TEST_EXPECT_CONDITION(mem = mmap(NULL, sizeof(wrbuff),
081                                    PROT_READ | PROT_WRITE, MAP_PRIVATE,
082                                    fd, MAPOFFS),
083                         (void*)RETVAL != NULL);
084 
085   for (i = 0 ; i < sizeof(wrbuff) ; i ++)
086     wrbuff[i] = magic + i;
087   TEST_EXPECT_CONDITION(1, 1); /* Print a debug line */
088 
089   memset(rdbuff, 0xaa, sizeof(wrbuff));
090   TEST_EXPECT_CONDITION(lseek(fd, MAPOFFS, SEEK_SET), RETVAL == MAPOFFS);
091   TEST_EXPECT_CONDITION(write(fd, wrbuff, sizeof(wrbuff)),
092                         RETVAL == sizeof(wrbuff));
093   TEST_EXPECT_CONDITION(memcmp(wrbuff, mem, sizeof(wrbuff)),
094                         RETVAL == 0);
095 
096   for (i = 0 ; i < sizeof(wrbuff) ; i ++)
097     mem[i] = wrbuff[i]*i;
098   TEST_EXPECT_CONDITION(1, 1); /* Print a debug line */
099 
100   memset(rdbuff, 0xaa, sizeof(rdbuff));
101   TEST_EXPECT_CONDITION(lseek(fdcheck, MAPOFFS, SEEK_SET), RETVAL == MAPOFFS);
102   TEST_EXPECT_CONDITION(read(fdcheck, rdbuff, sizeof(wrbuff)),
103                         RETVAL == sizeof(wrbuff));
104   TEST_EXPECT_CONDITION(memcmp(wrbuff, rdbuff, sizeof(wrbuff)), RETVAL == 0);
105 
106   TEST_EXPECT_CONDITION(msync(mem, sizeof(wrbuff), MS_SYNC), RETVAL == 0);
107   TEST_EXPECT_CONDITION(munmap(mem, sizeof(wrbuff)), RETVAL == 0);
108 
109   /* Test mmap shared mappings */
110   TEST_EXPECT_CONDITION(mem = mmap(mem, sizeof(wrbuff), PROT_READ,
111                                    MAP_SHARED, fd, MAPOFFS + 3),
112                         (void*)RETVAL == NULL);
113   TEST_EXPECT_CONDITION(mem = mmap(mem, sizeof(wrbuff),
114                                    PROT_READ | PROT_WRITE, MAP_SHARED,
115                                    fd, MAPOFFS),
116                         (void*)RETVAL != NULL);
117   for (i = 0 ; i < sizeof(wrbuff) ; i ++)
118     wrbuff[i] = magic + i;
119   memset(rdbuff, 0xaa, sizeof(rdbuff));
120   TEST_EXPECT_CONDITION(lseek(fd, MAPOFFS, SEEK_SET), RETVAL == MAPOFFS);
121   TEST_EXPECT_CONDITION(write(fd, wrbuff, sizeof(wrbuff)),
122                         RETVAL == sizeof(wrbuff));
123   TEST_EXPECT_CONDITION(memcmp(wrbuff, mem, sizeof(wrbuff)), RETVAL == 0);
124 
125   for (i = 0 ; i < sizeof(wrbuff) ; i ++)
126     mem[i] = wrbuff[i]*i;
127   memset(rdbuff, 0xaa, sizeof(rdbuff));
128   TEST_EXPECT_CONDITION(lseek(fdcheck, MAPOFFS, SEEK_SET), RETVAL == MAPOFFS);
129   TEST_EXPECT_CONDITION(read(fdcheck, rdbuff, sizeof(wrbuff)),
130                         RETVAL == sizeof(wrbuff));
131   TEST_EXPECT_CONDITION(memcmp(wrbuff, rdbuff, sizeof(wrbuff)), RETVAL != 0);
132   TEST_EXPECT_CONDITION(memcmp(mem, rdbuff, sizeof(wrbuff)), RETVAL == 0);
133 
134   TEST_EXPECT_CONDITION(msync(mem, sizeof(wrbuff), MS_SYNC), RETVAL == 0);
135   TEST_EXPECT_CONDITION(munmap(mem, sizeof(wrbuff)), RETVAL == 0);
136 
137 #define STARTOFFS (3*512 + 43 + sizeof(wrbuff) + sizeof(rdbuff))
138 
139   TEST_EXPECT_CONDITION(lseek(fd, STARTOFFS, SEEK_SET), RETVAL == STARTOFFS);
140   TEST_EXPECT_CONDITION(lseek(fdcheck, STARTOFFS, SEEK_SET),
141                         RETVAL == STARTOFFS);
142   int wrlen = 0;
143   while (1)
144     {
145       int sz;
146       for (i = 0 ; i < sizeof(wrbuff) ; i ++)
147         wrbuff[i] = magic*magic*i + wrlen*wrlen + i;
148 
149       TEST_EXPECT_CONDITION(sz = write(fd, wrbuff, sizeof(wrbuff)),
150                             (RETVAL >= 0) && (RETVAL <= sizeof(wrbuff)));
151       if (sz <= 0)
152         break;
153       wrlen += sz;
154 
155       memset(rdbuff, 0xcc, sizeof(wrbuff));
156       TEST_EXPECT_CONDITION(read(fdcheck, rdbuff, sizeof(wrbuff)), RETVAL == sz);
157       TEST_EXPECT_CONDITION(memcmp(rdbuff, wrbuff, sz), RETVAL == 0);
158     }
159 
160   /* Check the data was correctly written */
161   TEST_EXPECT_CONDITION(lseek(fd, STARTOFFS, SEEK_SET), RETVAL == STARTOFFS);
162   int rdlen = 0;
163   while (1)
164     {
165       int sz;
166       for (i = 0 ; i < sizeof(wrbuff) ; i ++)
167         wrbuff[i] = magic*magic*i + rdlen*rdlen + i;
168 
169       memset(rdbuff, 0xdd, sizeof(wrbuff));
170       TEST_EXPECT_CONDITION(sz = read(fd, rdbuff, sizeof(wrbuff)),
171                             (RETVAL >= 0) && (RETVAL <= sizeof(wrbuff)));
172       if (sz <= 0)
173         break;
174       rdlen += sz;
175       TEST_EXPECT_CONDITION(memcmp(rdbuff, wrbuff, sz), RETVAL == 0);
176     }
177   TEST_EXPECT_CONDITION(rdlen, wrlen == rdlen);
178 
179   bochs_printf("Synching %s...\n", path);
180   ioctl(fd, SOS_IOCTL_BLOCKDEV_SYNC, 0);
181 
182   close(fd);
183   bochs_printf("End of test for %s.\n", path);
184 
185   return 0;
186 }
187 
188 
189 int main(void)
190 {
191   int i;
192   bochs_printf("Hi from blktest\n");
193 
194   /* Test partitions access */
195   for (i = 1 ; i <= 15 ; i ++)
196     {
197       char path[64];
198       snprintf(path, sizeof(path), "/dev/hda%d", i);
199       if (fork() == 0)
200         {
201           test_device(path, i);
202           return 0;
203         }
204     }
205 
206   bochs_printf("Bye from blktest\n");
207   return 0;
208 }

source navigation ] diff markup ] identifier search ] general search ]