...

Source file src/github.com/datawire/ambassador/v2/pkg/acp/envoy_test.go

Documentation: github.com/datawire/ambassador/v2/pkg/acp

     1  package acp_test
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/datawire/ambassador/v2/pkg/acp"
     9  	"github.com/datawire/dlib/dlog"
    10  )
    11  
    12  type fakeReadyMode string
    13  
    14  const (
    15  	Happy   = fakeReadyMode("happy")
    16  	Error   = fakeReadyMode("error")
    17  	Failure = fakeReadyMode("failure")
    18  )
    19  
    20  type fakeReady struct {
    21  	// What mode are we using right now?
    22  	mode fakeReadyMode
    23  }
    24  
    25  func (f *fakeReady) setMode(mode fakeReadyMode) {
    26  	f.mode = mode
    27  }
    28  
    29  func (f *fakeReady) readyCheck(ctx context.Context) (*acp.EnvoyFetcherResponse, error) {
    30  	var resp *acp.EnvoyFetcherResponse
    31  	var err error
    32  
    33  	switch f.mode {
    34  	case Happy:
    35  		resp = &acp.EnvoyFetcherResponse{
    36  			StatusCode: 200,
    37  			Text:       []byte("Ready"),
    38  		}
    39  		err = nil
    40  
    41  	case Error:
    42  		resp = nil
    43  		err = fmt.Errorf("fakeReady Error always errors")
    44  
    45  	case Failure:
    46  		resp = &acp.EnvoyFetcherResponse{
    47  			StatusCode: 503,
    48  			Text:       []byte("Not ready"),
    49  		}
    50  		err = nil
    51  	}
    52  
    53  	return resp, err
    54  }
    55  
    56  type envoyMetadata struct {
    57  	t  *testing.T
    58  	f  *fakeReady
    59  	ew *acp.EnvoyWatcher
    60  }
    61  
    62  func (m *envoyMetadata) check(seq int, alive bool) {
    63  	if m.ew.IsAlive() != alive {
    64  		m.t.Errorf("%d: EnvoyWatcher.IsAlive %t, wanted %t", seq, m.ew.IsAlive(), alive)
    65  	}
    66  
    67  	if m.ew.IsReady() != alive {
    68  		m.t.Errorf("%d: EnvoyWatcher.IsReady %t, wanted %t (same as alive)", seq, m.ew.IsAlive(), alive)
    69  	}
    70  }
    71  
    72  func newEnvoyMetadata(t *testing.T, readyMode fakeReadyMode) *envoyMetadata {
    73  	f := &fakeReady{mode: readyMode}
    74  
    75  	ew := acp.NewEnvoyWatcher()
    76  	ew.SetReadyCheck(f.readyCheck)
    77  
    78  	if ew == nil {
    79  		t.Error("New EnvoyWatcher is nil?")
    80  	}
    81  
    82  	return &envoyMetadata{t: t, f: f, ew: ew}
    83  }
    84  
    85  func TestEnvoyHappyPath(t *testing.T) {
    86  	m := newEnvoyMetadata(t, Happy)
    87  	m.check(0, false)
    88  
    89  	// Fetch readiness.
    90  	m.ew.FetchEnvoyReady(dlog.NewTestContext(t, false))
    91  	m.check(1, true)
    92  }
    93  
    94  func TestEnvoyError(t *testing.T) {
    95  	m := newEnvoyMetadata(t, Error)
    96  	m.check(0, false)
    97  
    98  	// Fetch readiness.
    99  	m.ew.FetchEnvoyReady(dlog.NewTestContext(t, false))
   100  	m.check(1, false)
   101  }
   102  
   103  func TestEnvoy503(t *testing.T) {
   104  	m := newEnvoyMetadata(t, Failure)
   105  	m.check(0, false)
   106  
   107  	// Fetch readiness.
   108  	m.ew.FetchEnvoyReady(dlog.NewTestContext(t, false))
   109  	m.check(1, false)
   110  }
   111  
   112  func TestEnvoySadToHappy(t *testing.T) {
   113  	m := newEnvoyMetadata(t, Error)
   114  	m.check(0, false)
   115  
   116  	// Fetch readiness.
   117  	m.ew.FetchEnvoyReady(dlog.NewTestContext(t, false))
   118  	m.check(1, false)
   119  
   120  	// Switch to the happy path.
   121  	m.f.setMode(Happy)
   122  	m.ew.FetchEnvoyReady(dlog.NewTestContext(t, false))
   123  	m.check(2, true)
   124  }
   125  

View as plain text