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
|
# Built executable
|
||||||
restic-scheduler
|
restic-scheduler
|
||||||
data/
|
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 test -v -coverprofile=coverage.out # -short
|
||||||
go tool cover -func=coverage.out
|
go tool cover -func=coverage.out
|
||||||
|
|
||||||
|
.PHONY: itest
|
||||||
|
itest: docker-build
|
||||||
|
./itest/run.sh
|
||||||
|
|
||||||
# Installs pre-commit hooks
|
# Installs pre-commit hooks
|
||||||
.PHONY: install-hooks
|
.PHONY: install-hooks
|
||||||
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