mirror of
https://github.com/kopia/kopia.git
synced 2025-12-23 22:57:50 -05:00
139 lines
4.7 KiB
Go
139 lines
4.7 KiB
Go
package cli_test
|
|
|
|
import (
|
|
"os"
|
|
"path"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/kopia/kopia/internal/testutil"
|
|
"github.com/kopia/kopia/snapshot"
|
|
"github.com/kopia/kopia/snapshot/policy"
|
|
"github.com/kopia/kopia/tests/testenv"
|
|
)
|
|
|
|
func TestExportPolicy(t *testing.T) {
|
|
e := testenv.NewCLITest(t, testenv.RepoFormatNotImportant, testenv.NewInProcRunner(t))
|
|
defer e.RunAndExpectSuccess(t, "repo", "disconnect")
|
|
|
|
e.RunAndExpectSuccess(t, "repo", "create", "filesystem", "--path", e.RepoDir, "--override-username=user", "--override-hostname=host")
|
|
|
|
// check if we get the default global policy
|
|
var policies1 map[string]*policy.Policy
|
|
|
|
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export"), &policies1)
|
|
|
|
assert.Len(t, policies1, 1, "unexpected number of policies")
|
|
assert.Equal(t, policy.DefaultPolicy, policies1["(global)"], "unexpected policy")
|
|
|
|
var policies2 map[string]*policy.Policy
|
|
|
|
// we only have one policy, so exporting all policies should be the same as exporting the global policy explicitly
|
|
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export", "(global)"), &policies2)
|
|
|
|
assert.Len(t, policies2, 1, "unexpected number of policies")
|
|
assert.Equal(t, policies1, policies2, "unexpected policy")
|
|
|
|
// create a new policy
|
|
td := testutil.TempDirectory(t)
|
|
id := snapshot.SourceInfo{
|
|
Host: "host",
|
|
UserName: "user",
|
|
Path: td,
|
|
}.String()
|
|
|
|
e.RunAndExpectSuccess(t, "policy", "set", td, "--splitter=FIXED-4M")
|
|
|
|
expectedPolicy := &policy.Policy{
|
|
SplitterPolicy: policy.SplitterPolicy{
|
|
Algorithm: "FIXED-4M",
|
|
},
|
|
}
|
|
expectedPolicies := map[string]*policy.Policy{
|
|
"(global)": policy.DefaultPolicy,
|
|
id: expectedPolicy,
|
|
}
|
|
|
|
// check if we get the new policy
|
|
var policies3 map[string]*policy.Policy
|
|
|
|
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export", id), &policies3)
|
|
|
|
assert.Len(t, policies3, 1, "unexpected number of policies")
|
|
assert.Equal(t, expectedPolicy, policies3[id], "unexpected policy")
|
|
|
|
// specifying a local id should return the same policy
|
|
var policies4 map[string]*policy.Policy
|
|
|
|
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export", td), &policies4) // note: td, not id
|
|
|
|
assert.Len(t, policies4, 1, "unexpected number of policies")
|
|
assert.Equal(t, expectedPolicy, policies4[id], "unexpected policy") // thee key is always the full id however
|
|
|
|
// exporting without specifying a policy should return all policies
|
|
var policies5 map[string]*policy.Policy
|
|
|
|
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export"), &policies5)
|
|
|
|
assert.Len(t, policies5, 2, "unexpected number of policies")
|
|
assert.Equal(t, expectedPolicies, policies5, "unexpected policy")
|
|
|
|
// sanity check if --to-file works
|
|
exportPath := path.Join(td, "exported.json")
|
|
|
|
e.RunAndExpectSuccess(t, "policy", "export", "--to-file", exportPath)
|
|
|
|
exportedContent, err := os.ReadFile(exportPath)
|
|
if err != nil {
|
|
t.Fatalf("unable to read exported file: %v", err)
|
|
}
|
|
|
|
var policies6 map[string]*policy.Policy
|
|
|
|
testutil.MustParseJSONLines(t, []string{string(exportedContent)}, &policies6)
|
|
|
|
assert.Equal(t, expectedPolicies, policies6, "unexpected policy")
|
|
|
|
// should not overwrite existing file
|
|
e.RunAndExpectFailure(t, "policy", "export", "--to-file", exportPath, id)
|
|
|
|
// unless --overwrite is passed
|
|
e.RunAndExpectSuccess(t, "policy", "export", "--overwrite", "--to-file", exportPath, id)
|
|
|
|
exportedContent, err = os.ReadFile(exportPath)
|
|
if err != nil {
|
|
t.Fatalf("unable to read exported file: %v", err)
|
|
}
|
|
|
|
var policies7 map[string]*policy.Policy
|
|
|
|
testutil.MustParseJSONLines(t, []string{string(exportedContent)}, &policies7)
|
|
|
|
// we specified id, so only that policy should be exported
|
|
assert.Len(t, policies7, 1, "unexpected number of policies")
|
|
assert.Equal(t, expectedPolicy, policies5[id], "unexpected policy")
|
|
|
|
// pretty-printed JSON should be different but also correct
|
|
policies8prettyJSON := e.RunAndExpectSuccess(t, "policy", "export", "--json-indent")
|
|
|
|
var policies8pretty map[string]*policy.Policy
|
|
|
|
testutil.MustParseJSONLines(t, policies8prettyJSON, &policies8pretty)
|
|
|
|
policies8JSON := e.RunAndExpectSuccess(t, "policy", "export")
|
|
|
|
var policies8 map[string]*policy.Policy
|
|
|
|
testutil.MustParseJSONLines(t, policies8JSON, &policies8)
|
|
|
|
assert.Equal(t, policies8, policies8pretty, "pretty-printing should not change the content")
|
|
assert.NotEqual(t, policies8JSON, policies8prettyJSON, "pretty-printed JSON should be different")
|
|
|
|
// --overwrite and no --to-file should fail
|
|
e.RunAndExpectFailure(t, "policy", "export", "--overwrite")
|
|
|
|
// writing to inaccessible file should fail
|
|
e.RunAndExpectFailure(t, "policy", "export", "--to-file", "/not/a/real/file/path")
|
|
}
|