X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/2db0c3a44d8f12e3a566c796bdecaa1de150b155..0c888bcc93b559339c8abbce784bdcc44746bca2:/services/ws/server_test.go diff --git a/services/ws/server_test.go b/services/ws/server_test.go index d74f7dff42..b1f943857a 100644 --- a/services/ws/server_test.go +++ b/services/ws/server_test.go @@ -1,43 +1,58 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + package main import ( + "encoding/json" + "io/ioutil" + "net/http" "sync" "time" "git.curoverse.com/arvados.git/sdk/go/arvados" + "git.curoverse.com/arvados.git/sdk/go/arvadostest" check "gopkg.in/check.v1" ) var _ = check.Suite(&serverSuite{}) type serverSuite struct { + cfg *wsConfig + srv *server + wg sync.WaitGroup +} + +func (s *serverSuite) SetUpTest(c *check.C) { + s.cfg = s.testConfig() + s.srv = &server{wsConfig: s.cfg} } -func testConfig() *wsConfig { +func (*serverSuite) testConfig() *wsConfig { cfg := defaultConfig() cfg.Client = *(arvados.NewClientFromEnv()) cfg.Postgres = testDBConfig() cfg.Listen = ":" + cfg.ManagementToken = arvadostest.ManagementToken return &cfg } // TestBadDB ensures Run() returns an error (instead of panicking or // deadlocking) if it can't connect to the database server at startup. func (s *serverSuite) TestBadDB(c *check.C) { - cfg := testConfig() - cfg.Postgres["password"] = "1234" - srv := &server{wsConfig: cfg} + s.cfg.Postgres["password"] = "1234" var wg sync.WaitGroup wg.Add(1) go func() { - err := srv.Run() + err := s.srv.Run() c.Check(err, check.NotNil) wg.Done() }() wg.Add(1) go func() { - srv.WaitReady() + s.srv.WaitReady() wg.Done() }() @@ -53,9 +68,57 @@ func (s *serverSuite) TestBadDB(c *check.C) { } } -func newTestServer() *server { - srv := &server{wsConfig: testConfig()} - go srv.Run() - srv.WaitReady() - return srv +func (s *serverSuite) TestHealth(c *check.C) { + go s.srv.Run() + defer s.srv.Close() + s.srv.WaitReady() + for _, token := range []string{"", "foo", s.cfg.ManagementToken} { + req, err := http.NewRequest("GET", "http://"+s.srv.listener.Addr().String()+"/_health/ping", nil) + c.Assert(err, check.IsNil) + if token != "" { + req.Header.Add("Authorization", "Bearer "+token) + } + resp, err := http.DefaultClient.Do(req) + c.Check(err, check.IsNil) + if token == s.cfg.ManagementToken { + c.Check(resp.StatusCode, check.Equals, http.StatusOK) + buf, err := ioutil.ReadAll(resp.Body) + c.Check(err, check.IsNil) + c.Check(string(buf), check.Equals, `{"health":"OK"}`+"\n") + } else { + c.Check(resp.StatusCode, check.Not(check.Equals), http.StatusOK) + } + } +} + +func (s *serverSuite) TestStatus(c *check.C) { + go s.srv.Run() + defer s.srv.Close() + s.srv.WaitReady() + req, err := http.NewRequest("GET", "http://"+s.srv.listener.Addr().String()+"/status.json", nil) + c.Assert(err, check.IsNil) + resp, err := http.DefaultClient.Do(req) + c.Check(err, check.IsNil) + c.Check(resp.StatusCode, check.Equals, http.StatusOK) + var status map[string]interface{} + err = json.NewDecoder(resp.Body).Decode(&status) + c.Check(err, check.IsNil) + c.Check(status["Version"], check.Not(check.Equals), "") +} + +func (s *serverSuite) TestHealthDisabled(c *check.C) { + s.cfg.ManagementToken = "" + + go s.srv.Run() + defer s.srv.Close() + s.srv.WaitReady() + + for _, token := range []string{"", "foo", arvadostest.ManagementToken} { + req, err := http.NewRequest("GET", "http://"+s.srv.listener.Addr().String()+"/_health/ping", nil) + c.Assert(err, check.IsNil) + req.Header.Add("Authorization", "Bearer "+token) + resp, err := http.DefaultClient.Do(req) + c.Check(err, check.IsNil) + c.Check(resp.StatusCode, check.Equals, http.StatusNotFound) + } }