backupninja/test/restic.bats
2021-01-12 19:30:35 -05:00

220 lines
6.1 KiB
Bash

load common
begin_restic() {
if [ ! -d "$BN_SRCDIR" ]; then
apt -qq install debootstrap
debootstrap --variant=minbase testing "$BN_SRCDIR"
fi
[ -x "$(which restic)" ] || apt -qq install restic
remote_background_command "/usr/local/bin/rest-server --no-auth --path ${BN_BACKUPDIR}"
}
setup_restic() {
export RESTICREPO="${BN_BACKUPDIR}/testrestic"
cat << EOF > "${BATS_TMPDIR}/backup.d/test.restic"
when = manual
[general]
nicelevel =
ionicelevel =
repository = ${RESTICREPO}
password = 123test
run_backup = yes
[backup]
init = yes
include = ${BN_SRCDIR}
exclude = ${BN_SRCDIR}/var
EOF
chmod 0640 "${BATS_TMPDIR}/backup.d/test.restic"
rm -rf /root/.cache/restic
}
finish_restic() {
remote_command 'kill $(pgrep -u 1000 rest-server)'
cleanup_backups local remote
rm -rf /root/.cache/restic
}
init_repo() {
if [ "$1" = "remote" ]; then
cleanup_backups remote
remote_command "restic init --repo ${RESTICREPO} <<<123test"
else
cleanup_backups local
restic init --repo "${RESTICREPO}" <<<123test
fi
}
@test "check connection test, local repository" {
local badrepo="${BN_BACKUPDIR}foo/bar"
local goodrepo="${RESTICREPO}"
# invalid repo
setconfig general repository "$badrepo"
setconfig backup init no
testaction
greplog "Info: Attempting to connect to repository at ${badrepo}$"
greplog "Fatal: The specified repository is absent or unusable!$"
# valid repo
init_repo local
setconfig general repository "${goodrepo}"
setconfig backup init no
testaction
greplog "Info: Attempting to connect to repository at ${goodrepo}$"
greplog "Info: Connected successfully.$"
}
@test "check connection test, rest repository" {
local badrepo="rest:http://foo@bar:8000/testrestic"
local okrepo="rest:http://${BN_REMOTEUSER}@${BN_REMOTEHOST}:8000/testrestic"
# invalid repo
setconfig general repository "$badrepo"
setconfig backup init no
testaction
greplog "Info: Attempting to connect to repository at ${badrepo}$"
greplog "Fatal: The specified repository is absent or unusable!$"
# valid repo
init_repo remote
setconfig general repository "${okrepo}"
setconfig backup init no
testaction
greplog "Info: Attempting to connect to repository at ${okrepo}$"
greplog "Info: Connected successfully.$"
}
@test "check config parameter general/nicelevel" {
# nicelevel is 0 by default
delconfig general nicelevel
testaction
not_greplog 'Debug: executing restic backup$' '\bnice -n\b'
# nicelevel is defined
setconfig general nicelevel -19
testaction
greplog 'Debug: executing restic backup$' '\bnice -n -19\b'
}
@test "check config parameter general/ionicelevel" {
# no ionice by default
delconfig general ionicelevel
testaction
not_greplog 'Debug: executing restic backup$' '\bionice -c2\b'
# acceptable value
setconfig general ionicelevel 7
testaction
greplog 'Debug: executing restic backup$' '\bionice -c2 -n 7\b'
# unacceptable value
setconfig general ionicelevel 10
testaction
greplog 'Fatal: The value of ionicelevel is expected to be either empty or an integer from 0 to 7. Got: 10$'
}
@test "check config parameter backup/include" {
local cmd="restic backup --repo ${RESTICREPO}"
# undefined, raises fatal error
delconfig backup include
testaction
greplog "Fatal: No files or directories specified for backup.$"
# single value
setconfig backup include "$BN_SRCDIR"
testaction
greplog 'Debug: executing restic backup$' "\b${cmd} '${BN_SRCDIR}'\s"
# mutliple values
setconfig_repeat backup include "$BN_SRCDIR" "/home"
testaction
greplog 'Debug: executing restic backup$' "\b${cmd} '${BN_SRCDIR}' '/home'\s"
# with spaces
delconfig backup include
setconfig backup include "/home/foo/My Documents"
testaction
cat ${BATS_TMPDIR}/backup.d/test.restic
greplog 'Debug: executing restic backup$' "\b${cmd} '/home/foo/My Documents'\s"
# with glob (though restic doesn't support it)
delconfig backup include
setconfig backup include "/etc/*"
testaction
cat ${BATS_TMPDIR}/backup.d/test.restic
greplog 'Debug: executing restic backup$' "\b${cmd} '/etc/\*'\s"
}
@test "check config parameter backup/exclude" {
local cmd="restic backup --repo ${RESTICREPO} '${BN_SRCDIR}' --exclude ${RESTICREPO}"
# undefined
delconfig backup exclude
testaction
greplog 'Debug: executing restic backup$' "${cmd}"
# single value
setconfig backup exclude "${BN_SRCDIR}/var"
testaction
greplog 'Debug: executing restic backup$' "\b${cmd} --exclude '${BN_SRCDIR}/var'"
# mutliple values
setconfig_repeat backup exclude "${BN_SRCDIR}/var" "/home"
testaction
greplog 'Debug: executing restic backup$' "\b${cmd} --exclude '${BN_SRCDIR}/var' --exclude '/home'"
# with spaces
delconfig backup exclude
setconfig backup exclude "/home/foo/My Documents"
testaction
cat ${BATS_TMPDIR}/backup.d/test.restic
greplog 'Debug: executing restic backup$' "\b${cmd} --exclude '/home/foo/My Documents'"
# with glob (though restic doesn't support it)
delconfig backup exclude
setconfig backup exclude "/etc/*"
testaction
cat ${BATS_TMPDIR}/backup.d/test.restic
greplog 'Debug: executing restic backup$' "\b${cmd} --exclude '/etc/\*'"
}
@test "run local backup" {
init_repo
setconfig general run_backup yes
runaction
greplog 'Info: Restic backup successful.$'
}
@test "run local forget" {
setconfig general run_forget yes
runaction
greplog 'Info: Restic forget successful.$'
}
@test "run local prune" {
setconfig general run_prune yes
runaction
greplog 'Info: Restic prune successful.$'
}
@test "run local check" {
setconfig general run_check yes
runaction
greplog 'Info: Restic check successful.$'
}
@test "run remote backup" {
local remote="http://${BN_REMOTEUSER}@${BN_REMOTEHOST}:8000/testrestic"
setconfig general repository "rest:${remote}"
setconfig general run_backup yes
runaction
greplog 'Info: Restic backup successful.$'
}