tvl-depot/tvix/store-go/pathinfo_test.go
Florian Klink 2d51da7f40 chore(tvix/store-go): rename go module
`code.tvl.fyi/tvix/store/protos` now points to a directory that only
contains the `.proto` files, while all golang tooling and .pb.go files
live in tvix/store-go.

As discussed in
https://cl.tvl.fyi/c/depot/+/9787/comment/fc5d155c_1bd38e3a/, the amount
of people currently using this is still small, so rename the go.mod now,
while it doesn't yet hurt.

Also, use code.tvl.fyi/tvix/castore-go instead of code.tvl.fyi/tvix/
castore/protos, to make use of cl/9791.

Change-Id: I9ea89957d7c29dfae4c893b9aae8ac8a0bad2d8e
Reviewed-on: https://cl.tvl.fyi/c/depot/+/9792
Autosubmit: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
Reviewed-by: Connor Brewster <cbrewster@hey.com>
2023-10-17 20:36:36 +00:00

149 lines
4 KiB
Go

package storev1_test
import (
"path"
"testing"
"github.com/nix-community/go-nix/pkg/storepath"
"github.com/stretchr/testify/assert"
castorev1pb "code.tvl.fyi/tvix/castore-go"
storev1pb "code.tvl.fyi/tvix/store-go"
)
const (
EXAMPLE_STORE_PATH = "00bgd045z0d4icpbc2yyz4gx48ak44la-net-tools-1.60_p2017022118243"
)
var (
exampleStorePathDigest = []byte{
0x8a, 0x12, 0x32, 0x15, 0x22, 0xfd, 0x91, 0xef, 0xbd, 0x60, 0xeb, 0xb2, 0x48, 0x1a, 0xf8, 0x85,
0x80, 0xf6, 0x16, 0x00}
)
func genPathInfoSymlink() *storev1pb.PathInfo {
return &storev1pb.PathInfo{
Node: &castorev1pb.Node{
Node: &castorev1pb.Node_Symlink{
Symlink: &castorev1pb.SymlinkNode{
Name: []byte("00000000000000000000000000000000-dummy"),
Target: []byte("/nix/store/somewhereelse"),
},
},
},
References: [][]byte{exampleStorePathDigest},
Narinfo: &storev1pb.NARInfo{
NarSize: 0,
NarSha256: []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
Signatures: []*storev1pb.NARInfo_Signature{},
ReferenceNames: []string{EXAMPLE_STORE_PATH},
},
}
}
func genPathInfoSymlinkThin() *storev1pb.PathInfo {
pi := genPathInfoSymlink()
pi.Narinfo = nil
return pi
}
func TestValidate(t *testing.T) {
t.Run("happy symlink", func(t *testing.T) {
storePath, err := genPathInfoSymlink().Validate()
assert.NoError(t, err, "PathInfo must validate")
assert.Equal(t, "00000000000000000000000000000000-dummy", storePath.String())
})
t.Run("happy symlink thin", func(t *testing.T) {
storePath, err := genPathInfoSymlinkThin().Validate()
assert.NoError(t, err, "PathInfo must validate")
assert.Equal(t, "00000000000000000000000000000000-dummy", storePath.String())
})
t.Run("invalid nar_sha256", func(t *testing.T) {
pi := genPathInfoSymlink()
// create broken references, where the reference digest is wrong
pi.Narinfo.NarSha256 = []byte{0xbe, 0xef}
_, err := pi.Validate()
assert.Error(t, err, "must not validate")
})
t.Run("invalid reference digest", func(t *testing.T) {
pi := genPathInfoSymlink()
// create broken references, where the reference digest is wrong
pi.References = append(pi.References, []byte{0x00})
_, err := pi.Validate()
assert.Error(t, err, "must not validate")
})
t.Run("invalid reference name", func(t *testing.T) {
pi := genPathInfoSymlink()
// make the reference name an invalid store path
pi.Narinfo.ReferenceNames[0] = "00000000000000000000000000000000-"
_, err := pi.Validate()
assert.Error(t, err, "must not validate")
})
t.Run("reference name digest mismatch", func(t *testing.T) {
pi := genPathInfoSymlink()
// cause the digest for the reference to mismatch
pi.Narinfo.ReferenceNames[0] = "11111111111111111111111111111111-dummy"
_, err := pi.Validate()
assert.Error(t, err, "must not validate")
})
t.Run("nil root node", func(t *testing.T) {
pi := genPathInfoSymlink()
pi.Node = nil
_, err := pi.Validate()
assert.Error(t, err, "must not validate")
})
t.Run("invalid root node name", func(t *testing.T) {
pi := genPathInfoSymlink()
// make the reference name an invalid store path - it may not be absolute
symlinkNode := pi.Node.GetSymlink()
symlinkNode.Name = []byte(path.Join(storepath.StoreDir, "00000000000000000000000000000000-dummy"))
_, err := pi.Validate()
assert.Error(t, err, "must not validate")
})
t.Run("happy deriver", func(t *testing.T) {
pi := genPathInfoSymlink()
// add the Deriver Field.
pi.Deriver = &storev1pb.StorePath{
Digest: exampleStorePathDigest,
Name: "foo",
}
_, err := pi.Validate()
assert.NoError(t, err, "must validate")
})
t.Run("invalid deriver", func(t *testing.T) {
pi := genPathInfoSymlink()
// add the Deriver Field, with a broken digest
pi.Deriver = &storev1pb.StorePath{
Digest: []byte{},
Name: "foo2",
}
_, err := pi.Validate()
assert.Error(t, err, "must not validate")
})
}