test_truncate.sh 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #!/bin/bash
  2. set -eu
  3. SMALLSIZE=32
  4. MEDIUMSIZE=2048
  5. LARGESIZE=8192
  6. echo "=== Truncate tests ==="
  7. rm -rf blocks
  8. tests/test.py << TEST
  9. lfs_format(&lfs, &cfg) => 0;
  10. TEST
  11. truncate_test() {
  12. STARTSIZES="$1"
  13. STARTSEEKS="$2"
  14. HOTSIZES="$3"
  15. COLDSIZES="$4"
  16. tests/test.py << TEST
  17. static const lfs_off_t startsizes[] = {$STARTSIZES};
  18. static const lfs_off_t startseeks[] = {$STARTSEEKS};
  19. static const lfs_off_t hotsizes[] = {$HOTSIZES};
  20. lfs_mount(&lfs, &cfg) => 0;
  21. for (int i = 0; i < sizeof(startsizes)/sizeof(startsizes[0]); i++) {
  22. sprintf((char*)buffer, "hairyhead%d", i);
  23. lfs_file_open(&lfs, &file[0], (const char*)buffer,
  24. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
  25. strcpy((char*)buffer, "hair");
  26. size = strlen((char*)buffer);
  27. for (int j = 0; j < startsizes[i]; j += size) {
  28. lfs_file_write(&lfs, &file[0], buffer, size) => size;
  29. }
  30. lfs_file_size(&lfs, &file[0]) => startsizes[i];
  31. if (startseeks[i] != startsizes[i]) {
  32. lfs_file_seek(&lfs, &file[0],
  33. startseeks[i], LFS_SEEK_SET) => startseeks[i];
  34. }
  35. lfs_file_truncate(&lfs, &file[0], hotsizes[i]) => 0;
  36. lfs_file_size(&lfs, &file[0]) => hotsizes[i];
  37. lfs_file_close(&lfs, &file[0]) => 0;
  38. }
  39. lfs_unmount(&lfs) => 0;
  40. TEST
  41. tests/test.py << TEST
  42. static const lfs_off_t startsizes[] = {$STARTSIZES};
  43. static const lfs_off_t hotsizes[] = {$HOTSIZES};
  44. static const lfs_off_t coldsizes[] = {$COLDSIZES};
  45. lfs_mount(&lfs, &cfg) => 0;
  46. for (int i = 0; i < sizeof(startsizes)/sizeof(startsizes[0]); i++) {
  47. sprintf((char*)buffer, "hairyhead%d", i);
  48. lfs_file_open(&lfs, &file[0], (const char*)buffer, LFS_O_RDWR) => 0;
  49. lfs_file_size(&lfs, &file[0]) => hotsizes[i];
  50. size = strlen("hair");
  51. int j = 0;
  52. for (; j < startsizes[i] && j < hotsizes[i]; j += size) {
  53. lfs_file_read(&lfs, &file[0], buffer, size) => size;
  54. memcmp(buffer, "hair", size) => 0;
  55. }
  56. for (; j < hotsizes[i]; j += size) {
  57. lfs_file_read(&lfs, &file[0], buffer, size) => size;
  58. memcmp(buffer, "\0\0\0\0", size) => 0;
  59. }
  60. lfs_file_truncate(&lfs, &file[0], coldsizes[i]) => 0;
  61. lfs_file_size(&lfs, &file[0]) => coldsizes[i];
  62. lfs_file_close(&lfs, &file[0]) => 0;
  63. }
  64. lfs_unmount(&lfs) => 0;
  65. TEST
  66. tests/test.py << TEST
  67. static const lfs_off_t startsizes[] = {$STARTSIZES};
  68. static const lfs_off_t hotsizes[] = {$HOTSIZES};
  69. static const lfs_off_t coldsizes[] = {$COLDSIZES};
  70. lfs_mount(&lfs, &cfg) => 0;
  71. for (int i = 0; i < sizeof(startsizes)/sizeof(startsizes[0]); i++) {
  72. sprintf((char*)buffer, "hairyhead%d", i);
  73. lfs_file_open(&lfs, &file[0], (const char*)buffer, LFS_O_RDONLY) => 0;
  74. lfs_file_size(&lfs, &file[0]) => coldsizes[i];
  75. size = strlen("hair");
  76. int j = 0;
  77. for (; j < startsizes[i] && j < hotsizes[i] && j < coldsizes[i];
  78. j += size) {
  79. lfs_file_read(&lfs, &file[0], buffer, size) => size;
  80. memcmp(buffer, "hair", size) => 0;
  81. }
  82. for (; j < coldsizes[i]; j += size) {
  83. lfs_file_read(&lfs, &file[0], buffer, size) => size;
  84. memcmp(buffer, "\0\0\0\0", size) => 0;
  85. }
  86. lfs_file_close(&lfs, &file[0]) => 0;
  87. }
  88. lfs_unmount(&lfs) => 0;
  89. TEST
  90. }
  91. echo "--- Cold shrinking truncate ---"
  92. truncate_test \
  93. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  94. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  95. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  96. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE"
  97. echo "--- Cold expanding truncate ---"
  98. truncate_test \
  99. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  100. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  101. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  102. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE"
  103. echo "--- Warm shrinking truncate ---"
  104. truncate_test \
  105. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  106. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  107. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  108. " 0, 0, 0, 0, 0"
  109. echo "--- Warm expanding truncate ---"
  110. truncate_test \
  111. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  112. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  113. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  114. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE"
  115. echo "--- Mid-file shrinking truncate ---"
  116. truncate_test \
  117. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  118. " $LARGESIZE, $LARGESIZE, $LARGESIZE, $LARGESIZE, $LARGESIZE" \
  119. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  120. " 0, 0, 0, 0, 0"
  121. echo "--- Mid-file expanding truncate ---"
  122. truncate_test \
  123. " 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE, 2*$LARGESIZE" \
  124. " 0, 0, $SMALLSIZE, $MEDIUMSIZE, $LARGESIZE" \
  125. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE" \
  126. "2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE, 2*$LARGESIZE"
  127. echo "--- Results ---"
  128. tests/stats.py