blob: e270055c89824f8fc0a831d6a349ddb82ab7c55a [file] [log] [blame]
// 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")
}
}