metadata_test.go 1.96 KB
Newer Older
1 2 3
package metadata

import (
4
	"bytes"
5 6 7
	"math/rand"
	"testing"

8 9
	"github.com/ipld/go-ipld-prime/codec/dagcbor"
	"github.com/ipld/go-ipld-prime/fluent"
hannahhoward's avatar
hannahhoward committed
10 11
	cidlink "github.com/ipld/go-ipld-prime/linking/cid"
	basicnode "github.com/ipld/go-ipld-prime/node/basic"
Hannah Howard's avatar
Hannah Howard committed
12
	"github.com/stretchr/testify/require"
13 14 15 16 17 18

	"github.com/ipfs/go-graphsync/testutil"
)

func TestDecodeEncodeMetadata(t *testing.T) {
	cids := testutil.GenerateCids(10)
19
	initialMetadata := make(Metadata, 0, 10)
Eric Myhre's avatar
Eric Myhre committed
20
	nd := fluent.MustBuildList(basicnode.Prototype.List, 10, func(fla fluent.ListAssembler) {
21 22 23 24
		for _, k := range cids {
			blockPresent := rand.Int31()%2 == 0
			initialMetadata = append(initialMetadata, Item{k, blockPresent})
			fla.AssembleValue().CreateMap(2, func(fma fluent.MapAssembler) {
25 26
				fma.AssembleEntry("link").AssignLink(cidlink.Link{Cid: k})
				fma.AssembleEntry("blockPresent").AssignBool(blockPresent)
27 28 29 30 31
			})
		}
	})

	// verify metadata matches
32
	encoded, err := EncodeMetadata(initialMetadata)
Hannah Howard's avatar
Hannah Howard committed
33
	require.NoError(t, err, "encode errored")
34

35
	decodedMetadata, err := DecodeMetadata(encoded)
Hannah Howard's avatar
Hannah Howard committed
36 37
	require.NoError(t, err, "decode errored")
	require.Equal(t, initialMetadata, decodedMetadata, "metadata changed during encoding and decoding")
38 39 40 41 42 43 44 45 46

	// verify metadata is equivalent of IPLD node encoding
	encodedNode := new(bytes.Buffer)
	err = dagcbor.Encoder(nd, encodedNode)
	require.NoError(t, err)
	decodedMetadataFromNode, err := DecodeMetadata(encodedNode.Bytes())
	require.NoError(t, err)
	require.Equal(t, decodedMetadata, decodedMetadataFromNode, "metadata not equal to IPLD encoding")

Eric Myhre's avatar
Eric Myhre committed
47
	nb := basicnode.Prototype.List.NewBuilder()
48 49 50 51
	err = dagcbor.Decoder(nb, encodedNode)
	require.NoError(t, err)
	decodedNode := nb.Build()
	require.Equal(t, nd, decodedNode)
Eric Myhre's avatar
Eric Myhre committed
52
	nb = basicnode.Prototype.List.NewBuilder()
53 54 55 56
	err = dagcbor.Decoder(nb, bytes.NewReader(encoded))
	require.NoError(t, err)
	decodedNodeFromMetadata := nb.Build()
	require.Equal(t, decodedNode, decodedNodeFromMetadata, "deserialzed metadata does not match deserialized node")
57
}