testutil

package
v1.2.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 21, 2018 License: MPL-2.0 Imports: 22 Imported by: 0

README

Consul Testing Utilities

This package provides some generic helpers to facilitate testing in Consul.

TestServer

TestServer is a harness for managing Consul agents and initializing them with test data. Using it, you can form test clusters, create services, add health checks, manipulate the K/V store, etc. This test harness is completely decoupled from Consul's core and API client, meaning it can be easily imported and used in external unit tests for various applications. It works by invoking the Consul CLI, which means it is a requirement to have Consul installed in the $PATH.

Following is an example usage:

package my_program

import (
	"testing"

	"github.com/hashicorp/consul/consul/structs"
	"github.com/hashicorp/consul/testutil"
)

func TestFoo_bar(t *testing.T) {
	// Create a test Consul server
	srv1, err := testutil.NewTestServer()
	if err != nil {
		t.Fatal(err)
	}
	defer srv1.Stop()

	// Create a secondary server, passing in configuration
	// to avoid bootstrapping as we are forming a cluster.
	srv2, err := testutil.NewTestServerConfig(t, func(c *testutil.TestServerConfig) {
		c.Bootstrap = false
	})
	if err != nil {
		t.Fatal(err)
	}
	defer srv2.Stop()

	// Join the servers together
	srv1.JoinLAN(t, srv2.LANAddr)

	// Create a test key/value pair
	srv1.SetKV(t, "foo", []byte("bar"))

	// Create lots of test key/value pairs
	srv1.PopulateKV(t, map[string][]byte{
		"bar": []byte("123"),
		"baz": []byte("456"),
	})

	// Create a service
	srv1.AddService(t, "redis", structs.HealthPassing, []string{"master"})

	// Create a service that will be accessed in target source code
	srv1.AddAccessibleService("redis", structs.HealthPassing, "127.0.0.1", 6379, []string{"master"})

	// Create a service check
	srv1.AddCheck(t, "service:redis", "redis", structs.HealthPassing)

	// Create a node check
	srv1.AddCheck(t, "mem", "", structs.HealthCritical)

	// The HTTPAddr field contains the address of the Consul
	// API on the new test server instance.
	println(srv1.HTTPAddr)

	// All functions also have a wrapper method to limit the passing of "t"
	wrap := srv1.Wrap(t)
	wrap.SetKV("foo", []byte("bar"))
}

Documentation

Index

Constants

View Source
const (
	HealthAny      = "any"
	HealthPassing  = "passing"
	HealthWarning  = "warning"
	HealthCritical = "critical"
	HealthMaint    = "maintenance"
)

copied from testutil to break circular dependency

Variables

This section is empty.

Functions

func TempDir added in v0.9.2

func TempDir(t *testing.T, name string) string

TempDir creates a temporary directory within tmpdir with the name 'testname-name'. If the directory cannot be created t.Fatal is called.

func TempFile added in v0.9.2

func TempFile(t *testing.T, name string) *os.File

TempFile creates a temporary file within tmpdir with the name 'testname-name'. If the file cannot be created t.Fatal is called. If a temporary directory has been created before consider storing the file inside this directory to avoid double cleanup.

Types

type ServerConfigCallback added in v0.7.0

type ServerConfigCallback func(c *TestServerConfig)

ServerConfigCallback is a function interface which can be passed to NewTestServerConfig to modify the server config.

type TestAddressConfig added in v0.7.0

type TestAddressConfig struct {
	HTTP string `json:"http,omitempty"`
}

TestAddressConfig contains the bind addresses for various components of the Consul server.

type TestCheck added in v0.7.0

type TestCheck struct {
	ID        string `json:",omitempty"`
	Name      string `json:",omitempty"`
	ServiceID string `json:",omitempty"`
	TTL       string `json:",omitempty"`
}

TestCheck is used to serialize a check definition.

type TestKVResponse added in v0.7.0

type TestKVResponse struct {
	Value string
}

TestKVResponse is what we use to decode KV data.

type TestNetworkSegment added in v0.9.3

type TestNetworkSegment struct {
	Name      string `json:"name"`
	Bind      string `json:"bind"`
	Port      int    `json:"port"`
	Advertise string `json:"advertise"`
}

TestNetworkSegment contains the configuration for a network segment.

type TestPerformanceConfig added in v0.7.0

type TestPerformanceConfig struct {
	RaftMultiplier uint `json:"raft_multiplier,omitempty"`
}

TestPerformanceConfig configures the performance parameters.

type TestPortConfig added in v0.7.0

type TestPortConfig struct {
	DNS          int `json:"dns,omitempty"`
	HTTP         int `json:"http,omitempty"`
	HTTPS        int `json:"https,omitempty"`
	SerfLan      int `json:"serf_lan,omitempty"`
	SerfWan      int `json:"serf_wan,omitempty"`
	Server       int `json:"server,omitempty"`
	ProxyMinPort int `json:"proxy_min_port,omitempty"`
	ProxyMaxPort int `json:"proxy_max_port,omitempty"`
}

TestPortConfig configures the various ports used for services provided by the Consul server.

type TestServer added in v0.7.0

type TestServer struct {
	Config *TestServerConfig

	HTTPAddr  string
	HTTPSAddr string
	LANAddr   string
	WANAddr   string

	HTTPClient *http.Client
	// contains filtered or unexported fields
}

TestServer is the main server wrapper struct.

func NewTestServer added in v0.7.0

func NewTestServer() (*TestServer, error)

NewTestServer is an easy helper method to create a new Consul test server with the most basic configuration.

func NewTestServerConfig added in v0.7.0

func NewTestServerConfig(cb ServerConfigCallback) (*TestServer, error)

func NewTestServerConfigT added in v0.9.2

func NewTestServerConfigT(t *testing.T, cb ServerConfigCallback) (*TestServer, error)

NewTestServerConfig creates a new TestServer, and makes a call to an optional callback function to modify the configuration. If there is an error configuring or starting the server, the server will NOT be running when the function returns (thus you do not need to stop it).

func (*TestServer) AddAddressableService added in v0.9.2

func (s *TestServer) AddAddressableService(t *testing.T, name, status, address string, port int, tags []string)

AddAddressableService adds a new service to the Consul instance by passing "address" and "port". It is helpful when you need to prepare a fakeService that maybe accessed with in target source code. It also automatically adds a health check with the given status, which can be one of "passing", "warning", or "critical", just like `AddService` does.

func (*TestServer) AddCheck added in v0.7.0

func (s *TestServer) AddCheck(t *testing.T, name, serviceID, status string)

AddCheck adds a check to the Consul instance. If the serviceID is left empty (""), then the check will be associated with the node. The check status may be "passing", "warning", or "critical".

func (*TestServer) AddService added in v0.7.0

func (s *TestServer) AddService(t *testing.T, name, status string, tags []string)

AddService adds a new service to the Consul instance. It also automatically adds a health check with the given status, which can be one of "passing", "warning", or "critical".

func (*TestServer) GetKV added in v0.7.0

func (s *TestServer) GetKV(t *testing.T, key string) []byte

GetKV retrieves a single key and returns its value

func (*TestServer) GetKVString added in v0.8.1

func (s *TestServer) GetKVString(t *testing.T, key string) string

GetKVString retrieves a value from the store, but returns as a string instead of []byte.

func (*TestServer) JoinLAN added in v0.7.0

func (s *TestServer) JoinLAN(t *testing.T, addr string)

JoinLAN is used to join local datacenters together.

func (*TestServer) JoinWAN added in v0.7.0

func (s *TestServer) JoinWAN(t *testing.T, addr string)

JoinWAN is used to join remote datacenters together.

func (*TestServer) ListKV added in v0.7.0

func (s *TestServer) ListKV(t *testing.T, prefix string) []string

ListKV returns a list of keys present in the KV store. This will list all keys under the given prefix recursively and return them as a slice.

func (*TestServer) PopulateKV added in v0.7.0

func (s *TestServer) PopulateKV(t *testing.T, data map[string][]byte)

PopulateKV fills the Consul KV with data from a generic map.

func (*TestServer) SetKV added in v0.7.0

func (s *TestServer) SetKV(t *testing.T, key string, val []byte)

SetKV sets an individual key in the K/V store.

func (*TestServer) SetKVString added in v0.8.1

func (s *TestServer) SetKVString(t *testing.T, key string, val string)

SetKVString sets an individual key in the K/V store, but accepts a string instead of []byte.

func (*TestServer) Stop added in v0.7.0

func (s *TestServer) Stop() error

Stop stops the test Consul server, and removes the Consul data directory once we are done.

func (*TestServer) Wrap added in v0.8.1

func (s *TestServer) Wrap(t *testing.T) *WrappedServer

Wrap wraps the test server in a `testing.t` for convenience.

For example, the following code snippets are equivalent.

server.JoinLAN(t, "1.2.3.4")
server.Wrap(t).JoinLAN("1.2.3.4")

This is useful when you are calling multiple functions and save the wrapped value as another variable to reduce the inclusion of "t".

type TestServerConfig added in v0.7.0

type TestServerConfig struct {
	NodeName            string                 `json:"node_name"`
	NodeID              string                 `json:"node_id"`
	NodeMeta            map[string]string      `json:"node_meta,omitempty"`
	Performance         *TestPerformanceConfig `json:"performance,omitempty"`
	Bootstrap           bool                   `json:"bootstrap,omitempty"`
	Server              bool                   `json:"server,omitempty"`
	DataDir             string                 `json:"data_dir,omitempty"`
	Datacenter          string                 `json:"datacenter,omitempty"`
	Segments            []TestNetworkSegment   `json:"segments"`
	DisableCheckpoint   bool                   `json:"disable_update_check"`
	LogLevel            string                 `json:"log_level,omitempty"`
	Bind                string                 `json:"bind_addr,omitempty"`
	Addresses           *TestAddressConfig     `json:"addresses,omitempty"`
	Ports               *TestPortConfig        `json:"ports,omitempty"`
	RaftProtocol        int                    `json:"raft_protocol,omitempty"`
	ACLMasterToken      string                 `json:"acl_master_token,omitempty"`
	ACLDatacenter       string                 `json:"acl_datacenter,omitempty"`
	ACLDefaultPolicy    string                 `json:"acl_default_policy,omitempty"`
	ACLEnforceVersion8  bool                   `json:"acl_enforce_version_8"`
	Encrypt             string                 `json:"encrypt,omitempty"`
	CAFile              string                 `json:"ca_file,omitempty"`
	CertFile            string                 `json:"cert_file,omitempty"`
	KeyFile             string                 `json:"key_file,omitempty"`
	VerifyIncoming      bool                   `json:"verify_incoming,omitempty"`
	VerifyIncomingRPC   bool                   `json:"verify_incoming_rpc,omitempty"`
	VerifyIncomingHTTPS bool                   `json:"verify_incoming_https,omitempty"`
	VerifyOutgoing      bool                   `json:"verify_outgoing,omitempty"`
	EnableScriptChecks  bool                   `json:"enable_script_checks,omitempty"`
	Connect             map[string]interface{} `json:"connect,omitempty"`
	ReadyTimeout        time.Duration          `json:"-"`
	Stdout, Stderr      io.Writer              `json:"-"`
	Args                []string               `json:"-"`
}

TestServerConfig is the main server configuration struct.

type TestService added in v0.7.0

type TestService struct {
	ID      string   `json:",omitempty"`
	Name    string   `json:",omitempty"`
	Tags    []string `json:",omitempty"`
	Address string   `json:",omitempty"`
	Port    int      `json:",omitempty"`
}

TestService is used to serialize a service definition.

type WrappedServer added in v0.8.1

type WrappedServer struct {
	// contains filtered or unexported fields
}

func (*WrappedServer) AddAddressableService added in v0.9.2

func (w *WrappedServer) AddAddressableService(name, status, address string, port int, tags []string)

func (*WrappedServer) AddCheck added in v0.8.1

func (w *WrappedServer) AddCheck(name, serviceID, status string)

func (*WrappedServer) AddService added in v0.8.1

func (w *WrappedServer) AddService(name, status string, tags []string)

func (*WrappedServer) GetKV added in v0.8.1

func (w *WrappedServer) GetKV(key string) []byte

func (*WrappedServer) GetKVString added in v0.8.1

func (w *WrappedServer) GetKVString(key string) string

func (*WrappedServer) JoinLAN added in v0.8.1

func (w *WrappedServer) JoinLAN(addr string)

func (*WrappedServer) JoinWAN added in v0.8.1

func (w *WrappedServer) JoinWAN(addr string)

func (*WrappedServer) ListKV added in v0.8.1

func (w *WrappedServer) ListKV(prefix string) []string

func (*WrappedServer) PopulateKV added in v0.8.1

func (w *WrappedServer) PopulateKV(data map[string][]byte)

func (*WrappedServer) SetKV added in v0.8.1

func (w *WrappedServer) SetKV(key string, val []byte)

func (*WrappedServer) SetKVString added in v0.8.1

func (w *WrappedServer) SetKVString(key string, val string)

Directories

Path Synopsis
Package retry provides support for repeating operations in tests.
Package retry provides support for repeating operations in tests.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL