package client import ( "errors" "io/ioutil" "net/http" "strings" "testing" "github.com/stretchr/testify/assert" "golang.org/x/net/context" ) // TestPingFail tests that when a server sends a non-successful response that we // can still grab API details, when set. // Some of this is just excercising the code paths to make sure there are no // panics. func TestPingFail(t *testing.T) { var withHeader bool client := &Client{ client: newMockClient(func(req *http.Request) (*http.Response, error) { resp := &http.Response{StatusCode: http.StatusInternalServerError} if withHeader { resp.Header = http.Header{} resp.Header.Set("API-Version", "awesome") resp.Header.Set("Docker-Experimental", "true") } resp.Body = ioutil.NopCloser(strings.NewReader("some error with the server")) return resp, nil }), } ping, err := client.Ping(context.Background()) assert.Error(t, err) assert.Equal(t, false, ping.Experimental) assert.Equal(t, "", ping.APIVersion) withHeader = true ping2, err := client.Ping(context.Background()) assert.Error(t, err) assert.Equal(t, true, ping2.Experimental) assert.Equal(t, "awesome", ping2.APIVersion) } // TestPingWithError tests the case where there is a protocol error in the ping. // This test is mostly just testing that there are no panics in this code path. func TestPingWithError(t *testing.T) { client := &Client{ client: newMockClient(func(req *http.Request) (*http.Response, error) { resp := &http.Response{StatusCode: http.StatusInternalServerError} resp.Header = http.Header{} resp.Header.Set("API-Version", "awesome") resp.Header.Set("Docker-Experimental", "true") resp.Body = ioutil.NopCloser(strings.NewReader("some error with the server")) return resp, errors.New("some error") }), } ping, err := client.Ping(context.Background()) assert.Error(t, err) assert.Equal(t, false, ping.Experimental) assert.Equal(t, "", ping.APIVersion) } // TestPingSuccess tests that we are able to get the expected API headers/ping // details on success. func TestPingSuccess(t *testing.T) { client := &Client{ client: newMockClient(func(req *http.Request) (*http.Response, error) { resp := &http.Response{StatusCode: http.StatusInternalServerError} resp.Header = http.Header{} resp.Header.Set("API-Version", "awesome") resp.Header.Set("Docker-Experimental", "true") resp.Body = ioutil.NopCloser(strings.NewReader("some error with the server")) return resp, nil }), } ping, err := client.Ping(context.Background()) assert.Error(t, err) assert.Equal(t, true, ping.Experimental) assert.Equal(t, "awesome", ping.APIVersion) }