github.com/MetalBlockchain/metalgo@v1.11.9/vms/registry/vm_registry_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 registry
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/require"
    11  	"go.uber.org/mock/gomock"
    12  
    13  	"github.com/MetalBlockchain/metalgo/ids"
    14  	"github.com/MetalBlockchain/metalgo/vms"
    15  )
    16  
    17  var (
    18  	id1 = ids.GenerateTestID()
    19  	id2 = ids.GenerateTestID()
    20  	id3 = ids.GenerateTestID()
    21  	id4 = ids.GenerateTestID()
    22  )
    23  
    24  // Tests the happy case where Reload succeeds.
    25  func TestReload_Success(t *testing.T) {
    26  	require := require.New(t)
    27  
    28  	resources := initVMRegistryTest(t)
    29  
    30  	factory1 := vms.NewMockFactory(resources.ctrl)
    31  	factory2 := vms.NewMockFactory(resources.ctrl)
    32  	factory3 := vms.NewMockFactory(resources.ctrl)
    33  	factory4 := vms.NewMockFactory(resources.ctrl)
    34  
    35  	registeredVms := map[ids.ID]vms.Factory{
    36  		id1: factory1,
    37  		id2: factory2,
    38  	}
    39  
    40  	unregisteredVms := map[ids.ID]vms.Factory{
    41  		id3: factory3,
    42  		id4: factory4,
    43  	}
    44  
    45  	resources.mockVMGetter.EXPECT().
    46  		Get().
    47  		Times(1).
    48  		Return(registeredVms, unregisteredVms, nil)
    49  	resources.mockVMManager.EXPECT().
    50  		RegisterFactory(gomock.Any(), id3, factory3).
    51  		Times(1).
    52  		Return(nil)
    53  	resources.mockVMManager.EXPECT().
    54  		RegisterFactory(gomock.Any(), id4, factory4).
    55  		Times(1).
    56  		Return(nil)
    57  
    58  	installedVMs, failedVMs, err := resources.vmRegistry.Reload(context.Background())
    59  	require.NoError(err)
    60  	require.ElementsMatch([]ids.ID{id3, id4}, installedVMs)
    61  	require.Empty(failedVMs)
    62  }
    63  
    64  // Tests that we fail if we're not able to get the vms on disk
    65  func TestReload_GetNewVMsFails(t *testing.T) {
    66  	require := require.New(t)
    67  
    68  	resources := initVMRegistryTest(t)
    69  
    70  	resources.mockVMGetter.EXPECT().Get().Times(1).Return(nil, nil, errTest)
    71  
    72  	installedVMs, failedVMs, err := resources.vmRegistry.Reload(context.Background())
    73  	require.ErrorIs(err, errTest)
    74  	require.Empty(installedVMs)
    75  	require.Empty(failedVMs)
    76  }
    77  
    78  // Tests that if we fail to register a VM, we fail.
    79  func TestReload_PartialRegisterFailure(t *testing.T) {
    80  	require := require.New(t)
    81  
    82  	resources := initVMRegistryTest(t)
    83  
    84  	factory1 := vms.NewMockFactory(resources.ctrl)
    85  	factory2 := vms.NewMockFactory(resources.ctrl)
    86  	factory3 := vms.NewMockFactory(resources.ctrl)
    87  	factory4 := vms.NewMockFactory(resources.ctrl)
    88  
    89  	registeredVms := map[ids.ID]vms.Factory{
    90  		id1: factory1,
    91  		id2: factory2,
    92  	}
    93  
    94  	unregisteredVms := map[ids.ID]vms.Factory{
    95  		id3: factory3,
    96  		id4: factory4,
    97  	}
    98  
    99  	resources.mockVMGetter.EXPECT().
   100  		Get().
   101  		Times(1).
   102  		Return(registeredVms, unregisteredVms, nil)
   103  	resources.mockVMManager.EXPECT().
   104  		RegisterFactory(gomock.Any(), id3, factory3).
   105  		Times(1).
   106  		Return(errTest)
   107  	resources.mockVMManager.EXPECT().
   108  		RegisterFactory(gomock.Any(), id4, factory4).
   109  		Times(1).
   110  		Return(nil)
   111  
   112  	installedVMs, failedVMs, err := resources.vmRegistry.Reload(context.Background())
   113  	require.NoError(err)
   114  	require.Len(failedVMs, 1)
   115  	require.ErrorIs(failedVMs[id3], errTest)
   116  	require.Len(installedVMs, 1)
   117  	require.Equal(id4, installedVMs[0])
   118  }
   119  
   120  type registryTestResources struct {
   121  	ctrl          *gomock.Controller
   122  	mockVMGetter  *MockVMGetter
   123  	mockVMManager *vms.MockManager
   124  	vmRegistry    VMRegistry
   125  }
   126  
   127  func initVMRegistryTest(t *testing.T) *registryTestResources {
   128  	ctrl := gomock.NewController(t)
   129  
   130  	mockVMGetter := NewMockVMGetter(ctrl)
   131  	mockVMManager := vms.NewMockManager(ctrl)
   132  
   133  	vmRegistry := NewVMRegistry(
   134  		VMRegistryConfig{
   135  			VMGetter:  mockVMGetter,
   136  			VMManager: mockVMManager,
   137  		},
   138  	)
   139  
   140  	return &registryTestResources{
   141  		ctrl:          ctrl,
   142  		mockVMGetter:  mockVMGetter,
   143  		mockVMManager: mockVMManager,
   144  		vmRegistry:    vmRegistry,
   145  	}
   146  }