11901: Require management token for health checks.
[arvados.git] / services / ws / server_test.go
1 package main
2
3 import (
4         "io/ioutil"
5         "net/http"
6         "sync"
7         "time"
8
9         "git.curoverse.com/arvados.git/sdk/go/arvados"
10         "git.curoverse.com/arvados.git/sdk/go/arvadostest"
11         check "gopkg.in/check.v1"
12 )
13
14 var _ = check.Suite(&serverSuite{})
15
16 type serverSuite struct {
17         cfg *wsConfig
18         srv *server
19         wg  sync.WaitGroup
20 }
21
22 func (s *serverSuite) SetUpTest(c *check.C) {
23         s.cfg = s.testConfig()
24         s.srv = &server{wsConfig: s.cfg}
25 }
26
27 func (*serverSuite) testConfig() *wsConfig {
28         cfg := defaultConfig()
29         cfg.Client = *(arvados.NewClientFromEnv())
30         cfg.Postgres = testDBConfig()
31         cfg.Listen = ":"
32         cfg.ManagementToken = arvadostest.ManagementToken
33         return &cfg
34 }
35
36 // TestBadDB ensures Run() returns an error (instead of panicking or
37 // deadlocking) if it can't connect to the database server at startup.
38 func (s *serverSuite) TestBadDB(c *check.C) {
39         s.cfg.Postgres["password"] = "1234"
40
41         var wg sync.WaitGroup
42         wg.Add(1)
43         go func() {
44                 err := s.srv.Run()
45                 c.Check(err, check.NotNil)
46                 wg.Done()
47         }()
48         wg.Add(1)
49         go func() {
50                 s.srv.WaitReady()
51                 wg.Done()
52         }()
53
54         done := make(chan bool)
55         go func() {
56                 wg.Wait()
57                 close(done)
58         }()
59         select {
60         case <-done:
61         case <-time.After(10 * time.Second):
62                 c.Fatal("timeout")
63         }
64 }
65
66 func (s *serverSuite) TestHealth(c *check.C) {
67         go s.srv.Run()
68         s.srv.WaitReady()
69         for _, token := range []string{"", "foo", s.cfg.ManagementToken} {
70                 req, err := http.NewRequest("GET", "http://"+s.srv.listener.Addr().String()+"/_health/ping", nil)
71                 c.Assert(err, check.IsNil)
72                 if token != "" {
73                         req.Header.Add("Authorization", "Bearer "+token)
74                 }
75                 resp, err := http.DefaultClient.Do(req)
76                 c.Check(err, check.IsNil)
77                 if token == s.cfg.ManagementToken {
78                         c.Check(resp.StatusCode, check.Equals, http.StatusOK)
79                         buf, err := ioutil.ReadAll(resp.Body)
80                         c.Check(err, check.IsNil)
81                         c.Check(string(buf), check.Equals, `{"health":"OK"}`+"\n")
82                 } else {
83                         c.Check(resp.StatusCode, check.Not(check.Equals), http.StatusOK)
84                 }
85         }
86 }