Files
kopia/cli/command_policy_export_test.go
2025-04-26 13:01:20 -07:00

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")
}