test_corrupt.sh 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #!/bin/bash
  2. set -eu
  3. echo "=== Corrupt tests ==="
  4. NAMEMULT=64
  5. FILEMULT=1
  6. lfs_mktree() {
  7. tests/test.py ${1:-} << TEST
  8. lfs_format(&lfs, &cfg) => 0;
  9. lfs_mount(&lfs, &cfg) => 0;
  10. for (int i = 1; i < 10; i++) {
  11. for (int j = 0; j < $NAMEMULT; j++) {
  12. buffer[j] = '0'+i;
  13. }
  14. buffer[$NAMEMULT] = '\0';
  15. lfs_mkdir(&lfs, (char*)buffer) => 0;
  16. buffer[$NAMEMULT] = '/';
  17. for (int j = 0; j < $NAMEMULT; j++) {
  18. buffer[j+$NAMEMULT+1] = '0'+i;
  19. }
  20. buffer[2*$NAMEMULT+1] = '\0';
  21. lfs_file_open(&lfs, &file[0], (char*)buffer,
  22. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  23. size = $NAMEMULT;
  24. for (int j = 0; j < i*$FILEMULT; j++) {
  25. lfs_file_write(&lfs, &file[0], buffer, size) => size;
  26. }
  27. lfs_file_close(&lfs, &file[0]) => 0;
  28. }
  29. lfs_unmount(&lfs) => 0;
  30. TEST
  31. }
  32. lfs_chktree() {
  33. tests/test.py ${1:-} << TEST
  34. lfs_mount(&lfs, &cfg) => 0;
  35. for (int i = 1; i < 10; i++) {
  36. for (int j = 0; j < $NAMEMULT; j++) {
  37. buffer[j] = '0'+i;
  38. }
  39. buffer[$NAMEMULT] = '\0';
  40. lfs_stat(&lfs, (char*)buffer, &info) => 0;
  41. info.type => LFS_TYPE_DIR;
  42. buffer[$NAMEMULT] = '/';
  43. for (int j = 0; j < $NAMEMULT; j++) {
  44. buffer[j+$NAMEMULT+1] = '0'+i;
  45. }
  46. buffer[2*$NAMEMULT+1] = '\0';
  47. lfs_file_open(&lfs, &file[0], (char*)buffer, LFS_O_RDONLY) => 0;
  48. size = $NAMEMULT;
  49. for (int j = 0; j < i*$FILEMULT; j++) {
  50. lfs_file_read(&lfs, &file[0], rbuffer, size) => size;
  51. memcmp(buffer, rbuffer, size) => 0;
  52. }
  53. lfs_file_close(&lfs, &file[0]) => 0;
  54. }
  55. lfs_unmount(&lfs) => 0;
  56. TEST
  57. }
  58. echo "--- Sanity check ---"
  59. rm -rf blocks
  60. lfs_mktree
  61. lfs_chktree
  62. echo "--- Block corruption ---"
  63. for i in {0..33}
  64. do
  65. rm -rf blocks
  66. mkdir blocks
  67. ln -s /dev/zero blocks/$(printf '%x' $i)
  68. lfs_mktree
  69. lfs_chktree
  70. done
  71. echo "--- Block persistance ---"
  72. for i in {0..33}
  73. do
  74. rm -rf blocks
  75. mkdir blocks
  76. lfs_mktree
  77. chmod a-w blocks/$(printf '%x' $i)
  78. lfs_mktree
  79. lfs_chktree
  80. done
  81. echo "--- Big region corruption ---"
  82. rm -rf blocks
  83. mkdir blocks
  84. for i in {2..255}
  85. do
  86. ln -s /dev/zero blocks/$(printf '%x' $i)
  87. done
  88. lfs_mktree
  89. lfs_chktree
  90. echo "--- Alternating corruption ---"
  91. rm -rf blocks
  92. mkdir blocks
  93. for i in {2..511..2}
  94. do
  95. ln -s /dev/zero blocks/$(printf '%x' $i)
  96. done
  97. lfs_mktree
  98. lfs_chktree
  99. echo "--- Results ---"
  100. tests/stats.py