From 060d8b57e0caa6e49c9a842efb9d6da3aff1cd05 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Sun, 13 May 2018 12:07:05 +0200 Subject: [PATCH] Restructure TestApplyPolicy --- internal/restic/snapshot_policy_test.go | 353 +++++++++--------- .../restic/testdata/policy_keep_snapshots_25 | 97 +++++ .../restic/testdata/policy_keep_snapshots_26 | 332 ++++++++++++++++ 3 files changed, 606 insertions(+), 176 deletions(-) create mode 100644 internal/restic/testdata/policy_keep_snapshots_25 create mode 100644 internal/restic/testdata/policy_keep_snapshots_26 diff --git a/internal/restic/snapshot_policy_test.go b/internal/restic/snapshot_policy_test.go index f2e0605e3..7ac89e809 100644 --- a/internal/restic/snapshot_policy_test.go +++ b/internal/restic/snapshot_policy_test.go @@ -52,193 +52,194 @@ func TestExpireSnapshotOps(t *testing.T) { } } -var testExpireSnapshots = restic.Snapshots{ - {Time: parseTimeUTC("2014-09-01 10:20:30")}, - {Time: parseTimeUTC("2014-09-02 10:20:30")}, - {Time: parseTimeUTC("2014-09-05 10:20:30")}, - {Time: parseTimeUTC("2014-09-06 10:20:30")}, - {Time: parseTimeUTC("2014-09-08 10:20:30")}, - {Time: parseTimeUTC("2014-09-09 10:20:30")}, - {Time: parseTimeUTC("2014-09-10 10:20:30")}, - {Time: parseTimeUTC("2014-09-11 10:20:30")}, - {Time: parseTimeUTC("2014-09-20 10:20:30")}, - {Time: parseTimeUTC("2014-09-22 10:20:30")}, - {Time: parseTimeUTC("2014-08-08 10:20:30")}, - {Time: parseTimeUTC("2014-08-10 10:20:30")}, - {Time: parseTimeUTC("2014-08-12 10:20:30")}, - {Time: parseTimeUTC("2014-08-13 10:20:30")}, - {Time: parseTimeUTC("2014-08-13 10:20:30.1")}, - {Time: parseTimeUTC("2014-08-15 10:20:30")}, - {Time: parseTimeUTC("2014-08-18 10:20:30")}, - {Time: parseTimeUTC("2014-08-20 10:20:30")}, - {Time: parseTimeUTC("2014-08-21 10:20:30")}, - {Time: parseTimeUTC("2014-08-22 10:20:30")}, - {Time: parseTimeUTC("2014-10-01 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-10-02 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-10-05 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-10-06 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-10-08 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-10-09 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-10-10 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-10-11 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-10-20 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-10-22 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-11-08 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-11-10 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-11-12 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-11-13 10:20:30"), Tags: []string{"foo"}}, - {Time: parseTimeUTC("2014-11-13 10:20:30.1"), Tags: []string{"bar"}}, - {Time: parseTimeUTC("2014-11-15 10:20:30"), Tags: []string{"foo", "bar"}}, - {Time: parseTimeUTC("2014-11-18 10:20:30")}, - {Time: parseTimeUTC("2014-11-20 10:20:30")}, - {Time: parseTimeUTC("2014-11-21 10:20:30")}, - {Time: parseTimeUTC("2014-11-22 10:20:30")}, - {Time: parseTimeUTC("2015-09-01 10:20:30")}, - {Time: parseTimeUTC("2015-09-02 10:20:30")}, - {Time: parseTimeUTC("2015-09-05 10:20:30")}, - {Time: parseTimeUTC("2015-09-06 10:20:30")}, - {Time: parseTimeUTC("2015-09-08 10:20:30")}, - {Time: parseTimeUTC("2015-09-09 10:20:30")}, - {Time: parseTimeUTC("2015-09-10 10:20:30")}, - {Time: parseTimeUTC("2015-09-11 10:20:30")}, - {Time: parseTimeUTC("2015-09-20 10:20:30")}, - {Time: parseTimeUTC("2015-09-22 10:20:30")}, - {Time: parseTimeUTC("2015-08-08 10:20:30")}, - {Time: parseTimeUTC("2015-08-10 10:20:30")}, - {Time: parseTimeUTC("2015-08-12 10:20:30")}, - {Time: parseTimeUTC("2015-08-13 10:20:30")}, - {Time: parseTimeUTC("2015-08-13 10:20:30.1")}, - {Time: parseTimeUTC("2015-08-15 10:20:30")}, - {Time: parseTimeUTC("2015-08-18 10:20:30")}, - {Time: parseTimeUTC("2015-08-20 10:20:30")}, - {Time: parseTimeUTC("2015-08-21 10:20:30")}, - {Time: parseTimeUTC("2015-08-22 10:20:30")}, - {Time: parseTimeUTC("2015-10-01 10:20:30")}, - {Time: parseTimeUTC("2015-10-02 10:20:30")}, - {Time: parseTimeUTC("2015-10-05 10:20:30")}, - {Time: parseTimeUTC("2015-10-06 10:20:30")}, - {Time: parseTimeUTC("2015-10-08 10:20:30")}, - {Time: parseTimeUTC("2015-10-09 10:20:30")}, - {Time: parseTimeUTC("2015-10-10 10:20:30")}, - {Time: parseTimeUTC("2015-10-11 10:20:30")}, - {Time: parseTimeUTC("2015-10-20 10:20:30")}, - {Time: parseTimeUTC("2015-10-22 10:20:30")}, - {Time: parseTimeUTC("2015-10-22 10:20:30")}, - {Time: parseTimeUTC("2015-10-22 10:20:30"), Tags: []string{"foo", "bar"}}, - {Time: parseTimeUTC("2015-10-22 10:20:30"), Tags: []string{"foo", "bar"}}, - {Time: parseTimeUTC("2015-10-22 10:20:30"), Tags: []string{"foo", "bar"}, Paths: []string{"path1", "path2"}}, - {Time: parseTimeUTC("2015-11-08 10:20:30")}, - {Time: parseTimeUTC("2015-11-10 10:20:30")}, - {Time: parseTimeUTC("2015-11-12 10:20:30")}, - {Time: parseTimeUTC("2015-11-13 10:20:30")}, - {Time: parseTimeUTC("2015-11-13 10:20:30.1")}, - {Time: parseTimeUTC("2015-11-15 10:20:30")}, - {Time: parseTimeUTC("2015-11-18 10:20:30")}, - {Time: parseTimeUTC("2015-11-20 10:20:30")}, - {Time: parseTimeUTC("2015-11-21 10:20:30")}, - {Time: parseTimeUTC("2015-11-22 10:20:30")}, - {Time: parseTimeUTC("2016-01-01 01:02:03")}, - {Time: parseTimeUTC("2016-01-01 01:03:03")}, - {Time: parseTimeUTC("2016-01-01 07:08:03")}, - {Time: parseTimeUTC("2016-01-03 07:02:03")}, - {Time: parseTimeUTC("2016-01-04 10:23:03")}, - {Time: parseTimeUTC("2016-01-04 11:23:03")}, - {Time: parseTimeUTC("2016-01-04 12:23:03")}, - {Time: parseTimeUTC("2016-01-04 12:24:03")}, - {Time: parseTimeUTC("2016-01-04 12:28:03")}, - {Time: parseTimeUTC("2016-01-04 12:30:03")}, - {Time: parseTimeUTC("2016-01-04 16:23:03")}, - {Time: parseTimeUTC("2016-01-05 09:02:03")}, - {Time: parseTimeUTC("2016-01-06 08:02:03")}, - {Time: parseTimeUTC("2016-01-07 10:02:03")}, - {Time: parseTimeUTC("2016-01-08 20:02:03")}, - {Time: parseTimeUTC("2016-01-09 21:02:03")}, - {Time: parseTimeUTC("2016-01-12 21:02:03")}, - {Time: parseTimeUTC("2016-01-12 21:08:03")}, - {Time: parseTimeUTC("2016-01-18 12:02:03")}, -} - -var expireTests = []restic.ExpirePolicy{ - {}, - {Last: 10}, - {Last: 15}, - {Last: 99}, - {Last: 200}, - {Hourly: 20}, - {Daily: 3}, - {Daily: 10}, - {Daily: 30}, - {Last: 5, Daily: 5}, - {Last: 2, Daily: 10}, - {Weekly: 2}, - {Weekly: 4}, - {Daily: 3, Weekly: 4}, - {Monthly: 6}, - {Daily: 2, Weekly: 2, Monthly: 6}, - {Yearly: 10}, - {Daily: 7, Weekly: 2, Monthly: 3, Yearly: 10}, - {Tags: []restic.TagList{{"foo"}}}, - {Tags: []restic.TagList{{"foo", "bar"}}}, - {Tags: []restic.TagList{{"foo"}, {"bar"}}}, - {Within: parseDuration("1d")}, - {Within: parseDuration("2d")}, - {Within: parseDuration("7d")}, - {Within: parseDuration("1m")}, -} - func TestApplyPolicy(t *testing.T) { - for i, p := range expireTests { - keep, remove := restic.ApplyPolicy(testExpireSnapshots, p) + var testExpireSnapshots = restic.Snapshots{ + {Time: parseTimeUTC("2014-09-01 10:20:30")}, + {Time: parseTimeUTC("2014-09-02 10:20:30")}, + {Time: parseTimeUTC("2014-09-05 10:20:30")}, + {Time: parseTimeUTC("2014-09-06 10:20:30")}, + {Time: parseTimeUTC("2014-09-08 10:20:30")}, + {Time: parseTimeUTC("2014-09-09 10:20:30")}, + {Time: parseTimeUTC("2014-09-10 10:20:30")}, + {Time: parseTimeUTC("2014-09-11 10:20:30")}, + {Time: parseTimeUTC("2014-09-20 10:20:30")}, + {Time: parseTimeUTC("2014-09-22 10:20:30")}, + {Time: parseTimeUTC("2014-08-08 10:20:30")}, + {Time: parseTimeUTC("2014-08-10 10:20:30")}, + {Time: parseTimeUTC("2014-08-12 10:20:30")}, + {Time: parseTimeUTC("2014-08-13 10:20:30")}, + {Time: parseTimeUTC("2014-08-13 10:20:30.1")}, + {Time: parseTimeUTC("2014-08-15 10:20:30")}, + {Time: parseTimeUTC("2014-08-18 10:20:30")}, + {Time: parseTimeUTC("2014-08-20 10:20:30")}, + {Time: parseTimeUTC("2014-08-21 10:20:30")}, + {Time: parseTimeUTC("2014-08-22 10:20:30")}, + {Time: parseTimeUTC("2014-10-01 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-10-02 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-10-05 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-10-06 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-10-08 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-10-09 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-10-10 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-10-11 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-10-20 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-10-22 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-11-08 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-11-10 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-11-12 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-11-13 10:20:30"), Tags: []string{"foo"}}, + {Time: parseTimeUTC("2014-11-13 10:20:30.1"), Tags: []string{"bar"}}, + {Time: parseTimeUTC("2014-11-15 10:20:30"), Tags: []string{"foo", "bar"}}, + {Time: parseTimeUTC("2014-11-18 10:20:30")}, + {Time: parseTimeUTC("2014-11-20 10:20:30")}, + {Time: parseTimeUTC("2014-11-21 10:20:30")}, + {Time: parseTimeUTC("2014-11-22 10:20:30")}, + {Time: parseTimeUTC("2015-09-01 10:20:30")}, + {Time: parseTimeUTC("2015-09-02 10:20:30")}, + {Time: parseTimeUTC("2015-09-05 10:20:30")}, + {Time: parseTimeUTC("2015-09-06 10:20:30")}, + {Time: parseTimeUTC("2015-09-08 10:20:30")}, + {Time: parseTimeUTC("2015-09-09 10:20:30")}, + {Time: parseTimeUTC("2015-09-10 10:20:30")}, + {Time: parseTimeUTC("2015-09-11 10:20:30")}, + {Time: parseTimeUTC("2015-09-20 10:20:30")}, + {Time: parseTimeUTC("2015-09-22 10:20:30")}, + {Time: parseTimeUTC("2015-08-08 10:20:30")}, + {Time: parseTimeUTC("2015-08-10 10:20:30")}, + {Time: parseTimeUTC("2015-08-12 10:20:30")}, + {Time: parseTimeUTC("2015-08-13 10:20:30")}, + {Time: parseTimeUTC("2015-08-13 10:20:30.1")}, + {Time: parseTimeUTC("2015-08-15 10:20:30")}, + {Time: parseTimeUTC("2015-08-18 10:20:30")}, + {Time: parseTimeUTC("2015-08-20 10:20:30")}, + {Time: parseTimeUTC("2015-08-21 10:20:30")}, + {Time: parseTimeUTC("2015-08-22 10:20:30")}, + {Time: parseTimeUTC("2015-10-01 10:20:30")}, + {Time: parseTimeUTC("2015-10-02 10:20:30")}, + {Time: parseTimeUTC("2015-10-05 10:20:30")}, + {Time: parseTimeUTC("2015-10-06 10:20:30")}, + {Time: parseTimeUTC("2015-10-08 10:20:30")}, + {Time: parseTimeUTC("2015-10-09 10:20:30")}, + {Time: parseTimeUTC("2015-10-10 10:20:30")}, + {Time: parseTimeUTC("2015-10-11 10:20:30")}, + {Time: parseTimeUTC("2015-10-20 10:20:30")}, + {Time: parseTimeUTC("2015-10-22 10:20:30")}, + {Time: parseTimeUTC("2015-10-22 10:20:30")}, + {Time: parseTimeUTC("2015-10-22 10:20:30"), Tags: []string{"foo", "bar"}}, + {Time: parseTimeUTC("2015-10-22 10:20:30"), Tags: []string{"foo", "bar"}}, + {Time: parseTimeUTC("2015-10-22 10:20:30"), Tags: []string{"foo", "bar"}, Paths: []string{"path1", "path2"}}, + {Time: parseTimeUTC("2015-11-08 10:20:30")}, + {Time: parseTimeUTC("2015-11-10 10:20:30")}, + {Time: parseTimeUTC("2015-11-12 10:20:30")}, + {Time: parseTimeUTC("2015-11-13 10:20:30")}, + {Time: parseTimeUTC("2015-11-13 10:20:30.1")}, + {Time: parseTimeUTC("2015-11-15 10:20:30")}, + {Time: parseTimeUTC("2015-11-18 10:20:30")}, + {Time: parseTimeUTC("2015-11-20 10:20:30")}, + {Time: parseTimeUTC("2015-11-21 10:20:30")}, + {Time: parseTimeUTC("2015-11-22 10:20:30")}, + {Time: parseTimeUTC("2016-01-01 01:02:03")}, + {Time: parseTimeUTC("2016-01-01 01:03:03")}, + {Time: parseTimeUTC("2016-01-01 07:08:03")}, + {Time: parseTimeUTC("2016-01-03 07:02:03")}, + {Time: parseTimeUTC("2016-01-04 10:23:03")}, + {Time: parseTimeUTC("2016-01-04 11:23:03")}, + {Time: parseTimeUTC("2016-01-04 12:23:03")}, + {Time: parseTimeUTC("2016-01-04 12:24:03")}, + {Time: parseTimeUTC("2016-01-04 12:28:03")}, + {Time: parseTimeUTC("2016-01-04 12:30:03")}, + {Time: parseTimeUTC("2016-01-04 16:23:03")}, + {Time: parseTimeUTC("2016-01-05 09:02:03")}, + {Time: parseTimeUTC("2016-01-06 08:02:03")}, + {Time: parseTimeUTC("2016-01-07 10:02:03")}, + {Time: parseTimeUTC("2016-01-08 20:02:03")}, + {Time: parseTimeUTC("2016-01-09 21:02:03")}, + {Time: parseTimeUTC("2016-01-12 21:02:03")}, + {Time: parseTimeUTC("2016-01-12 21:08:03")}, + {Time: parseTimeUTC("2016-01-18 12:02:03")}, + } - t.Logf("test %d: returned keep %v, remove %v (of %v) expired snapshots for policy %v", - i, len(keep), len(remove), len(testExpireSnapshots), p) + var tests = []restic.ExpirePolicy{ + {}, + {Last: 10}, + {Last: 15}, + {Last: 99}, + {Last: 200}, + {Hourly: 20}, + {Daily: 3}, + {Daily: 10}, + {Daily: 30}, + {Last: 5, Daily: 5}, + {Last: 2, Daily: 10}, + {Weekly: 2}, + {Weekly: 4}, + {Daily: 3, Weekly: 4}, + {Monthly: 6}, + {Daily: 2, Weekly: 2, Monthly: 6}, + {Yearly: 10}, + {Daily: 7, Weekly: 2, Monthly: 3, Yearly: 10}, + {Tags: []restic.TagList{{"foo"}}}, + {Tags: []restic.TagList{{"foo", "bar"}}}, + {Tags: []restic.TagList{{"foo"}, {"bar"}}}, + {Within: parseDuration("1d")}, + {Within: parseDuration("2d")}, + {Within: parseDuration("7d")}, + {Within: parseDuration("1m")}, + {Within: parseDuration("1m14d")}, + {Within: parseDuration("1y1d1m")}, + } - if len(keep)+len(remove) != len(testExpireSnapshots) { - t.Errorf("test %d: len(keep)+len(remove) = %d != len(testExpireSnapshots) = %d", - i, len(keep)+len(remove), len(testExpireSnapshots)) - } + for i, p := range tests { + t.Run("", func(t *testing.T) { + keep, remove := restic.ApplyPolicy(testExpireSnapshots, p) - if p.Sum() > 0 && len(keep) > p.Sum() { - t.Errorf("not enough snapshots removed: policy allows %v snapshots to remain, but ended up with %v", - p.Sum(), len(keep)) - } + t.Logf("returned keep %v, remove %v (of %v) expired snapshots for policy %v", + len(keep), len(remove), len(testExpireSnapshots), p) - for _, sn := range keep { - t.Logf("test %d: keep snapshot at %v %s\n", i, sn.Time, sn.Tags) - } - for _, sn := range remove { - t.Logf("test %d: forget snapshot at %v %s\n", i, sn.Time, sn.Tags) - } + if len(keep)+len(remove) != len(testExpireSnapshots) { + t.Errorf("len(keep)+len(remove) = %d != len(testExpireSnapshots) = %d", + len(keep)+len(remove), len(testExpireSnapshots)) + } - goldenFilename := filepath.Join("testdata", fmt.Sprintf("policy_keep_snapshots_%d", i)) + if p.Sum() > 0 && len(keep) > p.Sum() { + t.Errorf("not enough snapshots removed: policy allows %v snapshots to remain, but ended up with %v", + p.Sum(), len(keep)) + } - if *updateGoldenFiles { - buf, err := json.MarshalIndent(keep, "", " ") + for _, sn := range keep { + t.Logf(" keep snapshot at %v %s", sn.Time, sn.Tags) + } + for _, sn := range remove { + t.Logf(" forget snapshot at %v %s", sn.Time, sn.Tags) + } + + goldenFilename := filepath.Join("testdata", fmt.Sprintf("policy_keep_snapshots_%d", i)) + + if *updateGoldenFiles { + buf, err := json.MarshalIndent(keep, "", " ") + if err != nil { + t.Fatalf("error marshaling result: %v", err) + } + + if err = ioutil.WriteFile(goldenFilename, buf, 0644); err != nil { + t.Fatalf("unable to update golden file: %v", err) + } + } + + buf, err := ioutil.ReadFile(goldenFilename) if err != nil { - t.Fatalf("error marshaling result: %v", err) + t.Fatalf("error loading golden file %v: %v", goldenFilename, err) } - if err = ioutil.WriteFile(goldenFilename, buf, 0644); err != nil { - t.Fatalf("unable to update golden file: %v", err) + var want restic.Snapshots + err = json.Unmarshal(buf, &want) + if err != nil { + t.Fatalf("error unmarshalling golden file %v: %v", goldenFilename, err) } - } - buf, err := ioutil.ReadFile(goldenFilename) - if err != nil { - t.Errorf("error loading golden file %v: %v", goldenFilename, err) - continue - } - - var want restic.Snapshots - err = json.Unmarshal(buf, &want) - if err != nil { - t.Errorf("error unmarshalling golden file %v: %v", goldenFilename, err) - continue - } - - if !reflect.DeepEqual(keep, want) { - t.Errorf("test %v: wrong result, want:\n %v\ngot:\n %v", i, want, keep) - continue - } + if !reflect.DeepEqual(keep, want) { + t.Fatalf("wrong result, want:\n %v\ngot:\n %v", want, keep) + } + }) } } diff --git a/internal/restic/testdata/policy_keep_snapshots_25 b/internal/restic/testdata/policy_keep_snapshots_25 new file mode 100644 index 000000000..11be139f5 --- /dev/null +++ b/internal/restic/testdata/policy_keep_snapshots_25 @@ -0,0 +1,97 @@ +[ + { + "time": "2016-01-18T12:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-12T21:08:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-12T21:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-09T21:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-08T20:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-07T10:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-06T08:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-05T09:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T16:23:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T12:30:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T12:28:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T12:24:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T12:23:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T11:23:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T10:23:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-03T07:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-01T07:08:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-01T01:03:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-01T01:02:03Z", + "tree": null, + "paths": null + } +] \ No newline at end of file diff --git a/internal/restic/testdata/policy_keep_snapshots_26 b/internal/restic/testdata/policy_keep_snapshots_26 new file mode 100644 index 000000000..f36ec66b7 --- /dev/null +++ b/internal/restic/testdata/policy_keep_snapshots_26 @@ -0,0 +1,332 @@ +[ + { + "time": "2016-01-18T12:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-12T21:08:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-12T21:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-09T21:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-08T20:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-07T10:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-06T08:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-05T09:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T16:23:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T12:30:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T12:28:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T12:24:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T12:23:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T11:23:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-04T10:23:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-03T07:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-01T07:08:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-01T01:03:03Z", + "tree": null, + "paths": null + }, + { + "time": "2016-01-01T01:02:03Z", + "tree": null, + "paths": null + }, + { + "time": "2015-11-22T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-11-21T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-11-20T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-11-18T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-11-15T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-11-13T10:20:30.1Z", + "tree": null, + "paths": null + }, + { + "time": "2015-11-13T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-11-12T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-11-10T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-11-08T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": [ + "path1", + "path2" + ], + "tags": [ + "foo", + "bar" + ] + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-10-22T10:20:30Z", + "tree": null, + "paths": null, + "tags": [ + "foo", + "bar" + ] + }, + { + "time": "2015-10-20T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-10-11T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-10-10T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-10-09T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-10-08T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-10-06T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-10-05T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-10-02T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-10-01T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-09-22T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-09-20T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-09-11T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-09-10T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-09-09T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-09-08T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-09-06T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-09-05T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-09-02T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-09-01T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-08-22T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-08-21T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-08-20T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-08-18T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-08-15T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-08-13T10:20:30.1Z", + "tree": null, + "paths": null + }, + { + "time": "2015-08-13T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-08-12T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-08-10T10:20:30Z", + "tree": null, + "paths": null + }, + { + "time": "2015-08-08T10:20:30Z", + "tree": null, + "paths": null + } +] \ No newline at end of file