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  }