test_badblocks.toml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. [[case]] # single bad blocks
  2. define.LFS_ERASE_CYCLES = 0xffffffff
  3. define.LFS_BADBLOCK_BEHAVIOR = 'LFS_TESTBD_BADBLOCK_NOPROG'
  4. define.NAMEMULT = 64
  5. define.FILEMULT = 1
  6. code = '''
  7. for (lfs_block_t badblock = 2; badblock < LFS_BLOCK_COUNT; badblock++) {
  8. lfs_testbd_setwear(&cfg, badblock-1, 0) => 0;
  9. lfs_testbd_setwear(&cfg, badblock, 0xffffffff) => 0;
  10. lfs_format(&lfs, &cfg) => 0;
  11. lfs_mount(&lfs, &cfg) => 0;
  12. for (int i = 1; i < 10; i++) {
  13. for (int j = 0; j < NAMEMULT; j++) {
  14. buffer[j] = '0'+i;
  15. }
  16. buffer[NAMEMULT] = '\0';
  17. lfs_mkdir(&lfs, (char*)buffer) => 0;
  18. buffer[NAMEMULT] = '/';
  19. for (int j = 0; j < NAMEMULT; j++) {
  20. buffer[j+NAMEMULT+1] = '0'+i;
  21. }
  22. buffer[2*NAMEMULT+1] = '\0';
  23. lfs_file_open(&lfs, &file, (char*)buffer,
  24. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  25. size = NAMEMULT;
  26. for (int j = 0; j < i*FILEMULT; j++) {
  27. lfs_file_write(&lfs, &file, buffer, size) => size;
  28. }
  29. lfs_file_close(&lfs, &file) => 0;
  30. }
  31. lfs_unmount(&lfs) => 0;
  32. lfs_mount(&lfs, &cfg) => 0;
  33. for (int i = 1; i < 10; i++) {
  34. for (int j = 0; j < NAMEMULT; j++) {
  35. buffer[j] = '0'+i;
  36. }
  37. buffer[NAMEMULT] = '\0';
  38. lfs_stat(&lfs, (char*)buffer, &info) => 0;
  39. info.type => LFS_TYPE_DIR;
  40. buffer[NAMEMULT] = '/';
  41. for (int j = 0; j < NAMEMULT; j++) {
  42. buffer[j+NAMEMULT+1] = '0'+i;
  43. }
  44. buffer[2*NAMEMULT+1] = '\0';
  45. lfs_file_open(&lfs, &file, (char*)buffer, LFS_O_RDONLY) => 0;
  46. size = NAMEMULT;
  47. for (int j = 0; j < i*FILEMULT; j++) {
  48. uint8_t rbuffer[1024];
  49. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  50. memcmp(buffer, rbuffer, size) => 0;
  51. }
  52. lfs_file_close(&lfs, &file) => 0;
  53. }
  54. lfs_unmount(&lfs) => 0;
  55. }
  56. '''
  57. [[case]] # single persistent blocks (can't erase)
  58. define.LFS_ERASE_CYCLES = 0xffffffff
  59. define.LFS_BADBLOCK_BEHAVIOR = 'LFS_TESTBD_BADBLOCK_NOERASE'
  60. define.NAMEMULT = 64
  61. define.FILEMULT = 1
  62. code = '''
  63. for (lfs_block_t badblock = 2; badblock < LFS_BLOCK_COUNT; badblock++) {
  64. lfs_testbd_setwear(&cfg, badblock-1, 0) => 0;
  65. lfs_testbd_setwear(&cfg, badblock, 0xffffffff) => 0;
  66. lfs_format(&lfs, &cfg) => 0;
  67. lfs_mount(&lfs, &cfg) => 0;
  68. for (int i = 1; i < 10; i++) {
  69. for (int j = 0; j < NAMEMULT; j++) {
  70. buffer[j] = '0'+i;
  71. }
  72. buffer[NAMEMULT] = '\0';
  73. lfs_mkdir(&lfs, (char*)buffer) => 0;
  74. buffer[NAMEMULT] = '/';
  75. for (int j = 0; j < NAMEMULT; j++) {
  76. buffer[j+NAMEMULT+1] = '0'+i;
  77. }
  78. buffer[2*NAMEMULT+1] = '\0';
  79. lfs_file_open(&lfs, &file, (char*)buffer,
  80. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  81. size = NAMEMULT;
  82. for (int j = 0; j < i*FILEMULT; j++) {
  83. lfs_file_write(&lfs, &file, buffer, size) => size;
  84. }
  85. lfs_file_close(&lfs, &file) => 0;
  86. }
  87. lfs_unmount(&lfs) => 0;
  88. lfs_mount(&lfs, &cfg) => 0;
  89. for (int i = 1; i < 10; i++) {
  90. for (int j = 0; j < NAMEMULT; j++) {
  91. buffer[j] = '0'+i;
  92. }
  93. buffer[NAMEMULT] = '\0';
  94. lfs_stat(&lfs, (char*)buffer, &info) => 0;
  95. info.type => LFS_TYPE_DIR;
  96. buffer[NAMEMULT] = '/';
  97. for (int j = 0; j < NAMEMULT; j++) {
  98. buffer[j+NAMEMULT+1] = '0'+i;
  99. }
  100. buffer[2*NAMEMULT+1] = '\0';
  101. lfs_file_open(&lfs, &file, (char*)buffer, LFS_O_RDONLY) => 0;
  102. size = NAMEMULT;
  103. for (int j = 0; j < i*FILEMULT; j++) {
  104. uint8_t rbuffer[1024];
  105. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  106. memcmp(buffer, rbuffer, size) => 0;
  107. }
  108. lfs_file_close(&lfs, &file) => 0;
  109. }
  110. lfs_unmount(&lfs) => 0;
  111. }
  112. '''
  113. [[case]] # single unreadable blocks (can't read)
  114. define.LFS_ERASE_CYCLES = 0xffffffff
  115. define.LFS_BADBLOCK_BEHAVIOR = 'LFS_TESTBD_BADBLOCK_NOREAD'
  116. define.NAMEMULT = 64
  117. define.FILEMULT = 1
  118. code = '''
  119. for (lfs_block_t badblock = 2; badblock < LFS_BLOCK_COUNT/2; badblock++) {
  120. lfs_testbd_setwear(&cfg, badblock-1, 0) => 0;
  121. lfs_testbd_setwear(&cfg, badblock, 0xffffffff) => 0;
  122. lfs_format(&lfs, &cfg) => 0;
  123. lfs_mount(&lfs, &cfg) => 0;
  124. for (int i = 1; i < 10; i++) {
  125. for (int j = 0; j < NAMEMULT; j++) {
  126. buffer[j] = '0'+i;
  127. }
  128. buffer[NAMEMULT] = '\0';
  129. lfs_mkdir(&lfs, (char*)buffer) => 0;
  130. buffer[NAMEMULT] = '/';
  131. for (int j = 0; j < NAMEMULT; j++) {
  132. buffer[j+NAMEMULT+1] = '0'+i;
  133. }
  134. buffer[2*NAMEMULT+1] = '\0';
  135. lfs_file_open(&lfs, &file, (char*)buffer,
  136. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  137. size = NAMEMULT;
  138. for (int j = 0; j < i*FILEMULT; j++) {
  139. lfs_file_write(&lfs, &file, buffer, size) => size;
  140. }
  141. lfs_file_close(&lfs, &file) => 0;
  142. }
  143. lfs_unmount(&lfs) => 0;
  144. lfs_mount(&lfs, &cfg) => 0;
  145. for (int i = 1; i < 10; i++) {
  146. for (int j = 0; j < NAMEMULT; j++) {
  147. buffer[j] = '0'+i;
  148. }
  149. buffer[NAMEMULT] = '\0';
  150. lfs_stat(&lfs, (char*)buffer, &info) => 0;
  151. info.type => LFS_TYPE_DIR;
  152. buffer[NAMEMULT] = '/';
  153. for (int j = 0; j < NAMEMULT; j++) {
  154. buffer[j+NAMEMULT+1] = '0'+i;
  155. }
  156. buffer[2*NAMEMULT+1] = '\0';
  157. lfs_file_open(&lfs, &file, (char*)buffer, LFS_O_RDONLY) => 0;
  158. size = NAMEMULT;
  159. for (int j = 0; j < i*FILEMULT; j++) {
  160. uint8_t rbuffer[1024];
  161. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  162. memcmp(buffer, rbuffer, size) => 0;
  163. }
  164. lfs_file_close(&lfs, &file) => 0;
  165. }
  166. lfs_unmount(&lfs) => 0;
  167. }
  168. '''
  169. [[case]] # region corruption (causes cascading failures)
  170. define.LFS_ERASE_CYCLES = 0xffffffff
  171. define.LFS_BADBLOCK_BEHAVIOR = [
  172. 'LFS_TESTBD_BADBLOCK_NOPROG',
  173. 'LFS_TESTBD_BADBLOCK_NOERASE',
  174. 'LFS_TESTBD_BADBLOCK_NOREAD',
  175. ]
  176. define.NAMEMULT = 64
  177. define.FILEMULT = 1
  178. code = '''
  179. for (lfs_block_t i = 0; i < (LFS_BLOCK_COUNT-2)/2; i++) {
  180. lfs_testbd_setwear(&cfg, i+2, 0xffffffff) => 0;
  181. }
  182. lfs_format(&lfs, &cfg) => 0;
  183. lfs_mount(&lfs, &cfg) => 0;
  184. for (int i = 1; i < 10; i++) {
  185. for (int j = 0; j < NAMEMULT; j++) {
  186. buffer[j] = '0'+i;
  187. }
  188. buffer[NAMEMULT] = '\0';
  189. lfs_mkdir(&lfs, (char*)buffer) => 0;
  190. buffer[NAMEMULT] = '/';
  191. for (int j = 0; j < NAMEMULT; j++) {
  192. buffer[j+NAMEMULT+1] = '0'+i;
  193. }
  194. buffer[2*NAMEMULT+1] = '\0';
  195. lfs_file_open(&lfs, &file, (char*)buffer,
  196. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  197. size = NAMEMULT;
  198. for (int j = 0; j < i*FILEMULT; j++) {
  199. lfs_file_write(&lfs, &file, buffer, size) => size;
  200. }
  201. lfs_file_close(&lfs, &file) => 0;
  202. }
  203. lfs_unmount(&lfs) => 0;
  204. lfs_mount(&lfs, &cfg) => 0;
  205. for (int i = 1; i < 10; i++) {
  206. for (int j = 0; j < NAMEMULT; j++) {
  207. buffer[j] = '0'+i;
  208. }
  209. buffer[NAMEMULT] = '\0';
  210. lfs_stat(&lfs, (char*)buffer, &info) => 0;
  211. info.type => LFS_TYPE_DIR;
  212. buffer[NAMEMULT] = '/';
  213. for (int j = 0; j < NAMEMULT; j++) {
  214. buffer[j+NAMEMULT+1] = '0'+i;
  215. }
  216. buffer[2*NAMEMULT+1] = '\0';
  217. lfs_file_open(&lfs, &file, (char*)buffer, LFS_O_RDONLY) => 0;
  218. size = NAMEMULT;
  219. for (int j = 0; j < i*FILEMULT; j++) {
  220. uint8_t rbuffer[1024];
  221. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  222. memcmp(buffer, rbuffer, size) => 0;
  223. }
  224. lfs_file_close(&lfs, &file) => 0;
  225. }
  226. lfs_unmount(&lfs) => 0;
  227. '''
  228. [[case]] # alternating corruption (causes cascading failures)
  229. define.LFS_ERASE_CYCLES = 0xffffffff
  230. define.LFS_BADBLOCK_BEHAVIOR = [
  231. 'LFS_TESTBD_BADBLOCK_NOPROG',
  232. 'LFS_TESTBD_BADBLOCK_NOERASE',
  233. 'LFS_TESTBD_BADBLOCK_NOREAD',
  234. ]
  235. define.NAMEMULT = 64
  236. define.FILEMULT = 1
  237. code = '''
  238. for (lfs_block_t i = 0; i < (LFS_BLOCK_COUNT-2)/2; i++) {
  239. lfs_testbd_setwear(&cfg, (2*i) + 2, 0xffffffff) => 0;
  240. }
  241. lfs_format(&lfs, &cfg) => 0;
  242. lfs_mount(&lfs, &cfg) => 0;
  243. for (int i = 1; i < 10; i++) {
  244. for (int j = 0; j < NAMEMULT; j++) {
  245. buffer[j] = '0'+i;
  246. }
  247. buffer[NAMEMULT] = '\0';
  248. lfs_mkdir(&lfs, (char*)buffer) => 0;
  249. buffer[NAMEMULT] = '/';
  250. for (int j = 0; j < NAMEMULT; j++) {
  251. buffer[j+NAMEMULT+1] = '0'+i;
  252. }
  253. buffer[2*NAMEMULT+1] = '\0';
  254. lfs_file_open(&lfs, &file, (char*)buffer,
  255. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  256. size = NAMEMULT;
  257. for (int j = 0; j < i*FILEMULT; j++) {
  258. lfs_file_write(&lfs, &file, buffer, size) => size;
  259. }
  260. lfs_file_close(&lfs, &file) => 0;
  261. }
  262. lfs_unmount(&lfs) => 0;
  263. lfs_mount(&lfs, &cfg) => 0;
  264. for (int i = 1; i < 10; i++) {
  265. for (int j = 0; j < NAMEMULT; j++) {
  266. buffer[j] = '0'+i;
  267. }
  268. buffer[NAMEMULT] = '\0';
  269. lfs_stat(&lfs, (char*)buffer, &info) => 0;
  270. info.type => LFS_TYPE_DIR;
  271. buffer[NAMEMULT] = '/';
  272. for (int j = 0; j < NAMEMULT; j++) {
  273. buffer[j+NAMEMULT+1] = '0'+i;
  274. }
  275. buffer[2*NAMEMULT+1] = '\0';
  276. lfs_file_open(&lfs, &file, (char*)buffer, LFS_O_RDONLY) => 0;
  277. size = NAMEMULT;
  278. for (int j = 0; j < i*FILEMULT; j++) {
  279. uint8_t rbuffer[1024];
  280. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  281. memcmp(buffer, rbuffer, size) => 0;
  282. }
  283. lfs_file_close(&lfs, &file) => 0;
  284. }
  285. lfs_unmount(&lfs) => 0;
  286. '''
  287. # other corner cases
  288. [[case]] # bad superblocks (corrupt 1 or 0)
  289. define.LFS_ERASE_CYCLES = 0xffffffff
  290. define.LFS_BADBLOCK_BEHAVIOR = [
  291. 'LFS_TESTBD_BADBLOCK_NOPROG',
  292. 'LFS_TESTBD_BADBLOCK_NOERASE',
  293. 'LFS_TESTBD_BADBLOCK_NOREAD',
  294. ]
  295. code = '''
  296. lfs_testbd_setwear(&cfg, 0, 0xffffffff) => 0;
  297. lfs_testbd_setwear(&cfg, 1, 0xffffffff) => 0;
  298. lfs_format(&lfs, &cfg) => LFS_ERR_NOSPC;
  299. lfs_mount(&lfs, &cfg) => LFS_ERR_CORRUPT;
  300. '''