blob: e270055c89824f8fc0a831d6a349ddb82ab7c55a [file] [log] [blame]
Carlos Amedee372ecfe2020-05-04 13:13:17 -04001// Copyright 2020 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package buildlet
6
7import (
8 "context"
9 "fmt"
10 "net/http"
11 "net/http/httptest"
12 "net/url"
13 "testing"
14)
15
16func TestBuildletClient(t *testing.T) {
17 var httpCalled, OnBeginBuildletProbeCalled, OnEndBuildletProbeCalled bool
18 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
19 httpCalled = true
20 fmt.Fprintln(w, "buildlet endpoint reached")
21 }))
22 defer ts.Close()
23
24 u, err := url.Parse(ts.URL)
25 if err != nil {
26 t.Fatalf("unable to parse http server url %s", err)
27 }
28
29 kp, err := NewKeyPair()
30 if err != nil {
31 t.Fatalf("unable to create key pair %s", err)
32 }
33
34 opt := &VMOpts{
35 TLS: kp,
36 OnBeginBuildletProbe: func(string) { OnBeginBuildletProbeCalled = true },
37 OnEndBuildletProbe: func(*http.Response, error) { OnEndBuildletProbeCalled = true },
38 }
39
40 gotClient, gotErr := buildletClient(context.Background(), ts.URL, u.Host, opt)
41 if gotErr != nil {
42 t.Errorf("buildletClient(ctx, %s, %s, %v) error %s", ts.URL, u.Host, opt, gotErr)
43 }
44 if gotClient == nil {
45 t.Errorf("client should not be nil")
46 }
47 if !httpCalled {
48 t.Error("http endpoint never called")
49 }
50 if !OnBeginBuildletProbeCalled {
51 t.Error("OnBeginBuildletProbe() was not called")
52 }
53 if !OnEndBuildletProbeCalled {
54 t.Error("OnEndBuildletProbe() was not called")
55 }
56}
57
58func TestBuildletClientError(t *testing.T) {
59 var httpCalled, OnBeginBuildletProbeCalled, OnEndBuildletProbeCalled bool
60 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
61 httpCalled = true
62 fmt.Fprintln(w, "buildlet endpoint reached")
63 }))
64 defer ts.Close()
65
66 u, err := url.Parse(ts.URL)
67 if err != nil {
68 t.Fatalf("unable to parse http server url %s", err)
69 }
70
71 kp, err := NewKeyPair()
72 if err != nil {
73 t.Fatalf("unable to create key pair %s", err)
74 }
75
76 opt := &VMOpts{
77 TLS: kp,
78 OnBeginBuildletProbe: func(string) { OnBeginBuildletProbeCalled = true },
79 OnEndBuildletProbe: func(*http.Response, error) { OnEndBuildletProbeCalled = true },
80 }
81
82 ctx, cancel := context.WithCancel(context.Background())
83 cancel()
84 gotClient, gotErr := buildletClient(ctx, ts.URL, u.Host, opt)
85 if gotErr == nil {
86 t.Errorf("buildletClient(ctx, %s, %s, %v) error %s", ts.URL, u.Host, opt, gotErr)
87 }
88 if gotClient != nil {
89 t.Errorf("client should be nil")
90 }
91 if httpCalled {
92 t.Error("http endpoint called")
93 }
Carlos Amedeebf27e272020-05-08 12:50:02 -040094 if OnBeginBuildletProbeCalled {
Carlos Amedee3b940762020-05-05 18:01:50 -040095 t.Error("OnBeginBuildletProbe() was called")
Carlos Amedee372ecfe2020-05-04 13:13:17 -040096 }
Carlos Amedeebf27e272020-05-08 12:50:02 -040097 if OnEndBuildletProbeCalled {
Carlos Amedee3b940762020-05-05 18:01:50 -040098 t.Error("OnEndBuildletProbe() was called")
Carlos Amedee372ecfe2020-05-04 13:13:17 -040099 }
100}
101
102func TestProbeBuildlet(t *testing.T) {
103 var httpCalled, OnBeginBuildletProbeCalled, OnEndBuildletProbeCalled bool
104 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
105 httpCalled = true
106 fmt.Fprintln(w, "buildlet endpoint reached")
107 }))
108 defer ts.Close()
109 opt := &VMOpts{
110 OnBeginBuildletProbe: func(string) { OnBeginBuildletProbeCalled = true },
111 OnEndBuildletProbe: func(*http.Response, error) { OnEndBuildletProbeCalled = true },
112 }
113 gotErr := probeBuildlet(context.Background(), ts.URL, opt)
114 if gotErr != nil {
115 t.Errorf("probeBuildlet(ctx, %q, %+v) = %s; want no error", ts.URL, opt, gotErr)
116 }
117 if !httpCalled {
118 t.Error("http endpoint never called")
119 }
120 if !OnBeginBuildletProbeCalled {
121 t.Error("OnBeginBuildletProbe() was not called")
122 }
123 if !OnEndBuildletProbeCalled {
124 t.Error("OnEndBuildletProbe() was not called")
125 }
126}
127
128func TestProbeBuildletError(t *testing.T) {
129 var httpCalled bool
130 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
131 httpCalled = true
132 http.Error(w, "all types of broken", http.StatusInternalServerError)
133 }))
134 defer ts.Close()
135 opt := &VMOpts{}
136 gotErr := probeBuildlet(context.Background(), ts.URL, opt)
137 if gotErr == nil {
138 t.Errorf("probeBuildlet(ctx, %q, %+v) = nil; want error", ts.URL, opt)
139 }
140 if !httpCalled {
141 t.Error("http endpoint never called")
142 }
143}