test_files.toml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. [cases.test_files_simple]
  2. defines.INLINE_MAX = [0, -1, 8]
  3. code = '''
  4. lfs_t lfs;
  5. lfs_format(&lfs, cfg) => 0;
  6. lfs_mount(&lfs, cfg) => 0;
  7. lfs_file_t file;
  8. lfs_file_open(&lfs, &file, "hello",
  9. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  10. lfs_size_t size = strlen("Hello World!")+1;
  11. uint8_t buffer[1024];
  12. strcpy((char*)buffer, "Hello World!");
  13. lfs_file_write(&lfs, &file, buffer, size) => size;
  14. lfs_file_close(&lfs, &file) => 0;
  15. lfs_unmount(&lfs) => 0;
  16. lfs_mount(&lfs, cfg) => 0;
  17. lfs_file_open(&lfs, &file, "hello", LFS_O_RDONLY) => 0;
  18. lfs_file_read(&lfs, &file, buffer, size) => size;
  19. assert(strcmp((char*)buffer, "Hello World!") == 0);
  20. lfs_file_close(&lfs, &file) => 0;
  21. lfs_unmount(&lfs) => 0;
  22. '''
  23. [cases.test_files_large]
  24. defines.SIZE = [32, 8192, 262144, 0, 7, 8193]
  25. defines.CHUNKSIZE = [31, 16, 33, 1, 1023]
  26. defines.INLINE_MAX = [0, -1, 8]
  27. code = '''
  28. lfs_t lfs;
  29. lfs_format(&lfs, cfg) => 0;
  30. // write
  31. lfs_mount(&lfs, cfg) => 0;
  32. lfs_file_t file;
  33. lfs_file_open(&lfs, &file, "avacado",
  34. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  35. uint32_t prng = 1;
  36. uint8_t buffer[1024];
  37. for (lfs_size_t i = 0; i < SIZE; i += CHUNKSIZE) {
  38. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE-i);
  39. for (lfs_size_t b = 0; b < chunk; b++) {
  40. buffer[b] = TEST_PRNG(&prng) & 0xff;
  41. }
  42. lfs_file_write(&lfs, &file, buffer, chunk) => chunk;
  43. }
  44. lfs_file_close(&lfs, &file) => 0;
  45. lfs_unmount(&lfs) => 0;
  46. // read
  47. lfs_mount(&lfs, cfg) => 0;
  48. lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY) => 0;
  49. lfs_file_size(&lfs, &file) => SIZE;
  50. prng = 1;
  51. for (lfs_size_t i = 0; i < SIZE; i += CHUNKSIZE) {
  52. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE-i);
  53. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  54. for (lfs_size_t b = 0; b < chunk; b++) {
  55. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  56. }
  57. }
  58. lfs_file_read(&lfs, &file, buffer, CHUNKSIZE) => 0;
  59. lfs_file_close(&lfs, &file) => 0;
  60. lfs_unmount(&lfs) => 0;
  61. '''
  62. [cases.test_files_rewrite]
  63. defines.SIZE1 = [32, 8192, 131072, 0, 7, 8193]
  64. defines.SIZE2 = [32, 8192, 131072, 0, 7, 8193]
  65. defines.CHUNKSIZE = [31, 16, 1]
  66. defines.INLINE_MAX = [0, -1, 8]
  67. code = '''
  68. lfs_t lfs;
  69. lfs_format(&lfs, cfg) => 0;
  70. // write
  71. lfs_mount(&lfs, cfg) => 0;
  72. lfs_file_t file;
  73. uint8_t buffer[1024];
  74. lfs_file_open(&lfs, &file, "avacado",
  75. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  76. uint32_t prng = 1;
  77. for (lfs_size_t i = 0; i < SIZE1; i += CHUNKSIZE) {
  78. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i);
  79. for (lfs_size_t b = 0; b < chunk; b++) {
  80. buffer[b] = TEST_PRNG(&prng) & 0xff;
  81. }
  82. lfs_file_write(&lfs, &file, buffer, chunk) => chunk;
  83. }
  84. lfs_file_close(&lfs, &file) => 0;
  85. lfs_unmount(&lfs) => 0;
  86. // read
  87. lfs_mount(&lfs, cfg) => 0;
  88. lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY) => 0;
  89. lfs_file_size(&lfs, &file) => SIZE1;
  90. prng = 1;
  91. for (lfs_size_t i = 0; i < SIZE1; i += CHUNKSIZE) {
  92. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i);
  93. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  94. for (lfs_size_t b = 0; b < chunk; b++) {
  95. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  96. }
  97. }
  98. lfs_file_read(&lfs, &file, buffer, CHUNKSIZE) => 0;
  99. lfs_file_close(&lfs, &file) => 0;
  100. lfs_unmount(&lfs) => 0;
  101. // rewrite
  102. lfs_mount(&lfs, cfg) => 0;
  103. lfs_file_open(&lfs, &file, "avacado", LFS_O_WRONLY) => 0;
  104. prng = 2;
  105. for (lfs_size_t i = 0; i < SIZE2; i += CHUNKSIZE) {
  106. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE2-i);
  107. for (lfs_size_t b = 0; b < chunk; b++) {
  108. buffer[b] = TEST_PRNG(&prng) & 0xff;
  109. }
  110. lfs_file_write(&lfs, &file, buffer, chunk) => chunk;
  111. }
  112. lfs_file_close(&lfs, &file) => 0;
  113. lfs_unmount(&lfs) => 0;
  114. // read
  115. lfs_mount(&lfs, cfg) => 0;
  116. lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY) => 0;
  117. lfs_file_size(&lfs, &file) => lfs_max(SIZE1, SIZE2);
  118. prng = 2;
  119. for (lfs_size_t i = 0; i < SIZE2; i += CHUNKSIZE) {
  120. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE2-i);
  121. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  122. for (lfs_size_t b = 0; b < chunk; b++) {
  123. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  124. }
  125. }
  126. if (SIZE1 > SIZE2) {
  127. prng = 1;
  128. for (lfs_size_t b = 0; b < SIZE2; b++) {
  129. TEST_PRNG(&prng);
  130. }
  131. for (lfs_size_t i = SIZE2; i < SIZE1; i += CHUNKSIZE) {
  132. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i);
  133. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  134. for (lfs_size_t b = 0; b < chunk; b++) {
  135. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  136. }
  137. }
  138. }
  139. lfs_file_read(&lfs, &file, buffer, CHUNKSIZE) => 0;
  140. lfs_file_close(&lfs, &file) => 0;
  141. lfs_unmount(&lfs) => 0;
  142. '''
  143. [cases.test_files_append]
  144. defines.SIZE1 = [32, 8192, 131072, 0, 7, 8193]
  145. defines.SIZE2 = [32, 8192, 131072, 0, 7, 8193]
  146. defines.CHUNKSIZE = [31, 16, 1]
  147. defines.INLINE_MAX = [0, -1, 8]
  148. code = '''
  149. lfs_t lfs;
  150. lfs_format(&lfs, cfg) => 0;
  151. // write
  152. lfs_mount(&lfs, cfg) => 0;
  153. lfs_file_t file;
  154. uint8_t buffer[1024];
  155. lfs_file_open(&lfs, &file, "avacado",
  156. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  157. uint32_t prng = 1;
  158. for (lfs_size_t i = 0; i < SIZE1; i += CHUNKSIZE) {
  159. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i);
  160. for (lfs_size_t b = 0; b < chunk; b++) {
  161. buffer[b] = TEST_PRNG(&prng) & 0xff;
  162. }
  163. lfs_file_write(&lfs, &file, buffer, chunk) => chunk;
  164. }
  165. lfs_file_close(&lfs, &file) => 0;
  166. lfs_unmount(&lfs) => 0;
  167. // read
  168. lfs_mount(&lfs, cfg) => 0;
  169. lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY) => 0;
  170. lfs_file_size(&lfs, &file) => SIZE1;
  171. prng = 1;
  172. for (lfs_size_t i = 0; i < SIZE1; i += CHUNKSIZE) {
  173. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i);
  174. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  175. for (lfs_size_t b = 0; b < chunk; b++) {
  176. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  177. }
  178. }
  179. lfs_file_read(&lfs, &file, buffer, CHUNKSIZE) => 0;
  180. lfs_file_close(&lfs, &file) => 0;
  181. lfs_unmount(&lfs) => 0;
  182. // append
  183. lfs_mount(&lfs, cfg) => 0;
  184. lfs_file_open(&lfs, &file, "avacado", LFS_O_WRONLY | LFS_O_APPEND) => 0;
  185. prng = 2;
  186. for (lfs_size_t i = 0; i < SIZE2; i += CHUNKSIZE) {
  187. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE2-i);
  188. for (lfs_size_t b = 0; b < chunk; b++) {
  189. buffer[b] = TEST_PRNG(&prng) & 0xff;
  190. }
  191. lfs_file_write(&lfs, &file, buffer, chunk) => chunk;
  192. }
  193. lfs_file_close(&lfs, &file) => 0;
  194. lfs_unmount(&lfs) => 0;
  195. // read
  196. lfs_mount(&lfs, cfg) => 0;
  197. lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY) => 0;
  198. lfs_file_size(&lfs, &file) => SIZE1 + SIZE2;
  199. prng = 1;
  200. for (lfs_size_t i = 0; i < SIZE1; i += CHUNKSIZE) {
  201. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i);
  202. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  203. for (lfs_size_t b = 0; b < chunk; b++) {
  204. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  205. }
  206. }
  207. prng = 2;
  208. for (lfs_size_t i = 0; i < SIZE2; i += CHUNKSIZE) {
  209. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE2-i);
  210. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  211. for (lfs_size_t b = 0; b < chunk; b++) {
  212. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  213. }
  214. }
  215. lfs_file_read(&lfs, &file, buffer, CHUNKSIZE) => 0;
  216. lfs_file_close(&lfs, &file) => 0;
  217. lfs_unmount(&lfs) => 0;
  218. '''
  219. [cases.test_files_truncate]
  220. defines.SIZE1 = [32, 8192, 131072, 0, 7, 8193]
  221. defines.SIZE2 = [32, 8192, 131072, 0, 7, 8193]
  222. defines.CHUNKSIZE = [31, 16, 1]
  223. defines.INLINE_MAX = [0, -1, 8]
  224. code = '''
  225. lfs_t lfs;
  226. lfs_format(&lfs, cfg) => 0;
  227. // write
  228. lfs_mount(&lfs, cfg) => 0;
  229. lfs_file_t file;
  230. uint8_t buffer[1024];
  231. lfs_file_open(&lfs, &file, "avacado",
  232. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  233. uint32_t prng = 1;
  234. for (lfs_size_t i = 0; i < SIZE1; i += CHUNKSIZE) {
  235. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i);
  236. for (lfs_size_t b = 0; b < chunk; b++) {
  237. buffer[b] = TEST_PRNG(&prng) & 0xff;
  238. }
  239. lfs_file_write(&lfs, &file, buffer, chunk) => chunk;
  240. }
  241. lfs_file_close(&lfs, &file) => 0;
  242. lfs_unmount(&lfs) => 0;
  243. // read
  244. lfs_mount(&lfs, cfg) => 0;
  245. lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY) => 0;
  246. lfs_file_size(&lfs, &file) => SIZE1;
  247. prng = 1;
  248. for (lfs_size_t i = 0; i < SIZE1; i += CHUNKSIZE) {
  249. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i);
  250. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  251. for (lfs_size_t b = 0; b < chunk; b++) {
  252. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  253. }
  254. }
  255. lfs_file_read(&lfs, &file, buffer, CHUNKSIZE) => 0;
  256. lfs_file_close(&lfs, &file) => 0;
  257. lfs_unmount(&lfs) => 0;
  258. // truncate
  259. lfs_mount(&lfs, cfg) => 0;
  260. lfs_file_open(&lfs, &file, "avacado", LFS_O_WRONLY | LFS_O_TRUNC) => 0;
  261. prng = 2;
  262. for (lfs_size_t i = 0; i < SIZE2; i += CHUNKSIZE) {
  263. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE2-i);
  264. for (lfs_size_t b = 0; b < chunk; b++) {
  265. buffer[b] = TEST_PRNG(&prng) & 0xff;
  266. }
  267. lfs_file_write(&lfs, &file, buffer, chunk) => chunk;
  268. }
  269. lfs_file_close(&lfs, &file) => 0;
  270. lfs_unmount(&lfs) => 0;
  271. // read
  272. lfs_mount(&lfs, cfg) => 0;
  273. lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY) => 0;
  274. lfs_file_size(&lfs, &file) => SIZE2;
  275. prng = 2;
  276. for (lfs_size_t i = 0; i < SIZE2; i += CHUNKSIZE) {
  277. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE2-i);
  278. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  279. for (lfs_size_t b = 0; b < chunk; b++) {
  280. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  281. }
  282. }
  283. lfs_file_read(&lfs, &file, buffer, CHUNKSIZE) => 0;
  284. lfs_file_close(&lfs, &file) => 0;
  285. lfs_unmount(&lfs) => 0;
  286. '''
  287. [cases.test_files_reentrant_write]
  288. defines.SIZE = [32, 0, 7, 2049]
  289. defines.CHUNKSIZE = [31, 16, 65]
  290. defines.INLINE_MAX = [0, -1, 8]
  291. reentrant = true
  292. code = '''
  293. lfs_t lfs;
  294. int err = lfs_mount(&lfs, cfg);
  295. if (err) {
  296. lfs_format(&lfs, cfg) => 0;
  297. lfs_mount(&lfs, cfg) => 0;
  298. }
  299. lfs_file_t file;
  300. uint8_t buffer[1024];
  301. err = lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY);
  302. assert(err == LFS_ERR_NOENT || err == 0);
  303. if (err == 0) {
  304. // can only be 0 (new file) or full size
  305. lfs_size_t size = lfs_file_size(&lfs, &file);
  306. assert(size == 0 || size == SIZE);
  307. lfs_file_close(&lfs, &file) => 0;
  308. }
  309. // write
  310. lfs_file_open(&lfs, &file, "avacado", LFS_O_WRONLY | LFS_O_CREAT) => 0;
  311. uint32_t prng = 1;
  312. for (lfs_size_t i = 0; i < SIZE; i += CHUNKSIZE) {
  313. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE-i);
  314. for (lfs_size_t b = 0; b < chunk; b++) {
  315. buffer[b] = TEST_PRNG(&prng) & 0xff;
  316. }
  317. lfs_file_write(&lfs, &file, buffer, chunk) => chunk;
  318. }
  319. lfs_file_close(&lfs, &file) => 0;
  320. // read
  321. lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY) => 0;
  322. lfs_file_size(&lfs, &file) => SIZE;
  323. prng = 1;
  324. for (lfs_size_t i = 0; i < SIZE; i += CHUNKSIZE) {
  325. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE-i);
  326. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  327. for (lfs_size_t b = 0; b < chunk; b++) {
  328. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  329. }
  330. }
  331. lfs_file_read(&lfs, &file, buffer, CHUNKSIZE) => 0;
  332. lfs_file_close(&lfs, &file) => 0;
  333. lfs_unmount(&lfs) => 0;
  334. '''
  335. [cases.test_files_reentrant_write_sync]
  336. defines = [
  337. # append (O(n))
  338. {MODE='LFS_O_APPEND',
  339. SIZE=[32, 0, 7, 2049],
  340. CHUNKSIZE=[31, 16, 65],
  341. INLINE_MAX=[0, -1, 8]},
  342. # truncate (O(n^2))
  343. {MODE='LFS_O_TRUNC',
  344. SIZE=[32, 0, 7, 200],
  345. CHUNKSIZE=[31, 16, 65],
  346. INLINE_MAX=[0, -1, 8]},
  347. # rewrite (O(n^2))
  348. {MODE=0,
  349. SIZE=[32, 0, 7, 200],
  350. CHUNKSIZE=[31, 16, 65],
  351. INLINE_MAX=[0, -1, 8]},
  352. ]
  353. reentrant = true
  354. code = '''
  355. lfs_t lfs;
  356. int err = lfs_mount(&lfs, cfg);
  357. if (err) {
  358. lfs_format(&lfs, cfg) => 0;
  359. lfs_mount(&lfs, cfg) => 0;
  360. }
  361. lfs_file_t file;
  362. uint8_t buffer[1024];
  363. err = lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY);
  364. assert(err == LFS_ERR_NOENT || err == 0);
  365. if (err == 0) {
  366. // with syncs we could be any size, but it at least must be valid data
  367. lfs_size_t size = lfs_file_size(&lfs, &file);
  368. assert(size <= SIZE);
  369. uint32_t prng = 1;
  370. for (lfs_size_t i = 0; i < size; i += CHUNKSIZE) {
  371. lfs_size_t chunk = lfs_min(CHUNKSIZE, size-i);
  372. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  373. for (lfs_size_t b = 0; b < chunk; b++) {
  374. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  375. }
  376. }
  377. lfs_file_close(&lfs, &file) => 0;
  378. }
  379. // write
  380. lfs_file_open(&lfs, &file, "avacado",
  381. LFS_O_WRONLY | LFS_O_CREAT | MODE) => 0;
  382. lfs_size_t size = lfs_file_size(&lfs, &file);
  383. assert(size <= SIZE);
  384. uint32_t prng = 1;
  385. lfs_size_t skip = (MODE == LFS_O_APPEND) ? size : 0;
  386. for (lfs_size_t b = 0; b < skip; b++) {
  387. TEST_PRNG(&prng);
  388. }
  389. for (lfs_size_t i = skip; i < SIZE; i += CHUNKSIZE) {
  390. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE-i);
  391. for (lfs_size_t b = 0; b < chunk; b++) {
  392. buffer[b] = TEST_PRNG(&prng) & 0xff;
  393. }
  394. lfs_file_write(&lfs, &file, buffer, chunk) => chunk;
  395. lfs_file_sync(&lfs, &file) => 0;
  396. }
  397. lfs_file_close(&lfs, &file) => 0;
  398. // read
  399. lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY) => 0;
  400. lfs_file_size(&lfs, &file) => SIZE;
  401. prng = 1;
  402. for (lfs_size_t i = 0; i < SIZE; i += CHUNKSIZE) {
  403. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE-i);
  404. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  405. for (lfs_size_t b = 0; b < chunk; b++) {
  406. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  407. }
  408. }
  409. lfs_file_read(&lfs, &file, buffer, CHUNKSIZE) => 0;
  410. lfs_file_close(&lfs, &file) => 0;
  411. lfs_unmount(&lfs) => 0;
  412. '''
  413. [cases.test_files_many]
  414. defines.N = 300
  415. code = '''
  416. lfs_t lfs;
  417. lfs_format(&lfs, cfg) => 0;
  418. // create N files of 7 bytes
  419. lfs_mount(&lfs, cfg) => 0;
  420. for (int i = 0; i < N; i++) {
  421. lfs_file_t file;
  422. char path[1024];
  423. sprintf(path, "file_%03d", i);
  424. lfs_file_open(&lfs, &file, path,
  425. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  426. char wbuffer[1024];
  427. lfs_size_t size = 7;
  428. sprintf(wbuffer, "Hi %03d", i);
  429. lfs_file_write(&lfs, &file, wbuffer, size) => size;
  430. lfs_file_close(&lfs, &file) => 0;
  431. char rbuffer[1024];
  432. lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
  433. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  434. assert(strcmp(rbuffer, wbuffer) == 0);
  435. lfs_file_close(&lfs, &file) => 0;
  436. }
  437. lfs_unmount(&lfs) => 0;
  438. '''
  439. [cases.test_files_many_power_cycle]
  440. defines.N = 300
  441. code = '''
  442. lfs_t lfs;
  443. lfs_format(&lfs, cfg) => 0;
  444. // create N files of 7 bytes
  445. lfs_mount(&lfs, cfg) => 0;
  446. for (int i = 0; i < N; i++) {
  447. lfs_file_t file;
  448. char path[1024];
  449. sprintf(path, "file_%03d", i);
  450. lfs_file_open(&lfs, &file, path,
  451. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  452. char wbuffer[1024];
  453. lfs_size_t size = 7;
  454. sprintf(wbuffer, "Hi %03d", i);
  455. lfs_file_write(&lfs, &file, wbuffer, size) => size;
  456. lfs_file_close(&lfs, &file) => 0;
  457. lfs_unmount(&lfs) => 0;
  458. char rbuffer[1024];
  459. lfs_mount(&lfs, cfg) => 0;
  460. lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
  461. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  462. assert(strcmp(rbuffer, wbuffer) == 0);
  463. lfs_file_close(&lfs, &file) => 0;
  464. }
  465. lfs_unmount(&lfs) => 0;
  466. '''
  467. [cases.test_files_many_power_loss]
  468. defines.N = 300
  469. reentrant = true
  470. code = '''
  471. lfs_t lfs;
  472. int err = lfs_mount(&lfs, cfg);
  473. if (err) {
  474. lfs_format(&lfs, cfg) => 0;
  475. lfs_mount(&lfs, cfg) => 0;
  476. }
  477. // create N files of 7 bytes
  478. for (int i = 0; i < N; i++) {
  479. lfs_file_t file;
  480. char path[1024];
  481. sprintf(path, "file_%03d", i);
  482. err = lfs_file_open(&lfs, &file, path, LFS_O_WRONLY | LFS_O_CREAT);
  483. char wbuffer[1024];
  484. lfs_size_t size = 7;
  485. sprintf(wbuffer, "Hi %03d", i);
  486. if ((lfs_size_t)lfs_file_size(&lfs, &file) != size) {
  487. lfs_file_write(&lfs, &file, wbuffer, size) => size;
  488. }
  489. lfs_file_close(&lfs, &file) => 0;
  490. char rbuffer[1024];
  491. lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
  492. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  493. assert(strcmp(rbuffer, wbuffer) == 0);
  494. lfs_file_close(&lfs, &file) => 0;
  495. }
  496. lfs_unmount(&lfs) => 0;
  497. '''