1
0
Fork 0
mirror of https://github.com/restic/restic.git synced 2025-03-09 00:00:02 +01:00

cmd_ls: one more test: ls --json to check the JSON lines

validate that the individual JSON lines are valid JSON statements.
Check for snap ID and the path names in the backup.
This commit is contained in:
Winfried Plappert 2025-02-21 18:41:52 +00:00
parent 5ddda7f5e9
commit 11c1fe3f94

View file

@ -1,12 +1,14 @@
package main
import (
"bytes"
"context"
"encoding/json"
"fmt"
"strings"
"testing"
"github.com/restic/restic/internal/restic"
rtest "github.com/restic/restic/internal/test"
)
@ -101,3 +103,65 @@ func TestRunLsSort(t *testing.T) {
rtest.Equals(t, test.expected, fileList, fmt.Sprintf("mismatch for mode %v", test.mode))
}
}
// JSON lines test
func TestRunLsJson(t *testing.T) {
pathList := []string{
"/0",
"/0/for_cmd_ls",
"/0/for_cmd_ls/file1.txt",
"/0/for_cmd_ls/file2.txt",
"/0/for_cmd_ls/python.py",
}
env, cleanup := withTestEnvironment(t)
defer cleanup()
testSetupBackupData(t, env)
opts := BackupOptions{}
testRunBackup(t, env.testdata, []string{"0/for_cmd_ls"}, opts, env.gopts)
snapshotIDs := testRunList(t, "snapshots", env.gopts)
rtest.Assert(t, len(snapshotIDs) == 1, "expected one snapshot, got %v", snapshotIDs)
buf, err := withCaptureStdout(func() error {
env.gopts.Quiet = true
env.gopts.JSON = true
return runLs(context.TODO(), LsOptions{}, env.gopts, []string{"latest"})
})
rtest.OK(t, err)
byteLines := bytes.Split(buf.Bytes(), []byte{'\n'})
// the snapshot structure from cmd_ls
type lsSnapshot struct {
*restic.Snapshot
ID *restic.ID `json:"id"`
ShortID string `json:"short_id"` // deprecated
MessageType string `json:"message_type"` // "snapshot"
StructType string `json:"struct_type"` // "snapshot", deprecated
}
var snappy lsSnapshot
rtest.OK(t, json.Unmarshal(byteLines[0], &snappy))
rtest.Equals(t, snappy.ShortID, snapshotIDs[0].Str(), "expected snap IDs to be identical")
// the node structure from cmd_ls
type lsNode struct {
Name string `json:"name"`
Type string `json:"type"`
Path string `json:"path"`
Permissions string `json:"permissions,omitempty"`
Inode uint64 `json:"inode,omitempty"`
MessageType string `json:"message_type"` // "node"
StructType string `json:"struct_type"` // "node", deprecated
}
var testNode lsNode
for i, nodeLine := range byteLines[1:] {
if len(nodeLine) == 0 {
break
}
rtest.OK(t, json.Unmarshal(nodeLine, &testNode))
rtest.Assert(t, testNode.Path == pathList[i], "expected %s actual %s", pathList[i], testNode.Path)
}
}