a0c4c8ccde0e3ab2bbf15412c6f82a525a971bee
[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         defer s.srv.Close()
69         s.srv.WaitReady()
70         for _, token := range []string{"", "foo", s.cfg.ManagementToken} {
71                 req, err := http.NewRequest("GET", "http://"+s.srv.listener.Addr().String()+"/_health/ping", nil)
72                 c.Assert(err, check.IsNil)
73                 if token != "" {
74                         req.Header.Add("Authorization", "Bearer "+token)
75                 }
76                 resp, err := http.DefaultClient.Do(req)
77                 c.Check(err, check.IsNil)
78                 if token == s.cfg.ManagementToken {
79                         c.Check(resp.StatusCode, check.Equals, http.StatusOK)
80                         buf, err := ioutil.ReadAll(resp.Body)
81                         c.Check(err, check.IsNil)
82                         c.Check(string(buf), check.Equals, `{"health":"OK"}`+"\n")
83                 } else {
84                         c.Check(resp.StatusCode, check.Not(check.Equals), http.StatusOK)
85                 }
86         }
87 }
88
89 func (s *serverSuite) TestHealthDisabled(c *check.C) {
90         s.cfg.ManagementToken = ""
91
92         go s.srv.Run()
93         defer s.srv.Close()
94         s.srv.WaitReady()
95
96         req, err := http.NewRequest("GET", "http://"+s.srv.listener.Addr().String()+"/_health/ping", nil)
97         c.Assert(err, check.IsNil)
98         req.Header.Add("Authorization", "Bearer "+arvadostest.ManagementToken)
99         resp, err := http.DefaultClient.Do(req)
100         c.Check(err, check.IsNil)
101         c.Check(resp.StatusCode, check.Equals, http.StatusNotFound)
102 }