github.com/outbrain/consul@v1.4.5/testutil/README.md (about)

     1  Consul Testing Utilities
     2  ========================
     3  
     4  This package provides some generic helpers to facilitate testing in Consul.
     5  
     6  TestServer
     7  ==========
     8  
     9  TestServer is a harness for managing Consul agents and initializing them with
    10  test data. Using it, you can form test clusters, create services, add health
    11  checks, manipulate the K/V store, etc. This test harness is completely decoupled
    12  from Consul's core and API client, meaning it can be easily imported and used in
    13  external unit tests for various applications. It works by invoking the Consul
    14  CLI, which means it is a requirement to have Consul installed in the `$PATH`.
    15  
    16  Following is an example usage:
    17  
    18  ```go
    19  package my_program
    20  
    21  import (
    22  	"testing"
    23  
    24  	"github.com/hashicorp/consul/consul/structs"
    25  	"github.com/hashicorp/consul/testutil"
    26  )
    27  
    28  func TestFoo_bar(t *testing.T) {
    29  	// Create a test Consul server
    30  	srv1, err := testutil.NewTestServer()
    31  	if err != nil {
    32  		t.Fatal(err)
    33  	}
    34  	defer srv1.Stop()
    35  
    36  	// Create a secondary server, passing in configuration
    37  	// to avoid bootstrapping as we are forming a cluster.
    38  	srv2, err := testutil.NewTestServerConfig(t, func(c *testutil.TestServerConfig) {
    39  		c.Bootstrap = false
    40  	})
    41  	if err != nil {
    42  		t.Fatal(err)
    43  	}
    44  	defer srv2.Stop()
    45  
    46  	// Join the servers together
    47  	srv1.JoinLAN(t, srv2.LANAddr)
    48  
    49  	// Create a test key/value pair
    50  	srv1.SetKV(t, "foo", []byte("bar"))
    51  
    52  	// Create lots of test key/value pairs
    53  	srv1.PopulateKV(t, map[string][]byte{
    54  		"bar": []byte("123"),
    55  		"baz": []byte("456"),
    56  	})
    57  
    58  	// Create a service
    59  	srv1.AddService(t, "redis", structs.HealthPassing, []string{"master"})
    60  
    61  	// Create a service that will be accessed in target source code
    62  	srv1.AddAccessibleService("redis", structs.HealthPassing, "127.0.0.1", 6379, []string{"master"})
    63  
    64  	// Create a service check
    65  	srv1.AddCheck(t, "service:redis", "redis", structs.HealthPassing)
    66  
    67  	// Create a node check
    68  	srv1.AddCheck(t, "mem", "", structs.HealthCritical)
    69  
    70  	// The HTTPAddr field contains the address of the Consul
    71  	// API on the new test server instance.
    72  	println(srv1.HTTPAddr)
    73  
    74  	// All functions also have a wrapper method to limit the passing of "t"
    75  	wrap := srv1.Wrap(t)
    76  	wrap.SetKV("foo", []byte("bar"))
    77  }
    78  ```