github.com/gaukas/goofys100m@v0.24.0/test/fuse-test.sh (about)

     1  #!/bin/bash
     2  
     3  set -o xtrace
     4  set -o errexit
     5  
     6  : ${CATFS:="false"}
     7  
     8  #COMMON=integration-test-common.sh
     9  #source $COMMON
    10  
    11  # Configuration
    12  TEST_TEXT="HELLO WORLD"
    13  TEST_TEXT_FILE=test-s3fs.txt
    14  TEST_DIR=testdir
    15  ALT_TEST_TEXT_FILE=test-s3fs-ALT.txt
    16  TEST_TEXT_FILE_LENGTH=15
    17  BIG_FILE=big-file-s3fs.txt
    18  BIG_FILE_LENGTH=$((25 * 1024 * 1024))
    19  
    20  function mk_test_file {
    21      if [ $# == 0 ]; then
    22          TEXT=$TEST_TEXT
    23      else
    24          TEXT=$1
    25      fi
    26      echo $TEXT > $TEST_TEXT_FILE
    27      if [ ! -e $TEST_TEXT_FILE ]
    28      then
    29          echo "Could not create file ${TEST_TEXT_FILE}, it does not exist"
    30          exit 1
    31      fi
    32  }
    33  
    34  function rm_test_file {
    35      if [ $# == 0 ]; then
    36          FILE=$TEST_TEXT_FILE
    37      else
    38          FILE=$1
    39      fi
    40      rm -f $FILE
    41  
    42      if [ -e $FILE ]
    43      then
    44          echo "Could not cleanup file ${TEST_TEXT_FILE}"
    45          exit 1
    46      fi
    47  }
    48  
    49  function mk_test_dir {
    50      mkdir ${TEST_DIR}
    51  
    52      if [ ! -d ${TEST_DIR} ]; then
    53          echo "Directory ${TEST_DIR} was not created"
    54          exit 1
    55      fi
    56  }
    57  
    58  function rm_test_dir {
    59      rmdir ${TEST_DIR}
    60      if [ -e $TEST_DIR ]; then
    61          echo "Could not remove the test directory, it still exists: ${TEST_DIR}"
    62          exit 1
    63      fi
    64  }
    65  
    66  function test_append_file {
    67      echo "Testing append to file ..."
    68      # Write a small test file
    69      for x in `seq 1 $TEST_TEXT_FILE_LENGTH`
    70      do
    71         echo "echo ${TEST_TEXT} to ${TEST_TEXT_FILE}"
    72      done > ${TEST_TEXT_FILE}
    73  
    74      # Verify contents of file
    75      echo "Verifying length of test file"
    76      FILE_LENGTH=`wc -l $TEST_TEXT_FILE | awk '{print $1}'`
    77      if [ "$FILE_LENGTH" -ne "$TEST_TEXT_FILE_LENGTH" ]
    78      then
    79         echo "error: expected $TEST_TEXT_FILE_LENGTH , got $FILE_LENGTH"
    80         exit 1
    81      fi
    82  
    83      rm_test_file
    84  }
    85  
    86  function test_truncate_file {
    87      echo "Testing truncate file ..."
    88      # Write a small test file
    89      echo "${TEST_TEXT}" > ${TEST_TEXT_FILE}
    90   
    91      # Truncate file to 0 length.  This should trigger open(path, O_RDWR | O_TRUNC...)
    92      : > ${TEST_TEXT_FILE}
    93    
    94      # Verify file is zero length
    95      if [ -s ${TEST_TEXT_FILE} ]
    96      then
    97          echo "error: expected ${TEST_TEXT_FILE} to be zero length"
    98          exit 1
    99      fi
   100      rm_test_file
   101  }
   102  
   103  function test_truncate_empty_file {
   104      echo "Testing truncate empty file ..."
   105      # Write an empty test file
   106      touch ${TEST_TEXT_FILE}
   107  
   108      # Truncate the file to 1024 length
   109      t_size=1024
   110      truncate ${TEST_TEXT_FILE} -s $t_size
   111  
   112      # Verify file is zero length
   113      size=$(stat -c %s ${TEST_TEXT_FILE})
   114      if [ $t_size -ne $size ]
   115      then
   116          echo "error: expected ${TEST_TEXT_FILE} to be $t_size length, got $size"
   117          exit 1
   118      fi
   119      rm_test_file
   120  }
   121  
   122  function test_mv_file {
   123      echo "Testing mv file function ..."
   124  
   125      # if the rename file exists, delete it
   126      if [ -e $ALT_TEST_TEXT_FILE ]
   127      then
   128         rm $ALT_TEST_TEXT_FILE
   129      fi
   130  
   131      if [ -e $ALT_TEST_TEXT_FILE ]
   132      then
   133         echo "Could not delete file ${ALT_TEST_TEXT_FILE}, it still exists"
   134         exit 1
   135      fi
   136  
   137      # create the test file again
   138      mk_test_file
   139  
   140      #rename the test file
   141      mv $TEST_TEXT_FILE $ALT_TEST_TEXT_FILE
   142      if [ ! -e $ALT_TEST_TEXT_FILE ]
   143      then
   144         echo "Could not move file"
   145         exit 1
   146      fi
   147  
   148      # Check the contents of the alt file
   149      ALT_TEXT_LENGTH=`echo $TEST_TEXT | wc -c | awk '{print $1}'`
   150      ALT_FILE_LENGTH=`wc -c $ALT_TEST_TEXT_FILE | awk '{print $1}'`
   151      if [ "$ALT_FILE_LENGTH" -ne "$ALT_TEXT_LENGTH" ]
   152      then
   153         echo "moved file length is not as expected expected: $ALT_TEXT_LENGTH  got: $ALT_FILE_LENGTH"
   154         exit 1
   155      fi
   156  
   157      # clean up
   158      rm_test_file $ALT_TEST_TEXT_FILE
   159  }
   160  
   161  function test_mv_directory {
   162      echo "Testing mv directory function ..."
   163      if [ -e $TEST_DIR ]; then
   164         echo "Unexpected, this file/directory exists: ${TEST_DIR}"
   165         exit 1
   166      fi
   167  
   168      mk_test_dir
   169  
   170      mv ${TEST_DIR} ${TEST_DIR}_rename
   171  
   172      if [ ! -d "${TEST_DIR}_rename" ]; then
   173         echo "Directory ${TEST_DIR} was not renamed"
   174         exit 1
   175      fi
   176  
   177      rmdir ${TEST_DIR}_rename
   178      if [ -e "${TEST_DIR}_rename" ]; then
   179         echo "Could not remove the test directory, it still exists: ${TEST_DIR}_rename"
   180         exit 1
   181      fi
   182  }
   183  
   184  function test_redirects {
   185      echo "Testing redirects ..."
   186  
   187      mk_test_file ABCDEF
   188  
   189      CONTENT=`cat $TEST_TEXT_FILE`
   190  
   191      if [ "${CONTENT}" != "ABCDEF" ]; then
   192         echo "CONTENT read is unexpected, got ${CONTENT}, expected ABCDEF"
   193         exit 1
   194      fi
   195  
   196      echo XYZ > $TEST_TEXT_FILE
   197  
   198      CONTENT=`cat $TEST_TEXT_FILE`
   199  
   200      if [ ${CONTENT} != "XYZ" ]; then
   201         echo "CONTENT read is unexpected, got ${CONTENT}, expected XYZ"
   202         exit 1
   203      fi
   204  
   205      echo 123456 >> $TEST_TEXT_FILE
   206  
   207      LINE1=`sed -n '1,1p' $TEST_TEXT_FILE`
   208      LINE2=`sed -n '2,2p' $TEST_TEXT_FILE`
   209  
   210      if [ ${LINE1} != "XYZ" ]; then
   211         echo "LINE1 was not as expected, got ${LINE1}, expected XYZ"
   212         exit 1
   213      fi
   214  
   215      if [ ${LINE2} != "123456" ]; then
   216         echo "LINE2 was not as expected, got ${LINE2}, expected 123456"
   217         exit 1
   218      fi
   219  
   220      # clean up
   221      rm_test_file
   222  }
   223  
   224  function test_mkdir_rmdir {
   225      echo "Testing creation/removal of a directory"
   226  
   227      if [ -e $TEST_DIR ]; then
   228         echo "Unexpected, this file/directory exists: ${TEST_DIR}"
   229         exit 1
   230      fi
   231  
   232      mk_test_dir
   233      rm_test_dir
   234  }
   235  
   236  function test_chmod {
   237      echo "Testing chmod file function ..."
   238  
   239      # create the test file again
   240      mk_test_file
   241  
   242      ORIGINAL_PERMISSIONS=$(stat --format=%a $TEST_TEXT_FILE)
   243  
   244      chmod 777 $TEST_TEXT_FILE;
   245  
   246      # if they're the same, we have a problem.
   247      if [ $(stat --format=%a $TEST_TEXT_FILE) == $ORIGINAL_PERMISSIONS ]
   248      then
   249        echo "Could not modify $TEST_TEXT_FILE permissions"
   250        exit 1
   251      fi
   252  
   253      # clean up
   254      rm_test_file
   255  }
   256  
   257  function test_chown {
   258      echo "Testing chown file function ..."
   259  
   260      # create the test file again
   261      mk_test_file
   262  
   263      ORIGINAL_PERMISSIONS=$(stat --format=%u:%g $TEST_TEXT_FILE)
   264  
   265      chown 1000:1000 $TEST_TEXT_FILE;
   266  
   267      # if they're the same, we have a problem.
   268      if [ $(stat --format=%a $TEST_TEXT_FILE) == $ORIGINAL_PERMISSIONS ]
   269      then
   270        echo "Could not modify $TEST_TEXT_FILE ownership"
   271        exit 1
   272      fi
   273  
   274      # clean up
   275      rm_test_file
   276  }
   277  
   278  function test_list {
   279      echo "Testing list"
   280      mk_test_file
   281      mk_test_dir
   282  
   283      file_cnt=$(ls -1 | wc -l)
   284      if [ $file_cnt != 2 ]; then
   285          echo "Expected 2 file but got $file_cnt"
   286          exit 1
   287      fi
   288  
   289      rm_test_file
   290      rm_test_dir
   291  }
   292  
   293  function test_remove_nonempty_directory {
   294      echo "Testing removing a non-empty directory"
   295      mk_test_dir
   296      touch "${TEST_DIR}/file"
   297      rmdir "${TEST_DIR}" 2>&1 | grep -q "Directory not empty"
   298      rm "${TEST_DIR}/file"
   299      rm_test_dir
   300  }
   301  
   302  function test_rename_before_close {
   303      echo "Testing rename before close ..."
   304      (
   305          echo foo
   306          mv $TEST_TEXT_FILE ${TEST_TEXT_FILE}.new
   307      ) > $TEST_TEXT_FILE
   308  
   309      if ! cmp <(echo foo) ${TEST_TEXT_FILE}.new; then
   310          echo "rename before close failed"
   311          exit 1
   312      fi
   313  
   314      rm_test_file ${TEST_TEXT_FILE}.new
   315      rm -f ${TEST_TEXT_FILE}
   316  }
   317  
   318  function test_multipart_upload {
   319      echo "Testing multi-part upload ..."
   320      dd if=/dev/urandom of="/tmp/${BIG_FILE}" bs=$BIG_FILE_LENGTH count=1
   321      dd if="/tmp/${BIG_FILE}" of="${BIG_FILE}" bs=$BIG_FILE_LENGTH count=1
   322  
   323      # Verify contents of file
   324      echo "Comparing test file"
   325      if ! cmp "/tmp/${BIG_FILE}" "${BIG_FILE}"
   326      then
   327         exit 1
   328      fi
   329  
   330      rm -f "/tmp/${BIG_FILE}"
   331      rm_test_file "${BIG_FILE}"
   332  }
   333  
   334  function test_multipart_copy {
   335      echo "Testing multi-part copy ..."
   336      dd if=/dev/urandom of="/tmp/${BIG_FILE}" bs=$BIG_FILE_LENGTH count=1
   337      dd if="/tmp/${BIG_FILE}" of="${BIG_FILE}" bs=$BIG_FILE_LENGTH count=1
   338      mv "${BIG_FILE}" "${BIG_FILE}-copy"
   339  
   340      # Verify contents of file
   341      echo "Comparing test file"
   342      if ! cmp "/tmp/${BIG_FILE}" "${BIG_FILE}-copy"
   343      then
   344         exit 1
   345      fi
   346  
   347      rm -f "/tmp/${BIG_FILE}"
   348      rm_test_file "${BIG_FILE}-copy"
   349  }
   350  
   351  function test_special_characters {
   352      echo "Testing special characters ..."
   353  
   354      ls 'special' 2>&1 | grep -q 'No such file or directory'
   355      ls 'special?' 2>&1 | grep -q 'No such file or directory'
   356      ls 'special*' 2>&1 | grep -q 'No such file or directory'
   357      ls 'special~' 2>&1 | grep -q 'No such file or directory'
   358      ls 'special&' 2>&1 | grep -q 'No such file or directory'
   359      ls 'special@' 2>&1 | grep -q 'No such file or directory'
   360      ls 'specialĀµ' 2>&1 | grep -q 'No such file or directory'
   361  }
   362  
   363  function test_symlink {
   364      echo "Testing symlinks ..."
   365  
   366      rm -f $TEST_TEXT_FILE
   367      rm -f $ALT_TEST_TEXT_FILE
   368      echo foo > $TEST_TEXT_FILE
   369  
   370      ln -s $TEST_TEXT_FILE $ALT_TEST_TEXT_FILE
   371      cmp $TEST_TEXT_FILE $ALT_TEST_TEXT_FILE
   372  
   373      rm -f $TEST_TEXT_FILE
   374  
   375      [ -L $ALT_TEST_TEXT_FILE ]
   376      [ ! -f $ALT_TEST_TEXT_FILE ]
   377  }
   378  
   379  function test_extended_attributes {
   380      command -v setfattr >/dev/null 2>&1 || \
   381          { echo "Skipping extended attribute tests" ; return; }
   382  
   383      echo "Testing extended attributes ..."
   384  
   385      rm -f $TEST_TEXT_FILE
   386      touch $TEST_TEXT_FILE
   387  
   388      # set value
   389      setfattr -n user.key1 -v value1 $TEST_TEXT_FILE
   390      getfattr -n user.key1 --only-values $TEST_TEXT_FILE | grep -q '^value1$'
   391  
   392      # append value
   393      setfattr -n user.key2 -v value2 $TEST_TEXT_FILE
   394      getfattr -n user.key1 --only-values $TEST_TEXT_FILE | grep -q '^value1$'
   395      getfattr -n user.key2 --only-values $TEST_TEXT_FILE | grep -q '^value2$'
   396  
   397      # remove value
   398      setfattr -x user.key1 $TEST_TEXT_FILE
   399      ! getfattr -n user.key1 --only-values $TEST_TEXT_FILE
   400      getfattr -n user.key2 --only-values $TEST_TEXT_FILE | grep -q '^value2$'
   401  }
   402  
   403  function test_mtime_file {
   404      echo "Testing mtime preservation function ..."
   405  
   406      # if the rename file exists, delete it
   407      if [ -e $ALT_TEST_TEXT_FILE -o -L $ALT_TEST_TEXT_FILE ]
   408      then
   409         rm $ALT_TEST_TEXT_FILE
   410      fi
   411  
   412      if [ -e $ALT_TEST_TEXT_FILE ]
   413      then
   414         echo "Could not delete file ${ALT_TEST_TEXT_FILE}, it still exists"
   415         exit 1
   416      fi
   417  
   418      # create the test file again
   419      mk_test_file
   420      sleep 2 # allow for some time to pass to compare the timestamps between test & alt
   421  
   422      #copy the test file with preserve mode
   423      cp -p $TEST_TEXT_FILE $ALT_TEST_TEXT_FILE
   424      testmtime=`stat -c %Y $TEST_TEXT_FILE`
   425      altmtime=`stat -c %Y $ALT_TEST_TEXT_FILE`
   426      if [ "$testmtime" -ne "$altmtime" ]
   427      then
   428         echo "File times do not match:  $testmtime != $altmtime"
   429         exit 1
   430      fi
   431  }
   432  
   433  function test_rm_rf_dir {
   434     echo "Test that rm -rf will remove directory with contents"
   435     # Create a dir with some files and directories
   436     mkdir dir1
   437     mkdir dir1/dir2
   438     touch dir1/file1
   439     touch dir1/dir2/file2
   440  
   441     # Remove the dir with recursive rm
   442     rm -rf dir1
   443  
   444     if [ -e dir1 ]; then
   445         echo "rm -rf did not remove $PWD/dir1"
   446         exit 1
   447     fi
   448  }
   449  
   450  function test_write_after_seek_ahead {
   451     echo "Test writes succeed after a seek ahead"
   452     dd if=/dev/zero of=testfile seek=1 count=1 bs=1024
   453     rm testfile
   454  }
   455  
   456  function run_all_tests {
   457      test_append_file
   458      #test_truncate_file
   459      #test_truncate_empty_file
   460      test_mv_file
   461      test_mv_directory
   462      #test_redirects
   463      test_mkdir_rmdir
   464      #test_chmod
   465      #test_chown
   466      test_list
   467      test_remove_nonempty_directory
   468      # TODO: broken: https://github.com/s3fs-fuse/s3fs-fuse/issues/145
   469      #test_rename_before_close
   470      test_multipart_upload
   471      test_multipart_copy
   472      test_special_characters
   473      #test_symlink
   474      if [ "$CATFS" != "true" ]; then        
   475          test_extended_attributes
   476      fi
   477      #test_mtime_file
   478      test_rm_rf_dir
   479      if [ "$CATFS" == "true" ]; then
   480          test_write_after_seek_ahead
   481      fi
   482  }
   483  
   484  # Mount the bucket
   485  CUR_DIR=`pwd`
   486  TEST_BUCKET_MOUNT_POINT_1=$1
   487  if [ "$TEST_BUCKET_MOUNT_POINT_1" == "" ]; then
   488      echo "Mountpoint missing"
   489      exit 1
   490  fi
   491  
   492  pushd $TEST_BUCKET_MOUNT_POINT_1
   493  mkdir test_dir
   494  cd test_dir
   495  
   496  if [ -e $TEST_TEXT_FILE ]
   497  then
   498    rm -f $TEST_TEXT_FILE
   499  fi
   500  
   501  run_all_tests
   502  
   503  # Unmount the bucket
   504  popd
   505  echo "All tests complete."