github.com/shishir-a412ed/docker@v1.3.2-0.20180103180333-fda904911d87/client/container_create_test.go (about) 1 package client 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "io/ioutil" 8 "net/http" 9 "strings" 10 "testing" 11 12 "github.com/docker/docker/api/types/container" 13 "golang.org/x/net/context" 14 ) 15 16 func TestContainerCreateError(t *testing.T) { 17 client := &Client{ 18 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 19 } 20 _, err := client.ContainerCreate(context.Background(), nil, nil, nil, "nothing") 21 if err == nil || err.Error() != "Error response from daemon: Server error" { 22 t.Fatalf("expected a Server Error while testing StatusInternalServerError, got %v", err) 23 } 24 25 // 404 doesn't automatically means an unknown image 26 client = &Client{ 27 client: newMockClient(errorMock(http.StatusNotFound, "Server error")), 28 } 29 _, err = client.ContainerCreate(context.Background(), nil, nil, nil, "nothing") 30 if err == nil || err.Error() != "Error response from daemon: Server error" { 31 t.Fatalf("expected a Server Error while testing StatusNotFound, got %v", err) 32 } 33 } 34 35 func TestContainerCreateImageNotFound(t *testing.T) { 36 client := &Client{ 37 client: newMockClient(errorMock(http.StatusNotFound, "No such image")), 38 } 39 _, err := client.ContainerCreate(context.Background(), &container.Config{Image: "unknown_image"}, nil, nil, "unknown") 40 if err == nil || !IsErrNotFound(err) { 41 t.Fatalf("expected an imageNotFound error, got %v", err) 42 } 43 } 44 45 func TestContainerCreateWithName(t *testing.T) { 46 expectedURL := "/containers/create" 47 client := &Client{ 48 client: newMockClient(func(req *http.Request) (*http.Response, error) { 49 if !strings.HasPrefix(req.URL.Path, expectedURL) { 50 return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) 51 } 52 name := req.URL.Query().Get("name") 53 if name != "container_name" { 54 return nil, fmt.Errorf("container name not set in URL query properly. Expected `container_name`, got %s", name) 55 } 56 b, err := json.Marshal(container.ContainerCreateCreatedBody{ 57 ID: "container_id", 58 }) 59 if err != nil { 60 return nil, err 61 } 62 return &http.Response{ 63 StatusCode: http.StatusOK, 64 Body: ioutil.NopCloser(bytes.NewReader(b)), 65 }, nil 66 }), 67 } 68 69 r, err := client.ContainerCreate(context.Background(), nil, nil, nil, "container_name") 70 if err != nil { 71 t.Fatal(err) 72 } 73 if r.ID != "container_id" { 74 t.Fatalf("expected `container_id`, got %s", r.ID) 75 } 76 } 77 78 // TestContainerCreateAutoRemove validates that a client using API 1.24 always disables AutoRemove. When using API 1.25 79 // or up, AutoRemove should not be disabled. 80 func TestContainerCreateAutoRemove(t *testing.T) { 81 autoRemoveValidator := func(expectedValue bool) func(req *http.Request) (*http.Response, error) { 82 return func(req *http.Request) (*http.Response, error) { 83 var config configWrapper 84 85 if err := json.NewDecoder(req.Body).Decode(&config); err != nil { 86 return nil, err 87 } 88 if config.HostConfig.AutoRemove != expectedValue { 89 return nil, fmt.Errorf("expected AutoRemove to be %v, got %v", expectedValue, config.HostConfig.AutoRemove) 90 } 91 b, err := json.Marshal(container.ContainerCreateCreatedBody{ 92 ID: "container_id", 93 }) 94 if err != nil { 95 return nil, err 96 } 97 return &http.Response{ 98 StatusCode: http.StatusOK, 99 Body: ioutil.NopCloser(bytes.NewReader(b)), 100 }, nil 101 } 102 } 103 104 client := &Client{ 105 client: newMockClient(autoRemoveValidator(false)), 106 version: "1.24", 107 } 108 if _, err := client.ContainerCreate(context.Background(), nil, &container.HostConfig{AutoRemove: true}, nil, ""); err != nil { 109 t.Fatal(err) 110 } 111 client = &Client{ 112 client: newMockClient(autoRemoveValidator(true)), 113 version: "1.25", 114 } 115 if _, err := client.ContainerCreate(context.Background(), nil, &container.HostConfig{AutoRemove: true}, nil, ""); err != nil { 116 t.Fatal(err) 117 } 118 }