github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/helper/pluginutils/loader/testing.go (about)

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