Merge branch '14482-rubysdk-empty-dir'
[arvados.git] / services / ws / server_test.go
index d74f7dff4283ef071fb4e1ae6cb4d8e5db1c9f07..b1f943857a18f495f2777c24aa3627855aa0d9f6 100644 (file)
@@ -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)
+       }
 }