12260: Test case for one unhealthy service.
[arvados.git] / sdk / go / health / aggregator_test.go
1 package health
2
3 import (
4         "encoding/json"
5         "net/http"
6         "net/http/httptest"
7         "strings"
8
9         "git.curoverse.com/arvados.git/sdk/go/arvados"
10         "git.curoverse.com/arvados.git/sdk/go/arvadostest"
11         "gopkg.in/check.v1"
12 )
13
14 type AggregatorSuite struct {
15         handler *Aggregator
16         req     *http.Request
17         resp    *httptest.ResponseRecorder
18 }
19
20 // Gocheck boilerplate
21 var _ = check.Suite(&AggregatorSuite{})
22
23 func (s *AggregatorSuite) TestInterface(c *check.C) {
24         var _ http.Handler = &Aggregator{}
25 }
26
27 func (s *AggregatorSuite) SetUpTest(c *check.C) {
28         s.handler = &Aggregator{Config: &arvados.Config{
29                 Clusters: map[string]arvados.Cluster{
30                         "zzzzz": {
31                                 ManagementToken: arvadostest.ManagementToken,
32                                 SystemNodes:     map[string]arvados.SystemNode{},
33                         },
34                 },
35         }}
36         s.req = httptest.NewRequest("GET", "/_health/all", nil)
37         s.req.Header.Set("Authorization", "Bearer "+arvadostest.ManagementToken)
38         s.resp = httptest.NewRecorder()
39 }
40
41 func (s *AggregatorSuite) TestNoAuth(c *check.C) {
42         s.req.Header.Del("Authorization")
43         s.handler.ServeHTTP(s.resp, s.req)
44         s.checkError(c)
45         c.Check(s.resp.Code, check.Equals, http.StatusUnauthorized)
46 }
47
48 func (s *AggregatorSuite) TestBadAuth(c *check.C) {
49         s.req.Header.Set("Authorization", "xyzzy")
50         s.handler.ServeHTTP(s.resp, s.req)
51         s.checkError(c)
52         c.Check(s.resp.Code, check.Equals, http.StatusUnauthorized)
53 }
54
55 func (s *AggregatorSuite) TestEmptyConfig(c *check.C) {
56         s.handler.ServeHTTP(s.resp, s.req)
57         s.checkOK(c)
58 }
59
60 type unhealthyHandler struct{}
61
62 func (*unhealthyHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
63         resp.Write([]byte(`{"health":"ERROR"}`))
64 }
65
66 func (s *AggregatorSuite) TestUnhealthy(c *check.C) {
67         srv := httptest.NewServer(&unhealthyHandler{})
68         defer srv.Close()
69
70         var port string
71         if parts := strings.Split(srv.URL, ":"); len(parts) < 3 {
72                 panic(srv.URL)
73         } else {
74                 port = parts[len(parts)-1]
75         }
76         s.handler.Config.Clusters["zzzzz"].SystemNodes["localhost"] = arvados.SystemNode{
77                 Keepstore: arvados.Keepstore{Listen: ":" + port},
78         }
79         s.handler.ServeHTTP(s.resp, s.req)
80         s.checkUnhealthy(c)
81 }
82
83 func (s *AggregatorSuite) checkError(c *check.C) {
84         c.Check(s.resp.Code, check.Not(check.Equals), http.StatusOK)
85         var body map[string]interface{}
86         err := json.NewDecoder(s.resp.Body).Decode(&body)
87         c.Check(err, check.IsNil)
88         c.Check(body["health"], check.Not(check.Equals), "OK")
89 }
90
91 func (s *AggregatorSuite) checkUnhealthy(c *check.C) {
92         c.Check(s.resp.Code, check.Equals, http.StatusOK)
93         var body map[string]interface{}
94         err := json.NewDecoder(s.resp.Body).Decode(&body)
95         c.Check(err, check.IsNil)
96         c.Check(body["health"], check.Equals, "ERROR")
97 }
98
99 func (s *AggregatorSuite) checkOK(c *check.C) {
100         c.Check(s.resp.Code, check.Equals, http.StatusOK)
101         var body map[string]interface{}
102         err := json.NewDecoder(s.resp.Body).Decode(&body)
103         c.Check(err, check.IsNil)
104         c.Check(body["health"], check.Equals, "OK")
105 }