Sun, 17 Dec 2023 15:33:50 +0100
fix faulty string to int conversion utilities
Probably it was expected that errno is set to EINVAL when illegal characters are encountered. But this is not standard and does not happen on every system, allowing illegal strings to be parsed as valid integers.
#!/bin/sh # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. # # Copyright 2019 Olaf Wintermann. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # if [ -z "$DAV_BIN" ]; then echo "DAV_BIN variable not set" exit 1 fi if [ -z "$DAV_SYNC_BIN" ]; then echo "DAV_BIN variable not set" exit 1 fi # checks if tmp-sync/out.txt contains a specific text # arg1: pattern # arg2: errormsg check_tmpout() { TEST=`cat tmp-sync/out.txt | grep "$1"` if [ $? -ne 0 ]; then echo "$2" exit 2 fi } # do dav-sync push and check return value # arg1: dir # arg2: errormsg dav_sync_push() { $DAV_SYNC_BIN push $1 > tmp-sync/out.txt if [ $? -ne 0 ]; then echo "$2" exit 2 fi } # do dav-sync pull and check return value # arg1: dir # arg2: errormsg dav_sync_pull() { $DAV_SYNC_BIN pull $1 > tmp-sync/out.txt if [ $? -ne 0 ]; then echo "$2" exit 2 fi } rm -f .dav/dav-sync-tests-test2a-db.xml rm -f .dav/dav-sync-tests-test2b-db.xml $DAV_BIN rm dav-test-repo/sync/test2 2> /dev/null $DAV_BIN mkcol dav-test-repo/sync/test2 2> /dev/null # tmp sync dir rm -Rf tmp-sync mkdir tmp-sync mkdir tmp-sync/test2a mkdir tmp-sync/test2b # ---------------------------------------------------------------------------- # 1. test: add 4 files, push, pull (not really an hashing test) # expected result: 4 files pushed, 4 files pulled mkdir tmp-sync/test2a/dir1/ mkdir tmp-sync/test2a/dir1/subdir1/ cp synctest/file1 tmp-sync/test2a/ cp synctest/file2 tmp-sync/test2a/dir1/ cp synctest/file3 tmp-sync/test2a/dir1/subdir1 cp synctest/file4 tmp-sync/test2a/dir1/subdir1 dav_sync_push test2a "test 1: push failed" check_tmpout "4 files pushed" "test 1: wrong push counter" check_tmpout "0 conflicts" "test 1: wrong conflict counter (push)" check_tmpout "0 errors" "test 1: wrong error counter (push)" dav_sync_pull test2b "test 1: pull failed" check_tmpout "4 files pulled" "test 1: wrong pull counter" check_tmpout "0 conflicts" "test 1: wrong conflict counter (pull)" check_tmpout "0 errors" "test 1: wrong error counter (pull)" # ---------------------------------------------------------------------------- # 2. test: touch 2 files, push # expected result: 0 files pushed sleep 3 touch tmp-sync/test2a/file1 touch tmp-sync/test2a/dir1/file2 dav_sync_push test2a "test 2: push failed" check_tmpout "0 files pushed" "test 2: wrong push counter" check_tmpout "0 conflicts" "test 2: wrong conflict counter" check_tmpout "0 errors" "test 2: wrong error counter" # ---------------------------------------------------------------------------- # 3. test: copy file1 to test2a again # expected result: 0 files pushed sleep 3 cp synctest/file1 tmp-sync/test2a/ dav_sync_push test2a "test 3: push failed" check_tmpout "0 files pushed" "test 3: wrong push counter" check_tmpout "0 conflicts" "test 3: wrong conflict counter" check_tmpout "0 errors" "test 3: wrong error counter" # ---------------------------------------------------------------------------- # 4. test: change content but don't change mtime # expected result: 1 file pushed # modify file and mtime to update mtime in the database echo "test4-change1-a" >> tmp-sync/test2a/file1 touch -t 01011200 tmp-sync/test2a/file1 dav_sync_push test2a "test 4: push failed (1)" check_tmpout "1 file pushed" "test 4: wrong push counter (1)" check_tmpout "0 conflicts" "test 4: wrong conflict counter (1)" check_tmpout "0 errors" "test 4: wrong error counter (1)" # modify file again and set mtime to same value echo "test4-change2-a" >> tmp-sync/test2a/file1 touch -t 01011200 tmp-sync/test2a/file1 dav_sync_push test2a "test 4: push failed (2)" check_tmpout "1 file pushed" "test 4: wrong push counter (2)" check_tmpout "0 conflicts" "test 4: wrong conflict counter (2)" check_tmpout "0 errors" "test 4: wrong error counter (2)" # ---------------------------------------------------------------------------- # 5. test: set same content on both sides # expected result: no conflict # prepare test2b dav_sync_pull test2b "test 5: pull failed" check_tmpout "1 file pulled" "test 5: wrong pull counter" check_tmpout "0 conflicts" "test 5: wrong conflict counter (prepare)" check_tmpout "0 errors" "test 5: wrong error counter (prepare)" # change content on both sides echo "test5-change" >> tmp-sync/test2a/file1 echo "test5-change" >> tmp-sync/test2b/file1 # push both sides dav_sync_push test2a "test 5: push failed (test2a)" check_tmpout "1 file pushed" "test 5: wrong push counter (test2a)" check_tmpout "0 conflicts" "test 5: wrong conflict counter (test2a)" check_tmpout "0 errors" "test 5: wrong error counter (test2a)" dav_sync_push test2b "test 5: push failed (test2b)" # don't check push counter check_tmpout "0 conflicts" "test 5: wrong conflict counter (test2b)" check_tmpout "0 errors" "test 5: wrong error counter (test2b)" # ---------------------------------------------------------------------------- # 6. test: upload same new file on both sides # expected result: no conflict echo "test6-newfile" >> tmp-sync/test2a/newfile1 echo "test6-newfile" >> tmp-sync/test2b/newfile1 # push both sides dav_sync_push test2a "test 6: push failed (test2a)" check_tmpout "1 file pushed" "test 6: wrong push counter (test2a)" check_tmpout "0 conflicts" "test 6: wrong conflict counter (test2a)" check_tmpout "0 errors" "test 6: wrong error counter (test2a)" dav_sync_push test2b "test 6: push failed (test2b)" # don't check push counter check_tmpout "0 conflicts" "test 6: wrong conflict counter (test2b)" check_tmpout "0 errors" "test 6: wrong error counter (test2b)" # ---------------------------------------------------------------------------- # 7. test: rename file # expected result: move mv tmp-sync/test2a/newfile1 tmp-sync/test2a/move1 dav_sync_push test2a "test 7: push failed" check_tmpout "move:" "test 7: no move" check_tmpout "0 conflicts" "test 7: wrong conflict counter" check_tmpout "0 errors" "test 7: wrong error counter" # ---------------------------------------------------------------------------- # 8. test: copy file # expected result: copy cp tmp-sync/test2a/file1 tmp-sync/test2a/copy1 dav_sync_push test2a "test 8: push failed" check_tmpout "copy:" "test 8: no move" check_tmpout "0 conflicts" "test 8: wrong conflict counter" check_tmpout "0 errors" "test 8: wrong error counter" # ---------------------------------------------------------------------------- # 9. test: copy file1 multiple times and than delete it # expected result: multiple copies, maybe one move, no errors echo "test9-change" >> tmp-sync/test2a/file1 dav_sync_push test2a "test 9: push failed (prepare)" check_tmpout "1 file pushed" "test 9: wrong push counter (prepare)" check_tmpout "0 conflicts" "test 9: wrong conflict counter (prepare)" check_tmpout "0 errors" "test 9: wrong error counter (prepare)" cp tmp-sync/test2a/file1 tmp-sync/test2a/copyx1 cp tmp-sync/test2a/file1 tmp-sync/test2a/copyx2 cp tmp-sync/test2a/file1 tmp-sync/test2a/copyx3 cp tmp-sync/test2a/file1 tmp-sync/test2a/copyx4 cp tmp-sync/test2a/file1 tmp-sync/test2a/copyx5 rm -f tmp-sync/test2a/file1 dav_sync_push test2a "test 9: push failed" check_tmpout "copy:" "test 9: no move" check_tmpout "0 conflicts" "test 9: wrong conflict counter" check_tmpout "0 errors" "test 9: wrong error counter" # to check if everything worked, pull test2b and check the files dav_sync_pull test2b check_tmpout "0 conflicts" "test 9: wrong conflict counter (pull)" check_tmpout "0 errors" "test 9: wrong error counter (pull)" cat tmp-sync/test2b/file1 > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "test 9: file1 not deleted (pull)" exit 2 fi diff tmp-sync/test2a/copyx1 tmp-sync/test2b/copyx1 > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "test 9: copyx1 missing or wrong content" exit 2 fi diff tmp-sync/test2a/copyx2 tmp-sync/test2b/copyx2 > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "test 9: copyx2 missing or wrong content" exit 2 fi diff tmp-sync/test2a/copyx3 tmp-sync/test2b/copyx3 > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "test 9: copyx3 missing or wrong content" exit 2 fi diff tmp-sync/test2a/copyx4 tmp-sync/test2b/copyx4 > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "test 9: copyx4 missing or wrong content" exit 2 fi diff tmp-sync/test2a/copyx5 tmp-sync/test2b/copyx5 > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "test 9: copyx5 missing or wrong content" exit 2 fi # ---------------------------------------------------------------------------- # 10. test: rename all copyx files, which will have all the same content hash # we don't test if everything is moved (instead of deleted), but to make sure # no errors occur when working with files with the same content # expected result: no errors mv tmp-sync/test2a/copyx1 tmp-sync/test2a/movex1 mv tmp-sync/test2a/copyx2 tmp-sync/test2a/movex2 mv tmp-sync/test2a/copyx3 tmp-sync/test2a/movex3 mv tmp-sync/test2a/copyx4 tmp-sync/test2a/movex4 mv tmp-sync/test2a/copyx5 tmp-sync/test2a/movex5 dav_sync_push test2a "test 10: push failed" check_tmpout "move:" "test 10: no move" check_tmpout "0 conflicts" "test 10: wrong conflict counter" check_tmpout "0 errors" "test 10: wrong error counter" # to check if everything worked, pull test2b and check the files dav_sync_pull test2b check_tmpout "0 conflicts" "test 9: wrong conflict counter (pull)" check_tmpout "0 errors" "test 9: wrong error counter (pull)" diff tmp-sync/test2a/movex1 tmp-sync/test2b/movex1 > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "test 10: movex1 missing or wrong content" exit 2 fi diff tmp-sync/test2a/movex2 tmp-sync/test2b/movex2 > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "test 10: movex2 missing or wrong content" exit 2 fi diff tmp-sync/test2a/movex3 tmp-sync/test2b/movex3 > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "test 10: movex3 missing or wrong content" exit 2 fi diff tmp-sync/test2a/movex4 tmp-sync/test2b/movex4 > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "test 10: movex4 missing or wrong content" exit 2 fi diff tmp-sync/test2a/movex5 tmp-sync/test2b/movex5 > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "test 10: movex5 missing or wrong content" exit 2 fi # ---------------------------------------------------------------------------- # 11. test: copy file, push test2a, pull test2b # expected result: pull copies file cp tmp-sync/test2a/movex5 tmp-sync/test2a/newcopyt11 dav_sync_push test2a "test 11: push failed" check_tmpout "copy:" "test 11: no copy (push)" check_tmpout "0 conflicts" "test 11: wrong conflict counter (push)" check_tmpout "0 errors" "test 11: wrong error counter (push)" dav_sync_pull test2b "test 11: pull failed" check_tmpout "copy:" "test 11: no copy (pull)" check_tmpout "0 conflicts" "test 11: wrong conflict counter (pull)" check_tmpout "0 errors" "test 11: wrong error counter (pull)" # ---------------------------------------------------------------------------- # 12. test: move file, push test2a, pull test2b # expected result: pull moves file # we need a fresh file with new content hash for this test echo "test12-newfile" >> tmp-sync/test2a/t12file1 dav_sync_push test2a "test 12: push failed (prepare)" check_tmpout "1 file pushed" "test 12: wrong push counter (prepare)" check_tmpout "0 conflicts" "test 12: wrong conflict counter (push, prepare)" check_tmpout "0 errors" "test 12: wrong error counter (push, prepare)" dav_sync_pull test2b "test 12: pull failed (prepare)" check_tmpout "1 file pulled" "test 12: wrong pull counter (prepare)" check_tmpout "0 conflicts" "test 12: wrong conflict counter (pull, prepare)" check_tmpout "0 errors" "test 12: wrong error counter (pull, prepare)" # actual test mv tmp-sync/test2a/t12file1 tmp-sync/test2a/t12move1 dav_sync_push test2a "test 12: push failed" check_tmpout "move:" "test 12: no copy (push)" check_tmpout "0 conflicts" "test 12: wrong conflict counter (push)" check_tmpout "0 errors" "test 12: wrong error counter (push)" dav_sync_pull test2b "test 12: pull failed" check_tmpout "move:" "test 12: no move (pull)" check_tmpout "0 conflicts" "test 12: wrong conflict counter (pull)" check_tmpout "0 errors" "test 12: wrong error counter (pull)" # ---------------------------------------------------------------------------- # 13. test: delete file, change name of other file to deleted file's name # expected result: first file has content of second file, second file deleted # prepare echo "test13-file1" > tmp-sync/test2a/t13file1 sleep 3 # make sure t13file2 doesn't has the same mtime as t13file1 echo "test13-file2" > tmp-sync/test2a/t13file2 dav_sync_push test2a "test 13: push failed (prepare)" check_tmpout "2 files pushed" "test 13: wrong push counter (prepare, push)" check_tmpout "0 conflicts" "test 13: wrong conflict counter (prepare, push)" check_tmpout "0 errors" "test 13: wrong error counter (prepare, push)" dav_sync_pull test2b "test 13: pull failed (prepare)" check_tmpout "2 files pulled" "test 13: wrong pull counter (prepare, pull)" check_tmpout "0 conflicts" "test 13: wrong conflict counter (prepare, pull)" check_tmpout "0 errors" "test 13: wrong error counter (prepare, pull)" # do test rm -f tmp-sync/test2a/t13file1 mv tmp-sync/test2a/t13file2 tmp-sync/test2a/t13file1 sleep 2 dav_sync_push test2a "test 13: push failed" # we can't check the exact output, because there are multiple valid ways # to sync the changes check_tmpout "0 conflicts" "test 13: wrong conflict counter (push)" check_tmpout "0 errors" "test 13: wrong error counter (push)" dav_sync_pull test2b "test 13: pull failed" check_tmpout "0 conflicts" "test 13: wrong conflict counter (pull)" check_tmpout "0 errors" "test 13: wrong error counter (pull)" TEST=`cat tmp-sync/test2b/t13file1` if [ $TEST != "test13-file2" ]; then echo "test 13: t13file1 has wrong content" exit 2 fi cat tmp-sync/test2b/t13file2 > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "test 13: t13file2 not deleted" exit 2 fi