github.com/MetalBlockchain/metalgo@v1.11.9/version/compatibility_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 version
     5  
     6  import (
     7  	"fmt"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestCompatibility(t *testing.T) {
    15  	v := &Application{
    16  		Name:  Client,
    17  		Major: 1,
    18  		Minor: 4,
    19  		Patch: 3,
    20  	}
    21  	minCompatible := &Application{
    22  		Name:  Client,
    23  		Major: 1,
    24  		Minor: 4,
    25  		Patch: 0,
    26  	}
    27  	minCompatibleTime := time.Unix(9000, 0)
    28  	prevMinCompatible := &Application{
    29  		Name:  Client,
    30  		Major: 1,
    31  		Minor: 3,
    32  		Patch: 0,
    33  	}
    34  
    35  	compatibility := NewCompatibility(
    36  		v,
    37  		minCompatible,
    38  		minCompatibleTime,
    39  		prevMinCompatible,
    40  	).(*compatibility)
    41  	require.Equal(t, v, compatibility.Version())
    42  
    43  	tests := []struct {
    44  		peer        *Application
    45  		time        time.Time
    46  		expectedErr error
    47  	}{
    48  		{
    49  			peer: &Application{
    50  				Name:  Client,
    51  				Major: 1,
    52  				Minor: 5,
    53  				Patch: 0,
    54  			},
    55  			time: minCompatibleTime,
    56  		},
    57  		{
    58  			peer: &Application{
    59  				Name:  Client,
    60  				Major: 1,
    61  				Minor: 3,
    62  				Patch: 5,
    63  			},
    64  			time: time.Unix(8500, 0),
    65  		},
    66  		{
    67  			peer: &Application{
    68  				Name:  Client,
    69  				Major: 0,
    70  				Minor: 1,
    71  				Patch: 0,
    72  			},
    73  			time:        minCompatibleTime,
    74  			expectedErr: errDifferentMajor,
    75  		},
    76  		{
    77  			peer: &Application{
    78  				Name:  Client,
    79  				Major: 1,
    80  				Minor: 3,
    81  				Patch: 5,
    82  			},
    83  			time:        minCompatibleTime,
    84  			expectedErr: errIncompatible,
    85  		},
    86  		{
    87  			peer: &Application{
    88  				Name:  Client,
    89  				Major: 1,
    90  				Minor: 2,
    91  				Patch: 5,
    92  			},
    93  			time:        time.Unix(8500, 0),
    94  			expectedErr: errIncompatible,
    95  		},
    96  		{
    97  			peer: &Application{
    98  				Name:  Client,
    99  				Major: 1,
   100  				Minor: 1,
   101  				Patch: 5,
   102  			},
   103  			time:        time.Unix(7500, 0),
   104  			expectedErr: errIncompatible,
   105  		},
   106  	}
   107  	for _, test := range tests {
   108  		peer := test.peer
   109  		compatibility.clock.Set(test.time)
   110  		t.Run(fmt.Sprintf("%s-%s", peer, test.time), func(t *testing.T) {
   111  			err := compatibility.Compatible(peer)
   112  			require.ErrorIs(t, err, test.expectedErr)
   113  		})
   114  	}
   115  }