source: rtems/cpukit/libfs/src/rfs/rtems-rfs-bitmaps-ut.c @ 26cf027

4.10
Last change on this file since 26cf027 was 26cf027, checked in by Ralf Corsepius <ralf.corsepius@…>, on 06/17/10 at 02:48:50

2010-06-17 Ralf Corsépius <ralf.corsepius@…>

  • libfs/src/rfs/rtems-rfs-bitmaps-ut.c: Various 64bit fixes.
  • Property mode set to 100644
File size: 13.6 KB
Line 
1/*
2 *  COPYRIGHT (c) 2010 Chris Johns <chrisj@rtems.org>
3 *
4 *  The license and distribution terms for this file may be
5 *  found in the file LICENSE in this distribution or at
6 *  http://www.rtems.com/license/LICENSE.
7 *
8 *  $Id$
9 */
10/**
11 * @file
12 *
13 * @ingroup rtems-rfs
14 *
15 * RTEMS File Systems Bitmap Unit Test..
16 *
17 * This is a unit test module for the bit map functions.
18 */
19
20#if HAVE_CONFIG_H
21#include "config.h"
22#endif
23
24#include <stdio.h>
25#include <stdlib.h>
26#include <inttypes.h>
27
28#include <rtems/rfs/rtems-rfs-bitmaps.h>
29#include <rtems/rfs/rtems-rfs-file-system.h>
30
31#define rtems_rfs_exit_on_error(_rc, _r, _c, _b)                         \
32  if ((_rc > 0) || _r) { free (_b); rtems_rfs_bitmap_close (_c); return; }
33
34static bool
35rtems_rfs_bitmap_ut_test_range (rtems_rfs_bitmap_control* control,
36                                int                       test,
37                                bool                      set,
38                                rtems_rfs_bitmap_bit      bit,
39                                size_t                    size)
40{
41  unsigned int count;
42  bool         result;
43  for (count = 0; count < size; count++)
44  {
45    int rc = rtems_rfs_bitmap_map_test (control, bit + count, &result);
46    if (rc > 0)
47    {
48      printf (" %2d. Test bit %" PRId32 " in range (%" PRId32 ",%ld] is %s: ",
49            test, bit + count, bit, bit + size - 1, !set ? "set" : "clear");
50      printf ("FAIL (%s)\n", strerror (rc));
51      return false;
52    }
53    if (!set)
54      result = !result;
55    if (!result)
56    {
57      printf (" %2d. Test bit %" PRId32 " in range (%" PRId32 ",%ld] is %s: ",
58              test, bit + count, bit, bit + size - 1, !set ? "set" : "clear");
59      printf (" %s\n", !result ? "pass" : "FAIL");
60      return false;
61    }
62  }
63 
64  printf (" %2d. Test bit range (%" PRId32 ",%ld] all %s: pass\n",
65          test, bit, bit + size - 1, set ? "set" : "clear");
66
67  return true;
68}
69
70static bool
71rtems_rfs_bitmap_ut_alloc_seq_test (rtems_rfs_bitmap_control* control,
72                                    int                       test,
73                                    rtems_rfs_bitmap_bit      bit,
74                                    size_t                    size)
75{
76  bool state;
77  int  i;
78  int  rc;
79 
80  printf (" %2d. Set all bits\n", test);
81  rc = rtems_rfs_bitmap_map_set_all (control);
82  if (rc > 0)
83  {
84    printf (" %2d. set all bits: FAIL (%s)\n", test, strerror (rc));
85    return false;
86  }
87 
88  for (i = 0; i < size; i++)
89    rtems_rfs_bitmap_map_clear (control, bit + i);
90 
91  printf (" %2d. Cleared bits (%" PRId32 ", %ld] (%zd)\n",
92          test, bit, bit + size - 1, size);
93 
94  for (i = 0; i < rtems_rfs_bitmap_element_bits (); i++)
95  {
96    rc = rtems_rfs_bitmap_map_test (control, bit + i, &state);
97    if (rc > 0)
98    {
99      printf (" %2d. test bit: FAIL (%s)\n", test, strerror (rc));
100      return false;
101    }
102    if (state)
103    {
104      printf (" %2d. Cleared bit still set: bit = %" PRId32 "\n", test, bit + i);
105      return false;
106    }
107  }
108 
109  for (i = 0, bit = 0; i < size; i++)
110  {
111    rtems_rfs_bitmap_bit seed = bit;
112    bool                 result;
113    int                  rc;
114    rc = rtems_rfs_bitmap_map_alloc (control, seed, &result, &bit);
115    if (rc > 0)
116    {
117      printf (" %2d. map all: FAIL (%s)\n", test, strerror (rc));
118      return false;
119    }
120    if (!result)
121    {
122      printf (" %2d. Find bit with seed = %" PRId32 ": %s: bit = %" PRId32 "\n",
123              test, seed, result ? "pass" : "FAIL", bit);
124      return false;
125    }
126  }
127
128  printf (" %2d. Alloc'ed all bits (%" PRId32 ", %ld] (%zd)\n",
129          test, bit, bit + size - 1, size);
130 
131  return true;
132}
133
134static void
135rtems_rfs_bitmap_ut_test_bitmap (size_t size)
136{
137  rtems_rfs_file_system    fs;
138  rtems_rfs_bitmap_control control;
139  rtems_rfs_buffer_handle  handle;
140  rtems_rfs_buffer         buffer;
141  rtems_rfs_bitmap_bit     bit = 0;
142  rtems_rfs_bitmap_bit     first_bit;
143  rtems_rfs_bitmap_bit     last_bit;
144  bool                     result;
145  size_t                   bytes;
146  size_t                   clear;
147  int                      rc;
148
149  bytes = (rtems_rfs_bitmap_elements (size) *
150           sizeof (rtems_rfs_bitmap_element));
151
152  memset (&fs, 0, sizeof (fs));
153  memset (&buffer, 0, sizeof (buffer));
154 
155  buffer.buffer = malloc (bytes);
156  buffer.block = 1;
157
158  if (!buffer.buffer)
159  {
160    printf (" Cannot allocate bitmap memory\n");
161    return;
162  }
163
164#if RTEMS_RFS_BITMAP_CLEAR_ZERO
165  memset (buffer.buffer, 0, bytes);
166#else
167  memset (buffer.buffer, 0xff, bytes);
168#endif
169 
170  /*
171   * Do not close the handle so no writes need occur.
172   */
173  rc = rtems_rfs_buffer_handle_open (&fs, &handle);
174  if (rc > 0)
175  {
176    printf (" Cannot open the handle: %d: %s\n", rc, strerror (rc));
177    free (buffer.buffer);
178    return;
179  }
180
181  handle.buffer = &buffer;
182  handle.bnum = 1;
183 
184  printf ("\nRFS Bitmap Test : size = %zd (%zd)\n",
185          size, rtems_rfs_bitmap_elements (size));
186  rc = rtems_rfs_bitmap_open (&control, &fs, &handle, size, 1);
187  if (rc > 0)
188  {
189    printf (" Cannot open the bitmap: %s\n", strerror (rc));
190    free (buffer.buffer);
191    return;
192  }
193
194  /*
195   * This is a new bitmap with no bits set. Try and find a bit with a few
196   * seeds.
197   */
198  rc = rtems_rfs_bitmap_map_alloc (&control, size * 2, &result, &bit);
199  printf ("  1. Find bit with seed > size: %s (%s)\n",
200          result ? "FAIL" : "pass", strerror (rc));
201  rtems_rfs_exit_on_error (rc, result, &control, buffer.buffer);
202 
203  rc = rtems_rfs_bitmap_map_alloc (&control, size, &result, &bit);
204  printf ("  2. Find bit with seed = size: %s (%s)\n",
205          result ? "FAIL" : "pass", strerror (rc));
206  rtems_rfs_exit_on_error (rc, result, &control, buffer.buffer);
207
208  rc = rtems_rfs_bitmap_map_alloc (&control, 0, &result, &bit);
209  result = result && (bit == 0);
210  printf ("  3. Find bit 0 with seed = 0: %s (%s): bit = %" PRId32 "\n",
211          result ? "pass" : "FAIL", strerror (rc),  bit);
212  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
213 
214  rc = rtems_rfs_bitmap_map_alloc (&control, size - 1, &result, &bit);
215  result = result && (bit == (size - 1));
216  printf ("  4. Find bit (size - 1) with seed = (size - 1) (%zd): %s (%s): bit = %" PRId32 "\n",
217          size - 1, result ? "pass" : "FAIL", strerror (rc), bit);
218  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
219
220 
221  /*
222   * Test the bits allocated to make sure they are set.
223   */
224
225  rc = rtems_rfs_bitmap_map_test (&control, 0, &result);
226  printf ("  5. Test bit 0: %s (%s)\n",
227          result ? "pass" : "FAIL", strerror (rc));
228  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
229 
230  rc = rtems_rfs_bitmap_map_test (&control, size - 1, &result);
231  printf ("  6. Test bit (size - 1) (%zd): %s (%s)\n",
232          size - 1, result ? "pass" : "FAIL", strerror (rc));
233  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
234 
235  if (!rtems_rfs_bitmap_ut_test_range (&control, 7, false, 1, size - 2))
236    rtems_rfs_exit_on_error (0, !result, &control, buffer.buffer);
237
238  /*
239   * Set all bits then clear one and find it.
240   */
241  rc = rtems_rfs_bitmap_map_set_all (&control);
242  printf ("  8. Set all bits: %s (%s)\n",
243          rc == 0 ? "PASS" : "FAIL", strerror (rc));
244  rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
245
246  bit = rand () % size;
247 
248  rc = rtems_rfs_bitmap_map_clear (&control, bit);
249  printf ("  9. Clear bit %" PRId32 ": %s (%s)\n",
250          bit, rc == 0 ? "PASS" : "FAIL", strerror (rc));
251  rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
252
253  last_bit = bit;
254  rc = rtems_rfs_bitmap_map_alloc (&control, 0, &result, &bit);
255  result = result && (bit == last_bit);
256  printf (" 10. Find bit with seed = 0: %s (%s): bit = %" PRId32 "\n",
257          result ? "pass" : "FAIL", strerror (rc), bit);
258  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
259 
260  rc = rtems_rfs_bitmap_map_alloc (&control, 0, &result, &bit);
261  result = !result || (bit != last_bit);
262  printf (" 11. Fail to find bit with seed = 0: %s (%s): bit = %" PRId32 "\n",
263          result ? "pass" : "FAIL", strerror (rc), bit);
264  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
265 
266  rc = rtems_rfs_bitmap_map_clear (&control, 0);
267  printf (" 12. Clear bit 0: %s (%s)\n",
268          rc == 0 ? "pass" : "FAIL", strerror (rc));
269  rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
270 
271  rc = rtems_rfs_bitmap_map_alloc (&control, size - 1, &result, &bit);
272  result = result && (bit == 0);
273  printf (" 13. Find bit with seed = (size - 1): %s (%s): bit = %" PRId32 "\n",
274          result ? "pass" : "FAIL", strerror (rc), bit);
275  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
276
277  rc = rtems_rfs_bitmap_map_clear (&control, size - 1);
278  printf (" 14. Clear bit (size - 1) (%zd): %s (%s)\n",
279          size - 1, rc == 0 ? "pass" : "FAIL", strerror (rc));
280  rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
281
282  rc = rtems_rfs_bitmap_map_alloc (&control, 0, &result, &bit);
283  result = result && (bit == (size - 1));
284  printf (" 15. Find bit with seed = 0: %s (%s): bit = %" PRId32 "\n",
285          result ? "pass" : "FAIL", strerror (rc), bit);
286  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
287
288  rc = rtems_rfs_bitmap_map_clear (&control, 0);
289  printf (" 16. Clear bit 0: %s (%s)\n",
290          rc == 0 ? "pass" : "FAIL", strerror (rc));
291 
292  rc = rtems_rfs_bitmap_map_alloc (&control, size / 2, &result, &bit);
293  result = result && (bit == 0);
294  printf (" 17. Find bit with seed = (size / 2) (%zd): %s (%s): bit = %" PRId32 "\n",
295          size / 2, result ? "pass" : "FAIL", strerror (rc), bit);
296  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
297
298  rc = rtems_rfs_bitmap_map_clear (&control, size - 1);
299  printf (" 18. Clear bit (size - 1) (%zd): %s, (%s)\n",
300          size - 1, rc == 0 ? "pass" : "FAIL", strerror (rc));
301  rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
302 
303  rc = rtems_rfs_bitmap_map_alloc (&control, size / 2, &result, &bit);
304  result = result && (bit == (size - 1));
305  printf (" 19. Find bit with seed = (size / 2) (%zd): %s (%s): bit = %" PRId32 "\n",
306          size / 2, result ? "pass" : "FAIL", strerror (rc), bit);
307  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
308
309  rc = rtems_rfs_bitmap_map_clear (&control, 0);
310  printf (" 20. Clear bit 0: %s (%s)\n",
311          rc == 0 ? "pass" : "FAIL", strerror (rc));
312 
313  rc = rtems_rfs_bitmap_map_alloc (&control, (size / 2) - 1, &result, &bit);
314  result = result && (bit == 0);
315  printf (" 21. Find bit with seed = ((size / 2) - 1) (%zd): %s (%s): bit = %" PRId32 "\n",
316          (size / 2) - 1, result ? "pass" : "FAIL", strerror (rc), bit);
317  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
318
319  rc = rtems_rfs_bitmap_map_clear (&control, size - 1);
320  printf (" 22. Clear bit (size - 1) (%zd): %s (%s)\n",
321          size - 1, rc == 0 ? "pass" : "FAIL", strerror (rc));
322 
323  rc = rtems_rfs_bitmap_map_alloc (&control, (size / 2) - 1, &result, &bit);
324  result = result && (bit == (size - 1));
325  printf (" 23. Find bit with seed = ((size / 2) - 1) (%zd): %s (%s): bit = %" PRId32 "\n",
326          (size / 2) - 1, result ? "pass" : "FAIL", strerror (rc), bit);
327  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
328
329  bit = rand () % (size / 2) + rtems_rfs_bitmap_element_bits ();
330  result = rtems_rfs_bitmap_ut_alloc_seq_test (&control, 23, bit,
331                                               rtems_rfs_bitmap_element_bits ());
332  rtems_rfs_exit_on_error (0, !result, &control, buffer.buffer);
333 
334  bit = rand () % (size / 2) + rtems_rfs_bitmap_element_bits ();
335  result = rtems_rfs_bitmap_ut_alloc_seq_test (&control, 24, bit, 57);
336  rtems_rfs_exit_on_error (0, !result, &control, buffer.buffer);
337
338  /*
339   * Set all bits, clear a random numberone then create a search map and make
340   * sure the clear count is correct.
341   */
342  rc = rtems_rfs_bitmap_map_set_all (&control);
343  printf (" 25. Set all bits: %s (%s)\n",
344          rc == 0 ? "PASS" : "FAIL", strerror (rc));
345  rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
346
347  first_bit = rand () % (size / 2) + rtems_rfs_bitmap_element_bits ();
348  last_bit = first_bit + rand () % (size / 2) + rtems_rfs_bitmap_element_bits ();
349
350  for (bit = first_bit; bit < last_bit; bit++)
351  {
352    rc = rtems_rfs_bitmap_map_clear (&control, bit);
353    if (rc > 0)
354    {
355      printf (" 26. Clear bit %" PRId32 ": %s (%s)\n",
356              bit, rc == 0 ? "PASS" : "FAIL", strerror (rc));
357      rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
358    }
359  }
360 
361  printf (" 26. Clear bit (%" PRId32 ", %" PRId32 "]: %s (%s)\n",
362          first_bit, last_bit, rc == 0 ? "PASS" : "FAIL", strerror (rc));
363 
364  clear = rtems_rfs_bitmap_map_free (&control);
365  result = clear == (last_bit - first_bit);
366  printf (" 27. Check free count is %zd: %" PRId32 ": %s (%s)\n",
367          clear, last_bit - first_bit,
368          result ? "pass" : "FAIL", strerror (rc));
369
370  rc = rtems_rfs_bitmap_create_search (&control);
371  result = clear == rtems_rfs_bitmap_map_free (&control);
372  printf (" 28. Create search check free count is %zd: %zd: %s (%s)\n",
373          clear, rtems_rfs_bitmap_map_free (&control),
374          result ? "pass" : "FAIL", strerror (rc));
375  rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
376 
377  rtems_rfs_bitmap_close (&control);
378  free (buffer.buffer);
379}
380
381void
382rtems_rfs_bitmap_unit_test (void)
383{
384  printf ("RTEMS File System Bitmap Unit Test\n");
385  printf (" Bit set value       : %d\n", RTEMS_RFS_BITMAP_BIT_SET);
386  printf (" Bit clear value     : %d\n", RTEMS_RFS_BITMAP_BIT_CLEAR);
387  printf (" Num bit per element : %zd\n", rtems_rfs_bitmap_element_bits ());
388
389#if INT_MAX >= 0x23984237
390  srand (0x23984237);
391#else
392  srand (0x2398);
393#endif
394 
395  rtems_rfs_bitmap_ut_test_bitmap (2048);
396  rtems_rfs_bitmap_ut_test_bitmap (420);
397}
398
Note: See TracBrowser for help on using the repository browser.