Whamcloud - gitweb
Supplied changelog for resize inode patch.
[tools/e2fsprogs.git] / lib / ext2fs / tst_badblocks.c
1 /*
2  * This testing program makes sure the badblocks implementation works.
3  *
4  * Copyright (C) 1996 by Theodore Ts'o.
5  * 
6  * %Begin-Header%
7  * This file may be redistributed under the terms of the GNU Public
8  * License.
9  * %End-Header%
10  */
11
12 #include <stdio.h>
13 #include <string.h>
14 #if HAVE_UNISTD_H
15 #include <unistd.h>
16 #endif
17 #include <fcntl.h>
18 #include <time.h>
19 #include <sys/stat.h>
20 #include <sys/types.h>
21 #if HAVE_ERRNO_H
22 #include <errno.h>
23 #endif
24
25 #include "ext2_fs.h"
26 #include "ext2fs.h"
27
28 #define ADD_BLK 0x0001
29 #define DEL_BLK 0x0002
30
31 blk_t test1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0 };
32 blk_t test2[] = { 11, 10, 9, 8, 7, 6, 5, 4, 3, 3, 2, 1 };
33 blk_t test3[] = { 3, 1, 4, 5, 9, 2, 7, 10, 5, 6, 10, 8, 0 };
34 blk_t test4[] = { 20, 50, 12, 17, 13, 2, 66, 23, 56, 0 };
35 blk_t test4a[] = {
36         20, 1,
37         50, 1,
38         3, 0,
39         17, 1,
40         18, 0,
41         16, 0,
42         11, 0,
43         12, 1,
44         13, 1,
45         14, 0, 
46         80, 0,
47         45, 0,
48         66, 1,
49         0 };
50 blk_t test5[] = { 31, 20, 17, 51, 23, 1, 56, 57, 0 };
51 blk_t test5a[] = {
52         50, ADD_BLK,
53         51, DEL_BLK,
54         57, DEL_BLK,
55         66, ADD_BLK,
56         31, DEL_BLK,
57         12, ADD_BLK,
58         2, ADD_BLK,
59         13, ADD_BLK,
60         1, DEL_BLK,
61         0
62         };
63                 
64
65 static int test_fail = 0;
66
67 static errcode_t create_test_list(blk_t *vec, badblocks_list *ret)
68 {
69         errcode_t       retval;
70         badblocks_list  bb;
71         int             i;
72         
73         retval = ext2fs_badblocks_list_create(&bb, 5);
74         if (retval) {
75                 com_err("create_test_list", retval, "while creating list");
76                 return retval;
77         }
78         for (i=0; vec[i]; i++) {
79                 retval = ext2fs_badblocks_list_add(bb, vec[i]);
80                 if (retval) {
81                         com_err("create_test_list", retval,
82                                 "while adding test vector %d", i);
83                         ext2fs_badblocks_list_free(bb);
84                         return retval;
85                 }
86         }
87         *ret = bb;
88         return 0;
89 }
90
91 static void print_list(badblocks_list bb, int verify)
92 {
93         errcode_t       retval;
94         badblocks_iterate       iter;
95         blk_t                   blk;
96         int                     i, ok;
97         
98         retval = ext2fs_badblocks_list_iterate_begin(bb, &iter);
99         if (retval) {
100                 com_err("print_list", retval, "while setting up iterator");
101                 return;
102         }
103         ok = i = 1;
104         while (ext2fs_badblocks_list_iterate(iter, &blk)) {
105                 printf("%d ", blk);
106                 if (i++ != blk)
107                         ok = 0;
108         }
109         ext2fs_badblocks_list_iterate_end(iter);
110         if (verify) {
111                 if (ok)
112                         printf("--- OK");
113                 else {
114                         printf("--- NOT OK");
115                         test_fail++;
116                 }
117         }
118 }
119
120 static void validate_test_seq(badblocks_list bb, blk_t *vec)
121 {
122         int     i, match, ok;
123
124         for (i = 0; vec[i]; i += 2) {
125                 match = ext2fs_badblocks_list_test(bb, vec[i]);
126                 if (match == vec[i+1])
127                         ok = 1;
128                 else {
129                         ok = 0;
130                         test_fail++;
131                 }
132                 printf("\tblock %d is %s --- %s\n", vec[i],
133                        match ? "present" : "absent",
134                        ok ? "OK" : "NOT OK");
135         }
136 }
137
138 static void do_test_seq(badblocks_list bb, blk_t *vec)
139 {
140         int     i, match;
141
142         for (i = 0; vec[i]; i += 2) {
143                 switch (vec[i+1]) {
144                 case ADD_BLK:
145                         ext2fs_badblocks_list_add(bb, vec[i]);
146                         match = ext2fs_badblocks_list_test(bb, vec[i]);
147                         printf("Adding block %d --- now %s\n", vec[i], 
148                                match ? "present" : "absent");
149                         if (!match) {
150                                 printf("FAILURE!\n");
151                                 test_fail++;
152                         }
153                         break;
154                 case DEL_BLK:
155                         ext2fs_badblocks_list_del(bb, vec[i]);
156                         match = ext2fs_badblocks_list_test(bb, vec[i]);
157                         printf("Removing block %d --- now %s\n", vec[i], 
158                                ext2fs_badblocks_list_test(bb, vec[i]) ? 
159                                "present" : "absent");
160                         if (match) {
161                                 printf("FAILURE!\n");
162                                 test_fail++;
163                         }
164                         break;
165                 }
166         }
167 }
168
169
170 int file_test(badblocks_list bb)
171 {
172         badblocks_list new_bb = 0;
173         errcode_t       retval;
174         FILE    *f;
175
176         f = tmpfile();
177         if (!f) {
178                 fprintf(stderr, "Error opening temp file: %s\n",
179                         error_message(errno));
180                 return 1;
181         }
182         retval = ext2fs_write_bb_FILE(bb, 0, f);
183         if (retval) {
184                 com_err("file_test", retval, "while writing bad blocks");
185                 return 1;
186         }
187
188         rewind(f);
189         retval = ext2fs_read_bb_FILE2(0, f, &new_bb, 0, 0);
190         if (retval) {
191                 com_err("file_test", retval, "while reading bad blocks");
192                 return 1;
193         }
194         fclose(f);
195
196         if (ext2fs_badblocks_equal(bb, new_bb)) {
197                 printf("Block bitmap matched after reading and writing.\n");
198         } else {
199                 printf("Block bitmap NOT matched.\n");
200                 test_fail++;
201         }
202         return 0;
203 }
204
205
206 int main(int argc, char **argv)
207 {
208         badblocks_list bb1, bb2, bb3, bb4, bb5;
209         int     equal;
210         errcode_t       retval;
211
212         bb1 = bb2 = bb3 = bb4 = bb5 = 0;
213
214         printf("test1: ");
215         retval = create_test_list(test1, &bb1);
216         if (retval == 0)
217                 print_list(bb1, 1);
218         printf("\n");
219         
220         printf("test2: ");
221         retval = create_test_list(test2, &bb2);
222         if (retval == 0)
223                 print_list(bb2, 1);
224         printf("\n");
225
226         printf("test3: ");
227         retval = create_test_list(test3, &bb3);
228         if (retval == 0)
229                 print_list(bb3, 1);
230         printf("\n");
231         
232         printf("test4: ");
233         retval = create_test_list(test4, &bb4);
234         if (retval == 0) {
235                 print_list(bb4, 0);
236                 printf("\n");
237                 validate_test_seq(bb4, test4a);
238         }
239         printf("\n");
240
241         printf("test5: ");
242         retval = create_test_list(test5, &bb5);
243         if (retval == 0) {
244                 print_list(bb5, 0);
245                 printf("\n");
246                 do_test_seq(bb5, test5a);
247                 printf("After test5 sequence: ");
248                 print_list(bb5, 0);
249                 printf("\n");
250         }
251         printf("\n");
252
253         if (bb1 && bb2 && bb3 && bb4 && bb5) {
254                 printf("Comparison tests:\n");
255                 equal = ext2fs_badblocks_equal(bb1, bb2);
256                 printf("bb1 and bb2 are %sequal.\n", equal ? "" : "NOT "); 
257                 if (equal)
258                         test_fail++;
259
260                 equal = ext2fs_badblocks_equal(bb1, bb3);
261                 printf("bb1 and bb3 are %sequal.\n", equal ? "" : "NOT "); 
262                 if (!equal)
263                         test_fail++;
264                 
265                 equal = ext2fs_badblocks_equal(bb1, bb4);
266                 printf("bb1 and bb4 are %sequal.\n", equal ? "" : "NOT "); 
267                 if (equal)
268                         test_fail++;
269
270                 equal = ext2fs_badblocks_equal(bb4, bb5);
271                 printf("bb4 and bb5 are %sequal.\n", equal ? "" : "NOT "); 
272                 if (!equal)
273                         test_fail++;
274                 printf("\n");
275         }
276         
277         file_test(bb4);
278         
279         if (test_fail == 0)
280                 printf("ext2fs library badblocks tests checks out OK!\n");
281
282         if (bb1)
283                 ext2fs_badblocks_list_free(bb1);
284         if (bb2)
285                 ext2fs_badblocks_list_free(bb2);
286         if (bb3)
287                 ext2fs_badblocks_list_free(bb3);
288         if (bb4)
289                 ext2fs_badblocks_list_free(bb4);
290
291         return test_fail;
292
293 }