golang.org/x/build@v0.0.0-20240506185731-218518f32b70/buildlet/buildlet_test.go (about) 1 // 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 5 package buildlet 6 7 import ( 8 "context" 9 "fmt" 10 "net/http" 11 "net/http/httptest" 12 "net/url" 13 "testing" 14 ) 15 16 func 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 58 func 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 } 94 if OnBeginBuildletProbeCalled { 95 t.Error("OnBeginBuildletProbe() was called") 96 } 97 if OnEndBuildletProbeCalled { 98 t.Error("OnEndBuildletProbe() was called") 99 } 100 } 101 102 func 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 128 func 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 }