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 }