15003: Merge branch 'master'
[arvados.git] / lib / service / cmd_test.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 // package service provides a cmd.Handler that brings up a system service.
6 package service
7
8 import (
9         "bytes"
10         "context"
11         "fmt"
12         "io/ioutil"
13         "net/http"
14         "os"
15         "testing"
16
17         "git.curoverse.com/arvados.git/sdk/go/arvados"
18         "git.curoverse.com/arvados.git/sdk/go/ctxlog"
19         check "gopkg.in/check.v1"
20 )
21
22 func Test(t *testing.T) {
23         check.TestingT(t)
24 }
25
26 var _ = check.Suite(&Suite{})
27
28 type Suite struct{}
29
30 func (*Suite) TestCommand(c *check.C) {
31         cf, err := ioutil.TempFile("", "cmd_test.")
32         c.Assert(err, check.IsNil)
33         defer os.Remove(cf.Name())
34         defer cf.Close()
35         fmt.Fprintf(cf, "Clusters:\n zzzzz:\n  SystemRootToken: abcde\n  NodeProfiles: {\"*\": {\"arvados-controller\": {Listen: \":1234\"}}}")
36
37         healthCheck := make(chan bool, 1)
38         ctx, cancel := context.WithCancel(context.Background())
39         defer cancel()
40
41         cmd := Command(arvados.ServiceNameController, func(ctx context.Context, _ *arvados.Cluster, token string) Handler {
42                 c.Check(ctx.Value("foo"), check.Equals, "bar")
43                 c.Check(token, check.Equals, "abcde")
44                 return &testHandler{ctx: ctx, healthCheck: healthCheck}
45         })
46         cmd.(*command).ctx = context.WithValue(ctx, "foo", "bar")
47
48         done := make(chan bool)
49         var stdin, stdout, stderr bytes.Buffer
50
51         go func() {
52                 cmd.RunCommand("arvados-controller", []string{"-config", cf.Name()}, &stdin, &stdout, &stderr)
53                 close(done)
54         }()
55         select {
56         case <-healthCheck:
57         case <-done:
58                 c.Error("command exited without health check")
59         }
60         cancel()
61         c.Check(stdout.String(), check.Equals, "")
62         c.Check(stderr.String(), check.Matches, `(?ms).*"msg":"CheckHealth called".*`)
63 }
64
65 type testHandler struct {
66         ctx         context.Context
67         healthCheck chan bool
68 }
69
70 func (th *testHandler) ServeHTTP(http.ResponseWriter, *http.Request) {}
71 func (th *testHandler) CheckHealth() error {
72         ctxlog.FromContext(th.ctx).Info("CheckHealth called")
73         select {
74         case th.healthCheck <- true:
75         default:
76         }
77         return nil
78 }