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  }