Fix more ineffassign warnings.
[arvados.git] / services / keep-balance / main_test.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package main
6
7 import (
8         "bytes"
9         "io/ioutil"
10         "net"
11         "net/http"
12         "time"
13
14         check "gopkg.in/check.v1"
15 )
16
17 var _ = check.Suite(&mainSuite{})
18
19 type mainSuite struct{}
20
21 func (s *mainSuite) TestVersionFlag(c *check.C) {
22         var stdout, stderr bytes.Buffer
23         runCommand("keep-balance", []string{"-version"}, nil, &stdout, &stderr)
24         c.Check(stderr.String(), check.Equals, "")
25         c.Log(stdout.String())
26 }
27
28 func (s *mainSuite) TestHTTPServer(c *check.C) {
29         ln, err := net.Listen("tcp", ":0")
30         if err != nil {
31                 c.Fatal(err)
32         }
33         _, p, err := net.SplitHostPort(ln.Addr().String())
34         c.Check(err, check.IsNil)
35         ln.Close()
36         config := "Clusters:\n zzzzz:\n  ManagementToken: abcdefg\n  Services: {Keepbalance: {InternalURLs: {'http://localhost:" + p + "/': {}}}}\n"
37
38         var stdout bytes.Buffer
39         go runCommand("keep-balance", []string{"-config", "-"}, bytes.NewBufferString(config), &stdout, &stdout)
40         done := make(chan struct{})
41         go func() {
42                 defer close(done)
43                 for {
44                         time.Sleep(time.Second / 10)
45                         req, err := http.NewRequest(http.MethodGet, "http://:"+p+"/metrics", nil)
46                         if err != nil {
47                                 c.Fatal(err)
48                                 return
49                         }
50                         req.Header.Set("Authorization", "Bearer abcdefg")
51                         resp, err := http.DefaultClient.Do(req)
52                         if err != nil {
53                                 c.Logf("error %s", err)
54                                 continue
55                         }
56                         defer resp.Body.Close()
57                         if resp.StatusCode != http.StatusOK {
58                                 c.Logf("http status %d", resp.StatusCode)
59                                 continue
60                         }
61                         buf, err := ioutil.ReadAll(resp.Body)
62                         if err != nil {
63                                 c.Logf("read body: %s", err)
64                                 continue
65                         }
66                         c.Check(string(buf), check.Matches, `(?ms).*arvados_keepbalance_sweep_seconds_sum.*`)
67                         return
68                 }
69         }()
70         select {
71         case <-done:
72         case <-time.After(time.Second):
73                 c.Log(stdout.String())
74                 c.Fatal("timeout")
75         }
76
77         // Check non-metrics URL that gets passed through to us from
78         // service.Command
79         req, err := http.NewRequest(http.MethodGet, "http://:"+p+"/not-metrics", nil)
80         c.Assert(err, check.IsNil)
81         resp, err := http.DefaultClient.Do(req)
82         c.Check(err, check.IsNil)
83         defer resp.Body.Close()
84         c.Check(resp.StatusCode, check.Equals, http.StatusNotFound)
85 }