This information is present in the .narinfo files, it should have gone there. Change-Id: Ib43d0cf30c2795bf1fe77c46646174353ade0458 Reviewed-on: https://cl.tvl.fyi/c/depot/+/9794 Autosubmit: flokli <flokli@flokli.de> Reviewed-by: Connor Brewster <cbrewster@hey.com> Tested-by: BuildkiteCI
		
			
				
	
	
		
			149 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			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.Narinfo.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.Narinfo.Deriver = &storev1pb.StorePath{
 | |
| 			Digest: []byte{},
 | |
| 			Name:   "foo2",
 | |
| 		}
 | |
| 		_, err := pi.Validate()
 | |
| 		assert.Error(t, err, "must not validate")
 | |
| 	})
 | |
| 
 | |
| }
 |