github.com/olljanat/moby@v1.13.1/pkg/httputils/httputils_test.go (about)

     1  package httputils
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"strings"
     9  	"testing"
    10  )
    11  
    12  func TestDownload(t *testing.T) {
    13  	expected := "Hello, docker !"
    14  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    15  		fmt.Fprintf(w, expected)
    16  	}))
    17  	defer ts.Close()
    18  	response, err := Download(ts.URL)
    19  	if err != nil {
    20  		t.Fatal(err)
    21  	}
    22  
    23  	actual, err := ioutil.ReadAll(response.Body)
    24  	response.Body.Close()
    25  
    26  	if err != nil || string(actual) != expected {
    27  		t.Fatalf("Expected the response %q, got err:%v, response:%v, actual:%s", expected, err, response, string(actual))
    28  	}
    29  }
    30  
    31  func TestDownload400Errors(t *testing.T) {
    32  	expectedError := "Got HTTP status code >= 400: 403 Forbidden"
    33  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    34  		// 403
    35  		http.Error(w, "something failed (forbidden)", http.StatusForbidden)
    36  	}))
    37  	defer ts.Close()
    38  	// Expected status code = 403
    39  	if _, err := Download(ts.URL); err == nil || err.Error() != expectedError {
    40  		t.Fatalf("Expected the the error %q, got %v", expectedError, err)
    41  	}
    42  }
    43  
    44  func TestDownloadOtherErrors(t *testing.T) {
    45  	if _, err := Download("I'm not an url.."); err == nil || !strings.Contains(err.Error(), "unsupported protocol scheme") {
    46  		t.Fatalf("Expected an error with 'unsupported protocol scheme', got %v", err)
    47  	}
    48  }
    49  
    50  func TestNewHTTPRequestError(t *testing.T) {
    51  	errorMessage := "Some error message"
    52  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    53  		// 403
    54  		http.Error(w, errorMessage, http.StatusForbidden)
    55  	}))
    56  	defer ts.Close()
    57  	httpResponse, err := http.Get(ts.URL)
    58  	if err != nil {
    59  		t.Fatal(err)
    60  	}
    61  	if err := NewHTTPRequestError(errorMessage, httpResponse); err.Error() != errorMessage {
    62  		t.Fatalf("Expected err to be %q, got %v", errorMessage, err)
    63  	}
    64  }
    65  
    66  func TestParseServerHeader(t *testing.T) {
    67  	inputs := map[string][]string{
    68  		"bad header":           {"error"},
    69  		"(bad header)":         {"error"},
    70  		"(without/spaces)":     {"error"},
    71  		"(header/with spaces)": {"error"},
    72  		"foo/bar (baz)":        {"foo", "bar", "baz"},
    73  		"foo/bar":              {"error"},
    74  		"foo":                  {"error"},
    75  		"foo/bar (baz space)":           {"foo", "bar", "baz space"},
    76  		"  f  f  /  b  b  (  b  s  )  ": {"f  f", "b  b", "b  s"},
    77  		"foo/bar (baz) ignore":          {"foo", "bar", "baz"},
    78  		"foo/bar ()":                    {"error"},
    79  		"foo/bar()":                     {"error"},
    80  		"foo/bar(baz)":                  {"foo", "bar", "baz"},
    81  		"foo/bar/zzz(baz)":              {"foo/bar", "zzz", "baz"},
    82  		"foo/bar(baz/abc)":              {"foo", "bar", "baz/abc"},
    83  		"foo/bar(baz (abc))":            {"foo", "bar", "baz (abc)"},
    84  	}
    85  
    86  	for header, values := range inputs {
    87  		serverHeader, err := ParseServerHeader(header)
    88  		if err != nil {
    89  			if err != errInvalidHeader {
    90  				t.Fatalf("Failed to parse %q, and got some unexpected error: %q", header, err)
    91  			}
    92  			if values[0] == "error" {
    93  				continue
    94  			}
    95  			t.Fatalf("Header %q failed to parse when it shouldn't have", header)
    96  		}
    97  		if values[0] == "error" {
    98  			t.Fatalf("Header %q parsed ok when it should have failed(%q).", header, serverHeader)
    99  		}
   100  
   101  		if serverHeader.App != values[0] {
   102  			t.Fatalf("Expected serverHeader.App for %q to equal %q, got %q", header, values[0], serverHeader.App)
   103  		}
   104  
   105  		if serverHeader.Ver != values[1] {
   106  			t.Fatalf("Expected serverHeader.Ver for %q to equal %q, got %q", header, values[1], serverHeader.Ver)
   107  		}
   108  
   109  		if serverHeader.OS != values[2] {
   110  			t.Fatalf("Expected serverHeader.OS for %q to equal %q, got %q", header, values[2], serverHeader.OS)
   111  		}
   112  
   113  	}
   114  
   115  }