Files
kopia/cli/command_snapshot_storage_stats_test.go
Julio Lopez 99fb50118f fix(cli): add retention to JSON output (#1992)
refactor(cli): snapshot list JSON functionality.
Defines SnapshotManifest struct for the snapshot list JSON output.

test(cli): `snapshot list --json`
2022-05-31 13:43:42 -07:00

138 lines
4.4 KiB
Go

package cli_test
import (
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/require"
"github.com/kopia/kopia/cli"
"github.com/kopia/kopia/internal/testutil"
"github.com/kopia/kopia/snapshot"
"github.com/kopia/kopia/tests/testenv"
)
func TestSnapshotStorageStats(t *testing.T) {
env := testenv.NewCLITest(t, testenv.RepoFormatNotImportant, testenv.NewInProcRunner(t))
dir1 := testutil.TempDirectory(t)
require.NoError(t, os.WriteFile(filepath.Join(dir1, "file1.txt"), []byte{1, 2, 3, 4, 5}, 0o600))
require.NoError(t, os.WriteFile(filepath.Join(dir1, "file2.txt"), []byte{2, 3, 4, 5, 6}, 0o600))
require.NoError(t, os.MkdirAll(filepath.Join(dir1, "subdir"), 0o755))
require.NoError(t, os.WriteFile(filepath.Join(dir1, "subdir", "file2.txt"), []byte{3, 4, 5, 6, 7}, 0o600))
env.RunAndExpectSuccess(t, "repo", "create", "filesystem", "--path", env.RepoDir)
env.RunAndExpectSuccess(t, "snapshot", "create", dir1)
// same as ./file1.txt
require.NoError(t, os.WriteFile(filepath.Join(dir1, "subdir", "file3.txt"), []byte{1, 2, 3, 4, 5}, 0o600))
// new file
require.NoError(t, os.WriteFile(filepath.Join(dir1, "subdir", "file4.txt"), []byte{1, 2, 3, 4, 5, 6, 7, 8}, 0o600))
env.RunAndExpectSuccess(t, "snapshot", "create", dir1)
var manifests []cli.SnapshotManifest
testutil.MustParseJSONLines(t, env.RunAndExpectSuccess(t, "snapshot", "ls", "--storage-stats", dir1, "--json"), &manifests)
require.Len(t, manifests, 2)
require.Equal(t, &snapshot.StorageStats{
NewData: snapshot.StorageUsageDetails{
FileObjectCount: 3,
DirObjectCount: 2,
ContentCount: 5,
ObjectBytes: 15,
OriginalContentBytes: 15,
PackedContentBytes: 99,
},
RunningTotal: snapshot.StorageUsageDetails{
FileObjectCount: 3,
DirObjectCount: 2,
ContentCount: 5,
ObjectBytes: 15,
OriginalContentBytes: 15,
PackedContentBytes: 99,
},
}, manifests[0].StorageStats)
require.Equal(t, &snapshot.StorageStats{
NewData: snapshot.StorageUsageDetails{
FileObjectCount: 1,
DirObjectCount: 2,
ContentCount: 3,
ObjectBytes: 8,
OriginalContentBytes: 8,
PackedContentBytes: 36,
},
RunningTotal: snapshot.StorageUsageDetails{
FileObjectCount: 4,
DirObjectCount: 4,
ContentCount: 8,
ObjectBytes: 23,
OriginalContentBytes: 23,
PackedContentBytes: 135,
},
}, manifests[1].StorageStats)
// same but in reverse order
testutil.MustParseJSONLines(t, env.RunAndExpectSuccess(t, "snapshot", "ls", "--storage-stats", dir1, "--reverse", "--json"), &manifests)
require.Len(t, manifests, 2)
require.Equal(t, &snapshot.StorageStats{
NewData: snapshot.StorageUsageDetails{
ObjectBytes: 23,
OriginalContentBytes: 23,
PackedContentBytes: 135,
FileObjectCount: 4,
DirObjectCount: 2,
ContentCount: 6,
},
RunningTotal: snapshot.StorageUsageDetails{
ObjectBytes: 23,
OriginalContentBytes: 23,
PackedContentBytes: 135,
FileObjectCount: 4,
DirObjectCount: 2,
ContentCount: 6,
},
}, manifests[0].StorageStats)
require.Equal(t, &snapshot.StorageStats{
NewData: snapshot.StorageUsageDetails{
ObjectBytes: 0, // all file data was already present
OriginalContentBytes: 0,
PackedContentBytes: 0,
FileObjectCount: 0,
DirObjectCount: 2, // new directories only
ContentCount: 2,
},
RunningTotal: snapshot.StorageUsageDetails{
ObjectBytes: 23,
OriginalContentBytes: 23,
PackedContentBytes: 135,
FileObjectCount: 4,
DirObjectCount: 4,
ContentCount: 8,
},
}, manifests[1].StorageStats)
out := env.RunAndExpectSuccess(t, "snapshot", "ls", "--storage-stats")
require.Len(t, out, 3)
require.Contains(t, out[1], "new-data:99 B ")
require.Contains(t, out[1], "new-files:3 ")
require.Contains(t, out[1], "new-dirs:2 ")
require.Contains(t, out[2], "new-data:36 B ")
require.Contains(t, out[2], "new-files:1 ")
require.Contains(t, out[2], "new-dirs:2 ")
out = env.RunAndExpectSuccess(t, "snapshot", "ls", "--storage-stats", "--reverse")
require.Len(t, out, 3)
require.Contains(t, out[1], "new-data:135 B ")
require.Contains(t, out[1], "new-files:4 ")
require.Contains(t, out[1], "new-dirs:2 ")
require.Contains(t, out[2], "new-data:0 B ")
require.Contains(t, out[2], "new-files:0 ")
require.Contains(t, out[2], "new-dirs:2 ")
}