test_files.toml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  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. defines.POWERLOSS_BEHAVIOR = [
  293. 'LFS_EMUBD_POWERLOSS_NOOP',
  294. 'LFS_EMUBD_POWERLOSS_OOO',
  295. ]
  296. code = '''
  297. lfs_t lfs;
  298. int err = lfs_mount(&lfs, cfg);
  299. if (err) {
  300. lfs_format(&lfs, cfg) => 0;
  301. lfs_mount(&lfs, cfg) => 0;
  302. }
  303. lfs_file_t file;
  304. uint8_t buffer[1024];
  305. err = lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY);
  306. assert(err == LFS_ERR_NOENT || err == 0);
  307. if (err == 0) {
  308. // can only be 0 (new file) or full size
  309. lfs_size_t size = lfs_file_size(&lfs, &file);
  310. assert(size == 0 || size == SIZE);
  311. lfs_file_close(&lfs, &file) => 0;
  312. }
  313. // write
  314. lfs_file_open(&lfs, &file, "avacado", LFS_O_WRONLY | LFS_O_CREAT) => 0;
  315. uint32_t prng = 1;
  316. for (lfs_size_t i = 0; i < SIZE; i += CHUNKSIZE) {
  317. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE-i);
  318. for (lfs_size_t b = 0; b < chunk; b++) {
  319. buffer[b] = TEST_PRNG(&prng) & 0xff;
  320. }
  321. lfs_file_write(&lfs, &file, buffer, chunk) => chunk;
  322. }
  323. lfs_file_close(&lfs, &file) => 0;
  324. // read
  325. lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY) => 0;
  326. lfs_file_size(&lfs, &file) => SIZE;
  327. prng = 1;
  328. for (lfs_size_t i = 0; i < SIZE; i += CHUNKSIZE) {
  329. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE-i);
  330. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  331. for (lfs_size_t b = 0; b < chunk; b++) {
  332. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  333. }
  334. }
  335. lfs_file_read(&lfs, &file, buffer, CHUNKSIZE) => 0;
  336. lfs_file_close(&lfs, &file) => 0;
  337. lfs_unmount(&lfs) => 0;
  338. '''
  339. [cases.test_files_reentrant_write_sync]
  340. defines = [
  341. # append (O(n))
  342. {MODE='LFS_O_APPEND',
  343. SIZE=[32, 0, 7, 2049],
  344. CHUNKSIZE=[31, 16, 65],
  345. INLINE_MAX=[0, -1, 8]},
  346. # truncate (O(n^2))
  347. {MODE='LFS_O_TRUNC',
  348. SIZE=[32, 0, 7, 200],
  349. CHUNKSIZE=[31, 16, 65],
  350. INLINE_MAX=[0, -1, 8]},
  351. # rewrite (O(n^2))
  352. {MODE=0,
  353. SIZE=[32, 0, 7, 200],
  354. CHUNKSIZE=[31, 16, 65],
  355. INLINE_MAX=[0, -1, 8]},
  356. ]
  357. reentrant = true
  358. code = '''
  359. lfs_t lfs;
  360. int err = lfs_mount(&lfs, cfg);
  361. if (err) {
  362. lfs_format(&lfs, cfg) => 0;
  363. lfs_mount(&lfs, cfg) => 0;
  364. }
  365. lfs_file_t file;
  366. uint8_t buffer[1024];
  367. err = lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY);
  368. assert(err == LFS_ERR_NOENT || err == 0);
  369. if (err == 0) {
  370. // with syncs we could be any size, but it at least must be valid data
  371. lfs_size_t size = lfs_file_size(&lfs, &file);
  372. assert(size <= SIZE);
  373. uint32_t prng = 1;
  374. for (lfs_size_t i = 0; i < size; i += CHUNKSIZE) {
  375. lfs_size_t chunk = lfs_min(CHUNKSIZE, size-i);
  376. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  377. for (lfs_size_t b = 0; b < chunk; b++) {
  378. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  379. }
  380. }
  381. lfs_file_close(&lfs, &file) => 0;
  382. }
  383. // write
  384. lfs_file_open(&lfs, &file, "avacado",
  385. LFS_O_WRONLY | LFS_O_CREAT | MODE) => 0;
  386. lfs_size_t size = lfs_file_size(&lfs, &file);
  387. assert(size <= SIZE);
  388. uint32_t prng = 1;
  389. lfs_size_t skip = (MODE == LFS_O_APPEND) ? size : 0;
  390. for (lfs_size_t b = 0; b < skip; b++) {
  391. TEST_PRNG(&prng);
  392. }
  393. for (lfs_size_t i = skip; i < SIZE; i += CHUNKSIZE) {
  394. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE-i);
  395. for (lfs_size_t b = 0; b < chunk; b++) {
  396. buffer[b] = TEST_PRNG(&prng) & 0xff;
  397. }
  398. lfs_file_write(&lfs, &file, buffer, chunk) => chunk;
  399. lfs_file_sync(&lfs, &file) => 0;
  400. }
  401. lfs_file_close(&lfs, &file) => 0;
  402. // read
  403. lfs_file_open(&lfs, &file, "avacado", LFS_O_RDONLY) => 0;
  404. lfs_file_size(&lfs, &file) => SIZE;
  405. prng = 1;
  406. for (lfs_size_t i = 0; i < SIZE; i += CHUNKSIZE) {
  407. lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE-i);
  408. lfs_file_read(&lfs, &file, buffer, chunk) => chunk;
  409. for (lfs_size_t b = 0; b < chunk; b++) {
  410. assert(buffer[b] == (TEST_PRNG(&prng) & 0xff));
  411. }
  412. }
  413. lfs_file_read(&lfs, &file, buffer, CHUNKSIZE) => 0;
  414. lfs_file_close(&lfs, &file) => 0;
  415. lfs_unmount(&lfs) => 0;
  416. '''
  417. [cases.test_files_many]
  418. defines.N = 300
  419. code = '''
  420. lfs_t lfs;
  421. lfs_format(&lfs, cfg) => 0;
  422. // create N files of 7 bytes
  423. lfs_mount(&lfs, cfg) => 0;
  424. for (int i = 0; i < N; i++) {
  425. lfs_file_t file;
  426. char path[1024];
  427. sprintf(path, "file_%03d", i);
  428. lfs_file_open(&lfs, &file, path,
  429. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  430. char wbuffer[1024];
  431. lfs_size_t size = 7;
  432. sprintf(wbuffer, "Hi %03d", i);
  433. lfs_file_write(&lfs, &file, wbuffer, size) => size;
  434. lfs_file_close(&lfs, &file) => 0;
  435. char rbuffer[1024];
  436. lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
  437. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  438. assert(strcmp(rbuffer, wbuffer) == 0);
  439. lfs_file_close(&lfs, &file) => 0;
  440. }
  441. lfs_unmount(&lfs) => 0;
  442. '''
  443. [cases.test_files_many_power_cycle]
  444. defines.N = 300
  445. code = '''
  446. lfs_t lfs;
  447. lfs_format(&lfs, cfg) => 0;
  448. // create N files of 7 bytes
  449. lfs_mount(&lfs, cfg) => 0;
  450. for (int i = 0; i < N; i++) {
  451. lfs_file_t file;
  452. char path[1024];
  453. sprintf(path, "file_%03d", i);
  454. lfs_file_open(&lfs, &file, path,
  455. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  456. char wbuffer[1024];
  457. lfs_size_t size = 7;
  458. sprintf(wbuffer, "Hi %03d", i);
  459. lfs_file_write(&lfs, &file, wbuffer, size) => size;
  460. lfs_file_close(&lfs, &file) => 0;
  461. lfs_unmount(&lfs) => 0;
  462. char rbuffer[1024];
  463. lfs_mount(&lfs, cfg) => 0;
  464. lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
  465. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  466. assert(strcmp(rbuffer, wbuffer) == 0);
  467. lfs_file_close(&lfs, &file) => 0;
  468. }
  469. lfs_unmount(&lfs) => 0;
  470. '''
  471. [cases.test_files_many_power_loss]
  472. defines.N = 300
  473. reentrant = true
  474. defines.POWERLOSS_BEHAVIOR = [
  475. 'LFS_EMUBD_POWERLOSS_NOOP',
  476. 'LFS_EMUBD_POWERLOSS_OOO',
  477. ]
  478. code = '''
  479. lfs_t lfs;
  480. int err = lfs_mount(&lfs, cfg);
  481. if (err) {
  482. lfs_format(&lfs, cfg) => 0;
  483. lfs_mount(&lfs, cfg) => 0;
  484. }
  485. // create N files of 7 bytes
  486. for (int i = 0; i < N; i++) {
  487. lfs_file_t file;
  488. char path[1024];
  489. sprintf(path, "file_%03d", i);
  490. err = lfs_file_open(&lfs, &file, path, LFS_O_WRONLY | LFS_O_CREAT);
  491. char wbuffer[1024];
  492. lfs_size_t size = 7;
  493. sprintf(wbuffer, "Hi %03d", i);
  494. if ((lfs_size_t)lfs_file_size(&lfs, &file) != size) {
  495. lfs_file_write(&lfs, &file, wbuffer, size) => size;
  496. }
  497. lfs_file_close(&lfs, &file) => 0;
  498. char rbuffer[1024];
  499. lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
  500. lfs_file_read(&lfs, &file, rbuffer, size) => size;
  501. assert(strcmp(rbuffer, wbuffer) == 0);
  502. lfs_file_close(&lfs, &file) => 0;
  503. }
  504. lfs_unmount(&lfs) => 0;
  505. '''