test_truncate.toml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  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. defines.POWERLOSS_BEHAVIOR = [
  196. 'LFS_EMUBD_POWERLOSS_NOOP',
  197. 'LFS_EMUBD_POWERLOSS_OOO',
  198. ]
  199. code = '''
  200. lfs_t lfs;
  201. int err = lfs_mount(&lfs, cfg);
  202. if (err) {
  203. lfs_format(&lfs, cfg) => 0;
  204. lfs_mount(&lfs, cfg) => 0;
  205. }
  206. lfs_file_t file;
  207. err = lfs_file_open(&lfs, &file, "baldy", LFS_O_RDONLY);
  208. assert(!err || err == LFS_ERR_NOENT);
  209. if (!err) {
  210. size_t size = lfs_file_size(&lfs, &file);
  211. assert(size == 0 ||
  212. size == (size_t)LARGESIZE ||
  213. size == (size_t)MEDIUMSIZE ||
  214. size == (size_t)SMALLSIZE);
  215. for (lfs_off_t j = 0; j < size; j += 4) {
  216. uint8_t buffer[1024];
  217. lfs_file_read(&lfs, &file, buffer, lfs_min(4, size-j))
  218. => lfs_min(4, size-j);
  219. assert(memcmp(buffer, "hair", lfs_min(4, size-j)) == 0 ||
  220. memcmp(buffer, "bald", lfs_min(4, size-j)) == 0 ||
  221. memcmp(buffer, "comb", lfs_min(4, size-j)) == 0);
  222. }
  223. lfs_file_close(&lfs, &file) => 0;
  224. }
  225. lfs_file_open(&lfs, &file, "baldy",
  226. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
  227. lfs_file_size(&lfs, &file) => 0;
  228. uint8_t buffer[1024];
  229. strcpy((char*)buffer, "hair");
  230. size_t size = strlen((char*)buffer);
  231. for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
  232. lfs_file_write(&lfs, &file, buffer, lfs_min(size, LARGESIZE-j))
  233. => lfs_min(size, LARGESIZE-j);
  234. }
  235. lfs_file_size(&lfs, &file) => LARGESIZE;
  236. lfs_file_close(&lfs, &file) => 0;
  237. lfs_file_open(&lfs, &file, "baldy", LFS_O_RDWR) => 0;
  238. lfs_file_size(&lfs, &file) => LARGESIZE;
  239. /* truncate */
  240. lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0;
  241. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  242. /* and write */
  243. strcpy((char*)buffer, "bald");
  244. size = strlen((char*)buffer);
  245. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  246. lfs_file_write(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  247. => lfs_min(size, MEDIUMSIZE-j);
  248. }
  249. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  250. lfs_file_close(&lfs, &file) => 0;
  251. lfs_file_open(&lfs, &file, "baldy", LFS_O_RDWR) => 0;
  252. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  253. lfs_file_truncate(&lfs, &file, SMALLSIZE) => 0;
  254. lfs_file_size(&lfs, &file) => SMALLSIZE;
  255. strcpy((char*)buffer, "comb");
  256. size = strlen((char*)buffer);
  257. for (lfs_off_t j = 0; j < SMALLSIZE; j += size) {
  258. lfs_file_write(&lfs, &file, buffer, lfs_min(size, SMALLSIZE-j))
  259. => lfs_min(size, SMALLSIZE-j);
  260. }
  261. lfs_file_size(&lfs, &file) => SMALLSIZE;
  262. lfs_file_close(&lfs, &file) => 0;
  263. lfs_unmount(&lfs) => 0;
  264. '''
  265. # more aggressive general truncation tests
  266. [cases.test_truncate_aggressive]
  267. defines.CONFIG = 'range(6)'
  268. defines.SMALLSIZE = 32
  269. defines.MEDIUMSIZE = 2048
  270. defines.LARGESIZE = 8192
  271. code = '''
  272. lfs_t lfs;
  273. #define COUNT 5
  274. const struct {
  275. lfs_off_t startsizes[COUNT];
  276. lfs_off_t startseeks[COUNT];
  277. lfs_off_t hotsizes[COUNT];
  278. lfs_off_t coldsizes[COUNT];
  279. } configs[] = {
  280. // cold shrinking
  281. {{2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  282. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  283. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  284. { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE}},
  285. // cold expanding
  286. {{2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  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. // warm shrinking truncate
  291. {{2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  292. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  293. { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE},
  294. { 0, 0, 0, 0, 0}},
  295. // warm expanding truncate
  296. {{ 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE},
  297. { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE},
  298. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  299. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}},
  300. // mid-file shrinking truncate
  301. {{2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  302. { LARGESIZE, LARGESIZE, LARGESIZE, LARGESIZE, LARGESIZE},
  303. { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE},
  304. { 0, 0, 0, 0, 0}},
  305. // mid-file expanding truncate
  306. {{ 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE},
  307. { 0, 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE},
  308. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE},
  309. {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}},
  310. };
  311. const lfs_off_t *startsizes = configs[CONFIG].startsizes;
  312. const lfs_off_t *startseeks = configs[CONFIG].startseeks;
  313. const lfs_off_t *hotsizes = configs[CONFIG].hotsizes;
  314. const lfs_off_t *coldsizes = configs[CONFIG].coldsizes;
  315. lfs_format(&lfs, cfg) => 0;
  316. lfs_mount(&lfs, cfg) => 0;
  317. for (unsigned i = 0; i < COUNT; i++) {
  318. char path[1024];
  319. sprintf(path, "hairyhead%d", i);
  320. lfs_file_t file;
  321. lfs_file_open(&lfs, &file, path,
  322. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
  323. uint8_t buffer[1024];
  324. strcpy((char*)buffer, "hair");
  325. size_t size = strlen((char*)buffer);
  326. for (lfs_off_t j = 0; j < startsizes[i]; j += size) {
  327. lfs_file_write(&lfs, &file, buffer, size) => size;
  328. }
  329. lfs_file_size(&lfs, &file) => startsizes[i];
  330. if (startseeks[i] != startsizes[i]) {
  331. lfs_file_seek(&lfs, &file,
  332. startseeks[i], LFS_SEEK_SET) => startseeks[i];
  333. }
  334. lfs_file_truncate(&lfs, &file, hotsizes[i]) => 0;
  335. lfs_file_size(&lfs, &file) => hotsizes[i];
  336. lfs_file_close(&lfs, &file) => 0;
  337. }
  338. lfs_unmount(&lfs) => 0;
  339. lfs_mount(&lfs, cfg) => 0;
  340. for (unsigned i = 0; i < COUNT; i++) {
  341. char path[1024];
  342. sprintf(path, "hairyhead%d", i);
  343. lfs_file_t file;
  344. lfs_file_open(&lfs, &file, path, LFS_O_RDWR) => 0;
  345. lfs_file_size(&lfs, &file) => hotsizes[i];
  346. size_t size = strlen("hair");
  347. lfs_off_t j = 0;
  348. for (; j < startsizes[i] && j < hotsizes[i]; j += size) {
  349. uint8_t buffer[1024];
  350. lfs_file_read(&lfs, &file, buffer, size) => size;
  351. memcmp(buffer, "hair", size) => 0;
  352. }
  353. for (; j < hotsizes[i]; j += size) {
  354. uint8_t buffer[1024];
  355. lfs_file_read(&lfs, &file, buffer, size) => size;
  356. memcmp(buffer, "\0\0\0\0", size) => 0;
  357. }
  358. lfs_file_truncate(&lfs, &file, coldsizes[i]) => 0;
  359. lfs_file_size(&lfs, &file) => coldsizes[i];
  360. lfs_file_close(&lfs, &file) => 0;
  361. }
  362. lfs_unmount(&lfs) => 0;
  363. lfs_mount(&lfs, cfg) => 0;
  364. for (unsigned i = 0; i < COUNT; i++) {
  365. char path[1024];
  366. sprintf(path, "hairyhead%d", i);
  367. lfs_file_t file;
  368. lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
  369. lfs_file_size(&lfs, &file) => coldsizes[i];
  370. size_t size = strlen("hair");
  371. lfs_off_t j = 0;
  372. for (; j < startsizes[i] && j < hotsizes[i] && j < coldsizes[i];
  373. j += size) {
  374. uint8_t buffer[1024];
  375. lfs_file_read(&lfs, &file, buffer, size) => size;
  376. memcmp(buffer, "hair", size) => 0;
  377. }
  378. for (; j < coldsizes[i]; j += size) {
  379. uint8_t buffer[1024];
  380. lfs_file_read(&lfs, &file, buffer, size) => size;
  381. memcmp(buffer, "\0\0\0\0", size) => 0;
  382. }
  383. lfs_file_close(&lfs, &file) => 0;
  384. }
  385. lfs_unmount(&lfs) => 0;
  386. '''
  387. # noop truncate
  388. [cases.test_truncate_nop]
  389. defines.MEDIUMSIZE = [32, 33, 512, 513, 2048, 2049, 8192, 8193]
  390. code = '''
  391. lfs_t lfs;
  392. lfs_format(&lfs, cfg) => 0;
  393. lfs_mount(&lfs, cfg) => 0;
  394. lfs_file_t file;
  395. lfs_file_open(&lfs, &file, "baldynoop",
  396. LFS_O_RDWR | LFS_O_CREAT) => 0;
  397. uint8_t buffer[1024];
  398. strcpy((char*)buffer, "hair");
  399. size_t size = strlen((char*)buffer);
  400. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  401. lfs_file_write(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  402. => lfs_min(size, MEDIUMSIZE-j);
  403. // this truncate should do nothing
  404. lfs_file_truncate(&lfs, &file, j+lfs_min(size, MEDIUMSIZE-j)) => 0;
  405. }
  406. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  407. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0;
  408. // should do nothing again
  409. lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0;
  410. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  411. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  412. lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  413. => lfs_min(size, MEDIUMSIZE-j);
  414. memcmp(buffer, "hair", lfs_min(size, MEDIUMSIZE-j)) => 0;
  415. }
  416. lfs_file_read(&lfs, &file, buffer, size) => 0;
  417. lfs_file_close(&lfs, &file) => 0;
  418. lfs_unmount(&lfs) => 0;
  419. // still there after reboot?
  420. lfs_mount(&lfs, cfg) => 0;
  421. lfs_file_open(&lfs, &file, "baldynoop", LFS_O_RDWR) => 0;
  422. lfs_file_size(&lfs, &file) => MEDIUMSIZE;
  423. for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
  424. lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
  425. => lfs_min(size, MEDIUMSIZE-j);
  426. memcmp(buffer, "hair", lfs_min(size, MEDIUMSIZE-j)) => 0;
  427. }
  428. lfs_file_read(&lfs, &file, buffer, size) => 0;
  429. lfs_file_close(&lfs, &file) => 0;
  430. lfs_unmount(&lfs) => 0;
  431. '''