diff --git a/api/agent_test.go b/api/agent_test.go index bd2b22a2bc24..9a773cca264b 100644 --- a/api/agent_test.go +++ b/api/agent_test.go @@ -1,6 +1,7 @@ package api import ( + "fmt" "io/ioutil" "os" "path/filepath" @@ -1366,3 +1367,101 @@ func TestAPI_AgentConnectProxyConfig(t *testing.T) { require.Equal(t, expectConfig, config) require.Equal(t, expectConfig.ContentHash, qm.LastContentHash) } + +func TestAPI_AgentHealthService(t *testing.T) { + t.Parallel() + c, s := makeClient(t) + defer s.Stop() + + agent := c.Agent() + + requireServiceHealthID := func(t *testing.T, serviceID, expected string, shouldExist bool) { + msg := fmt.Sprintf("service id:%s, shouldExist:%v, expectedStatus:%s : bad %%s", serviceID, shouldExist, expected) + + state, out, err := agent.AgentHealthServiceByID(serviceID) + require.Nil(t, err, msg, "err") + require.Equal(t, expected, state, msg, "state") + if !shouldExist { + require.Nil(t, out, msg, "shouldExist") + } else { + require.NotNil(t, out, msg, "output") + require.Equal(t, serviceID, out.Service.ID, msg, "output") + } + } + requireServiceHealthName := func(t *testing.T, serviceName, expected string, shouldExist bool) { + msg := fmt.Sprintf("service name:%s, shouldExist:%v, expectedStatus:%s : bad %%s", serviceName, shouldExist, expected) + + state, outs, err := agent.AgentHealthServiceByName(serviceName) + require.Nil(t, err, msg, "err") + require.Equal(t, expected, state, msg, "state") + if !shouldExist { + require.Equal(t, 0, len(outs), msg, "output") + } else { + require.True(t, len(outs) > 0, msg, "output") + for _, o := range outs { + require.Equal(t, serviceName, o.Service.Service, msg, "output") + } + } + } + + requireServiceHealthID(t, "_i_do_not_exist_", HealthCritical, false) + requireServiceHealthName(t, "_i_do_not_exist_", HealthCritical, false) + + testServiceID1 := "foo" + testServiceID2 := "foofoo" + testServiceName := "bar" + + // register service + reg := &AgentServiceRegistration{ + Name: testServiceName, + ID: testServiceID1, + Port: 8000, + Check: &AgentServiceCheck{ + TTL: "15s", + }, + } + err := agent.ServiceRegister(reg) + require.Nil(t, err) + requireServiceHealthID(t, testServiceID1, HealthCritical, true) + requireServiceHealthName(t, testServiceName, HealthCritical, true) + + err = agent.WarnTTL(fmt.Sprintf("service:%s", testServiceID1), "I am warn") + require.Nil(t, err) + requireServiceHealthName(t, testServiceName, HealthWarning, true) + requireServiceHealthID(t, testServiceID1, HealthWarning, true) + + err = agent.PassTTL(fmt.Sprintf("service:%s", testServiceID1), "I am good :)") + require.Nil(t, err) + requireServiceHealthName(t, testServiceName, HealthPassing, true) + requireServiceHealthID(t, testServiceID1, HealthPassing, true) + + err = agent.FailTTL(fmt.Sprintf("service:%s", testServiceID1), "I am dead.") + require.Nil(t, err) + requireServiceHealthName(t, testServiceName, HealthCritical, true) + requireServiceHealthID(t, testServiceID1, HealthCritical, true) + + // register another service + reg = &AgentServiceRegistration{ + Name: testServiceName, + ID: testServiceID2, + Port: 8000, + Check: &AgentServiceCheck{ + TTL: "15s", + }, + } + err = agent.ServiceRegister(reg) + require.Nil(t, err) + requireServiceHealthName(t, testServiceName, HealthCritical, true) + + err = agent.PassTTL(fmt.Sprintf("service:%s", testServiceID1), "I am good :)") + require.Nil(t, err) + requireServiceHealthName(t, testServiceName, HealthCritical, true) + + err = agent.WarnTTL(fmt.Sprintf("service:%s", testServiceID2), "I am warn") + require.Nil(t, err) + requireServiceHealthName(t, testServiceName, HealthWarning, true) + + err = agent.PassTTL(fmt.Sprintf("service:%s", testServiceID2), "I am good :)") + require.Nil(t, err) + requireServiceHealthName(t, testServiceName, HealthPassing, true) +}