test_seek.toml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. [[case]] # simple file seek
  2. code = '''
  3. lfs_format(&lfs, &cfg) => 0;
  4. lfs_mount(&lfs, &cfg) => 0;
  5. lfs_file_open(&lfs, &file, "kitty",
  6. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0;
  7. size = strlen("kittycatcat");
  8. memcpy(buffer, "kittycatcat", size);
  9. for (int j = 0; j < COUNT; j++) {
  10. lfs_file_write(&lfs, &file, buffer, size);
  11. }
  12. lfs_file_close(&lfs, &file) => 0;
  13. lfs_unmount(&lfs) => 0;
  14. lfs_mount(&lfs, &cfg) => 0;
  15. lfs_file_open(&lfs, &file, "kitty", LFS_O_RDONLY) => 0;
  16. lfs_soff_t pos;
  17. size = strlen("kittycatcat");
  18. for (int i = 0; i < SKIP; i++) {
  19. lfs_file_read(&lfs, &file, buffer, size) => size;
  20. memcmp(buffer, "kittycatcat", size) => 0;
  21. pos = lfs_file_tell(&lfs, &file);
  22. }
  23. pos >= 0 => 1;
  24. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  25. lfs_file_read(&lfs, &file, buffer, size) => size;
  26. memcmp(buffer, "kittycatcat", size) => 0;
  27. lfs_file_rewind(&lfs, &file) => 0;
  28. lfs_file_read(&lfs, &file, buffer, size) => size;
  29. memcmp(buffer, "kittycatcat", size) => 0;
  30. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_CUR) => size;
  31. lfs_file_read(&lfs, &file, buffer, size) => size;
  32. memcmp(buffer, "kittycatcat", size) => 0;
  33. lfs_file_seek(&lfs, &file, size, LFS_SEEK_CUR) => 3*size;
  34. lfs_file_read(&lfs, &file, buffer, size) => size;
  35. memcmp(buffer, "kittycatcat", size) => 0;
  36. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  37. lfs_file_read(&lfs, &file, buffer, size) => size;
  38. memcmp(buffer, "kittycatcat", size) => 0;
  39. lfs_file_seek(&lfs, &file, -size, LFS_SEEK_CUR) => pos;
  40. lfs_file_read(&lfs, &file, buffer, size) => size;
  41. memcmp(buffer, "kittycatcat", size) => 0;
  42. lfs_file_seek(&lfs, &file, -size, LFS_SEEK_END) >= 0 => 1;
  43. lfs_file_read(&lfs, &file, buffer, size) => size;
  44. memcmp(buffer, "kittycatcat", size) => 0;
  45. size = lfs_file_size(&lfs, &file);
  46. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_CUR) => size;
  47. lfs_file_close(&lfs, &file) => 0;
  48. lfs_unmount(&lfs) => 0;
  49. '''
  50. define = [
  51. {COUNT=132, SKIP=4},
  52. {COUNT=132, SKIP=128},
  53. {COUNT=200, SKIP=10},
  54. {COUNT=200, SKIP=100},
  55. {COUNT=4, SKIP=1},
  56. {COUNT=4, SKIP=2},
  57. ]
  58. [[case]] # simple file seek and write
  59. code = '''
  60. lfs_format(&lfs, &cfg) => 0;
  61. lfs_mount(&lfs, &cfg) => 0;
  62. lfs_file_open(&lfs, &file, "kitty",
  63. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0;
  64. size = strlen("kittycatcat");
  65. memcpy(buffer, "kittycatcat", size);
  66. for (int j = 0; j < COUNT; j++) {
  67. lfs_file_write(&lfs, &file, buffer, size);
  68. }
  69. lfs_file_close(&lfs, &file) => 0;
  70. lfs_unmount(&lfs) => 0;
  71. lfs_mount(&lfs, &cfg) => 0;
  72. lfs_file_open(&lfs, &file, "kitty", LFS_O_RDWR) => 0;
  73. lfs_soff_t pos;
  74. size = strlen("kittycatcat");
  75. for (int i = 0; i < SKIP; i++) {
  76. lfs_file_read(&lfs, &file, buffer, size) => size;
  77. memcmp(buffer, "kittycatcat", size) => 0;
  78. pos = lfs_file_tell(&lfs, &file);
  79. }
  80. pos >= 0 => 1;
  81. memcpy(buffer, "doggodogdog", size);
  82. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  83. lfs_file_write(&lfs, &file, buffer, size) => size;
  84. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  85. lfs_file_read(&lfs, &file, buffer, size) => size;
  86. memcmp(buffer, "doggodogdog", size) => 0;
  87. lfs_file_rewind(&lfs, &file) => 0;
  88. lfs_file_read(&lfs, &file, buffer, size) => size;
  89. memcmp(buffer, "kittycatcat", size) => 0;
  90. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  91. lfs_file_read(&lfs, &file, buffer, size) => size;
  92. memcmp(buffer, "doggodogdog", size) => 0;
  93. lfs_file_seek(&lfs, &file, -size, LFS_SEEK_END) >= 0 => 1;
  94. lfs_file_read(&lfs, &file, buffer, size) => size;
  95. memcmp(buffer, "kittycatcat", size) => 0;
  96. size = lfs_file_size(&lfs, &file);
  97. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_CUR) => size;
  98. lfs_file_close(&lfs, &file) => 0;
  99. lfs_unmount(&lfs) => 0;
  100. '''
  101. define = [
  102. {COUNT=132, SKIP=4},
  103. {COUNT=132, SKIP=128},
  104. {COUNT=200, SKIP=10},
  105. {COUNT=200, SKIP=100},
  106. {COUNT=4, SKIP=1},
  107. {COUNT=4, SKIP=2},
  108. ]
  109. [[case]] # boundary seek and writes
  110. code = '''
  111. lfs_format(&lfs, &cfg) => 0;
  112. lfs_mount(&lfs, &cfg) => 0;
  113. lfs_file_open(&lfs, &file, "kitty",
  114. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0;
  115. size = strlen("kittycatcat");
  116. memcpy(buffer, "kittycatcat", size);
  117. for (int j = 0; j < COUNT; j++) {
  118. lfs_file_write(&lfs, &file, buffer, size);
  119. }
  120. lfs_file_close(&lfs, &file) => 0;
  121. lfs_unmount(&lfs) => 0;
  122. lfs_mount(&lfs, &cfg) => 0;
  123. lfs_file_open(&lfs, &file, "kitty", LFS_O_RDWR) => 0;
  124. size = strlen("hedgehoghog");
  125. const lfs_soff_t offsets[] = OFFSETS;
  126. for (unsigned i = 0; i < sizeof(offsets) / sizeof(offsets[0]); i++) {
  127. lfs_soff_t off = offsets[i];
  128. memcpy(buffer, "hedgehoghog", size);
  129. lfs_file_seek(&lfs, &file, off, LFS_SEEK_SET) => off;
  130. lfs_file_write(&lfs, &file, buffer, size) => size;
  131. lfs_file_seek(&lfs, &file, off, LFS_SEEK_SET) => off;
  132. lfs_file_read(&lfs, &file, buffer, size) => size;
  133. memcmp(buffer, "hedgehoghog", size) => 0;
  134. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0;
  135. lfs_file_read(&lfs, &file, buffer, size) => size;
  136. memcmp(buffer, "kittycatcat", size) => 0;
  137. lfs_file_seek(&lfs, &file, off, LFS_SEEK_SET) => off;
  138. lfs_file_read(&lfs, &file, buffer, size) => size;
  139. memcmp(buffer, "hedgehoghog", size) => 0;
  140. lfs_file_sync(&lfs, &file) => 0;
  141. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0;
  142. lfs_file_read(&lfs, &file, buffer, size) => size;
  143. memcmp(buffer, "kittycatcat", size) => 0;
  144. lfs_file_seek(&lfs, &file, off, LFS_SEEK_SET) => off;
  145. lfs_file_read(&lfs, &file, buffer, size) => size;
  146. memcmp(buffer, "hedgehoghog", size) => 0;
  147. }
  148. lfs_file_close(&lfs, &file) => 0;
  149. lfs_unmount(&lfs) => 0;
  150. '''
  151. define.COUNT = 132
  152. define.OFFSETS = '"{512, 1020, 513, 1021, 511, 1019, 1441}"'
  153. [[case]] # out of bounds seek
  154. code = '''
  155. lfs_format(&lfs, &cfg) => 0;
  156. lfs_mount(&lfs, &cfg) => 0;
  157. lfs_file_open(&lfs, &file, "kitty",
  158. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0;
  159. size = strlen("kittycatcat");
  160. memcpy(buffer, "kittycatcat", size);
  161. for (int j = 0; j < COUNT; j++) {
  162. lfs_file_write(&lfs, &file, buffer, size);
  163. }
  164. lfs_file_close(&lfs, &file) => 0;
  165. lfs_unmount(&lfs) => 0;
  166. lfs_mount(&lfs, &cfg) => 0;
  167. lfs_file_open(&lfs, &file, "kitty", LFS_O_RDWR) => 0;
  168. size = strlen("kittycatcat");
  169. lfs_file_size(&lfs, &file) => COUNT*size;
  170. lfs_file_seek(&lfs, &file, (COUNT+SKIP)*size,
  171. LFS_SEEK_SET) => (COUNT+SKIP)*size;
  172. lfs_file_read(&lfs, &file, buffer, size) => 0;
  173. memcpy(buffer, "porcupineee", size);
  174. lfs_file_write(&lfs, &file, buffer, size) => size;
  175. lfs_file_seek(&lfs, &file, (COUNT+SKIP)*size,
  176. LFS_SEEK_SET) => (COUNT+SKIP)*size;
  177. lfs_file_read(&lfs, &file, buffer, size) => size;
  178. memcmp(buffer, "porcupineee", size) => 0;
  179. lfs_file_seek(&lfs, &file, COUNT*size,
  180. LFS_SEEK_SET) => COUNT*size;
  181. lfs_file_read(&lfs, &file, buffer, size) => size;
  182. memcmp(buffer, "\0\0\0\0\0\0\0\0\0\0\0", size) => 0;
  183. lfs_file_seek(&lfs, &file, -((COUNT+SKIP)*size),
  184. LFS_SEEK_CUR) => LFS_ERR_INVAL;
  185. lfs_file_tell(&lfs, &file) => (COUNT+1)*size;
  186. lfs_file_seek(&lfs, &file, -((COUNT+2*SKIP)*size),
  187. LFS_SEEK_END) => LFS_ERR_INVAL;
  188. lfs_file_tell(&lfs, &file) => (COUNT+1)*size;
  189. lfs_file_close(&lfs, &file) => 0;
  190. lfs_unmount(&lfs) => 0;
  191. '''
  192. define = [
  193. {COUNT=132, SKIP=4},
  194. {COUNT=132, SKIP=128},
  195. {COUNT=200, SKIP=10},
  196. {COUNT=200, SKIP=100},
  197. {COUNT=4, SKIP=2},
  198. {COUNT=4, SKIP=3},
  199. ]
  200. [[case]] # inline write and seek
  201. code = '''
  202. lfs_format(&lfs, &cfg) => 0;
  203. lfs_mount(&lfs, &cfg) => 0;
  204. lfs_file_open(&lfs, &file, "tinykitty",
  205. LFS_O_RDWR | LFS_O_CREAT) => 0;
  206. int j = 0;
  207. int k = 0;
  208. memcpy(buffer, "abcdefghijklmnopqrstuvwxyz", 26);
  209. for (unsigned i = 0; i < SIZE; i++) {
  210. lfs_file_write(&lfs, &file, &buffer[j++ % 26], 1) => 1;
  211. lfs_file_tell(&lfs, &file) => i+1;
  212. lfs_file_size(&lfs, &file) => i+1;
  213. }
  214. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0;
  215. lfs_file_tell(&lfs, &file) => 0;
  216. lfs_file_size(&lfs, &file) => SIZE;
  217. for (unsigned i = 0; i < SIZE; i++) {
  218. uint8_t c;
  219. lfs_file_read(&lfs, &file, &c, 1) => 1;
  220. c => buffer[k++ % 26];
  221. }
  222. lfs_file_sync(&lfs, &file) => 0;
  223. lfs_file_tell(&lfs, &file) => SIZE;
  224. lfs_file_size(&lfs, &file) => SIZE;
  225. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0;
  226. for (unsigned i = 0; i < SIZE; i++) {
  227. lfs_file_write(&lfs, &file, &buffer[j++ % 26], 1) => 1;
  228. lfs_file_tell(&lfs, &file) => i+1;
  229. lfs_file_size(&lfs, &file) => SIZE;
  230. lfs_file_sync(&lfs, &file) => 0;
  231. lfs_file_tell(&lfs, &file) => i+1;
  232. lfs_file_size(&lfs, &file) => SIZE;
  233. if (i < SIZE-2) {
  234. uint8_t c[3];
  235. lfs_file_seek(&lfs, &file, -1, LFS_SEEK_CUR) => i;
  236. lfs_file_read(&lfs, &file, &c, 3) => 3;
  237. lfs_file_tell(&lfs, &file) => i+3;
  238. lfs_file_size(&lfs, &file) => SIZE;
  239. lfs_file_seek(&lfs, &file, i+1, LFS_SEEK_SET) => i+1;
  240. lfs_file_tell(&lfs, &file) => i+1;
  241. lfs_file_size(&lfs, &file) => SIZE;
  242. }
  243. }
  244. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0;
  245. lfs_file_tell(&lfs, &file) => 0;
  246. lfs_file_size(&lfs, &file) => SIZE;
  247. for (unsigned i = 0; i < SIZE; i++) {
  248. uint8_t c;
  249. lfs_file_read(&lfs, &file, &c, 1) => 1;
  250. c => buffer[k++ % 26];
  251. }
  252. lfs_file_sync(&lfs, &file) => 0;
  253. lfs_file_tell(&lfs, &file) => SIZE;
  254. lfs_file_size(&lfs, &file) => SIZE;
  255. lfs_file_close(&lfs, &file) => 0;
  256. lfs_unmount(&lfs) => 0;
  257. '''
  258. define.SIZE = [2, 4, 128, 132]
  259. [[case]] # file seek and write with power-loss
  260. code = '''
  261. err = lfs_mount(&lfs, &cfg);
  262. if (err) {
  263. lfs_format(&lfs, &cfg) => 0;
  264. lfs_mount(&lfs, &cfg) => 0;
  265. }
  266. err = lfs_file_open(&lfs, &file, "kitty", LFS_O_RDONLY);
  267. assert(!err || err == LFS_ERR_NOENT);
  268. if (!err) {
  269. if (lfs_file_size(&lfs, &file) != 0) {
  270. lfs_file_size(&lfs, &file) => 11*COUNT;
  271. for (int j = 0; j < COUNT; j++) {
  272. memset(buffer, 0, 11+1);
  273. lfs_file_read(&lfs, &file, buffer, 11) => 11;
  274. assert(memcmp(buffer, "kittycatcat", 11) == 0 ||
  275. memcmp(buffer, "doggodogdog", 11) == 0);
  276. }
  277. }
  278. lfs_file_close(&lfs, &file) => 0;
  279. }
  280. lfs_file_open(&lfs, &file, "kitty", LFS_O_WRONLY | LFS_O_CREAT) => 0;
  281. if (lfs_file_size(&lfs, &file) == 0) {
  282. for (int j = 0; j < COUNT; j++) {
  283. strcpy((char*)buffer, "kittycatcat");
  284. size = strlen((char*)buffer);
  285. lfs_file_write(&lfs, &file, buffer, size) => size;
  286. }
  287. }
  288. lfs_file_close(&lfs, &file) => 0;
  289. strcpy((char*)buffer, "doggodogdog");
  290. size = strlen((char*)buffer);
  291. lfs_file_open(&lfs, &file, "kitty", LFS_O_RDWR) => 0;
  292. lfs_file_size(&lfs, &file) => COUNT*size;
  293. // seek and write using quadratic probing to touch all
  294. // 11-byte words in the file
  295. lfs_off_t off = 0;
  296. for (int j = 0; j < COUNT; j++) {
  297. off = (5*off + 1) % COUNT;
  298. lfs_file_seek(&lfs, &file, off*size, LFS_SEEK_SET) => off*size;
  299. lfs_file_read(&lfs, &file, buffer, size) => size;
  300. assert(memcmp(buffer, "kittycatcat", size) == 0 ||
  301. memcmp(buffer, "doggodogdog", size) == 0);
  302. if (memcmp(buffer, "doggodogdog", size) != 0) {
  303. lfs_file_seek(&lfs, &file, off*size, LFS_SEEK_SET) => off*size;
  304. strcpy((char*)buffer, "doggodogdog");
  305. lfs_file_write(&lfs, &file, buffer, size) => size;
  306. lfs_file_seek(&lfs, &file, off*size, LFS_SEEK_SET) => off*size;
  307. lfs_file_read(&lfs, &file, buffer, size) => size;
  308. assert(memcmp(buffer, "doggodogdog", size) == 0);
  309. lfs_file_sync(&lfs, &file) => 0;
  310. lfs_file_seek(&lfs, &file, off*size, LFS_SEEK_SET) => off*size;
  311. lfs_file_read(&lfs, &file, buffer, size) => size;
  312. assert(memcmp(buffer, "doggodogdog", size) == 0);
  313. }
  314. }
  315. lfs_file_close(&lfs, &file) => 0;
  316. lfs_file_open(&lfs, &file, "kitty", LFS_O_RDWR) => 0;
  317. lfs_file_size(&lfs, &file) => COUNT*size;
  318. for (int j = 0; j < COUNT; j++) {
  319. lfs_file_read(&lfs, &file, buffer, size) => size;
  320. assert(memcmp(buffer, "doggodogdog", size) == 0);
  321. }
  322. lfs_file_close(&lfs, &file) => 0;
  323. lfs_unmount(&lfs) => 0;
  324. '''
  325. # must be power-of-2 for quadratic probing to be exhaustive
  326. define.COUNT = [4, 64, 128]
  327. reentrant = true