diff --git a/dev/tests/run_tests.sh b/dev/tests/run_tests.sh index 8687c87..b5e1e43 100755 --- a/dev/tests/run_tests.sh +++ b/dev/tests/run_tests.sh @@ -7,7 +7,7 @@ ## On CYGWIN / MSYS, ACL and extended attributes aren't supported -# osync test suite 2016113002 +# osync test suite 2016120401 # 4 tests: # quicklocal @@ -22,6 +22,7 @@ # conflict resolution initiator with backups / multiple backups # conflict resolution target with backups / multiple backups # deletion propagation, failed deletion repropagation, skip deletion +# symlink and broken symlink propagation and deletion # replica lock checks # file attribute tests # local / remote locking resume tests @@ -177,7 +178,7 @@ function PrepareLocalDirs () { rm -rf "$INITIATOR_DIR" fi mkdir -p "$INITIATOR_DIR" - + if [ -d "$TARGET_DIR" ]; then rm -rf "$TARGET_DIR" fi @@ -235,6 +236,23 @@ function oneTimeSetUp () { OSYNC_IS_STABLE=$(GetConfFileValue "$OSYNC_DIR/$OSYNC_DEV_EXECUTABLE" "IS_STABLE") echo "Running with $OSYNC_VERSION ($OSYNC_MIN_VERSION) STABLE=$OSYNC_IS_STABLE" + + # Be sure to set default values for config files which can be incoherent if tests gets aborted + SetConfFileValue "$CONF_DIR/$LOCAL_CONF" "SKIP_DELETION" "" + SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "SKIP_DELETION" "" + + SetConfFileValue "$CONF_DIR/$LOCAL_CONF" "COPY_SYMLINKS" "no" + SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "COPY_SYMLINKS" "no" + + SetConfFileValue "$CONF_DIR/$LOCAL_CONF" "CONFLICT_BACKUP_MULTIPLE" "no" + SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "CONFLICT_BACKUP_MULTIPLE" "no" + + SetConfFileValue "$CONF_DIR/$LOCAL_CONF" "FORCE_STRANGER_LOCK_RESUME" "no" + SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "FORCE_STRANGER_LOCK_RESUME" "no" + + SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "SOFT_MAX_EXEC_TIME" "7200" + SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "HARD_MAX_EXEC_TIME" "10600" + } function oneTimeTearDown () { @@ -392,13 +410,14 @@ function test_deletion_failure () { REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i assertEquals "Second deletion run with parameters [$i]." "1" $? + # standard file tests [ -f "$TARGET_DIR/$FileA" ] - assertEquals "File [$TARGET_DIR/$FileA] is still present in deletion dir." "0" $? + assertEquals "File [$TARGET_DIR/$FileA] is still present in replica dir." "0" $? [ ! -f "$TARGET_DIR/$OSYNC_DELETE_DIR/$FileA" ] assertEquals "File [$TARGET_DIR/$OSYNC_DELETE_DIR/$FileA] is not present in deletion dir." "0" $? [ -f "$INITIATOR_DIR/$FileB" ] - assertEquals "File [$INITIATOR_DIR/$FileB] is still present in deletion dir." "0" $? + assertEquals "File [$INITIATOR_DIR/$FileB] is still present in replica dir." "0" $? [ ! -f "$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileB" ] assertEquals "File [$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileB] is not present in deletion dir." "0" $? @@ -410,12 +429,12 @@ function test_deletion_failure () { assertEquals "Third deletion run with parameters [$i]." "0" $? [ ! -f "$TARGET_DIR/$FileA" ] - assertEquals "File [$TARGET_DIR/$FileA] is still present in deletion dir." "0" $? + assertEquals "File [$TARGET_DIR/$FileA] is still present in replica dir." "0" $? [ -f "$TARGET_DIR/$OSYNC_DELETE_DIR/$FileA" ] assertEquals "File [$TARGET_DIR/$OSYNC_DELETE_DIR/$FileA] is not present in deletion dir." "0" $? [ ! -f "$INITIATOR_DIR/$FileB" ] - assertEquals "File [$INITIATOR_DIR/$FileB] is still present in deletion dir." "0" $? + assertEquals "File [$INITIATOR_DIR/$FileB] is still present in replica dir." "0" $? [ -f "$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileB" ] assertEquals "File [$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileB] is not present in deletion dir." "0" $? done @@ -492,6 +511,177 @@ function test_skip_deletion () { SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "SKIP_DELETION" "" } +function test_handle_symlinks () { + if [ "$OSYNC_MIN_VERSION" == "1" ]; then + echo "Skipping symlink tests as osync v1.1x didn't handle this." + return 0 + fi + + # Check with and without copySymlinks + copySymlinks="yes" + + echo "Running with COPY_SYMLINKS=$copySymlinks" + + SetConfFileValue "$CONF_DIR/$LOCAL_CONF" "COPY_SYMLINKS" "$copySymlinks" + SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "COPY_SYMLINKS" "$copySymlinks" + + for i in "${osyncParameters[@]}"; do + cd "$OSYNC_DIR" + + PrepareLocalDirs + + DirA="some directory with spaces" + DirB="another directoy/and sub directory" + + mkdir -p "$INITIATOR_DIR/$DirA" + mkdir -p "$TARGET_DIR/$DirB" + + FileA="$DirA/File A" + FileB="$DirB/File B" + FileAL="$DirA/File A symlink" + FileBL="$DirB/File B symlink" + + # Create symlinks + touch "$INITIATOR_DIR/$FileA" + touch "$TARGET_DIR/$FileB" + ln -s "$INITIATOR_DIR/$FileA" "$INITIATOR_DIR/$FileAL" + ln -s "$TARGET_DIR/$FileB" "$TARGET_DIR/$FileBL" + + COPY_SYMLINKS=$copySymlinks REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i + assertEquals "First symlink run with parameters [$i]." "0" $? + + # Delete symlinks + rm -f "$INITIATOR_DIR/$FileAL" + rm -f "$TARGET_DIR/$FileBL" + + COPY_SYMLINKS=$copySymlinks REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i + assertEquals "Second symlink deletion run with parameters [$i]." "0" $? + + # symlink deletion propagation + [ ! -f "$TARGET_DIR/$FileAL" ] + assertEquals "File [$TARGET_DIR/$FileAL] is still present in replica dir." "0" $? + [ -f "$TARGET_DIR/$OSYNC_DELETE_DIR/$FileAL" ] + assertEquals "File [$TARGET_DIR/$OSYNC_DELETE_DIR/$FileAL] is not present in deletion dir." "0" $? + [ ! -f "$INITIATOR_DIR/$FileBL" ] + assertEquals "File [$INITIATOR_DIR/$FileBL] is still present in replica dir." "0" $? + [ -f "$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileBL" ] + assertEquals "File [$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileBL] is not present in deletion dir." "0" $? + + # Create broken symlinks and propagate them + ln -s "$INITIATOR_DIR/$FileA" "$INITIATOR_DIR/$FileAL" + ln -s "$TARGET_DIR/$FileB" "$TARGET_DIR/$FileBL" + rm -f "$INITIATOR_DIR/$FileA" + rm -f "$TARGET_DIR/$FileB" + + COPY_SYMLINKS=$copySymlinks REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i + assertEquals "Third broken symlink run with parameters should fail [$i]." "1" $? + + [ ! -f "$TARGET_DIR/$FileAL" ] + assertEquals "File [$TARGET_DIR/$FileAL] is present in replica dir." "0" $? + + [ ! -f "$INITIATOR_DIR/$FileBL" ] + assertEquals "File [$INITIATOR_DIR/$FileBL] is present in replica dir." "0" $? + + # Check broken symlink deletion propagation + rm -f "$INITIATOR_DIR/$FileAL" + rm -f "$TARGET_DIR/$FileBL" + + COPY_SYMLINKS=$copySymlinks REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i + assertEquals "Fourth symlink deletion run should resume with parameters [$i]." "2" $? + + [ ! -f "$TARGET_DIR/$FileAL" ] + assertEquals "File [$TARGET_DIR/$FileAL] is still present in replica dir." "0" $? + [ -f "$TARGET_DIR/$OSYNC_DELETE_DIR/$FileAL" ] + assertEquals "File [$TARGET_DIR/$OSYNC_DELETE_DIR/$FileAL] is not present in deletion dir." "0" $? + [ ! -f "$INITIATOR_DIR/$FileBL" ] + assertEquals "File [$INITIATOR_DIR/$FileBL] is still present in replica dir." "0" $? + [ -f "$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileBL" ] + assertEquals "File [$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileBL] is not present in deletion dir." "0" $? + done + + # Check with and without copySymlinks + copySymlinks="no" + + echo "Running with COPY_SYMLINKS=$copySymlinks" + + SetConfFileValue "$CONF_DIR/$LOCAL_CONF" "COPY_SYMLINKS" "$copySymlinks" + SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "COPY_SYMLINKS" "$copySymlinks" + + for i in "${osyncParameters[@]}"; do + cd "$OSYNC_DIR" + + PrepareLocalDirs + + DirA="some directory with spaces" + DirB="another directoy/and sub directory" + + mkdir -p "$INITIATOR_DIR/$DirA" + mkdir -p "$TARGET_DIR/$DirB" + + FileA="$DirA/File A" + FileB="$DirB/File B" + FileAL="$DirA/File A symlink" + FileBL="$DirB/File B symlink" + + # Create symlinks + touch "$INITIATOR_DIR/$FileA" + touch "$TARGET_DIR/$FileB" + ln -s "$INITIATOR_DIR/$FileA" "$INITIATOR_DIR/$FileAL" + ln -s "$TARGET_DIR/$FileB" "$TARGET_DIR/$FileBL" + + COPY_SYMLINKS=$copySymlinks REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i + assertEquals "First symlink run with parameters [$i]." "0" $? + + # Delete symlinks + rm -f "$INITIATOR_DIR/$FileAL" + rm -f "$TARGET_DIR/$FileBL" + + COPY_SYMLINKS=$copySymlinks REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i + assertEquals "Second symlink deletion run with parameters [$i]." "0" $? + + # symlink deletion propagation + [ ! -L "$TARGET_DIR/$FileAL" ] + assertEquals "File [$TARGET_DIR/$FileAL] is still present in replica dir." "0" $? + [ -L "$TARGET_DIR/$OSYNC_DELETE_DIR/$FileAL" ] + assertEquals "File [$TARGET_DIR/$OSYNC_DELETE_DIR/$FileAL] is not present in deletion dir." "0" $? + [ ! -L "$INITIATOR_DIR/$FileBL" ] + assertEquals "File [$INITIATOR_DIR/$FileBL] is still present in replica dir." "0" $? + [ -L "$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileBL" ] + assertEquals "File [$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileBL] is not present in deletion dir." "0" $? + + # Create broken symlinks and propagate them + ln -s "$INITIATOR_DIR/$FileA" "$INITIATOR_DIR/$FileAL" + ln -s "$TARGET_DIR/$FileB" "$TARGET_DIR/$FileBL" + rm -f "$INITIATOR_DIR/$FileA" + rm -f "$TARGET_DIR/$FileB" + + COPY_SYMLINKS=$copySymlinks REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i + assertEquals "Third broken symlink run with parameters [$i]." "0" $? + + [ -L "$TARGET_DIR/$FileAL" ] + assertEquals "File [$TARGET_DIR/$FileAL] is present in replica dir." "0" $? + + [ -L "$INITIATOR_DIR/$FileBL" ] + assertEquals "File [$INITIATOR_DIR/$FileBL] is present in replica dir." "0" $? + + # Check broken symlink deletion propagation + rm -f "$INITIATOR_DIR/$FileAL" + rm -f "$TARGET_DIR/$FileBL" + + COPY_SYMLINKS=$copySymlinks REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i + assertEquals "Fourth symlink deletion run with parameters [$i]." "0" $? + + [ ! -L "$TARGET_DIR/$FileAL" ] + assertEquals "File [$TARGET_DIR/$FileAL] is still present in replica dir." "0" $? + [ -L "$TARGET_DIR/$OSYNC_DELETE_DIR/$FileAL" ] + assertEquals "File [$TARGET_DIR/$OSYNC_DELETE_DIR/$FileAL] is not present in deletion dir." "0" $? + [ ! -L "$INITIATOR_DIR/$FileBL" ] + assertEquals "File [$INITIATOR_DIR/$FileBL] is still present in replica dir." "0" $? + [ -L "$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileBL" ] + assertEquals "File [$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileBL] is not present in deletion dir." "0" $? + done +} + function test_softdeletion_cleanup () { #declare -A files @@ -723,9 +913,6 @@ function test_MultipleConflictBackups () { } function test_Locking () { - local forceStrangerUnlockLocal - local forceStrangerUnlockRemote - # local not running = resume # remote same instance_id = resume # remote different instance_id = stop @@ -809,9 +996,6 @@ function test_Locking () { # Target lock present should be resumed if instance ID is NOT the same as current one but FORCE_STRANGER_UNLOCK=yes - forceStrangerUnlockLocal=$(GetConfFileValue "$CONF_DIR/$LOCAL_CONF" "FORCE_STRANGER_LOCK_RESUME") - forceStrangerUnlockRemote=$(GetConfFileValue "$CONF_DIR/$REMOTE_CONF" "FORCE_STRANGER_LOCK_RESUME") - SetConfFileValue "$CONF_DIR/$LOCAL_CONF" "FORCE_STRANGER_LOCK_RESUME" "yes" SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "FORCE_STRANGER_LOCK_RESUME" "yes" @@ -827,8 +1011,8 @@ function test_Locking () { assertEquals "Should be able to resume when target has lock with different instance id but FORCE_STRANGER_UNLOCK=yes." "0" $? done - SetConfFileValue "$CONF_DIR/$LOCAL_CONF" "FORCE_STRANGER_LOCK_RESUME" "$forceStrangerUnlockLocal" - SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "FORCE_STRANGER_LOCK_RESUME" "$forceStrangerUnlockRemote" + SetConfFileValue "$CONF_DIR/$LOCAL_CONF" "FORCE_STRANGER_LOCK_RESUME" "no" + SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "FORCE_STRANGER_LOCK_RESUME" "no" } function test_WaitForTaskCompletion () {