github.com/ipld/go-ipld-prime@v0.21.0/linking/functions_test.go (about)

     1  package linking_test
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"testing"
     7  
     8  	qt "github.com/frankban/quicktest"
     9  	"github.com/ipfs/go-cid"
    10  	"github.com/ipld/go-ipld-prime"
    11  	"github.com/ipld/go-ipld-prime/codec/dagcbor"
    12  	"github.com/ipld/go-ipld-prime/datamodel"
    13  	"github.com/ipld/go-ipld-prime/fluent"
    14  	cidlink "github.com/ipld/go-ipld-prime/linking/cid"
    15  	"github.com/ipld/go-ipld-prime/node/basicnode"
    16  	"github.com/ipld/go-ipld-prime/storage/memstore"
    17  	"github.com/multiformats/go-multicodec"
    18  )
    19  
    20  func TestLinkSystem_LoadHashMismatch(t *testing.T) {
    21  	subject := cidlink.DefaultLinkSystem()
    22  	storage := &memstore.Store{}
    23  	subject.SetReadStorage(storage)
    24  	subject.SetWriteStorage(storage)
    25  
    26  	// Construct some test IPLD node.
    27  	wantNode := fluent.MustBuildMap(basicnode.Prototype.Map, 1, func(na fluent.MapAssembler) {
    28  		na.AssembleEntry("fish").AssignString("barreleye")
    29  	})
    30  
    31  	// Encode as raw value to be used for testing LoadRaw
    32  	var buf bytes.Buffer
    33  	qt.Check(t, dagcbor.Encode(wantNode, &buf), qt.IsNil)
    34  	wantNodeRaw := buf.Bytes()
    35  
    36  	// Store the test IPLD node and get link back.
    37  	lctx := ipld.LinkContext{Ctx: context.TODO()}
    38  	gotLink, err := subject.Store(lctx, cidlink.LinkPrototype{
    39  		Prefix: cid.Prefix{
    40  			Version:  1,
    41  			Codec:    uint64(multicodec.DagCbor),
    42  			MhType:   uint64(multicodec.Sha2_256),
    43  			MhLength: -1,
    44  		},
    45  	}, wantNode)
    46  	qt.Check(t, err, qt.IsNil)
    47  	gotCidlink := gotLink.(cidlink.Link)
    48  
    49  	// Assert all load variations return expected values for different link representations.
    50  	for _, test := range []struct {
    51  		name string
    52  		link datamodel.Link
    53  	}{
    54  		{"datamodel.Link", gotLink},
    55  		{"cidlink.Link", gotCidlink},
    56  		{"&cidlink.Link", &gotCidlink},
    57  	} {
    58  		t.Run(test.name, func(t *testing.T) {
    59  			gotNode, err := subject.Load(lctx, test.link, basicnode.Prototype.Any)
    60  			qt.Check(t, err, qt.IsNil)
    61  			qt.Check(t, ipld.DeepEqual(wantNode, gotNode), qt.IsTrue)
    62  
    63  			gotNodeRaw, err := subject.LoadRaw(lctx, test.link)
    64  			qt.Check(t, err, qt.IsNil)
    65  			qt.Check(t, bytes.Equal(wantNodeRaw, gotNodeRaw), qt.IsTrue)
    66  
    67  			gotNode, gotNodeRaw, err = subject.LoadPlusRaw(lctx, test.link, basicnode.Prototype.Any)
    68  			qt.Check(t, err, qt.IsNil)
    69  			qt.Check(t, ipld.DeepEqual(wantNode, gotNode), qt.IsTrue)
    70  			qt.Check(t, bytes.Equal(wantNodeRaw, gotNodeRaw), qt.IsTrue)
    71  		})
    72  	}
    73  }