test_badblocks.toml 7.2 KB

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