File indexing completed on 2025-05-11 08:24:31
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 #ifdef HAVE_CONFIG_H
0036 #include "config.h"
0037 #endif
0038
0039 #include <stdio.h>
0040 #include <stdlib.h>
0041 #include <inttypes.h>
0042
0043 #include <rtems/rfs/rtems-rfs-bitmaps.h>
0044 #include <rtems/rfs/rtems-rfs-file-system.h>
0045
0046 #include "fstest.h"
0047 #include "fs_config.h"
0048 #include "tmacros.h"
0049 #include <rtems/malloc.h>
0050
0051 const char rtems_test_name[] = "FSRFSBITMAP 1";
0052 const RTEMS_TEST_STATE rtems_test_state = TEST_STATE;
0053
0054 #define rtems_rfs_exit_on_error(_rc, _r, _c, _b) \
0055 if ((_rc > 0) || _r) { free (_b); rtems_rfs_bitmap_close (_c); return; }
0056
0057 static bool
0058 rtems_rfs_bitmap_ut_test_range (rtems_rfs_bitmap_control* control,
0059 int test,
0060 bool set,
0061 rtems_rfs_bitmap_bit bit,
0062 size_t size)
0063 {
0064 unsigned int count;
0065 bool result;
0066 for (count = 0; count < size; count++)
0067 {
0068 int rc = rtems_rfs_bitmap_map_test (control, bit + count, &result);
0069 if (rc > 0)
0070 {
0071 printf (" %2d. Test bit %" PRId32 " in range (%" PRId32 ",%zu] is %s: ",
0072 test, bit + count, bit, bit + size - 1, !set ? "set" : "clear");
0073 printf ("FAIL (%s)\n", strerror (rc));
0074 return false;
0075 }
0076 if (!set)
0077 result = !result;
0078 if (!result)
0079 {
0080 printf (" %2d. Test bit %" PRId32 " in range (%" PRId32 ",%zu] is %s: ",
0081 test, bit + count, bit, bit + size - 1, !set ? "set" : "clear");
0082 printf (" %s\n", !result ? "pass" : "FAIL");
0083 return false;
0084 }
0085 }
0086
0087 printf (" %2d. Test bit range (%" PRId32 ",%zu] all %s: pass\n",
0088 test, bit, bit + size - 1, set ? "set" : "clear");
0089
0090 return true;
0091 }
0092
0093 static bool
0094 rtems_rfs_bitmap_ut_alloc_seq_test (rtems_rfs_bitmap_control* control,
0095 int test,
0096 rtems_rfs_bitmap_bit bit,
0097 size_t size)
0098 {
0099 bool state;
0100 int i;
0101 int rc;
0102
0103 printf (" %2d. Set all bits\n", test);
0104 rc = rtems_rfs_bitmap_map_set_all (control);
0105 if (rc > 0)
0106 {
0107 printf (" %2d. set all bits: FAIL (%s)\n", test, strerror (rc));
0108 return false;
0109 }
0110
0111 for (i = 0; i < size; i++)
0112 rtems_rfs_bitmap_map_clear (control, bit + i);
0113
0114 printf (" %2d. Cleared bits (%" PRId32 ", %zu] (%zu)\n",
0115 test, bit, bit + size - 1, size);
0116
0117 for (i = 0; i < rtems_rfs_bitmap_element_bits (); i++)
0118 {
0119 rc = rtems_rfs_bitmap_map_test (control, bit + i, &state);
0120 if (rc > 0)
0121 {
0122 printf (" %2d. test bit: FAIL (%s)\n", test, strerror (rc));
0123 return false;
0124 }
0125 if (state)
0126 {
0127 printf (" %2d. Cleared bit still set: bit = %" PRId32 "\n", test, bit + i);
0128 return false;
0129 }
0130 }
0131
0132 for (i = 0, bit = 0; i < size; i++)
0133 {
0134 rtems_rfs_bitmap_bit seed = bit;
0135 bool result;
0136 int rc;
0137 rc = rtems_rfs_bitmap_map_alloc (control, seed, &result, &bit);
0138 if (rc > 0)
0139 {
0140 printf (" %2d. map all: FAIL (%s)\n", test, strerror (rc));
0141 return false;
0142 }
0143 if (!result)
0144 {
0145 printf (" %2d. Find bit with seed = %" PRId32 ": %s: bit = %" PRId32 "\n",
0146 test, seed, result ? "pass" : "FAIL", bit);
0147 return false;
0148 }
0149 }
0150
0151 printf (" %2d. Alloc'ed all bits (%" PRId32 ", %zu] (%zu)\n",
0152 test, bit, bit + size - 1, size);
0153
0154 return true;
0155 }
0156
0157 static void
0158 rtems_rfs_bitmap_ut_test_bitmap (size_t size)
0159 {
0160 rtems_rfs_file_system fs;
0161 rtems_rfs_bitmap_control control;
0162 rtems_rfs_buffer_handle handle;
0163 rtems_rfs_buffer buffer;
0164 rtems_rfs_bitmap_bit bit = 0;
0165 rtems_rfs_bitmap_bit first_bit;
0166 rtems_rfs_bitmap_bit last_bit;
0167 bool result;
0168 size_t bytes;
0169 size_t clear;
0170 int rc;
0171
0172 bytes = (rtems_rfs_bitmap_elements (size) *
0173 sizeof (rtems_rfs_bitmap_element));
0174
0175 memset (&fs, 0, sizeof (fs));
0176 memset (&buffer, 0, sizeof (buffer));
0177
0178 buffer.buffer = malloc (bytes);
0179 buffer.block = 1;
0180
0181 if (!buffer.buffer)
0182 {
0183 printf (" Cannot allocate bitmap memory\n");
0184 return;
0185 }
0186
0187 #if RTEMS_RFS_BITMAP_CLEAR_ZERO
0188 memset (buffer.buffer, 0, bytes);
0189 #else
0190 memset (buffer.buffer, 0xff, bytes);
0191 #endif
0192
0193
0194
0195
0196 rc = rtems_rfs_buffer_handle_open (&fs, &handle);
0197 if (rc > 0)
0198 {
0199 printf (" Cannot open the handle: %d: %s\n", rc, strerror (rc));
0200 free (buffer.buffer);
0201 return;
0202 }
0203
0204 handle.buffer = &buffer;
0205 handle.bnum = 1;
0206
0207 printf ("\nRFS Bitmap Test : size = %zu (%zu)\n",
0208 size, rtems_rfs_bitmap_elements (size));
0209
0210 rc = rtems_rfs_bitmap_open (&control, &fs, &handle, size, 1);
0211 if (rc > 0)
0212 {
0213 printf (" Cannot open the bitmap: %s\n", strerror (rc));
0214 free (buffer.buffer);
0215 return;
0216 }
0217
0218
0219 rtems_test_assert( control.free == control.size );
0220
0221
0222
0223
0224
0225 rc = rtems_rfs_bitmap_map_alloc (&control, size * 2, &result, &bit);
0226 printf (" 1. Find bit with seed > size: %s (%s)\n",
0227 result ? "FAIL" : "pass", strerror (rc));
0228 rtems_rfs_exit_on_error (rc, result, &control, buffer.buffer);
0229
0230 rc = rtems_rfs_bitmap_map_alloc (&control, size, &result, &bit);
0231 printf (" 2. Find bit with seed = size: %s (%s)\n",
0232 result ? "FAIL" : "pass", strerror (rc));
0233 rtems_rfs_exit_on_error (rc, result, &control, buffer.buffer);
0234
0235 rc = rtems_rfs_bitmap_map_alloc (&control, 0, &result, &bit);
0236 result = result && (bit == 0);
0237 printf (" 3. Find bit 0 with seed = 0: %s (%s): bit = %" PRId32 "\n",
0238 result ? "pass" : "FAIL", strerror (rc), bit);
0239 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0240
0241 rc = rtems_rfs_bitmap_map_alloc (&control, size - 1, &result, &bit);
0242 result = result && (bit == (size - 1));
0243 printf (" 4. Find bit (size - 1) with seed = (size - 1) (%zu): %s (%s): bit = %" PRId32 "\n",
0244 size - 1, result ? "pass" : "FAIL", strerror (rc), bit);
0245 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0246
0247
0248
0249
0250 rc = rtems_rfs_bitmap_map_test (&control, 0, &result);
0251 printf (" 5. Test bit 0: %s (%s)\n",
0252 result ? "pass" : "FAIL", strerror (rc));
0253 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0254
0255 rc = rtems_rfs_bitmap_map_test (&control, size - 1, &result);
0256 printf (" 6. Test bit (size - 1) (%zu): %s (%s)\n",
0257 size - 1, result ? "pass" : "FAIL", strerror (rc));
0258 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0259
0260 if (!rtems_rfs_bitmap_ut_test_range (&control, 7, false, 1, size - 2))
0261 rtems_rfs_exit_on_error (0, !result, &control, buffer.buffer);
0262
0263
0264
0265
0266 rc = rtems_rfs_bitmap_map_set_all (&control);
0267 printf (" 8. Set all bits: %s (%s)\n",
0268 rc == 0 ? "PASS" : "FAIL", strerror (rc));
0269 rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
0270
0271 rtems_test_assert( control.free == 0 );
0272
0273 bit = rand () % size;
0274
0275 rc = rtems_rfs_bitmap_map_clear (&control, bit);
0276 printf (" 9. Clear bit %" PRId32 ": %s (%s)\n",
0277 bit, rc == 0 ? "PASS" : "FAIL", strerror (rc));
0278 rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
0279 rtems_test_assert( control.free == 1);
0280
0281 last_bit = bit;
0282 rc = rtems_rfs_bitmap_map_alloc (&control, 0, &result, &bit);
0283 result = result && (bit == last_bit);
0284 printf (" 10. Find bit with seed = 0: %s (%s): bit = %" PRId32 "\n",
0285 result ? "pass" : "FAIL", strerror (rc), bit);
0286 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0287
0288 rc = rtems_rfs_bitmap_map_alloc (&control, 0, &result, &bit);
0289 result = !result || (bit != last_bit);
0290 printf (" 11. Fail to find bit with seed = 0: %s (%s): bit = %" PRId32 "\n",
0291 result ? "pass" : "FAIL", strerror (rc), bit);
0292 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0293
0294 rc = rtems_rfs_bitmap_map_clear (&control, 0);
0295 printf (" 12. Clear bit 0: %s (%s)\n",
0296 rc == 0 ? "pass" : "FAIL", strerror (rc));
0297 rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
0298 rtems_test_assert( control.free == 1);
0299
0300 rc = rtems_rfs_bitmap_map_alloc (&control, size - 1, &result, &bit);
0301 result = result && (bit == 0);
0302 printf (" 13. Find bit with seed = (size - 1): %s (%s): bit = %" PRId32 "\n",
0303 result ? "pass" : "FAIL", strerror (rc), bit);
0304 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0305
0306 rc = rtems_rfs_bitmap_map_clear (&control, size - 1);
0307 printf (" 14. Clear bit (size - 1) (%zu): %s (%s)\n",
0308 size - 1, rc == 0 ? "pass" : "FAIL", strerror (rc));
0309 rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
0310
0311 rc = rtems_rfs_bitmap_map_alloc (&control, 0, &result, &bit);
0312 result = result && (bit == (size - 1));
0313 printf (" 15. Find bit with seed = 0: %s (%s): bit = %" PRId32 "\n",
0314 result ? "pass" : "FAIL", strerror (rc), bit);
0315 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0316
0317 rc = rtems_rfs_bitmap_map_clear (&control, 0);
0318 printf (" 16. Clear bit 0: %s (%s)\n",
0319 rc == 0 ? "pass" : "FAIL", strerror (rc));
0320
0321 rc = rtems_rfs_bitmap_map_alloc (&control, size / 2, &result, &bit);
0322 result = result && (bit == 0);
0323 printf (" 17. Find bit with seed = (size / 2) (%zu): %s (%s): bit = %" PRId32 "\n",
0324 size / 2, result ? "pass" : "FAIL", strerror (rc), bit);
0325 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0326
0327 rc = rtems_rfs_bitmap_map_clear (&control, size - 1);
0328 printf (" 18. Clear bit (size - 1) (%zu): %s, (%s)\n",
0329 size - 1, rc == 0 ? "pass" : "FAIL", strerror (rc));
0330 rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
0331
0332 rc = rtems_rfs_bitmap_map_alloc (&control, size / 2, &result, &bit);
0333 result = result && (bit == (size - 1));
0334 printf (" 19. Find bit with seed = (size / 2) (%zu): %s (%s): bit = %" PRId32 "\n",
0335 size / 2, result ? "pass" : "FAIL", strerror (rc), bit);
0336 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0337
0338 rc = rtems_rfs_bitmap_map_clear (&control, 0);
0339 printf (" 20. Clear bit 0: %s (%s)\n",
0340 rc == 0 ? "pass" : "FAIL", strerror (rc));
0341
0342 rc = rtems_rfs_bitmap_map_alloc (&control, (size / 2) - 1, &result, &bit);
0343 result = result && (bit == 0);
0344 printf (" 21. Find bit with seed = ((size / 2) - 1) (%zu): %s (%s): bit = %" PRId32 "\n",
0345 (size / 2) - 1, result ? "pass" : "FAIL", strerror (rc), bit);
0346 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0347
0348 rc = rtems_rfs_bitmap_map_clear (&control, size - 1);
0349 printf (" 22. Clear bit (size - 1) (%zu): %s (%s)\n",
0350 size - 1, rc == 0 ? "pass" : "FAIL", strerror (rc));
0351
0352 rc = rtems_rfs_bitmap_map_alloc (&control, (size / 2) - 1, &result, &bit);
0353 result = result && (bit == (size - 1));
0354 printf (" 23. Find bit with seed = ((size / 2) - 1) (%zu): %s (%s): bit = %" PRId32 "\n",
0355 (size / 2) - 1, result ? "pass" : "FAIL", strerror (rc), bit);
0356 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0357
0358 bit = rand () % (size / 2) + rtems_rfs_bitmap_element_bits ();
0359 result = rtems_rfs_bitmap_ut_alloc_seq_test (&control, 23, bit,
0360 rtems_rfs_bitmap_element_bits ());
0361 rtems_rfs_exit_on_error (0, !result, &control, buffer.buffer);
0362
0363 bit = rand () % (size / 2) + rtems_rfs_bitmap_element_bits ();
0364 result = rtems_rfs_bitmap_ut_alloc_seq_test (&control, 24, bit, 57);
0365 rtems_rfs_exit_on_error (0, !result, &control, buffer.buffer);
0366
0367
0368
0369
0370
0371 rc = rtems_rfs_bitmap_map_set_all (&control);
0372 printf (" 25. Set all bits: %s (%s)\n",
0373 rc == 0 ? "PASS" : "FAIL", strerror (rc));
0374 rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
0375
0376 first_bit = rand () % (size / 2) + rtems_rfs_bitmap_element_bits ();
0377 last_bit = first_bit + rand () % (size / 2) + rtems_rfs_bitmap_element_bits();
0378
0379 for (bit = first_bit; bit < last_bit; bit++)
0380 {
0381 rc = rtems_rfs_bitmap_map_clear (&control, bit);
0382 if (rc > 0)
0383 {
0384 printf (" 26. Clear bit %" PRId32 ": %s (%s)\n",
0385 bit, rc == 0 ? "PASS" : "FAIL", strerror (rc));
0386 rtems_rfs_exit_on_error (rc, false, &control, buffer.buffer);
0387 }
0388 }
0389
0390 printf (" 26. Clear bit (%" PRId32 ", %" PRId32 "]: %s (%s)\n",
0391 first_bit, last_bit, rc == 0 ? "PASS" : "FAIL", strerror (rc));
0392
0393 clear = rtems_rfs_bitmap_map_free (&control);
0394 result = clear == (last_bit - first_bit);
0395 printf (" 27. Check free count is %zu: %" PRId32 ": %s (%s)\n",
0396 clear, last_bit - first_bit,
0397 result ? "pass" : "FAIL", strerror (rc));
0398
0399 rc = rtems_rfs_bitmap_create_search (&control);
0400 result = clear == rtems_rfs_bitmap_map_free (&control);
0401 printf (" 28. Create search check free count is %zu: %zu: %s (%s)\n",
0402 clear, rtems_rfs_bitmap_map_free (&control),
0403 result ? "pass" : "FAIL", strerror (rc));
0404 rtems_rfs_exit_on_error (rc, !result, &control, buffer.buffer);
0405
0406 rtems_rfs_bitmap_bit mybit = control.size +2;
0407
0408 printf (" 29. Map set check with bit (%d) larger than size (%d)\n",
0409 (int)mybit, (int)control.size);
0410 rc = rtems_rfs_bitmap_map_set(&control, mybit);
0411 rtems_test_assert( rc == EINVAL );
0412
0413 printf (" 30. Map clear check with bit (%d) larger than size (%d)\n",
0414 (int)mybit, (int)control.size);
0415 rc = rtems_rfs_bitmap_map_clear(&control, mybit);
0416 rtems_test_assert( rc == EINVAL );
0417
0418 printf (" 31. Map test check with bit (%d) larger than size (%d)\n",
0419 (int)mybit, (int)control.size);
0420 rc = rtems_rfs_bitmap_map_test(&control, mybit ,&result);
0421 rtems_test_assert( rc == EINVAL );
0422
0423
0424 printf (" 32. Set all bits in the map, then clear bit (%zu) and set this bit once again:",control.size/2);
0425 rc = rtems_rfs_bitmap_map_set_all(&control);
0426 rtems_test_assert( rc == 0 );
0427 rc = rtems_rfs_bitmap_map_clear(&control, control.size/2);
0428 rtems_test_assert (rc == 0 );
0429 rc = rtems_rfs_bitmap_map_set(&control, control.size/2);
0430 rtems_test_assert (rc == 0 );
0431 printf (" PASSED\n");
0432
0433
0434 printf (" 33. Attempt to find bit when all bits are set (expected FAILED):");
0435 rc = rtems_rfs_bitmap_map_alloc(&control, 0, &result, &bit);
0436 rtems_test_assert(rc == 0 );
0437 rtems_test_assert ( result == false );
0438 rc = rtems_rfs_bitmap_map_alloc(&control, size-1, &result, &bit);
0439 rtems_test_assert(rc == 0 );
0440 rtems_test_assert ( result == false );
0441 rc = rtems_rfs_bitmap_map_alloc(&control, size/2, &result, &bit);
0442 rtems_test_assert(rc == 0 );
0443 rtems_test_assert ( result == false );
0444 rc = rtems_rfs_bitmap_map_alloc(&control, 1, &result, &bit);
0445 rtems_test_assert(rc == 0 );
0446 rtems_test_assert ( result == false );
0447 rc = rtems_rfs_bitmap_map_alloc(&control, -2, &result, &bit);
0448 rtems_test_assert(rc == 0 );
0449 rtems_test_assert ( result == false );
0450 printf(" FAILED\n");
0451
0452
0453 printf (" 34. Clear all bits in the map.\n");
0454 rc = rtems_rfs_bitmap_map_clear_all(&control);
0455 rtems_test_assert( rc == 0 );
0456
0457 rtems_test_assert( control.free == control.size );
0458
0459
0460 printf (" 35. Set a bit and check accounting.\n");
0461 rc = rtems_rfs_bitmap_map_set(&control, 0);
0462 rtems_test_assert( rc == 0 );
0463 rtems_test_assert( control.free == control.size - 1);
0464
0465 rc = rtems_rfs_bitmap_map_set(&control, 0);
0466 rtems_test_assert( rc == 0 );
0467 rtems_test_assert( control.free == control.size - 1);
0468
0469 rtems_rfs_bitmap_close (&control);
0470 free (buffer.buffer);
0471 }
0472
0473 static void rtems_rfs_bitmap_unit_test (void)
0474 {
0475 printf (" Bit set value : %d\n", RTEMS_RFS_BITMAP_BIT_SET);
0476 printf (" Bit clear value : %d\n", RTEMS_RFS_BITMAP_BIT_CLEAR);
0477 printf (" Num bit per element : %zu\n", rtems_rfs_bitmap_element_bits ());
0478
0479 #if INT_MAX >= 0x23984237
0480 srand (0x23984237);
0481 #else
0482 srand (0x2398);
0483 #endif
0484 rtems_rfs_bitmap_ut_test_bitmap (4096);
0485 rtems_rfs_bitmap_ut_test_bitmap (2048);
0486 rtems_rfs_bitmap_ut_test_bitmap (420);
0487 }
0488
0489 static void nullpointer_test(void){
0490
0491 rtems_rfs_bitmap_control control;
0492 rtems_rfs_bitmap_bit bit = 0;
0493 rtems_rfs_bitmap_bit seed_bit = 0;
0494 int rc;
0495 bool result;
0496
0497 memset(&control, 0, sizeof(control));
0498
0499 printf ("\n Testing bitmap_map functions with zero "
0500 "initialized bitmap control pointer\n");
0501
0502
0503 rc = rtems_rfs_bitmap_map_set(&control, bit);
0504 rtems_test_assert(rc == ENXIO);
0505 rc = rtems_rfs_bitmap_map_clear(&control, bit);
0506 rtems_test_assert(rc == ENXIO);
0507 rc = rtems_rfs_bitmap_map_test(&control, bit, &result);
0508 rtems_test_assert(rc == ENXIO);
0509 rc = rtems_rfs_bitmap_map_set_all(&control);
0510 rtems_test_assert(rc == ENXIO);
0511 rc = rtems_rfs_bitmap_map_clear_all(&control);
0512 rtems_test_assert(rc == ENXIO);
0513 rc = rtems_rfs_bitmap_create_search(&control);
0514 rtems_test_assert(rc == ENXIO);
0515 rc = rtems_rfs_bitmap_map_alloc(&control, seed_bit, &result, &bit);
0516 rtems_test_assert(rc == 0);
0517 rtems_test_assert(!result);
0518 rc = rtems_rfs_bitmap_map_set(&control, bit);
0519 rtems_test_assert(rc == ENXIO);
0520 }
0521
0522 static void open_failure(void){
0523
0524 rtems_rfs_file_system fs;
0525 rtems_rfs_bitmap_control control;
0526 rtems_rfs_buffer_handle handle;
0527 int rc;
0528 void *opaque;
0529
0530
0531 printf("\n Allocate most of memory - attempt to fail while open bitmap - expect ENOMEM\n" );
0532
0533 opaque = rtems_heap_greedy_allocate( NULL, 0 );
0534
0535 memset (&fs, 0, sizeof (fs));
0536
0537 rc = rtems_rfs_buffer_handle_open (&fs, &handle);
0538 rtems_test_assert( rc == 0 );
0539
0540 rc = rtems_rfs_bitmap_open (&control, &fs, &handle, 0, 0);
0541 rtems_test_assert( rc == ENOMEM );
0542 printf( " Attempt to open bitmap returned: %s\n", strerror(rc));
0543 puts( " Freeing the allocated memory" );
0544 rtems_heap_greedy_free( opaque );
0545 }
0546
0547 void test(void){
0548 puts("\n START of RFS Bitmap Unit Test");
0549
0550 rtems_rfs_bitmap_unit_test();
0551 nullpointer_test();
0552 open_failure();
0553
0554 puts("\n END of RFS Bitmap Unit Test");
0555 }