mirror of
https://github.com/zrepl/zrepl.git
synced 2024-12-18 05:00:50 +01:00
3ffb69bfb0
Originally, I had a patch that would replace all usages of time.Duration in package config with the new config.Duration types, but: 1. these are all timeouts/retry intervals that have default values. Most users don't touch them, and if they do, they don't need day or week units. 2. go-yaml's error reporting for yaml.Unmarshaler is inferior to built-in types (line numbers are missing, so the error would not have sufficient context) fixes https://github.com/zrepl/zrepl/issues/486
177 lines
4.3 KiB
Go
177 lines
4.3 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestSnapshotting(t *testing.T) {
|
|
tmpl := `
|
|
jobs:
|
|
- name: foo
|
|
type: push
|
|
connect:
|
|
type: local
|
|
listener_name: foo
|
|
client_identity: bar
|
|
filesystems: {"<": true}
|
|
%s
|
|
pruning:
|
|
keep_sender:
|
|
- type: last_n
|
|
count: 10
|
|
keep_receiver:
|
|
- type: last_n
|
|
count: 10
|
|
`
|
|
manual := `
|
|
snapshotting:
|
|
type: manual
|
|
`
|
|
periodic := `
|
|
snapshotting:
|
|
type: periodic
|
|
prefix: zrepl_
|
|
timestamp_format: dense
|
|
interval: 10m
|
|
`
|
|
cron := `
|
|
snapshotting:
|
|
type: cron
|
|
prefix: zrepl_
|
|
timestamp_format: human
|
|
cron: "10 * * * *"
|
|
`
|
|
|
|
periodicDaily := `
|
|
snapshotting:
|
|
type: periodic
|
|
prefix: zrepl_
|
|
interval: 1d
|
|
`
|
|
|
|
hooks := `
|
|
snapshotting:
|
|
type: periodic
|
|
prefix: zrepl_
|
|
interval: 10m
|
|
hooks:
|
|
- type: command
|
|
path: /tmp/path/to/command
|
|
- type: command
|
|
path: /tmp/path/to/command
|
|
filesystems: { "zroot<": true, "<": false }
|
|
- type: postgres-checkpoint
|
|
dsn: "host=localhost port=5432 user=postgres sslmode=disable"
|
|
filesystems: {
|
|
"tank/postgres/data11": true
|
|
}
|
|
- type: mysql-lock-tables
|
|
dsn: "root@tcp(localhost)/"
|
|
filesystems: {
|
|
"tank/mysql": true
|
|
}
|
|
`
|
|
|
|
fillSnapshotting := func(s string) string { return fmt.Sprintf(tmpl, s) }
|
|
var c *Config
|
|
|
|
t.Run("manual", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(manual))
|
|
snm := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingManual)
|
|
assert.Equal(t, "manual", snm.Type)
|
|
})
|
|
|
|
t.Run("periodic", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(periodic))
|
|
snp := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingPeriodic)
|
|
assert.Equal(t, "periodic", snp.Type)
|
|
assert.Equal(t, 10*time.Minute, snp.Interval.Duration())
|
|
assert.Equal(t, "zrepl_", snp.Prefix)
|
|
})
|
|
|
|
t.Run("periodicDaily", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(periodicDaily))
|
|
snp := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingPeriodic)
|
|
assert.Equal(t, "periodic", snp.Type)
|
|
assert.Equal(t, 24*time.Hour, snp.Interval.Duration())
|
|
assert.Equal(t, "zrepl_", snp.Prefix)
|
|
assert.Equal(t, "dense", snp.TimestampFormat)
|
|
})
|
|
|
|
t.Run("cron", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(cron))
|
|
snp := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingCron)
|
|
assert.Equal(t, "cron", snp.Type)
|
|
assert.Equal(t, "zrepl_", snp.Prefix)
|
|
assert.Equal(t, "human", snp.TimestampFormat)
|
|
})
|
|
|
|
t.Run("hooks", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(hooks))
|
|
hs := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingPeriodic).Hooks
|
|
assert.Equal(t, hs[0].Ret.(*HookCommand).Filesystems["<"], true)
|
|
assert.Equal(t, hs[1].Ret.(*HookCommand).Filesystems["zroot<"], true)
|
|
assert.Equal(t, hs[2].Ret.(*HookPostgresCheckpoint).Filesystems["tank/postgres/data11"], true)
|
|
assert.Equal(t, hs[3].Ret.(*HookMySQLLockTables).Filesystems["tank/mysql"], true)
|
|
})
|
|
|
|
}
|
|
|
|
func TestSnapshottingTimestampDefaults(t *testing.T) {
|
|
tmpl := `
|
|
jobs:
|
|
- name: foo
|
|
type: push
|
|
connect:
|
|
type: local
|
|
listener_name: foo
|
|
client_identity: bar
|
|
filesystems: {"<": true}
|
|
%s
|
|
pruning:
|
|
keep_sender:
|
|
- type: last_n
|
|
count: 10
|
|
keep_receiver:
|
|
- type: last_n
|
|
count: 10
|
|
`
|
|
|
|
periodic := `
|
|
snapshotting:
|
|
type: periodic
|
|
prefix: zrepl_
|
|
interval: 10m
|
|
`
|
|
cron := `
|
|
snapshotting:
|
|
type: cron
|
|
prefix: zrepl_
|
|
cron: "10 * * * *"
|
|
`
|
|
|
|
fillSnapshotting := func(s string) string { return fmt.Sprintf(tmpl, s) }
|
|
var c *Config
|
|
|
|
t.Run("periodic", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(periodic))
|
|
snp := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingPeriodic)
|
|
assert.Equal(t, "periodic", snp.Type)
|
|
assert.Equal(t, 10*time.Minute, snp.Interval.Duration())
|
|
assert.Equal(t, "zrepl_", snp.Prefix)
|
|
assert.Equal(t, "dense", snp.TimestampFormat) // default was set correctly
|
|
})
|
|
|
|
t.Run("cron", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(cron))
|
|
snp := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingCron)
|
|
assert.Equal(t, "cron", snp.Type)
|
|
assert.Equal(t, "zrepl_", snp.Prefix)
|
|
assert.Equal(t, "dense", snp.TimestampFormat) // default was set correctly
|
|
})
|
|
}
|