test_truncate.sh 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #!/bin/bash
  2. set -eu
  3. export TEST_FILE=$0
  4. trap 'export TEST_LINE=$LINENO' DEBUG
  5. echo "=== Truncate tests ==="
  6. SMALLSIZE=32
  7. MEDIUMSIZE=2048
  8. LARGESIZE=8192
  9. rm -rf blocks
  10. scripts/test.py << TEST
  11. lfs_format(&lfs, &cfg) => 0;
  12. TEST
  13. echo "--- Simple truncate ---"
  14. scripts/test.py << TEST
  15. lfs_mount(&lfs, &cfg) => 0;
  16. lfs_file_open(&lfs, &file, "baldynoop",
  17. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  18. strcpy((char*)buffer, "hair");
  19. lfs_size_t size = strlen((char*)buffer);
  20. for (lfs_off_t j = 0; j < $LARGESIZE; j += size) {
  21. lfs_file_write(&lfs, &file, buffer, size) => size;
  22. }
  23. lfs_file_size(&lfs, &file) => $LARGESIZE;
  24. lfs_file_close(&lfs, &file) => 0;
  25. lfs_unmount(&lfs) => 0;
  26. TEST
  27. scripts/test.py << TEST
  28. lfs_mount(&lfs, &cfg) => 0;
  29. lfs_file_open(&lfs, &file, "baldynoop", LFS_O_RDWR) => 0;
  30. lfs_file_size(&lfs, &file) => $LARGESIZE;
  31. lfs_file_truncate(&lfs, &file, $MEDIUMSIZE) => 0;
  32. lfs_file_size(&lfs, &file) => $MEDIUMSIZE;
  33. lfs_file_close(&lfs, &file) => 0;
  34. lfs_unmount(&lfs) => 0;
  35. TEST
  36. scripts/test.py << TEST
  37. lfs_mount(&lfs, &cfg) => 0;
  38. lfs_file_open(&lfs, &file, "baldynoop", LFS_O_RDONLY) => 0;
  39. lfs_file_size(&lfs, &file) => $MEDIUMSIZE;
  40. lfs_size_t size = strlen("hair");
  41. for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
  42. lfs_file_read(&lfs, &file, buffer, size) => size;
  43. memcmp(buffer, "hair", size) => 0;
  44. }
  45. lfs_file_read(&lfs, &file, buffer, size) => 0;
  46. lfs_file_close(&lfs, &file) => 0;
  47. lfs_unmount(&lfs) => 0;
  48. TEST
  49. echo "--- Truncate and read ---"
  50. scripts/test.py << TEST
  51. lfs_mount(&lfs, &cfg) => 0;
  52. lfs_file_open(&lfs, &file, "baldyread",
  53. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  54. strcpy((char*)buffer, "hair");
  55. lfs_size_t size = strlen((char*)buffer);
  56. for (lfs_off_t j = 0; j < $LARGESIZE; j += size) {
  57. lfs_file_write(&lfs, &file, buffer, size) => size;
  58. }
  59. lfs_file_size(&lfs, &file) => $LARGESIZE;
  60. lfs_file_close(&lfs, &file) => 0;
  61. lfs_unmount(&lfs) => 0;
  62. TEST
  63. scripts/test.py << TEST
  64. lfs_mount(&lfs, &cfg) => 0;
  65. lfs_file_open(&lfs, &file, "baldyread", LFS_O_RDWR) => 0;
  66. lfs_file_size(&lfs, &file) => $LARGESIZE;
  67. lfs_file_truncate(&lfs, &file, $MEDIUMSIZE) => 0;
  68. lfs_file_size(&lfs, &file) => $MEDIUMSIZE;
  69. lfs_size_t size = strlen("hair");
  70. for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
  71. lfs_file_read(&lfs, &file, buffer, size) => size;
  72. memcmp(buffer, "hair", size) => 0;
  73. }
  74. lfs_file_read(&lfs, &file, buffer, size) => 0;
  75. lfs_file_close(&lfs, &file) => 0;
  76. lfs_unmount(&lfs) => 0;
  77. TEST
  78. scripts/test.py << TEST
  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. lfs_size_t size = strlen("hair");
  83. for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
  84. lfs_file_read(&lfs, &file, buffer, size) => size;
  85. memcmp(buffer, "hair", size) => 0;
  86. }
  87. lfs_file_read(&lfs, &file, buffer, size) => 0;
  88. lfs_file_close(&lfs, &file) => 0;
  89. lfs_unmount(&lfs) => 0;
  90. TEST
  91. echo "--- Truncate and write ---"
  92. scripts/test.py << TEST
  93. lfs_mount(&lfs, &cfg) => 0;
  94. lfs_file_open(&lfs, &file, "baldywrite",
  95. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  96. strcpy((char*)buffer, "hair");
  97. lfs_size_t size = strlen((char*)buffer);
  98. for (lfs_off_t j = 0; j < $LARGESIZE; j += size) {
  99. lfs_file_write(&lfs, &file, buffer, size) => size;
  100. }
  101. lfs_file_size(&lfs, &file) => $LARGESIZE;
  102. lfs_file_close(&lfs, &file) => 0;
  103. lfs_unmount(&lfs) => 0;
  104. TEST
  105. scripts/test.py << TEST
  106. lfs_mount(&lfs, &cfg) => 0;
  107. lfs_file_open(&lfs, &file, "baldywrite", LFS_O_RDWR) => 0;
  108. lfs_file_size(&lfs, &file) => $LARGESIZE;
  109. lfs_file_truncate(&lfs, &file, $MEDIUMSIZE) => 0;
  110. lfs_file_size(&lfs, &file) => $MEDIUMSIZE;
  111. strcpy((char*)buffer, "bald");
  112. lfs_size_t size = strlen((char*)buffer);
  113. for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
  114. lfs_file_write(&lfs, &file, buffer, size) => size;
  115. }
  116. lfs_file_size(&lfs, &file) => $MEDIUMSIZE;
  117. lfs_file_close(&lfs, &file) => 0;
  118. lfs_unmount(&lfs) => 0;
  119. TEST
  120. scripts/test.py << TEST
  121. lfs_mount(&lfs, &cfg) => 0;
  122. lfs_file_open(&lfs, &file, "baldywrite", LFS_O_RDONLY) => 0;
  123. lfs_file_size(&lfs, &file) => $MEDIUMSIZE;
  124. lfs_size_t size = strlen("bald");
  125. for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
  126. lfs_file_read(&lfs, &file, buffer, size) => size;
  127. memcmp(buffer, "bald", size) => 0;
  128. }
  129. lfs_file_read(&lfs, &file, buffer, size) => 0;
  130. lfs_file_close(&lfs, &file) => 0;
  131. lfs_unmount(&lfs) => 0;
  132. TEST
  133. # More aggressive general truncation tests
  134. truncate_test() {
  135. STARTSIZES="$1"
  136. STARTSEEKS="$2"
  137. HOTSIZES="$3"
  138. COLDSIZES="$4"
  139. scripts/test.py << TEST
  140. static const lfs_off_t startsizes[] = {$STARTSIZES};
  141. static const lfs_off_t startseeks[] = {$STARTSEEKS};
  142. static const lfs_off_t hotsizes[] = {$HOTSIZES};
  143. lfs_mount(&lfs, &cfg) => 0;
  144. for (unsigned i = 0; i < sizeof(startsizes)/sizeof(startsizes[0]); i++) {
  145. sprintf(path, "hairyhead%d", i);
  146. lfs_file_open(&lfs, &file, path,
  147. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
  148. strcpy((char*)buffer, "hair");
  149. lfs_size_t size = strlen((char*)buffer);
  150. for (lfs_off_t j = 0; j < startsizes[i]; j += size) {
  151. lfs_file_write(&lfs, &file, buffer, size) => size;
  152. }
  153. lfs_file_size(&lfs, &file) => startsizes[i];
  154. if (startseeks[i] != startsizes[i]) {
  155. lfs_file_seek(&lfs, &file,
  156. startseeks[i], LFS_SEEK_SET) => startseeks[i];
  157. }
  158. lfs_file_truncate(&lfs, &file, hotsizes[i]) => 0;
  159. lfs_file_size(&lfs, &file) => hotsizes[i];
  160. lfs_file_close(&lfs, &file) => 0;
  161. }
  162. lfs_unmount(&lfs) => 0;
  163. TEST
  164. scripts/test.py << TEST
  165. static const lfs_off_t startsizes[] = {$STARTSIZES};
  166. static const lfs_off_t hotsizes[] = {$HOTSIZES};
  167. static const lfs_off_t coldsizes[] = {$COLDSIZES};
  168. lfs_mount(&lfs, &cfg) => 0;
  169. for (unsigned i = 0; i < sizeof(startsizes)/sizeof(startsizes[0]); i++) {
  170. sprintf(path, "hairyhead%d", i);
  171. lfs_file_open(&lfs, &file, path, LFS_O_RDWR) => 0;
  172. lfs_file_size(&lfs, &file) => hotsizes[i];
  173. lfs_size_t size = strlen("hair");
  174. lfs_off_t j = 0;
  175. for (; j < startsizes[i] && j < hotsizes[i]; j += size) {
  176. lfs_file_read(&lfs, &file, buffer, size) => size;
  177. memcmp(buffer, "hair", size) => 0;
  178. }
  179. for (; j < hotsizes[i]; j += size) {
  180. lfs_file_read(&lfs, &file, buffer, size) => size;
  181. memcmp(buffer, "\0\0\0\0", size) => 0;
  182. }
  183. lfs_file_truncate(&lfs, &file, coldsizes[i]) => 0;
  184. lfs_file_size(&lfs, &file) => coldsizes[i];
  185. lfs_file_close(&lfs, &file) => 0;
  186. }
  187. lfs_unmount(&lfs) => 0;
  188. TEST
  189. scripts/test.py << TEST
  190. static const lfs_off_t startsizes[] = {$STARTSIZES};
  191. static const lfs_off_t hotsizes[] = {$HOTSIZES};
  192. static const lfs_off_t coldsizes[] = {$COLDSIZES};
  193. lfs_mount(&lfs, &cfg) => 0;
  194. for (unsigned i = 0; i < sizeof(startsizes)/sizeof(startsizes[0]); i++) {
  195. sprintf(path, "hairyhead%d", i);
  196. lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0;
  197. lfs_file_size(&lfs, &file) => coldsizes[i];
  198. lfs_size_t size = strlen("hair");
  199. lfs_off_t j = 0;
  200. for (; j < startsizes[i] && j < hotsizes[i] && j < coldsizes[i];
  201. j += size) {
  202. lfs_file_read(&lfs, &file, buffer, size) => size;
  203. memcmp(buffer, "hair", size) => 0;
  204. }
  205. for (; j < coldsizes[i]; j += size) {
  206. lfs_file_read(&lfs, &file, buffer, size) => size;
  207. memcmp(buffer, "\0\0\0\0", size) => 0;
  208. }
  209. lfs_file_close(&lfs, &file) => 0;
  210. }
  211. lfs_unmount(&lfs) => 0;
  212. TEST
  213. }
  214. echo "--- Cold shrinking truncate ---"
  215. truncate_test \
  216. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  217. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  218. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  219. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE"
  220. echo "--- Cold expanding truncate ---"
  221. truncate_test \
  222. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  223. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  224. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  225. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE"
  226. echo "--- Warm shrinking truncate ---"
  227. truncate_test \
  228. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  229. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  230. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  231. " 0, 0, 0, 0, 0"
  232. echo "--- Warm expanding truncate ---"
  233. truncate_test \
  234. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  235. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  236. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  237. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE"
  238. echo "--- Mid-file shrinking truncate ---"
  239. truncate_test \
  240. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  241. " $LARGESIZE, $LARGESIZE, $LARGESIZE, $LARGESIZE, $LARGESIZE" \
  242. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  243. " 0, 0, 0, 0, 0"
  244. echo "--- Mid-file expanding truncate ---"
  245. truncate_test \
  246. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  247. " 0, 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE" \
  248. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  249. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE"
  250. scripts/results.py