kubo/test/sharness/t0066-migration.sh
Marcin Rataj ccb49de852
Some checks failed
CodeQL / codeql (push) Has been cancelled
Docker Build / docker-build (push) Has been cancelled
Gateway Conformance / gateway-conformance (push) Has been cancelled
Gateway Conformance / gateway-conformance-libp2p-experiment (push) Has been cancelled
Go Build / go-build (push) Has been cancelled
Go Check / go-check (push) Has been cancelled
Go Lint / go-lint (push) Has been cancelled
Go Test / go-test (push) Has been cancelled
Interop / interop-prep (push) Has been cancelled
Sharness / sharness-test (push) Has been cancelled
Spell Check / spellcheck (push) Has been cancelled
Interop / helia-interop (push) Has been cancelled
Interop / ipfs-webui (push) Has been cancelled
feat(config): AutoConf with "auto" placeholders (#10883)
https://github.com/ipfs/kubo/pull/10883
https://github.com/ipshipyard/config.ipfs-mainnet.org/issues/3

---------

Co-authored-by: gammazero <gammazero@users.noreply.github.com>
2025-08-20 05:59:11 +02:00

145 lines
4.7 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Copyright (c) 2016 Jeromy Johnson
# MIT Licensed; see the LICENSE file in this repository.
#
test_description="Test migrations auto update prompt"
. lib/test-lib.sh
test_init_ipfs
# Remove explicit AutoConf.Enabled=false from test profile to use implicit default
# This allows daemon to work with 'auto' values added by v16-to-17 migration
ipfs config --json AutoConf.Enabled null >/dev/null 2>&1
MIGRATION_START=7
IPFS_REPO_VER=$(<.ipfs/version)
# Generate mock migration binaries
gen_mock_migrations() {
mkdir bin
i=$((MIGRATION_START))
until [ $i -ge $IPFS_REPO_VER ]
do
j=$((i+1))
echo "#!/bin/bash" > bin/fs-repo-${i}-to-${j}
echo "echo fake applying ${i}-to-${j} repo migration" >> bin/fs-repo-${i}-to-${j}
# Update version file to the target version for hybrid migration system
echo "if [ \"\$1\" = \"-path\" ] && [ -n \"\$2\" ]; then" >> bin/fs-repo-${i}-to-${j}
echo " echo $j > \"\$2/version\"" >> bin/fs-repo-${i}-to-${j}
echo "elif [ -n \"\$IPFS_PATH\" ]; then" >> bin/fs-repo-${i}-to-${j}
echo " echo $j > \"\$IPFS_PATH/version\"" >> bin/fs-repo-${i}-to-${j}
echo "fi" >> bin/fs-repo-${i}-to-${j}
chmod +x bin/fs-repo-${i}-to-${j}
((i++))
done
}
# Check for expected output from each migration
check_migration_output() {
out_file="$1"
i=$((MIGRATION_START))
until [ $i -ge $IPFS_REPO_VER ]
do
j=$((i+1))
grep "applying ${i}-to-${j} repo migration" "$out_file" > /dev/null
((i++))
done
}
# Create fake migration binaries instead of letting ipfs download from network
# To test downloading and running actual binaries, comment out this test.
test_expect_success "setup mock migrations" '
gen_mock_migrations &&
find bin -name "fs-repo-*-to-*" | wc -l > mock_count &&
echo $((IPFS_REPO_VER-MIGRATION_START)) > expect_mock_count &&
export PATH="$(pwd)/bin":$PATH &&
test_cmp mock_count expect_mock_count
'
test_expect_success "manually reset repo version to $MIGRATION_START" '
echo "$MIGRATION_START" > "$IPFS_PATH"/version
'
test_expect_success "ipfs daemon --migrate=false fails" '
test_expect_code 1 ipfs daemon --migrate=false > false_out 2>&1
'
test_expect_success "output looks good" '
grep "Kubo repository at .* has version .* and needs to be migrated to version" false_out &&
grep "Error: fs-repo requires migration" false_out
'
# The migrations will succeed and the daemon will continue running
# since the mock migrations now properly update the repo version number.
test_expect_success "ipfs daemon --migrate=true runs migration" '
ipfs daemon --migrate=true > true_out 2>&1 &
DAEMON_PID=$!
# Wait for daemon to be ready then shutdown gracefully
sleep 3 && ipfs shutdown 2>/dev/null || kill $DAEMON_PID 2>/dev/null || true
wait $DAEMON_PID 2>/dev/null || true
'
test_expect_success "output looks good" '
check_migration_output true_out &&
(grep "Success: fs-repo migrated to version $IPFS_REPO_VER" true_out > /dev/null ||
grep "Hybrid migration completed successfully: v$MIGRATION_START → v$IPFS_REPO_VER" true_out > /dev/null)
'
test_expect_success "reset repo version for auto-migration test" '
echo "$MIGRATION_START" > "$IPFS_PATH"/version
'
test_expect_success "'ipfs daemon' prompts to auto migrate" '
test_expect_code 1 ipfs daemon > daemon_out 2>&1
'
test_expect_success "output looks good" '
grep "Kubo repository at .* has version .* and needs to be migrated to version" daemon_out > /dev/null &&
grep "Run migrations now?" daemon_out > /dev/null &&
grep "Error: fs-repo requires migration" daemon_out > /dev/null
'
test_expect_success "ipfs repo migrate succeed" '
test_expect_code 0 ipfs repo migrate > migrate_out
'
test_expect_success "output looks good" '
grep "Migrating repository from version" migrate_out > /dev/null &&
(grep "Success: fs-repo migrated to version $IPFS_REPO_VER" migrate_out > /dev/null ||
grep "Hybrid migration completed successfully: v$MIGRATION_START → v$IPFS_REPO_VER" migrate_out > /dev/null)
'
test_expect_success "manually reset repo version to latest" '
echo "$IPFS_REPO_VER" > "$IPFS_PATH"/version
'
test_expect_success "detect repo does not need migration" '
test_expect_code 0 ipfs repo migrate > migrate_out
'
test_expect_success "output looks good" '
grep "Repository is already at version" migrate_out > /dev/null
'
# ensure that we get a lock error if we need to migrate and the daemon is running
test_launch_ipfs_daemon
test_expect_success "manually reset repo version to $MIGRATION_START" '
echo "$MIGRATION_START" > "$IPFS_PATH"/version
'
test_expect_success "ipfs repo migrate fails" '
test_expect_code 1 ipfs repo migrate 2> migrate_out
'
test_expect_success "output looks good" '
grep "repo.lock" migrate_out > /dev/null
'
test_kill_ipfs_daemon
test_done