test_badblocks.toml 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. # bad blocks with block cycles should be tested in test_relocations
  2. if = 'LFS_BLOCK_CYCLES == -1'
  3. [[case]] # single bad blocks
  4. define.LFS_BLOCK_COUNT = 256 # small bd so test runs faster
  5. define.LFS_ERASE_CYCLES = 0xffffffff
  6. define.LFS_ERASE_VALUE = [0x00, 0xff, -1]
  7. define.LFS_BADBLOCK_BEHAVIOR = [
  8. 'LFS_TESTBD_BADBLOCK_PROGERROR',
  9. 'LFS_TESTBD_BADBLOCK_ERASEERROR',
  10. 'LFS_TESTBD_BADBLOCK_READERROR',
  11. 'LFS_TESTBD_BADBLOCK_PROGNOOP',
  12. 'LFS_TESTBD_BADBLOCK_ERASENOOP',
  13. ]
  14. define.NAMEMULT = 64
  15. define.FILEMULT = 1
  16. code = '''
  17. for (lfs_block_t badblock = 2; badblock < LFS_BLOCK_COUNT; badblock++) {
  18. lfs_testbd_setwear(&cfg, badblock-1, 0) => 0;
  19. lfs_testbd_setwear(&cfg, badblock, 0xffffffff) => 0;
  20. lfs_format(&lfs, &cfg) => 0;
  21. lfs_mount(&lfs, &cfg) => 0;
  22. for (int i = 1; i < 10; i++) {
  23. for (int j = 0; j < NAMEMULT; j++) {
  24. buffer[j] = '0'+i;
  25. }
  26. buffer[NAMEMULT] = '\0';
  27. lfs_mkdir(&lfs, (char*)buffer) => 0;
  28. buffer[NAMEMULT] = '/';
  29. for (int j = 0; j < NAMEMULT; j++) {
  30. buffer[j+NAMEMULT+1] = '0'+i;
  31. }
  32. buffer[2*NAMEMULT+1] = '\0';
  33. lfs_file_open(&lfs, &file, (char*)buffer,
  34. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  35. size = NAMEMULT;
  36. for (int j = 0; j < i*FILEMULT; j++) {
  37. lfs_file_write(&lfs, &file, buffer, size) => size;
  38. }
  39. lfs_file_close(&lfs, &file) => 0;
  40. }
  41. lfs_unmount(&lfs) => 0;
  42. lfs_mount(&lfs, &cfg) => 0;
  43. for (int i = 1; i < 10; i++) {
  44. for (int j = 0; j < NAMEMULT; j++) {
  45. buffer[j] = '0'+i;
  46. }
  47. buffer[NAMEMULT] = '\0';
  48. lfs_stat(&lfs, (char*)buffer, &info) => 0;
  49. info.type => LFS_TYPE_DIR;
  50. buffer[NAMEMULT] = '/';
  51. for (int j = 0; j < NAMEMULT; j++) {
  52. buffer[j+NAMEMULT+1] = '0'+i;
  53. }
  54. buffer[2*NAMEMULT+1] = '\0';
  55. lfs_file_open(&lfs, &file, (char*)buffer, LFS_O_RDONLY) => 0;
  56. size = NAMEMULT;
  57. for (int j = 0; j < i*FILEMULT; j++) {
  58. uint8_t rbuffer[1024];
  59. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  60. memcmp(buffer, rbuffer, size) => 0;
  61. }
  62. lfs_file_close(&lfs, &file) => 0;
  63. }
  64. lfs_unmount(&lfs) => 0;
  65. }
  66. '''
  67. [[case]] # region corruption (causes cascading failures)
  68. define.LFS_BLOCK_COUNT = 256 # small bd so test runs faster
  69. define.LFS_ERASE_CYCLES = 0xffffffff
  70. define.LFS_ERASE_VALUE = [0x00, 0xff, -1]
  71. define.LFS_BADBLOCK_BEHAVIOR = [
  72. 'LFS_TESTBD_BADBLOCK_PROGERROR',
  73. 'LFS_TESTBD_BADBLOCK_ERASEERROR',
  74. 'LFS_TESTBD_BADBLOCK_READERROR',
  75. 'LFS_TESTBD_BADBLOCK_PROGNOOP',
  76. 'LFS_TESTBD_BADBLOCK_ERASENOOP',
  77. ]
  78. define.NAMEMULT = 64
  79. define.FILEMULT = 1
  80. code = '''
  81. for (lfs_block_t i = 0; i < (LFS_BLOCK_COUNT-2)/2; i++) {
  82. lfs_testbd_setwear(&cfg, i+2, 0xffffffff) => 0;
  83. }
  84. lfs_format(&lfs, &cfg) => 0;
  85. lfs_mount(&lfs, &cfg) => 0;
  86. for (int i = 1; i < 10; i++) {
  87. for (int j = 0; j < NAMEMULT; j++) {
  88. buffer[j] = '0'+i;
  89. }
  90. buffer[NAMEMULT] = '\0';
  91. lfs_mkdir(&lfs, (char*)buffer) => 0;
  92. buffer[NAMEMULT] = '/';
  93. for (int j = 0; j < NAMEMULT; j++) {
  94. buffer[j+NAMEMULT+1] = '0'+i;
  95. }
  96. buffer[2*NAMEMULT+1] = '\0';
  97. lfs_file_open(&lfs, &file, (char*)buffer,
  98. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  99. size = NAMEMULT;
  100. for (int j = 0; j < i*FILEMULT; j++) {
  101. lfs_file_write(&lfs, &file, buffer, size) => size;
  102. }
  103. lfs_file_close(&lfs, &file) => 0;
  104. }
  105. lfs_unmount(&lfs) => 0;
  106. lfs_mount(&lfs, &cfg) => 0;
  107. for (int i = 1; i < 10; i++) {
  108. for (int j = 0; j < NAMEMULT; j++) {
  109. buffer[j] = '0'+i;
  110. }
  111. buffer[NAMEMULT] = '\0';
  112. lfs_stat(&lfs, (char*)buffer, &info) => 0;
  113. info.type => LFS_TYPE_DIR;
  114. buffer[NAMEMULT] = '/';
  115. for (int j = 0; j < NAMEMULT; j++) {
  116. buffer[j+NAMEMULT+1] = '0'+i;
  117. }
  118. buffer[2*NAMEMULT+1] = '\0';
  119. lfs_file_open(&lfs, &file, (char*)buffer, LFS_O_RDONLY) => 0;
  120. size = NAMEMULT;
  121. for (int j = 0; j < i*FILEMULT; j++) {
  122. uint8_t rbuffer[1024];
  123. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  124. memcmp(buffer, rbuffer, size) => 0;
  125. }
  126. lfs_file_close(&lfs, &file) => 0;
  127. }
  128. lfs_unmount(&lfs) => 0;
  129. '''
  130. [[case]] # alternating corruption (causes cascading failures)
  131. define.LFS_BLOCK_COUNT = 256 # small bd so test runs faster
  132. define.LFS_ERASE_CYCLES = 0xffffffff
  133. define.LFS_ERASE_VALUE = [0x00, 0xff, -1]
  134. define.LFS_BADBLOCK_BEHAVIOR = [
  135. 'LFS_TESTBD_BADBLOCK_PROGERROR',
  136. 'LFS_TESTBD_BADBLOCK_ERASEERROR',
  137. 'LFS_TESTBD_BADBLOCK_READERROR',
  138. 'LFS_TESTBD_BADBLOCK_PROGNOOP',
  139. 'LFS_TESTBD_BADBLOCK_ERASENOOP',
  140. ]
  141. define.NAMEMULT = 64
  142. define.FILEMULT = 1
  143. code = '''
  144. for (lfs_block_t i = 0; i < (LFS_BLOCK_COUNT-2)/2; i++) {
  145. lfs_testbd_setwear(&cfg, (2*i) + 2, 0xffffffff) => 0;
  146. }
  147. lfs_format(&lfs, &cfg) => 0;
  148. lfs_mount(&lfs, &cfg) => 0;
  149. for (int i = 1; i < 10; i++) {
  150. for (int j = 0; j < NAMEMULT; j++) {
  151. buffer[j] = '0'+i;
  152. }
  153. buffer[NAMEMULT] = '\0';
  154. lfs_mkdir(&lfs, (char*)buffer) => 0;
  155. buffer[NAMEMULT] = '/';
  156. for (int j = 0; j < NAMEMULT; j++) {
  157. buffer[j+NAMEMULT+1] = '0'+i;
  158. }
  159. buffer[2*NAMEMULT+1] = '\0';
  160. lfs_file_open(&lfs, &file, (char*)buffer,
  161. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  162. size = NAMEMULT;
  163. for (int j = 0; j < i*FILEMULT; j++) {
  164. lfs_file_write(&lfs, &file, buffer, size) => size;
  165. }
  166. lfs_file_close(&lfs, &file) => 0;
  167. }
  168. lfs_unmount(&lfs) => 0;
  169. lfs_mount(&lfs, &cfg) => 0;
  170. for (int i = 1; i < 10; i++) {
  171. for (int j = 0; j < NAMEMULT; j++) {
  172. buffer[j] = '0'+i;
  173. }
  174. buffer[NAMEMULT] = '\0';
  175. lfs_stat(&lfs, (char*)buffer, &info) => 0;
  176. info.type => LFS_TYPE_DIR;
  177. buffer[NAMEMULT] = '/';
  178. for (int j = 0; j < NAMEMULT; j++) {
  179. buffer[j+NAMEMULT+1] = '0'+i;
  180. }
  181. buffer[2*NAMEMULT+1] = '\0';
  182. lfs_file_open(&lfs, &file, (char*)buffer, LFS_O_RDONLY) => 0;
  183. size = NAMEMULT;
  184. for (int j = 0; j < i*FILEMULT; j++) {
  185. uint8_t rbuffer[1024];
  186. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  187. memcmp(buffer, rbuffer, size) => 0;
  188. }
  189. lfs_file_close(&lfs, &file) => 0;
  190. }
  191. lfs_unmount(&lfs) => 0;
  192. '''
  193. # other corner cases
  194. [[case]] # bad superblocks (corrupt 1 or 0)
  195. define.LFS_ERASE_CYCLES = 0xffffffff
  196. define.LFS_ERASE_VALUE = [0x00, 0xff, -1]
  197. define.LFS_BADBLOCK_BEHAVIOR = [
  198. 'LFS_TESTBD_BADBLOCK_PROGERROR',
  199. 'LFS_TESTBD_BADBLOCK_ERASEERROR',
  200. 'LFS_TESTBD_BADBLOCK_READERROR',
  201. 'LFS_TESTBD_BADBLOCK_PROGNOOP',
  202. 'LFS_TESTBD_BADBLOCK_ERASENOOP',
  203. ]
  204. code = '''
  205. lfs_testbd_setwear(&cfg, 0, 0xffffffff) => 0;
  206. lfs_testbd_setwear(&cfg, 1, 0xffffffff) => 0;
  207. lfs_format(&lfs, &cfg) => LFS_ERR_NOSPC;
  208. lfs_mount(&lfs, &cfg) => LFS_ERR_CORRUPT;
  209. '''