summaryrefslogtreecommitdiff
path: root/test/update.test
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-09-04 09:05:24 +0200
committercashmere <cashmere@autistici.org>2026-09-04 09:05:24 +0200
commit4f49b16079b27d7ce633619e4cddfdf2bffbc952 (patch)
treec296c1e7f3c3e2f6859c6d3a1b1b208779b89679 /test/update.test
downloadrelic-master.tar.gz
initial commitHEADmaster
Diffstat (limited to 'test/update.test')
-rw-r--r--test/update.test247
1 files changed, 247 insertions, 0 deletions
diff --git a/test/update.test b/test/update.test
new file mode 100644
index 0000000..d0c6ec9
--- /dev/null
+++ b/test/update.test
@@ -0,0 +1,247 @@
+#
+# Copyright (c) 2024 Preben Guldnerg <preben@guldberg.org>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the Simplified BSD License (also
+# known as the "2-Clause License" or "FreeBSD License".)
+#
+# This program is distributed in the hope that it will be useful,
+# but without any warranty; without even the implied warranty of
+# merchantability or fitness for a particular purpose.
+#
+# Author contact information:
+# drh@hwaci.com
+# http://www.hwaci.com/drh/
+#
+############################################################################
+#
+# Tests for the "update" command.
+#
+
+# Track number of tests we have set up in test_update_setup. This helps ensure
+# that generated files are ordered in `fossil update --verbose` mode.
+set UPDATE_TEST 0
+
+proc test_update_setup {desc} {
+ global UPDATE_TEST
+ incr UPDATE_TEST
+ fossil revert
+ fossil update
+ return [format "test-%02u-%s.txt" $UPDATE_TEST $desc]
+}
+
+# The output is in file name order, so massage $RESULT to remove initial UNCHANGED
+# files. Only do this if we have the expected branch information.
+proc test_update {testname message changes {fossil_args ""}} {
+ fossil update --verbose {*}$fossil_args
+ if { [regsub {\n-{79}\nupdated-from: [0-9a-z]{40} .*} $::RESULT {} test_result ] } {
+ regsub {^(?:UNCHANGED [-a-z0-9.]+\n)*} $test_result {} test_result
+ } else {
+ set test_result $::RESULT
+ }
+ test "update-message-$testname" {$message == $test_result}
+ fossil changes
+ test "update-changes-$testname" {$changes == $::RESULT}
+}
+
+# Use a sequence number for file content that is not important for the test.
+set UPDATE_SEQ_NO 0
+proc write_seq_to_file {fname} {
+ global UPDATE_SEQ_NO
+ incr UPDATE_SEQ_NO
+ write_file $fname "$UPDATE_SEQ_NO\n"
+}
+
+# Make sure we are not in an open repository and initialize new repository
+test_setup
+
+###############################################################################
+
+fossil update --verbose
+test update-already-up-to-date {
+ [regexp {^-{79}\ncheckout: .*\nchanges: +None. Already up-to-date.$} $RESULT]
+}
+
+# Remaining tests are carried out in the order update_cmd() performs checks.
+#
+# Common approach for tests below:
+# 1. Set the testname
+# 2. Set the file name, done by calling update_setup
+# 3. Set message and changes, the expected message message and subsequent changes
+# 3. Optionally set up and commit a common base for the next steps
+# 4. Commit a change to the repository (new tip)
+# 5. Update to the previous version
+# 6. Make changes
+# 7. Call test_update to attempt and update to tip
+
+
+set testname "conflict-standard"
+set fname [test_update_setup $testname]
+set message "CONFLICT $fname"
+set changes "EDITED $fname"
+write_seq_to_file $fname
+fossil add $fname
+fossil commit -m "Add $fname"
+fossil up previous
+write_seq_to_file $fname
+fossil add $fname
+test_update $testname $message $changes -expectError
+
+set testname "add-overwrites"
+set fname [test_update_setup $testname]
+set message "ADD $fname - overwrites an unmanaged file, original copy backed up locally"
+set changes ""
+write_seq_to_file $fname
+fossil add $fname
+fossil commit -m "Add $fname"
+fossil up previous
+write_seq_to_file $fname
+test_update $testname $message $changes -expectError
+
+set testname "add-standard"
+set fname [test_update_setup $testname]
+set message "ADD $fname"
+set changes ""
+write_seq_to_file $fname
+fossil add $fname
+fossil commit -m "Add $fname"
+fossil up previous
+test_update $testname $message $changes
+
+set testname "update-change"
+set fname [test_update_setup $testname]
+set message "UPDATE $fname - change to unmanaged file"
+set changes "DELETED $fname"
+write_seq_to_file $fname
+fossil add $fname
+fossil commit -m "Add $fname"
+write_seq_to_file $fname
+fossil commit -m "Update $fname"
+fossil up previous
+fossil rm --hard $fname
+test_update $testname $message $changes
+
+set testname "update-standard"
+set fname [test_update_setup $testname]
+set message "UPDATE $fname"
+set changes ""
+write_seq_to_file $fname
+fossil add $fname
+fossil commit -m "Add $fname"
+write_seq_to_file $fname
+fossil commit -m "Update $testname"
+fossil up previous
+test_update $testname $message $changes
+
+set testname "update-missing"
+set fname [test_update_setup $testname]
+set message "UPDATE $fname"
+set changes ""
+write_seq_to_file $fname
+fossil add $fname
+fossil commit -m "Add $fname"
+write_seq_to_file $fname
+fossil commit -m "Update $fname"
+fossil up previous
+file delete $fname
+test_update $testname $message $changes
+
+set testname "conflict-deleted"
+set fname [test_update_setup $testname]
+set message "CONFLICT $fname - edited locally but deleted by update"
+set changes ""
+write_seq_to_file $fname
+fossil add $fname
+fossil commit -m "Add $fname"
+fossil rm --hard $fname
+fossil commit -m "Remove $fname"
+fossil up previous
+file delete $fname
+test_update $testname $message $changes -expectError
+
+set testname "remove"
+set fname [test_update_setup $testname]
+set message "REMOVE $fname"
+set changes ""
+write_seq_to_file $fname
+fossil add $fname
+fossil commit -m "Add $fname"
+fossil rm --hard $fname
+fossil commit -m "Remove $fname"
+fossil up previous
+test_update $testname $message $changes
+
+set testname "merge-renamed"
+set fname [test_update_setup $testname]
+set message "MERGE $fname -> $fname.renamed"
+set changes "EDITED $fname.renamed"
+write_file $fname "center\n"
+fossil add $fname
+fossil commit -m "Add $fname"
+write_file $fname "top\ncenter\n"
+fossil mv --hard $fname "$fname.renamed"
+fossil commit -m "Update and rename $fname"
+fossil up previous
+write_file $fname "center\nbelow\n"
+test_update $testname $message $changes
+
+set testname "merge-standard"
+set fname [test_update_setup $testname]
+set message "MERGE $fname"
+set changes "EDITED $fname"
+write_file $fname "center\n"
+fossil add $fname
+fossil commit -m "Add $fname"
+write_file $fname "top\ncenter\n"
+fossil commit -m "Update $fname"
+fossil up previous
+write_file $fname "center\nbelow\n"
+test_update $testname $message $changes
+
+# TODO: test for "Cannot merge symlink" would be platform dependent
+
+set testname "merge-conflict"
+set fname [test_update_setup $testname]
+set message "MERGE $fname\n***** 1 merge conflicts in $fname"
+set changes "CONFLICT $fname"
+write_seq_to_file $fname
+fossil add $fname
+fossil commit -m "Add $fname"
+write_seq_to_file $fname
+fossil commit -m "Update $fname"
+fossil up previous
+write_seq_to_file $fname
+test_update $testname $message $changes -expectError
+
+# TODO: test for "Cannot merge binary file"?
+
+set testname "edited"
+set fname [test_update_setup $testname]
+set message "EDITED $fname\nADD $fname.other"
+set changes "EDITED $fname"
+write_seq_to_file $fname
+fossil add $fname
+fossil commit -m "Add $fname"
+write_seq_to_file "$fname.other"
+fossil add $fname.other
+fossil commit -m "Add $fname.other"
+fossil up previous
+write_seq_to_file $fname
+test_update $testname $message $changes
+
+set testname "unchanged"
+set fname [test_update_setup $testname]
+set message "ADD $fname\nUNCHANGED $fname.unchanged"
+set changes ""
+write_seq_to_file "$fname.unchanged"
+fossil add "$fname.unchanged"
+fossil commit -m "Add $fname.unchanged"
+write_seq_to_file "$fname"
+fossil add "$fname"
+fossil commit -m "Add $fname"
+fossil up previous
+test_update $testname $message $changes
+
+###############################################################################
+
+test_cleanup