test_seek.sh 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. #!/bin/bash
  2. set -eu
  3. export TEST_FILE=$0
  4. trap 'export TEST_LINE=$LINENO' DEBUG
  5. echo "=== Seek tests ==="
  6. SMALLSIZE=4
  7. MEDIUMSIZE=128
  8. LARGESIZE=132
  9. rm -rf blocks
  10. scripts/test.py << TEST
  11. lfs_format(&lfs, &cfg) => 0;
  12. lfs_mount(&lfs, &cfg) => 0;
  13. lfs_mkdir(&lfs, "hello") => 0;
  14. for (int i = 0; i < $LARGESIZE; i++) {
  15. sprintf(path, "hello/kitty%03d", i);
  16. lfs_file_open(&lfs, &file, path,
  17. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0;
  18. lfs_size_t size = strlen("kittycatcat");
  19. memcpy(buffer, "kittycatcat", size);
  20. for (int j = 0; j < $LARGESIZE; j++) {
  21. lfs_file_write(&lfs, &file, buffer, size);
  22. }
  23. lfs_file_close(&lfs, &file) => 0;
  24. }
  25. lfs_unmount(&lfs) => 0;
  26. TEST
  27. echo "--- Simple dir seek ---"
  28. scripts/test.py << TEST
  29. lfs_mount(&lfs, &cfg) => 0;
  30. lfs_dir_open(&lfs, &dir, "hello") => 0;
  31. lfs_dir_read(&lfs, &dir, &info) => 1;
  32. strcmp(info.name, ".") => 0;
  33. lfs_dir_read(&lfs, &dir, &info) => 1;
  34. strcmp(info.name, "..") => 0;
  35. lfs_soff_t pos;
  36. int i;
  37. for (i = 0; i < $SMALLSIZE; i++) {
  38. sprintf(path, "kitty%03d", i);
  39. lfs_dir_read(&lfs, &dir, &info) => 1;
  40. strcmp(info.name, path) => 0;
  41. pos = lfs_dir_tell(&lfs, &dir);
  42. }
  43. pos >= 0 => 1;
  44. lfs_dir_seek(&lfs, &dir, pos) => 0;
  45. sprintf(path, "kitty%03d", i);
  46. lfs_dir_read(&lfs, &dir, &info) => 1;
  47. strcmp(info.name, path) => 0;
  48. lfs_dir_rewind(&lfs, &dir) => 0;
  49. sprintf(path, "kitty%03d", 0);
  50. lfs_dir_read(&lfs, &dir, &info) => 1;
  51. strcmp(info.name, ".") => 0;
  52. lfs_dir_read(&lfs, &dir, &info) => 1;
  53. strcmp(info.name, "..") => 0;
  54. lfs_dir_read(&lfs, &dir, &info) => 1;
  55. strcmp(info.name, path) => 0;
  56. lfs_dir_seek(&lfs, &dir, pos) => 0;
  57. sprintf(path, "kitty%03d", i);
  58. lfs_dir_read(&lfs, &dir, &info) => 1;
  59. strcmp(info.name, path) => 0;
  60. lfs_dir_close(&lfs, &dir) => 0;
  61. lfs_unmount(&lfs) => 0;
  62. TEST
  63. echo "--- Large dir seek ---"
  64. scripts/test.py << TEST
  65. lfs_mount(&lfs, &cfg) => 0;
  66. lfs_dir_open(&lfs, &dir, "hello") => 0;
  67. lfs_dir_read(&lfs, &dir, &info) => 1;
  68. strcmp(info.name, ".") => 0;
  69. lfs_dir_read(&lfs, &dir, &info) => 1;
  70. strcmp(info.name, "..") => 0;
  71. lfs_soff_t pos;
  72. int i;
  73. for (i = 0; i < $MEDIUMSIZE; i++) {
  74. sprintf(path, "kitty%03d", i);
  75. lfs_dir_read(&lfs, &dir, &info) => 1;
  76. strcmp(info.name, path) => 0;
  77. pos = lfs_dir_tell(&lfs, &dir);
  78. }
  79. pos >= 0 => 1;
  80. lfs_dir_seek(&lfs, &dir, pos) => 0;
  81. sprintf(path, "kitty%03d", i);
  82. lfs_dir_read(&lfs, &dir, &info) => 1;
  83. strcmp(info.name, path) => 0;
  84. lfs_dir_rewind(&lfs, &dir) => 0;
  85. sprintf(path, "kitty%03d", 0);
  86. lfs_dir_read(&lfs, &dir, &info) => 1;
  87. strcmp(info.name, ".") => 0;
  88. lfs_dir_read(&lfs, &dir, &info) => 1;
  89. strcmp(info.name, "..") => 0;
  90. lfs_dir_read(&lfs, &dir, &info) => 1;
  91. strcmp(info.name, path) => 0;
  92. lfs_dir_seek(&lfs, &dir, pos) => 0;
  93. sprintf(path, "kitty%03d", i);
  94. lfs_dir_read(&lfs, &dir, &info) => 1;
  95. strcmp(info.name, path) => 0;
  96. lfs_dir_close(&lfs, &dir) => 0;
  97. lfs_unmount(&lfs) => 0;
  98. TEST
  99. echo "--- Simple file seek ---"
  100. scripts/test.py << TEST
  101. lfs_mount(&lfs, &cfg) => 0;
  102. lfs_file_open(&lfs, &file, "hello/kitty042", LFS_O_RDONLY) => 0;
  103. lfs_soff_t pos;
  104. lfs_size_t size = strlen("kittycatcat");
  105. for (int i = 0; i < $SMALLSIZE; i++) {
  106. lfs_file_read(&lfs, &file, buffer, size) => size;
  107. memcmp(buffer, "kittycatcat", size) => 0;
  108. pos = lfs_file_tell(&lfs, &file);
  109. }
  110. pos >= 0 => 1;
  111. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  112. lfs_file_read(&lfs, &file, buffer, size) => size;
  113. memcmp(buffer, "kittycatcat", size) => 0;
  114. lfs_file_rewind(&lfs, &file) => 0;
  115. lfs_file_read(&lfs, &file, buffer, size) => size;
  116. memcmp(buffer, "kittycatcat", size) => 0;
  117. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_CUR) => size;
  118. lfs_file_read(&lfs, &file, buffer, size) => size;
  119. memcmp(buffer, "kittycatcat", size) => 0;
  120. lfs_file_seek(&lfs, &file, size, LFS_SEEK_CUR) => 3*size;
  121. lfs_file_read(&lfs, &file, buffer, size) => size;
  122. memcmp(buffer, "kittycatcat", size) => 0;
  123. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  124. lfs_file_read(&lfs, &file, buffer, size) => size;
  125. memcmp(buffer, "kittycatcat", size) => 0;
  126. lfs_file_seek(&lfs, &file, -size, LFS_SEEK_CUR) => pos;
  127. lfs_file_read(&lfs, &file, buffer, size) => size;
  128. memcmp(buffer, "kittycatcat", size) => 0;
  129. lfs_file_seek(&lfs, &file, -size, LFS_SEEK_END) >= 0 => 1;
  130. lfs_file_read(&lfs, &file, buffer, size) => size;
  131. memcmp(buffer, "kittycatcat", size) => 0;
  132. size = lfs_file_size(&lfs, &file);
  133. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_CUR) => size;
  134. lfs_file_close(&lfs, &file) => 0;
  135. lfs_unmount(&lfs) => 0;
  136. TEST
  137. echo "--- Large file seek ---"
  138. scripts/test.py << TEST
  139. lfs_mount(&lfs, &cfg) => 0;
  140. lfs_file_open(&lfs, &file, "hello/kitty042", LFS_O_RDONLY) => 0;
  141. lfs_soff_t pos;
  142. lfs_size_t size = strlen("kittycatcat");
  143. for (int i = 0; i < $MEDIUMSIZE; i++) {
  144. lfs_file_read(&lfs, &file, buffer, size) => size;
  145. memcmp(buffer, "kittycatcat", size) => 0;
  146. pos = lfs_file_tell(&lfs, &file);
  147. }
  148. pos >= 0 => 1;
  149. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  150. lfs_file_read(&lfs, &file, buffer, size) => size;
  151. memcmp(buffer, "kittycatcat", size) => 0;
  152. lfs_file_rewind(&lfs, &file) => 0;
  153. lfs_file_read(&lfs, &file, buffer, size) => size;
  154. memcmp(buffer, "kittycatcat", size) => 0;
  155. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_CUR) => size;
  156. lfs_file_read(&lfs, &file, buffer, size) => size;
  157. memcmp(buffer, "kittycatcat", size) => 0;
  158. lfs_file_seek(&lfs, &file, size, LFS_SEEK_CUR) => 3*size;
  159. lfs_file_read(&lfs, &file, buffer, size) => size;
  160. memcmp(buffer, "kittycatcat", size) => 0;
  161. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  162. lfs_file_read(&lfs, &file, buffer, size) => size;
  163. memcmp(buffer, "kittycatcat", size) => 0;
  164. lfs_file_seek(&lfs, &file, -size, LFS_SEEK_CUR) => pos;
  165. lfs_file_read(&lfs, &file, buffer, size) => size;
  166. memcmp(buffer, "kittycatcat", size) => 0;
  167. lfs_file_seek(&lfs, &file, -size, LFS_SEEK_END) >= 0 => 1;
  168. lfs_file_read(&lfs, &file, buffer, size) => size;
  169. memcmp(buffer, "kittycatcat", size) => 0;
  170. size = lfs_file_size(&lfs, &file);
  171. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_CUR) => size;
  172. lfs_file_close(&lfs, &file) => 0;
  173. lfs_unmount(&lfs) => 0;
  174. TEST
  175. echo "--- Simple file seek and write ---"
  176. scripts/test.py << TEST
  177. lfs_mount(&lfs, &cfg) => 0;
  178. lfs_file_open(&lfs, &file, "hello/kitty042", LFS_O_RDWR) => 0;
  179. lfs_soff_t pos;
  180. lfs_size_t size = strlen("kittycatcat");
  181. for (int i = 0; i < $SMALLSIZE; i++) {
  182. lfs_file_read(&lfs, &file, buffer, size) => size;
  183. memcmp(buffer, "kittycatcat", size) => 0;
  184. pos = lfs_file_tell(&lfs, &file);
  185. }
  186. pos >= 0 => 1;
  187. memcpy(buffer, "doggodogdog", size);
  188. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  189. lfs_file_write(&lfs, &file, buffer, size) => size;
  190. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  191. lfs_file_read(&lfs, &file, buffer, size) => size;
  192. memcmp(buffer, "doggodogdog", size) => 0;
  193. lfs_file_rewind(&lfs, &file) => 0;
  194. lfs_file_read(&lfs, &file, buffer, size) => size;
  195. memcmp(buffer, "kittycatcat", size) => 0;
  196. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  197. lfs_file_read(&lfs, &file, buffer, size) => size;
  198. memcmp(buffer, "doggodogdog", size) => 0;
  199. lfs_file_seek(&lfs, &file, -size, LFS_SEEK_END) >= 0 => 1;
  200. lfs_file_read(&lfs, &file, buffer, size) => size;
  201. memcmp(buffer, "kittycatcat", size) => 0;
  202. size = lfs_file_size(&lfs, &file);
  203. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_CUR) => size;
  204. lfs_file_close(&lfs, &file) => 0;
  205. lfs_unmount(&lfs) => 0;
  206. TEST
  207. echo "--- Large file seek and write ---"
  208. scripts/test.py << TEST
  209. lfs_mount(&lfs, &cfg) => 0;
  210. lfs_file_open(&lfs, &file, "hello/kitty042", LFS_O_RDWR) => 0;
  211. lfs_soff_t pos;
  212. lfs_size_t size = strlen("kittycatcat");
  213. for (int i = 0; i < $MEDIUMSIZE; i++) {
  214. lfs_file_read(&lfs, &file, buffer, size) => size;
  215. if (i != $SMALLSIZE) {
  216. memcmp(buffer, "kittycatcat", size) => 0;
  217. }
  218. pos = lfs_file_tell(&lfs, &file);
  219. }
  220. pos >= 0 => 1;
  221. memcpy(buffer, "doggodogdog", size);
  222. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  223. lfs_file_write(&lfs, &file, buffer, size) => size;
  224. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  225. lfs_file_read(&lfs, &file, buffer, size) => size;
  226. memcmp(buffer, "doggodogdog", size) => 0;
  227. lfs_file_rewind(&lfs, &file) => 0;
  228. lfs_file_read(&lfs, &file, buffer, size) => size;
  229. memcmp(buffer, "kittycatcat", size) => 0;
  230. lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos;
  231. lfs_file_read(&lfs, &file, buffer, size) => size;
  232. memcmp(buffer, "doggodogdog", size) => 0;
  233. lfs_file_seek(&lfs, &file, -size, LFS_SEEK_END) >= 0 => 1;
  234. lfs_file_read(&lfs, &file, buffer, size) => size;
  235. memcmp(buffer, "kittycatcat", size) => 0;
  236. size = lfs_file_size(&lfs, &file);
  237. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_CUR) => size;
  238. lfs_file_close(&lfs, &file) => 0;
  239. lfs_unmount(&lfs) => 0;
  240. TEST
  241. echo "--- Boundary seek and write ---"
  242. scripts/test.py << TEST
  243. lfs_mount(&lfs, &cfg) => 0;
  244. lfs_file_open(&lfs, &file, "hello/kitty042", LFS_O_RDWR) => 0;
  245. lfs_size_t size = strlen("hedgehoghog");
  246. const lfs_soff_t offsets[] = {512, 1020, 513, 1021, 511, 1019};
  247. for (unsigned i = 0; i < sizeof(offsets) / sizeof(offsets[0]); i++) {
  248. lfs_soff_t off = offsets[i];
  249. memcpy(buffer, "hedgehoghog", size);
  250. lfs_file_seek(&lfs, &file, off, LFS_SEEK_SET) => off;
  251. lfs_file_write(&lfs, &file, buffer, size) => size;
  252. lfs_file_seek(&lfs, &file, off, LFS_SEEK_SET) => off;
  253. lfs_file_read(&lfs, &file, buffer, size) => size;
  254. memcmp(buffer, "hedgehoghog", size) => 0;
  255. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0;
  256. lfs_file_read(&lfs, &file, buffer, size) => size;
  257. memcmp(buffer, "kittycatcat", size) => 0;
  258. lfs_file_sync(&lfs, &file) => 0;
  259. }
  260. lfs_file_close(&lfs, &file) => 0;
  261. lfs_unmount(&lfs) => 0;
  262. TEST
  263. echo "--- Out-of-bounds seek ---"
  264. scripts/test.py << TEST
  265. lfs_mount(&lfs, &cfg) => 0;
  266. lfs_file_open(&lfs, &file, "hello/kitty042", LFS_O_RDWR) => 0;
  267. lfs_size_t size = strlen("kittycatcat");
  268. lfs_file_size(&lfs, &file) => $LARGESIZE*size;
  269. lfs_file_seek(&lfs, &file, ($LARGESIZE+$SMALLSIZE)*size,
  270. LFS_SEEK_SET) => ($LARGESIZE+$SMALLSIZE)*size;
  271. lfs_file_read(&lfs, &file, buffer, size) => 0;
  272. memcpy(buffer, "porcupineee", size);
  273. lfs_file_write(&lfs, &file, buffer, size) => size;
  274. lfs_file_seek(&lfs, &file, ($LARGESIZE+$SMALLSIZE)*size,
  275. LFS_SEEK_SET) => ($LARGESIZE+$SMALLSIZE)*size;
  276. lfs_file_read(&lfs, &file, buffer, size) => size;
  277. memcmp(buffer, "porcupineee", size) => 0;
  278. lfs_file_seek(&lfs, &file, $LARGESIZE*size,
  279. LFS_SEEK_SET) => $LARGESIZE*size;
  280. lfs_file_read(&lfs, &file, buffer, size) => size;
  281. memcmp(buffer, "\0\0\0\0\0\0\0\0\0\0\0", size) => 0;
  282. lfs_file_seek(&lfs, &file, -(($LARGESIZE+$SMALLSIZE)*size),
  283. LFS_SEEK_CUR) => LFS_ERR_INVAL;
  284. lfs_file_tell(&lfs, &file) => ($LARGESIZE+1)*size;
  285. lfs_file_seek(&lfs, &file, -(($LARGESIZE+2*$SMALLSIZE)*size),
  286. LFS_SEEK_END) => LFS_ERR_INVAL;
  287. lfs_file_tell(&lfs, &file) => ($LARGESIZE+1)*size;
  288. lfs_file_close(&lfs, &file) => 0;
  289. lfs_unmount(&lfs) => 0;
  290. TEST
  291. echo "--- Inline write and seek ---"
  292. for SIZE in $SMALLSIZE $MEDIUMSIZE $LARGESIZE
  293. do
  294. scripts/test.py << TEST
  295. lfs_mount(&lfs, &cfg) => 0;
  296. lfs_file_open(&lfs, &file, "hello/tinykitty$SIZE",
  297. LFS_O_RDWR | LFS_O_CREAT) => 0;
  298. int j = 0;
  299. int k = 0;
  300. memcpy(buffer, "abcdefghijklmnopqrstuvwxyz", 26);
  301. for (unsigned i = 0; i < $SIZE; i++) {
  302. lfs_file_write(&lfs, &file, &buffer[j++ % 26], 1) => 1;
  303. lfs_file_tell(&lfs, &file) => i+1;
  304. lfs_file_size(&lfs, &file) => i+1;
  305. }
  306. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0;
  307. lfs_file_tell(&lfs, &file) => 0;
  308. lfs_file_size(&lfs, &file) => $SIZE;
  309. for (unsigned i = 0; i < $SIZE; i++) {
  310. uint8_t c;
  311. lfs_file_read(&lfs, &file, &c, 1) => 1;
  312. c => buffer[k++ % 26];
  313. }
  314. lfs_file_sync(&lfs, &file) => 0;
  315. lfs_file_tell(&lfs, &file) => $SIZE;
  316. lfs_file_size(&lfs, &file) => $SIZE;
  317. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0;
  318. for (unsigned i = 0; i < $SIZE; i++) {
  319. lfs_file_write(&lfs, &file, &buffer[j++ % 26], 1) => 1;
  320. lfs_file_tell(&lfs, &file) => i+1;
  321. lfs_file_size(&lfs, &file) => $SIZE;
  322. lfs_file_sync(&lfs, &file) => 0;
  323. lfs_file_tell(&lfs, &file) => i+1;
  324. lfs_file_size(&lfs, &file) => $SIZE;
  325. if (i < $SIZE-2) {
  326. uint8_t c[3];
  327. lfs_file_seek(&lfs, &file, -1, LFS_SEEK_CUR) => i;
  328. lfs_file_read(&lfs, &file, &c, 3) => 3;
  329. lfs_file_tell(&lfs, &file) => i+3;
  330. lfs_file_size(&lfs, &file) => $SIZE;
  331. lfs_file_seek(&lfs, &file, i+1, LFS_SEEK_SET) => i+1;
  332. lfs_file_tell(&lfs, &file) => i+1;
  333. lfs_file_size(&lfs, &file) => $SIZE;
  334. }
  335. }
  336. lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0;
  337. lfs_file_tell(&lfs, &file) => 0;
  338. lfs_file_size(&lfs, &file) => $SIZE;
  339. for (unsigned i = 0; i < $SIZE; i++) {
  340. uint8_t c;
  341. lfs_file_read(&lfs, &file, &c, 1) => 1;
  342. c => buffer[k++ % 26];
  343. }
  344. lfs_file_sync(&lfs, &file) => 0;
  345. lfs_file_tell(&lfs, &file) => $SIZE;
  346. lfs_file_size(&lfs, &file) => $SIZE;
  347. lfs_file_close(&lfs, &file) => 0;
  348. lfs_unmount(&lfs) => 0;
  349. TEST
  350. done
  351. scripts/results.py