test_truncate.toml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. # simple truncate
  2. [cases.test_truncate_simple]
  3. defines.MEDIUMSIZE = [31, 32, 33, 511, 512, 513, 2047, 2048, 2049]
  4. defines.LARGESIZE = [32, 33, 512, 513, 2048, 2049, 8192, 8193]
  5. if = 'MEDIUMSIZE < LARGESIZE'
  6. code = '''
  7. lfs_t lfs;
  8. lfs_format(&lfs, cfg) => 0;
  9. lfs_mount(&lfs, cfg) => 0;
  10. lfs_file_t file;
  11. lfs_file_open(&lfs, &file, "baldynoop",
  12. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  13. uint8_t buffer[1024];
  14. strcpy((char*)buffer, "hair");
  15. size_t size = strlen((char*)buffer);
  16. for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
  17. lfs_file_write(&lfs, &file, buffer, lfs_min(size, LARGESIZE-j))
  18. => lfs_min(size, LARGESIZE-j);
  19. }
  20. lfs_file_size(&lfs, &file) => LARGESIZE;
  21. lfs_file_close(&lfs, &file) => 0;
  22. lfs_unmount(&lfs) => 0;
  23. lfs_mount(&lfs, cfg) => 0;
  24. lfs_file_open(&lfs, &file, "baldynoop", LFS_O_RDWR) => 0;
  25. lfs_file_size(&lfs, &file) => LARGESIZE;
  26. lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0;
  27. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  28. lfs_file_close(&lfs, &file) => 0;
  29. lfs_unmount(&lfs) => 0;
  30. lfs_mount(&lfs, cfg) => 0;
  31. lfs_file_open(&lfs, &file, "baldynoop", LFS_O_RDONLY) => 0;
  32. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  33. size = strlen("hair");
  34. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  35. lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  36. => lfs_min(size, MEDIUMSIZE-j);
  37. memcmp(buffer, "hair", lfs_min(size, MEDIUMSIZE-j)) => 0;
  38. }
  39. lfs_file_read(&lfs, &file, buffer, size) => 0;
  40. lfs_file_close(&lfs, &file) => 0;
  41. lfs_unmount(&lfs) => 0;
  42. '''
  43. # truncate and read
  44. [cases.test_truncate_read]
  45. defines.MEDIUMSIZE = [31, 32, 33, 511, 512, 513, 2047, 2048, 2049]
  46. defines.LARGESIZE = [32, 33, 512, 513, 2048, 2049, 8192, 8193]
  47. if = 'MEDIUMSIZE < LARGESIZE'
  48. code = '''
  49. lfs_t lfs;
  50. lfs_format(&lfs, cfg) => 0;
  51. lfs_mount(&lfs, cfg) => 0;
  52. lfs_file_t file;
  53. lfs_file_open(&lfs, &file, "baldyread",
  54. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  55. uint8_t buffer[1024];
  56. strcpy((char*)buffer, "hair");
  57. size_t size = strlen((char*)buffer);
  58. for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
  59. lfs_file_write(&lfs, &file, buffer, lfs_min(size, LARGESIZE-j))
  60. => lfs_min(size, LARGESIZE-j);
  61. }
  62. lfs_file_size(&lfs, &file) => LARGESIZE;
  63. lfs_file_close(&lfs, &file) => 0;
  64. lfs_unmount(&lfs) => 0;
  65. lfs_mount(&lfs, cfg) => 0;
  66. lfs_file_open(&lfs, &file, "baldyread", LFS_O_RDWR) => 0;
  67. lfs_file_size(&lfs, &file) => LARGESIZE;
  68. lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0;
  69. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  70. size = strlen("hair");
  71. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  72. lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  73. => lfs_min(size, MEDIUMSIZE-j);
  74. memcmp(buffer, "hair", lfs_min(size, MEDIUMSIZE-j)) => 0;
  75. }
  76. lfs_file_read(&lfs, &file, buffer, size) => 0;
  77. lfs_file_close(&lfs, &file) => 0;
  78. lfs_unmount(&lfs) => 0;
  79. lfs_mount(&lfs, cfg) => 0;
  80. lfs_file_open(&lfs, &file, "baldyread", LFS_O_RDONLY) => 0;
  81. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  82. size = strlen("hair");
  83. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  84. lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  85. => lfs_min(size, MEDIUMSIZE-j);
  86. memcmp(buffer, "hair", lfs_min(size, MEDIUMSIZE-j)) => 0;
  87. }
  88. lfs_file_read(&lfs, &file, buffer, size) => 0;
  89. lfs_file_close(&lfs, &file) => 0;
  90. lfs_unmount(&lfs) => 0;
  91. '''
  92. # write, truncate, and read
  93. [cases.test_truncate_write_read]
  94. code = '''
  95. lfs_t lfs;
  96. lfs_format(&lfs, cfg) => 0;
  97. lfs_mount(&lfs, cfg) => 0;
  98. lfs_file_t file;
  99. lfs_file_open(&lfs, &file, "sequence",
  100. LFS_O_RDWR | LFS_O_CREAT | LFS_O_TRUNC) => 0;
  101. uint8_t buffer[1024];
  102. size_t size = lfs_min(lfs.cfg->cache_size, sizeof(buffer)/2);
  103. lfs_size_t qsize = size / 4;
  104. uint8_t *wb = buffer;
  105. uint8_t *rb = buffer + size;
  106. for (lfs_off_t j = 0; j < size; ++j) {
  107. wb[j] = j;
  108. }
  109. /* Spread sequence over size */
  110. lfs_file_write(&lfs, &file, wb, size) => size;
  111. lfs_file_size(&lfs, &file) => size;
  112. lfs_file_tell(&lfs, &file) => size;
  113. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0;
  114. lfs_file_tell(&lfs, &file) => 0;
  115. /* Chop off the last quarter */
  116. lfs_size_t trunc = size - qsize;
  117. lfs_file_truncate(&lfs, &file, trunc) => 0;
  118. lfs_file_tell(&lfs, &file) => 0;
  119. lfs_file_size(&lfs, &file) => trunc;
  120. /* Read should produce first 3/4 */
  121. lfs_file_read(&lfs, &file, rb, size) => trunc;
  122. memcmp(rb, wb, trunc) => 0;
  123. /* Move to 1/4 */
  124. lfs_file_size(&lfs, &file) => trunc;
  125. lfs_file_seek(&lfs, &file, qsize, LFS_SEEK_SET) => qsize;
  126. lfs_file_tell(&lfs, &file) => qsize;
  127. /* Chop to 1/2 */
  128. trunc -= qsize;
  129. lfs_file_truncate(&lfs, &file, trunc) => 0;
  130. lfs_file_tell(&lfs, &file) => qsize;
  131. lfs_file_size(&lfs, &file) => trunc;
  132. /* Read should produce second quarter */
  133. lfs_file_read(&lfs, &file, rb, size) => trunc - qsize;
  134. memcmp(rb, wb + qsize, trunc - qsize) => 0;
  135. lfs_file_close(&lfs, &file) => 0;
  136. lfs_unmount(&lfs) => 0;
  137. '''
  138. # truncate and write
  139. [cases.test_truncate_write]
  140. defines.MEDIUMSIZE = [31, 32, 33, 511, 512, 513, 2047, 2048, 2049]
  141. defines.LARGESIZE = [32, 33, 512, 513, 2048, 2049, 8192, 8193]
  142. if = 'MEDIUMSIZE < LARGESIZE'
  143. code = '''
  144. lfs_t lfs;
  145. lfs_format(&lfs, cfg) => 0;
  146. lfs_mount(&lfs, cfg) => 0;
  147. lfs_file_t file;
  148. lfs_file_open(&lfs, &file, "baldywrite",
  149. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  150. uint8_t buffer[1024];
  151. strcpy((char*)buffer, "hair");
  152. size_t size = strlen((char*)buffer);
  153. for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
  154. lfs_file_write(&lfs, &file, buffer, lfs_min(size, LARGESIZE-j))
  155. => lfs_min(size, LARGESIZE-j);
  156. }
  157. lfs_file_size(&lfs, &file) => LARGESIZE;
  158. lfs_file_close(&lfs, &file) => 0;
  159. lfs_unmount(&lfs) => 0;
  160. lfs_mount(&lfs, cfg) => 0;
  161. lfs_file_open(&lfs, &file, "baldywrite", LFS_O_RDWR) => 0;
  162. lfs_file_size(&lfs, &file) => LARGESIZE;
  163. /* truncate */
  164. lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0;
  165. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  166. /* and write */
  167. strcpy((char*)buffer, "bald");
  168. size = strlen((char*)buffer);
  169. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  170. lfs_file_write(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  171. => lfs_min(size, MEDIUMSIZE-j);
  172. }
  173. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  174. lfs_file_close(&lfs, &file) => 0;
  175. lfs_unmount(&lfs) => 0;
  176. lfs_mount(&lfs, cfg) => 0;
  177. lfs_file_open(&lfs, &file, "baldywrite", LFS_O_RDONLY) => 0;
  178. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  179. size = strlen("bald");
  180. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  181. lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  182. => lfs_min(size, MEDIUMSIZE-j);
  183. memcmp(buffer, "bald", lfs_min(size, MEDIUMSIZE-j)) => 0;
  184. }
  185. lfs_file_read(&lfs, &file, buffer, size) => 0;
  186. lfs_file_close(&lfs, &file) => 0;
  187. lfs_unmount(&lfs) => 0;
  188. '''
  189. # truncate write under powerloss
  190. [cases.test_truncate_reentrant_write]
  191. defines.SMALLSIZE = [4, 512]
  192. defines.MEDIUMSIZE = [0, 3, 4, 5, 31, 32, 33, 511, 512, 513, 1023, 1024, 1025]
  193. defines.LARGESIZE = 2048
  194. reentrant = true
  195. code = '''
  196. lfs_t lfs;
  197. int err = lfs_mount(&lfs, cfg);
  198. if (err) {
  199. lfs_format(&lfs, cfg) => 0;
  200. lfs_mount(&lfs, cfg) => 0;
  201. }
  202. lfs_file_t file;
  203. err = lfs_file_open(&lfs, &file, "baldy", LFS_O_RDONLY);
  204. assert(!err || err == LFS_ERR_NOENT);
  205. if (!err) {
  206. size_t size = lfs_file_size(&lfs, &file);
  207. assert(size == 0 ||
  208. size == (size_t)LARGESIZE ||
  209. size == (size_t)MEDIUMSIZE ||
  210. size == (size_t)SMALLSIZE);
  211. for (lfs_off_t j = 0; j < size; j += 4) {
  212. uint8_t buffer[1024];
  213. lfs_file_read(&lfs, &file, buffer, lfs_min(4, size-j))
  214. => lfs_min(4, size-j);
  215. assert(memcmp(buffer, "hair", lfs_min(4, size-j)) == 0 ||
  216. memcmp(buffer, "bald", lfs_min(4, size-j)) == 0 ||
  217. memcmp(buffer, "comb", lfs_min(4, size-j)) == 0);
  218. }
  219. lfs_file_close(&lfs, &file) => 0;
  220. }
  221. lfs_file_open(&lfs, &file, "baldy",
  222. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
  223. lfs_file_size(&lfs, &file) => 0;
  224. uint8_t buffer[1024];
  225. strcpy((char*)buffer, "hair");
  226. size_t size = strlen((char*)buffer);
  227. for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
  228. lfs_file_write(&lfs, &file, buffer, lfs_min(size, LARGESIZE-j))
  229. => lfs_min(size, LARGESIZE-j);
  230. }
  231. lfs_file_size(&lfs, &file) => LARGESIZE;
  232. lfs_file_close(&lfs, &file) => 0;
  233. lfs_file_open(&lfs, &file, "baldy", LFS_O_RDWR) => 0;
  234. lfs_file_size(&lfs, &file) => LARGESIZE;
  235. /* truncate */
  236. lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0;
  237. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  238. /* and write */
  239. strcpy((char*)buffer, "bald");
  240. size = strlen((char*)buffer);
  241. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  242. lfs_file_write(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  243. => lfs_min(size, MEDIUMSIZE-j);
  244. }
  245. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  246. lfs_file_close(&lfs, &file) => 0;
  247. lfs_file_open(&lfs, &file, "baldy", LFS_O_RDWR) => 0;
  248. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  249. lfs_file_truncate(&lfs, &file, SMALLSIZE) => 0;
  250. lfs_file_size(&lfs, &file) => SMALLSIZE;
  251. strcpy((char*)buffer, "comb");
  252. size = strlen((char*)buffer);
  253. for (lfs_off_t j = 0; j < SMALLSIZE; j += size) {
  254. lfs_file_write(&lfs, &file, buffer, lfs_min(size, SMALLSIZE-j))
  255. => lfs_min(size, SMALLSIZE-j);
  256. }
  257. lfs_file_size(&lfs, &file) => SMALLSIZE;
  258. lfs_file_close(&lfs, &file) => 0;
  259. lfs_unmount(&lfs) => 0;
  260. '''
  261. # more aggressive general truncation tests
  262. [cases.test_truncate_aggressive]
  263. defines.CONFIG = 'range(6)'
  264. defines.SMALLSIZE = 32
  265. defines.MEDIUMSIZE = 2048
  266. defines.LARGESIZE = 8192
  267. code = '''
  268. lfs_t lfs;
  269. #define COUNT 5
  270. const struct {
  271. lfs_off_t startsizes[COUNT];
  272. lfs_off_t startseeks[COUNT];
  273. lfs_off_t hotsizes[COUNT];
  274. lfs_off_t coldsizes[COUNT];
  275. } configs[] = {
  276. // cold shrinking
  277. {{2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  278. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  279. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  280. { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE}},
  281. // cold expanding
  282. {{2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  283. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  284. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  285. { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE}},
  286. // warm shrinking truncate
  287. {{2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  288. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  289. { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE},
  290. { 0, 0, 0, 0, 0}},
  291. // warm expanding truncate
  292. {{ 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE},
  293. { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE},
  294. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  295. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}},
  296. // mid-file shrinking truncate
  297. {{2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  298. { LARGESIZE, LARGESIZE, LARGESIZE, LARGESIZE, LARGESIZE},
  299. { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE},
  300. { 0, 0, 0, 0, 0}},
  301. // mid-file expanding truncate
  302. {{ 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE},
  303. { 0, 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE},
  304. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  305. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}},
  306. };
  307. const lfs_off_t *startsizes = configs[CONFIG].startsizes;
  308. const lfs_off_t *startseeks = configs[CONFIG].startseeks;
  309. const lfs_off_t *hotsizes = configs[CONFIG].hotsizes;
  310. const lfs_off_t *coldsizes = configs[CONFIG].coldsizes;
  311. lfs_format(&lfs, cfg) => 0;
  312. lfs_mount(&lfs, cfg) => 0;
  313. for (unsigned i = 0; i < COUNT; i++) {
  314. char path[1024];
  315. sprintf(path, "hairyhead%d", i);
  316. lfs_file_t file;
  317. lfs_file_open(&lfs, &file, path,
  318. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
  319. uint8_t buffer[1024];
  320. strcpy((char*)buffer, "hair");
  321. size_t size = strlen((char*)buffer);
  322. for (lfs_off_t j = 0; j < startsizes[i]; j += size) {
  323. lfs_file_write(&lfs, &file, buffer, size) => size;
  324. }
  325. lfs_file_size(&lfs, &file) => startsizes[i];
  326. if (startseeks[i] != startsizes[i]) {
  327. lfs_file_seek(&lfs, &file,
  328. startseeks[i], LFS_SEEK_SET) => startseeks[i];
  329. }
  330. lfs_file_truncate(&lfs, &file, hotsizes[i]) => 0;
  331. lfs_file_size(&lfs, &file) => hotsizes[i];
  332. lfs_file_close(&lfs, &file) => 0;
  333. }
  334. lfs_unmount(&lfs) => 0;
  335. lfs_mount(&lfs, cfg) => 0;
  336. for (unsigned i = 0; i < COUNT; i++) {
  337. char path[1024];
  338. sprintf(path, "hairyhead%d", i);
  339. lfs_file_t file;
  340. lfs_file_open(&lfs, &file, path, LFS_O_RDWR) => 0;
  341. lfs_file_size(&lfs, &file) => hotsizes[i];
  342. size_t size = strlen("hair");
  343. lfs_off_t j = 0;
  344. for (; j < startsizes[i] && j < hotsizes[i]; j += size) {
  345. uint8_t buffer[1024];
  346. lfs_file_read(&lfs, &file, buffer, size) => size;
  347. memcmp(buffer, "hair", size) => 0;
  348. }
  349. for (; j < hotsizes[i]; j += size) {
  350. uint8_t buffer[1024];
  351. lfs_file_read(&lfs, &file, buffer, size) => size;
  352. memcmp(buffer, "\0\0\0\0", size) => 0;
  353. }
  354. lfs_file_truncate(&lfs, &file, coldsizes[i]) => 0;
  355. lfs_file_size(&lfs, &file) => coldsizes[i];
  356. lfs_file_close(&lfs, &file) => 0;
  357. }
  358. lfs_unmount(&lfs) => 0;
  359. lfs_mount(&lfs, cfg) => 0;
  360. for (unsigned i = 0; i < COUNT; i++) {
  361. char path[1024];
  362. sprintf(path, "hairyhead%d", i);
  363. lfs_file_t file;
  364. lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
  365. lfs_file_size(&lfs, &file) => coldsizes[i];
  366. size_t size = strlen("hair");
  367. lfs_off_t j = 0;
  368. for (; j < startsizes[i] && j < hotsizes[i] && j < coldsizes[i];
  369. j += size) {
  370. uint8_t buffer[1024];
  371. lfs_file_read(&lfs, &file, buffer, size) => size;
  372. memcmp(buffer, "hair", size) => 0;
  373. }
  374. for (; j < coldsizes[i]; j += size) {
  375. uint8_t buffer[1024];
  376. lfs_file_read(&lfs, &file, buffer, size) => size;
  377. memcmp(buffer, "\0\0\0\0", size) => 0;
  378. }
  379. lfs_file_close(&lfs, &file) => 0;
  380. }
  381. lfs_unmount(&lfs) => 0;
  382. '''
  383. # noop truncate
  384. [cases.test_truncate_nop]
  385. defines.MEDIUMSIZE = [32, 33, 512, 513, 2048, 2049, 8192, 8193]
  386. code = '''
  387. lfs_t lfs;
  388. lfs_format(&lfs, cfg) => 0;
  389. lfs_mount(&lfs, cfg) => 0;
  390. lfs_file_t file;
  391. lfs_file_open(&lfs, &file, "baldynoop",
  392. LFS_O_RDWR | LFS_O_CREAT) => 0;
  393. uint8_t buffer[1024];
  394. strcpy((char*)buffer, "hair");
  395. size_t size = strlen((char*)buffer);
  396. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  397. lfs_file_write(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  398. => lfs_min(size, MEDIUMSIZE-j);
  399. // this truncate should do nothing
  400. lfs_file_truncate(&lfs, &file, j+lfs_min(size, MEDIUMSIZE-j)) => 0;
  401. }
  402. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  403. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0;
  404. // should do nothing again
  405. lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0;
  406. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  407. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  408. lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  409. => lfs_min(size, MEDIUMSIZE-j);
  410. memcmp(buffer, "hair", lfs_min(size, MEDIUMSIZE-j)) => 0;
  411. }
  412. lfs_file_read(&lfs, &file, buffer, size) => 0;
  413. lfs_file_close(&lfs, &file) => 0;
  414. lfs_unmount(&lfs) => 0;
  415. // still there after reboot?
  416. lfs_mount(&lfs, cfg) => 0;
  417. lfs_file_open(&lfs, &file, "baldynoop", LFS_O_RDWR) => 0;
  418. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  419. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  420. lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  421. => lfs_min(size, MEDIUMSIZE-j);
  422. memcmp(buffer, "hair", lfs_min(size, MEDIUMSIZE-j)) => 0;
  423. }
  424. lfs_file_read(&lfs, &file, buffer, size) => 0;
  425. lfs_file_close(&lfs, &file) => 0;
  426. lfs_unmount(&lfs) => 0;
  427. '''