github.com/hernad/nomad@v1.6.112/helper/pluginutils/loader/testing.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package loader 5 6 import ( 7 "net" 8 "sync" 9 10 log "github.com/hashicorp/go-hclog" 11 plugin "github.com/hashicorp/go-plugin" 12 "github.com/hernad/nomad/helper/pointer" 13 "github.com/hernad/nomad/plugins/base" 14 ) 15 16 // MockCatalog provides a mock PluginCatalog to be used for testing 17 type MockCatalog struct { 18 DispenseF func(name, pluginType string, cfg *base.AgentConfig, logger log.Logger) (PluginInstance, error) 19 ReattachF func(name, pluginType string, config *plugin.ReattachConfig) (PluginInstance, error) 20 CatalogF func() map[string][]*base.PluginInfoResponse 21 } 22 23 func (m *MockCatalog) Dispense(name, pluginType string, cfg *base.AgentConfig, logger log.Logger) (PluginInstance, error) { 24 return m.DispenseF(name, pluginType, cfg, logger) 25 } 26 27 func (m *MockCatalog) Reattach(name, pluginType string, config *plugin.ReattachConfig) (PluginInstance, error) { 28 return m.ReattachF(name, pluginType, config) 29 } 30 31 func (m *MockCatalog) Catalog() map[string][]*base.PluginInfoResponse { 32 return m.CatalogF() 33 } 34 35 // MockInstance provides a mock PluginInstance to be used for testing 36 type MockInstance struct { 37 InternalPlugin bool 38 KillF func() 39 ReattachConfigF func() (*plugin.ReattachConfig, bool) 40 PluginF func() interface{} 41 ExitedF func() bool 42 ApiVersionF func() string 43 } 44 45 func (m *MockInstance) Internal() bool { return m.InternalPlugin } 46 func (m *MockInstance) Kill() { m.KillF() } 47 func (m *MockInstance) ReattachConfig() (*plugin.ReattachConfig, bool) { return m.ReattachConfigF() } 48 func (m *MockInstance) Plugin() interface{} { return m.PluginF() } 49 func (m *MockInstance) Exited() bool { return m.ExitedF() } 50 func (m *MockInstance) ApiVersion() string { return m.ApiVersionF() } 51 52 // MockBasicExternalPlugin returns a MockInstance that simulates an external 53 // plugin returning it has been exited after kill is called. It returns the 54 // passed inst as the plugin 55 func MockBasicExternalPlugin(inst interface{}, apiVersion string) *MockInstance { 56 var killedLock sync.Mutex 57 killed := pointer.Of(false) 58 return &MockInstance{ 59 InternalPlugin: false, 60 KillF: func() { 61 killedLock.Lock() 62 defer killedLock.Unlock() 63 *killed = true 64 }, 65 66 ReattachConfigF: func() (*plugin.ReattachConfig, bool) { 67 return &plugin.ReattachConfig{ 68 Protocol: "tcp", 69 Addr: &net.TCPAddr{ 70 IP: net.IPv4(127, 0, 0, 1), 71 Port: 3200, 72 Zone: "", 73 }, 74 Pid: 1000, 75 }, true 76 }, 77 78 PluginF: func() interface{} { 79 return inst 80 }, 81 82 ExitedF: func() bool { 83 killedLock.Lock() 84 defer killedLock.Unlock() 85 return *killed 86 }, 87 88 ApiVersionF: func() string { return apiVersion }, 89 } 90 }