github.com/MetalBlockchain/metalgo@v1.11.9/vms/platformvm/state/metadata_delegator_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package state 5 6 import ( 7 "testing" 8 9 "github.com/stretchr/testify/require" 10 11 "github.com/MetalBlockchain/metalgo/codec" 12 "github.com/MetalBlockchain/metalgo/database/memdb" 13 "github.com/MetalBlockchain/metalgo/ids" 14 "github.com/MetalBlockchain/metalgo/utils/wrappers" 15 ) 16 17 func TestParseDelegatorMetadata(t *testing.T) { 18 type test struct { 19 name string 20 bytes []byte 21 expected *delegatorMetadata 22 expectedErr error 23 } 24 tests := []test{ 25 { 26 name: "potential reward only no codec", 27 bytes: []byte{ 28 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 29 }, 30 expected: &delegatorMetadata{ 31 PotentialReward: 123, 32 StakerStartTime: 0, 33 }, 34 expectedErr: nil, 35 }, 36 { 37 name: "potential reward + staker start time with codec v1", 38 bytes: []byte{ 39 // codec version 40 0x00, 0x01, 41 // potential reward 42 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 43 // staker start time 44 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc8, 45 }, 46 expected: &delegatorMetadata{ 47 PotentialReward: 123, 48 StakerStartTime: 456, 49 }, 50 expectedErr: nil, 51 }, 52 { 53 name: "invalid codec version", 54 bytes: []byte{ 55 // codec version 56 0x00, 0x02, 57 // potential reward 58 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 59 // staker start time 60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc8, 61 }, 62 expected: nil, 63 expectedErr: codec.ErrUnknownVersion, 64 }, 65 { 66 name: "short byte len", 67 bytes: []byte{ 68 // codec version 69 0x00, 0x01, 70 // potential reward 71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 72 // staker start time 73 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 74 }, 75 expected: nil, 76 expectedErr: wrappers.ErrInsufficientLength, 77 }, 78 } 79 for _, tt := range tests { 80 t.Run(tt.name, func(t *testing.T) { 81 require := require.New(t) 82 var metadata delegatorMetadata 83 err := parseDelegatorMetadata(tt.bytes, &metadata) 84 require.ErrorIs(err, tt.expectedErr) 85 if tt.expectedErr != nil { 86 return 87 } 88 require.Equal(tt.expected, &metadata) 89 }) 90 } 91 } 92 93 func TestWriteDelegatorMetadata(t *testing.T) { 94 type test struct { 95 name string 96 version uint16 97 metadata *delegatorMetadata 98 expected []byte 99 } 100 tests := []test{ 101 { 102 name: CodecVersion0Tag, 103 version: CodecVersion0, 104 metadata: &delegatorMetadata{ 105 PotentialReward: 123, 106 StakerStartTime: 456, 107 }, 108 expected: []byte{ 109 // potential reward 110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 111 }, 112 }, 113 { 114 name: CodecVersion1Tag, 115 version: CodecVersion1, 116 metadata: &delegatorMetadata{ 117 PotentialReward: 123, 118 StakerStartTime: 456, 119 }, 120 expected: []byte{ 121 // codec version 122 0x00, 0x01, 123 // potential reward 124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 125 // staker start time 126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc8, 127 }, 128 }, 129 } 130 for _, tt := range tests { 131 t.Run(tt.name, func(t *testing.T) { 132 require := require.New(t) 133 db := memdb.New() 134 tt.metadata.txID = ids.GenerateTestID() 135 require.NoError(writeDelegatorMetadata(db, tt.metadata, tt.version)) 136 bytes, err := db.Get(tt.metadata.txID[:]) 137 require.NoError(err) 138 require.Equal(tt.expected, bytes) 139 }) 140 } 141 }