test_powerloss.toml 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. # There are already a number of tests that test general operations under
  2. # power-loss (see the reentrant attribute). These tests are for explicitly
  3. # testing specific corner cases.
  4. # only a revision count
  5. [cases.test_powerloss_only_rev]
  6. code = '''
  7. lfs_t lfs;
  8. lfs_format(&lfs, cfg) => 0;
  9. lfs_mount(&lfs, cfg) => 0;
  10. lfs_mkdir(&lfs, "notebook") => 0;
  11. lfs_file_t file;
  12. lfs_file_open(&lfs, &file, "notebook/paper",
  13. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0;
  14. char buffer[256];
  15. strcpy(buffer, "hello");
  16. lfs_size_t size = strlen("hello");
  17. for (int i = 0; i < 5; i++) {
  18. lfs_file_write(&lfs, &file, buffer, size) => size;
  19. lfs_file_sync(&lfs, &file) => 0;
  20. }
  21. lfs_file_close(&lfs, &file) => 0;
  22. char rbuffer[256];
  23. lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0;
  24. for (int i = 0; i < 5; i++) {
  25. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  26. assert(memcmp(rbuffer, buffer, size) == 0);
  27. }
  28. lfs_file_close(&lfs, &file) => 0;
  29. lfs_unmount(&lfs) => 0;
  30. // get pair/rev count
  31. lfs_mount(&lfs, cfg) => 0;
  32. lfs_dir_t dir;
  33. lfs_dir_open(&lfs, &dir, "notebook") => 0;
  34. lfs_block_t pair[2] = {dir.m.pair[0], dir.m.pair[1]};
  35. uint32_t rev = dir.m.rev;
  36. lfs_dir_close(&lfs, &dir) => 0;
  37. lfs_unmount(&lfs) => 0;
  38. // write just the revision count
  39. uint8_t bbuffer[BLOCK_SIZE];
  40. cfg->read(cfg, pair[1], 0, bbuffer, BLOCK_SIZE) => 0;
  41. memcpy(bbuffer, &(uint32_t){lfs_tole32(rev+1)}, sizeof(uint32_t));
  42. cfg->erase(cfg, pair[1]) => 0;
  43. cfg->prog(cfg, pair[1], 0, bbuffer, BLOCK_SIZE) => 0;
  44. lfs_mount(&lfs, cfg) => 0;
  45. // can read?
  46. lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0;
  47. for (int i = 0; i < 5; i++) {
  48. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  49. assert(memcmp(rbuffer, buffer, size) == 0);
  50. }
  51. lfs_file_close(&lfs, &file) => 0;
  52. // can write?
  53. lfs_file_open(&lfs, &file, "notebook/paper",
  54. LFS_O_WRONLY | LFS_O_APPEND) => 0;
  55. strcpy(buffer, "goodbye");
  56. size = strlen("goodbye");
  57. for (int i = 0; i < 5; i++) {
  58. lfs_file_write(&lfs, &file, buffer, size) => size;
  59. lfs_file_sync(&lfs, &file) => 0;
  60. }
  61. lfs_file_close(&lfs, &file) => 0;
  62. lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0;
  63. strcpy(buffer, "hello");
  64. size = strlen("hello");
  65. for (int i = 0; i < 5; i++) {
  66. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  67. assert(memcmp(rbuffer, buffer, size) == 0);
  68. }
  69. strcpy(buffer, "goodbye");
  70. size = strlen("goodbye");
  71. for (int i = 0; i < 5; i++) {
  72. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  73. assert(memcmp(rbuffer, buffer, size) == 0);
  74. }
  75. lfs_file_close(&lfs, &file) => 0;
  76. lfs_unmount(&lfs) => 0;
  77. '''
  78. # partial prog, may not be byte in order!
  79. [cases.test_powerloss_partial_prog]
  80. if = "PROG_SIZE < BLOCK_SIZE"
  81. defines.BYTE_OFF = ["0", "PROG_SIZE-1", "PROG_SIZE/2"]
  82. defines.BYTE_VALUE = [0x33, 0xcc]
  83. in = "lfs.c"
  84. code = '''
  85. lfs_t lfs;
  86. lfs_format(&lfs, cfg) => 0;
  87. lfs_mount(&lfs, cfg) => 0;
  88. lfs_mkdir(&lfs, "notebook") => 0;
  89. lfs_file_t file;
  90. lfs_file_open(&lfs, &file, "notebook/paper",
  91. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0;
  92. char buffer[256];
  93. strcpy(buffer, "hello");
  94. lfs_size_t size = strlen("hello");
  95. for (int i = 0; i < 5; i++) {
  96. lfs_file_write(&lfs, &file, buffer, size) => size;
  97. lfs_file_sync(&lfs, &file) => 0;
  98. }
  99. lfs_file_close(&lfs, &file) => 0;
  100. char rbuffer[256];
  101. lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0;
  102. for (int i = 0; i < 5; i++) {
  103. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  104. assert(memcmp(rbuffer, buffer, size) == 0);
  105. }
  106. lfs_file_close(&lfs, &file) => 0;
  107. lfs_unmount(&lfs) => 0;
  108. // imitate a partial prog, value should not matter, if littlefs
  109. // doesn't notice the partial prog testbd will assert
  110. // get offset to next prog
  111. lfs_mount(&lfs, cfg) => 0;
  112. lfs_dir_t dir;
  113. lfs_dir_open(&lfs, &dir, "notebook") => 0;
  114. lfs_block_t block = dir.m.pair[0];
  115. lfs_off_t off = dir.m.off;
  116. lfs_dir_close(&lfs, &dir) => 0;
  117. lfs_unmount(&lfs) => 0;
  118. // tweak byte
  119. uint8_t bbuffer[BLOCK_SIZE];
  120. cfg->read(cfg, block, 0, bbuffer, BLOCK_SIZE) => 0;
  121. bbuffer[off + BYTE_OFF] = BYTE_VALUE;
  122. cfg->erase(cfg, block) => 0;
  123. cfg->prog(cfg, block, 0, bbuffer, BLOCK_SIZE) => 0;
  124. lfs_mount(&lfs, cfg) => 0;
  125. // can read?
  126. lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0;
  127. for (int i = 0; i < 5; i++) {
  128. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  129. assert(memcmp(rbuffer, buffer, size) == 0);
  130. }
  131. lfs_file_close(&lfs, &file) => 0;
  132. // can write?
  133. lfs_file_open(&lfs, &file, "notebook/paper",
  134. LFS_O_WRONLY | LFS_O_APPEND) => 0;
  135. strcpy(buffer, "goodbye");
  136. size = strlen("goodbye");
  137. for (int i = 0; i < 5; i++) {
  138. lfs_file_write(&lfs, &file, buffer, size) => size;
  139. lfs_file_sync(&lfs, &file) => 0;
  140. }
  141. lfs_file_close(&lfs, &file) => 0;
  142. lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0;
  143. strcpy(buffer, "hello");
  144. size = strlen("hello");
  145. for (int i = 0; i < 5; i++) {
  146. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  147. assert(memcmp(rbuffer, buffer, size) == 0);
  148. }
  149. strcpy(buffer, "goodbye");
  150. size = strlen("goodbye");
  151. for (int i = 0; i < 5; i++) {
  152. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  153. assert(memcmp(rbuffer, buffer, size) == 0);
  154. }
  155. lfs_file_close(&lfs, &file) => 0;
  156. lfs_unmount(&lfs) => 0;
  157. '''