|  | // Copyright 2020 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package buildlet | 
|  |  | 
|  | import ( | 
|  | "context" | 
|  | "fmt" | 
|  | "net/http" | 
|  | "net/http/httptest" | 
|  | "net/url" | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | func TestBuildletClient(t *testing.T) { | 
|  | var httpCalled, OnBeginBuildletProbeCalled, OnEndBuildletProbeCalled bool | 
|  | ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | 
|  | httpCalled = true | 
|  | fmt.Fprintln(w, "buildlet endpoint reached") | 
|  | })) | 
|  | defer ts.Close() | 
|  |  | 
|  | u, err := url.Parse(ts.URL) | 
|  | if err != nil { | 
|  | t.Fatalf("unable to parse http server url %s", err) | 
|  | } | 
|  |  | 
|  | kp, err := NewKeyPair() | 
|  | if err != nil { | 
|  | t.Fatalf("unable to create key pair %s", err) | 
|  | } | 
|  |  | 
|  | opt := &VMOpts{ | 
|  | TLS:                  kp, | 
|  | OnBeginBuildletProbe: func(string) { OnBeginBuildletProbeCalled = true }, | 
|  | OnEndBuildletProbe:   func(*http.Response, error) { OnEndBuildletProbeCalled = true }, | 
|  | } | 
|  |  | 
|  | gotClient, gotErr := buildletClient(context.Background(), ts.URL, u.Host, opt) | 
|  | if gotErr != nil { | 
|  | t.Errorf("buildletClient(ctx, %s, %s, %v) error %s", ts.URL, u.Host, opt, gotErr) | 
|  | } | 
|  | if gotClient == nil { | 
|  | t.Errorf("client should not be nil") | 
|  | } | 
|  | if !httpCalled { | 
|  | t.Error("http endpoint never called") | 
|  | } | 
|  | if !OnBeginBuildletProbeCalled { | 
|  | t.Error("OnBeginBuildletProbe() was not called") | 
|  | } | 
|  | if !OnEndBuildletProbeCalled { | 
|  | t.Error("OnEndBuildletProbe() was not called") | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestBuildletClientError(t *testing.T) { | 
|  | var httpCalled, OnBeginBuildletProbeCalled, OnEndBuildletProbeCalled bool | 
|  | ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | 
|  | httpCalled = true | 
|  | fmt.Fprintln(w, "buildlet endpoint reached") | 
|  | })) | 
|  | defer ts.Close() | 
|  |  | 
|  | u, err := url.Parse(ts.URL) | 
|  | if err != nil { | 
|  | t.Fatalf("unable to parse http server url %s", err) | 
|  | } | 
|  |  | 
|  | kp, err := NewKeyPair() | 
|  | if err != nil { | 
|  | t.Fatalf("unable to create key pair %s", err) | 
|  | } | 
|  |  | 
|  | opt := &VMOpts{ | 
|  | TLS:                  kp, | 
|  | OnBeginBuildletProbe: func(string) { OnBeginBuildletProbeCalled = true }, | 
|  | OnEndBuildletProbe:   func(*http.Response, error) { OnEndBuildletProbeCalled = true }, | 
|  | } | 
|  |  | 
|  | ctx, cancel := context.WithCancel(context.Background()) | 
|  | cancel() | 
|  | gotClient, gotErr := buildletClient(ctx, ts.URL, u.Host, opt) | 
|  | if gotErr == nil { | 
|  | t.Errorf("buildletClient(ctx, %s, %s, %v) error %s", ts.URL, u.Host, opt, gotErr) | 
|  | } | 
|  | if gotClient != nil { | 
|  | t.Errorf("client should be nil") | 
|  | } | 
|  | if httpCalled { | 
|  | t.Error("http endpoint called") | 
|  | } | 
|  | if OnBeginBuildletProbeCalled { | 
|  | t.Error("OnBeginBuildletProbe() was called") | 
|  | } | 
|  | if OnEndBuildletProbeCalled { | 
|  | t.Error("OnEndBuildletProbe() was called") | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestProbeBuildlet(t *testing.T) { | 
|  | var httpCalled, OnBeginBuildletProbeCalled, OnEndBuildletProbeCalled bool | 
|  | ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | 
|  | httpCalled = true | 
|  | fmt.Fprintln(w, "buildlet endpoint reached") | 
|  | })) | 
|  | defer ts.Close() | 
|  | opt := &VMOpts{ | 
|  | OnBeginBuildletProbe: func(string) { OnBeginBuildletProbeCalled = true }, | 
|  | OnEndBuildletProbe:   func(*http.Response, error) { OnEndBuildletProbeCalled = true }, | 
|  | } | 
|  | gotErr := probeBuildlet(context.Background(), ts.URL, opt) | 
|  | if gotErr != nil { | 
|  | t.Errorf("probeBuildlet(ctx, %q, %+v) = %s; want no error", ts.URL, opt, gotErr) | 
|  | } | 
|  | if !httpCalled { | 
|  | t.Error("http endpoint never called") | 
|  | } | 
|  | if !OnBeginBuildletProbeCalled { | 
|  | t.Error("OnBeginBuildletProbe() was not called") | 
|  | } | 
|  | if !OnEndBuildletProbeCalled { | 
|  | t.Error("OnEndBuildletProbe() was not called") | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestProbeBuildletError(t *testing.T) { | 
|  | var httpCalled bool | 
|  | ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | 
|  | httpCalled = true | 
|  | http.Error(w, "all types of broken", http.StatusInternalServerError) | 
|  | })) | 
|  | defer ts.Close() | 
|  | opt := &VMOpts{} | 
|  | gotErr := probeBuildlet(context.Background(), ts.URL, opt) | 
|  | if gotErr == nil { | 
|  | t.Errorf("probeBuildlet(ctx, %q, %+v) = nil; want error", ts.URL, opt) | 
|  | } | 
|  | if !httpCalled { | 
|  | t.Error("http endpoint never called") | 
|  | } | 
|  | } |