about summary refs log tree commit diff
path: root/tvix/store/protos/pathinfo_test.go
blob: 74af50e5691f4f23dcac078445ccedb3892040b9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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/protos"
	storev1pb "code.tvl.fyi/tvix/store/protos"
)

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