github.com/ipld/go-ipld-prime@v0.21.0/codec/dagcbor/marshal_test.go (about)

     1  package dagcbor
     2  
     3  import (
     4  	"bytes"
     5  	"math/rand"
     6  	"testing"
     7  	"time"
     8  
     9  	qt "github.com/frankban/quicktest"
    10  	"github.com/ipfs/go-cid"
    11  	"github.com/ipld/go-ipld-prime"
    12  	"github.com/ipld/go-ipld-prime/datamodel"
    13  	"github.com/ipld/go-ipld-prime/fluent/qp"
    14  	cidlink "github.com/ipld/go-ipld-prime/linking/cid"
    15  	basicnode "github.com/ipld/go-ipld-prime/node/basic"
    16  	"github.com/ipld/go-ipld-prime/testutil/garbage"
    17  )
    18  
    19  func calculateActualLength(t *testing.T, n datamodel.Node) int64 {
    20  	var buf bytes.Buffer
    21  	err := Encode(n, &buf)
    22  	qt.Assert(t, err, qt.IsNil)
    23  	return int64(buf.Len())
    24  }
    25  
    26  func verifyEstimatedSize(t *testing.T, n datamodel.Node) {
    27  	estimatedLength, err := EncodedLength(n)
    28  	qt.Assert(t, err, qt.IsNil)
    29  	actualLength := calculateActualLength(t, n)
    30  	qt.Assert(t, estimatedLength, qt.Equals, actualLength)
    31  }
    32  
    33  func TestEncodedLength(t *testing.T) {
    34  	t.Run("int boundaries", func(t *testing.T) {
    35  		for ii := 0; ii < 4; ii++ {
    36  			verifyEstimatedSize(t, basicnode.NewInt(int64(lengthBoundaries[ii].upperBound)))
    37  			verifyEstimatedSize(t, basicnode.NewInt(int64(lengthBoundaries[ii].upperBound)-1))
    38  			verifyEstimatedSize(t, basicnode.NewInt(int64(lengthBoundaries[ii].upperBound)+1))
    39  			verifyEstimatedSize(t, basicnode.NewInt(-1*int64(lengthBoundaries[ii].upperBound)))
    40  			verifyEstimatedSize(t, basicnode.NewInt(-1*int64(lengthBoundaries[ii].upperBound)-1))
    41  			verifyEstimatedSize(t, basicnode.NewInt(-1*int64(lengthBoundaries[ii].upperBound)+1))
    42  		}
    43  	})
    44  
    45  	t.Run("small garbage", func(t *testing.T) {
    46  		seed := time.Now().Unix()
    47  		t.Logf("randomness seed: %v\n", seed)
    48  		rnd := rand.New(rand.NewSource(seed))
    49  		for i := 0; i < 1000; i++ {
    50  			gbg := garbage.Generate(rnd, garbage.TargetBlockSize(1<<6))
    51  			verifyEstimatedSize(t, gbg)
    52  		}
    53  	})
    54  
    55  	t.Run("medium garbage", func(t *testing.T) {
    56  		seed := time.Now().Unix()
    57  		t.Logf("randomness seed: %v\n", seed)
    58  		rnd := rand.New(rand.NewSource(seed))
    59  		for i := 0; i < 100; i++ {
    60  			gbg := garbage.Generate(rnd, garbage.TargetBlockSize(1<<16))
    61  			verifyEstimatedSize(t, gbg)
    62  		}
    63  	})
    64  
    65  	t.Run("large garbage", func(t *testing.T) {
    66  		seed := time.Now().Unix()
    67  		t.Logf("randomness seed: %v\n", seed)
    68  		rnd := rand.New(rand.NewSource(seed))
    69  		for i := 0; i < 10; i++ {
    70  			gbg := garbage.Generate(rnd, garbage.TargetBlockSize(1<<20))
    71  			verifyEstimatedSize(t, gbg)
    72  		}
    73  	})
    74  }
    75  
    76  func TestMarshalUndefCid(t *testing.T) {
    77  	link, err := cid.Decode("bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi")
    78  	qt.Assert(t, err, qt.IsNil)
    79  	node, err := qp.BuildMap(basicnode.Prototype.Any, -1, func(ma datamodel.MapAssembler) {
    80  		qp.MapEntry(ma, "UndefCid", qp.Link(cidlink.Link{Cid: cid.Undef}))
    81  		qp.MapEntry(ma, "DefCid", qp.Link(cidlink.Link{Cid: link}))
    82  	})
    83  	qt.Assert(t, err, qt.IsNil)
    84  	_, err = ipld.Encode(node, Encode)
    85  	qt.Assert(t, err, qt.ErrorMatches, "encoding undefined CIDs are not supported by this codec")
    86  }