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  }