Add integration testing to verify backup and restoration
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
Including databases
This commit is contained in:
parent
9cdf37c680
commit
28f081c8d0
4
.gitignore
vendored
4
.gitignore
vendored
@ -21,3 +21,7 @@ dist/
|
||||
# Built executable
|
||||
restic-scheduler
|
||||
data/
|
||||
|
||||
# Itest temp dirs
|
||||
itest/data
|
||||
itest/repo
|
||||
|
4
Makefile
4
Makefile
@ -32,6 +32,10 @@ test:
|
||||
go test -v -coverprofile=coverage.out # -short
|
||||
go tool cover -func=coverage.out
|
||||
|
||||
.PHONY: itest
|
||||
itest: docker-build
|
||||
./itest/run.sh
|
||||
|
||||
# Installs pre-commit hooks
|
||||
.PHONY: install-hooks
|
||||
install-hooks:
|
||||
|
31
itest/bootstrap-tests.sh
Executable file
31
itest/bootstrap-tests.sh
Executable file
@ -0,0 +1,31 @@
|
||||
#! /bin/sh
|
||||
set -ex
|
||||
|
||||
# Create flat file
|
||||
echo "Hello" > /data/test.txt
|
||||
|
||||
# Create Sqlite database
|
||||
touch /data/test_database.db
|
||||
sqlite3 /data/test_database.db <<-EOF
|
||||
CREATE TABLE test_table (
|
||||
id integer PRIMARY KEY,
|
||||
data text NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO test_table(data)
|
||||
VALUES ("Test row");
|
||||
EOF
|
||||
|
||||
# Create MySql database
|
||||
until mysql --host "$MYSQL_HOST" --user "$MYSQL_USER" --password="$MYSQL_PWD" --execute "SHOW DATABASES;"; do
|
||||
sleep 1
|
||||
done
|
||||
mysql --host "$MYSQL_HOST" --user "$MYSQL_USER" --password="$MYSQL_PWD" main <<EOF
|
||||
CREATE TABLE test_table (
|
||||
id integer AUTO_INCREMENT PRIMARY KEY,
|
||||
data text NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO test_table(data)
|
||||
VALUES ("Test row");
|
||||
EOF
|
42
itest/docker-compose.yml
Normal file
42
itest/docker-compose.yml
Normal file
@ -0,0 +1,42 @@
|
||||
---
|
||||
version: "3.9"
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: mysql
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: shhh
|
||||
MYSQL_DATABASE: main
|
||||
|
||||
bootstrap:
|
||||
image: resticscheduler
|
||||
entrypoint: /bootstrap-tests.sh
|
||||
environment:
|
||||
MYSQL_HOST: mysql
|
||||
MYSQL_USER: root
|
||||
MYSQL_PWD: shhh
|
||||
volumes:
|
||||
- ./bootstrap-tests.sh:/bootstrap-tests.sh
|
||||
- ./data:/data
|
||||
|
||||
main:
|
||||
image: resticscheduler
|
||||
environment:
|
||||
MYSQL_HOST: mysql
|
||||
MYSQL_USER: root
|
||||
MYSQL_PWD: shhh
|
||||
volumes:
|
||||
- ./repo:/repo
|
||||
- ./data:/data
|
||||
- ./test-backup.hcl:/test-backup.hcl
|
||||
|
||||
validate:
|
||||
image: resticscheduler
|
||||
entrypoint: /validate-tests.sh
|
||||
environment:
|
||||
MYSQL_HOST: mysql
|
||||
MYSQL_USER: root
|
||||
MYSQL_PWD: shhh
|
||||
volumes:
|
||||
- ./validate-tests.sh:/validate-tests.sh
|
||||
- ./data:/data
|
35
itest/run.sh
Executable file
35
itest/run.sh
Executable file
@ -0,0 +1,35 @@
|
||||
#! /bin/bash
|
||||
set -ex
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
mkdir -p ./repo ./data
|
||||
|
||||
echo Clean everything
|
||||
docker-compose down -v
|
||||
rm -fr ./repo/* ./data/*
|
||||
sleep 5
|
||||
|
||||
echo Boostrap databases and data
|
||||
docker-compose up -d mysql
|
||||
docker-compose run bootstrap
|
||||
sleep 1
|
||||
|
||||
echo Run backup job
|
||||
docker-compose run main -backup IntegrationTest -once /test-backup.hcl
|
||||
|
||||
echo Clean data
|
||||
docker-compose down -v
|
||||
docker-compose up -d mysql
|
||||
rm -fr ./data/*
|
||||
sleep 20
|
||||
|
||||
echo Run restore
|
||||
docker-compose run main -restore IntegrationTest -once /test-backup.hcl
|
||||
sleep 1
|
||||
|
||||
echo Validate data
|
||||
docker-compose run validate
|
||||
|
||||
echo Clean all again
|
||||
docker-compose down -v
|
||||
rm -fr ./repo/* ./data/*
|
29
itest/test-backup.hcl
Normal file
29
itest/test-backup.hcl
Normal file
@ -0,0 +1,29 @@
|
||||
job "IntegrationTest" {
|
||||
schedule = "@daily"
|
||||
|
||||
config {
|
||||
repo = "/repo"
|
||||
passphrase = "shh"
|
||||
}
|
||||
|
||||
mysql "MySQL" {
|
||||
hostname = env("MYSQL_HOST")
|
||||
database = "main"
|
||||
username = env("MYSQL_USER")
|
||||
password = env("MYSQL_PWD")
|
||||
dump_to = "/tmp/mysql.sql"
|
||||
}
|
||||
|
||||
sqlite "SQLite" {
|
||||
path = "/data/test_database.db"
|
||||
dump_to = "/data/test_database.db.bak"
|
||||
}
|
||||
|
||||
backup {
|
||||
paths = ["/data"]
|
||||
|
||||
restore_opts {
|
||||
Target = "/"
|
||||
}
|
||||
}
|
||||
}
|
15
itest/validate-tests.sh
Executable file
15
itest/validate-tests.sh
Executable file
@ -0,0 +1,15 @@
|
||||
#! /bin/sh
|
||||
set -ex
|
||||
|
||||
# Check flat file
|
||||
test -f /data/test.txt
|
||||
grep "^Hello" /data/test.txt
|
||||
|
||||
# Check Sqlite database
|
||||
test -f /data/test_database.db
|
||||
sqlite3 /data/test_database.db "select data from test_table where id = 1" | grep "^Test row"
|
||||
|
||||
# Check MySql database
|
||||
mysql --host "$MYSQL_HOST" --user "$MYSQL_USER" --password="$MYSQL_PWD" main <<-EOF | grep "^Test row"
|
||||
select data from test_table where id = 1;
|
||||
EOF
|
Loading…
Reference in New Issue
Block a user