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 ®istryTestResources{ 141 ctrl: ctrl, 142 mockVMGetter: mockVMGetter, 143 mockVMManager: mockVMManager, 144 vmRegistry: vmRegistry, 145 } 146 }