github.com/outbrain/consul@v1.4.5/agent/snapshot_endpoint_test.go (about)

     1  package agent
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/hashicorp/consul/acl"
    12  )
    13  
    14  func TestSnapshot(t *testing.T) {
    15  	t.Parallel()
    16  	var snap io.Reader
    17  	t.Run("", func(t *testing.T) {
    18  		a := NewTestAgent(t, t.Name(), "")
    19  		defer a.Shutdown()
    20  
    21  		body := bytes.NewBuffer(nil)
    22  		req, _ := http.NewRequest("GET", "/v1/snapshot?token=root", body)
    23  		resp := httptest.NewRecorder()
    24  		if _, err := a.srv.Snapshot(resp, req); err != nil {
    25  			t.Fatalf("err: %v", err)
    26  		}
    27  		snap = resp.Body
    28  
    29  		header := resp.Header().Get("X-Consul-Index")
    30  		if header == "" {
    31  			t.Fatalf("bad: %v", header)
    32  		}
    33  		header = resp.Header().Get("X-Consul-KnownLeader")
    34  		if header != "true" {
    35  			t.Fatalf("bad: %v", header)
    36  		}
    37  		header = resp.Header().Get("X-Consul-LastContact")
    38  		if header != "0" {
    39  			t.Fatalf("bad: %v", header)
    40  		}
    41  	})
    42  
    43  	t.Run("", func(t *testing.T) {
    44  		a := NewTestAgent(t, t.Name(), "")
    45  		defer a.Shutdown()
    46  
    47  		req, _ := http.NewRequest("PUT", "/v1/snapshot?token=root", snap)
    48  		resp := httptest.NewRecorder()
    49  		if _, err := a.srv.Snapshot(resp, req); err != nil {
    50  			t.Fatalf("err: %v", err)
    51  		}
    52  	})
    53  }
    54  
    55  func TestSnapshot_Options(t *testing.T) {
    56  	t.Parallel()
    57  	for _, method := range []string{"GET", "PUT"} {
    58  		t.Run(method, func(t *testing.T) {
    59  			a := NewTestAgent(t, t.Name(), TestACLConfig())
    60  			defer a.Shutdown()
    61  
    62  			body := bytes.NewBuffer(nil)
    63  			req, _ := http.NewRequest(method, "/v1/snapshot?token=anonymous", body)
    64  			resp := httptest.NewRecorder()
    65  			_, err := a.srv.Snapshot(resp, req)
    66  			if !acl.IsErrPermissionDenied(err) {
    67  				t.Fatalf("err: %v", err)
    68  			}
    69  		})
    70  
    71  		t.Run(method, func(t *testing.T) {
    72  			a := NewTestAgent(t, t.Name(), TestACLConfig())
    73  			defer a.Shutdown()
    74  
    75  			body := bytes.NewBuffer(nil)
    76  			req, _ := http.NewRequest(method, "/v1/snapshot?dc=nope", body)
    77  			resp := httptest.NewRecorder()
    78  			_, err := a.srv.Snapshot(resp, req)
    79  			if err == nil || !strings.Contains(err.Error(), "No path to datacenter") {
    80  				t.Fatalf("err: %v", err)
    81  			}
    82  		})
    83  
    84  		t.Run(method, func(t *testing.T) {
    85  			a := NewTestAgent(t, t.Name(), TestACLConfig())
    86  			defer a.Shutdown()
    87  
    88  			body := bytes.NewBuffer(nil)
    89  			req, _ := http.NewRequest(method, "/v1/snapshot?token=root&stale", body)
    90  			resp := httptest.NewRecorder()
    91  			_, err := a.srv.Snapshot(resp, req)
    92  			if method == "GET" {
    93  				if err != nil {
    94  					t.Fatalf("err: %v", err)
    95  				}
    96  			} else {
    97  				if err == nil || !strings.Contains(err.Error(), "stale not allowed") {
    98  					t.Fatalf("err: %v", err)
    99  				}
   100  			}
   101  		})
   102  	}
   103  }