github.com/zhouyu0/docker-note@v0.0.0-20190722021225-b8d3825084db/client/container_exec_test.go (about) 1 package client // import "github.com/docker/docker/client" 2 3 import ( 4 "bytes" 5 "context" 6 "encoding/json" 7 "fmt" 8 "io/ioutil" 9 "net/http" 10 "strings" 11 "testing" 12 13 "github.com/docker/docker/api/types" 14 ) 15 16 func TestContainerExecCreateError(t *testing.T) { 17 client := &Client{ 18 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 19 } 20 _, err := client.ContainerExecCreate(context.Background(), "container_id", types.ExecConfig{}) 21 if err == nil || err.Error() != "Error response from daemon: Server error" { 22 t.Fatalf("expected a Server Error, got %v", err) 23 } 24 } 25 26 func TestContainerExecCreate(t *testing.T) { 27 expectedURL := "/containers/container_id/exec" 28 client := &Client{ 29 client: newMockClient(func(req *http.Request) (*http.Response, error) { 30 if !strings.HasPrefix(req.URL.Path, expectedURL) { 31 return nil, fmt.Errorf("expected URL '%s', got '%s'", expectedURL, req.URL) 32 } 33 if req.Method != "POST" { 34 return nil, fmt.Errorf("expected POST method, got %s", req.Method) 35 } 36 // FIXME validate the content is the given ExecConfig ? 37 if err := req.ParseForm(); err != nil { 38 return nil, err 39 } 40 execConfig := &types.ExecConfig{} 41 if err := json.NewDecoder(req.Body).Decode(execConfig); err != nil { 42 return nil, err 43 } 44 if execConfig.User != "user" { 45 return nil, fmt.Errorf("expected an execConfig with User == 'user', got %v", execConfig) 46 } 47 b, err := json.Marshal(types.IDResponse{ 48 ID: "exec_id", 49 }) 50 if err != nil { 51 return nil, err 52 } 53 return &http.Response{ 54 StatusCode: http.StatusOK, 55 Body: ioutil.NopCloser(bytes.NewReader(b)), 56 }, nil 57 }), 58 } 59 60 r, err := client.ContainerExecCreate(context.Background(), "container_id", types.ExecConfig{ 61 User: "user", 62 }) 63 if err != nil { 64 t.Fatal(err) 65 } 66 if r.ID != "exec_id" { 67 t.Fatalf("expected `exec_id`, got %s", r.ID) 68 } 69 } 70 71 func TestContainerExecStartError(t *testing.T) { 72 client := &Client{ 73 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 74 } 75 err := client.ContainerExecStart(context.Background(), "nothing", types.ExecStartCheck{}) 76 if err == nil || err.Error() != "Error response from daemon: Server error" { 77 t.Fatalf("expected a Server Error, got %v", err) 78 } 79 } 80 81 func TestContainerExecStart(t *testing.T) { 82 expectedURL := "/exec/exec_id/start" 83 client := &Client{ 84 client: newMockClient(func(req *http.Request) (*http.Response, error) { 85 if !strings.HasPrefix(req.URL.Path, expectedURL) { 86 return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) 87 } 88 if err := req.ParseForm(); err != nil { 89 return nil, err 90 } 91 execStartCheck := &types.ExecStartCheck{} 92 if err := json.NewDecoder(req.Body).Decode(execStartCheck); err != nil { 93 return nil, err 94 } 95 if execStartCheck.Tty || !execStartCheck.Detach { 96 return nil, fmt.Errorf("expected execStartCheck{Detach:true,Tty:false}, got %v", execStartCheck) 97 } 98 99 return &http.Response{ 100 StatusCode: http.StatusOK, 101 Body: ioutil.NopCloser(bytes.NewReader([]byte(""))), 102 }, nil 103 }), 104 } 105 106 err := client.ContainerExecStart(context.Background(), "exec_id", types.ExecStartCheck{ 107 Detach: true, 108 Tty: false, 109 }) 110 if err != nil { 111 t.Fatal(err) 112 } 113 } 114 115 func TestContainerExecInspectError(t *testing.T) { 116 client := &Client{ 117 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 118 } 119 _, err := client.ContainerExecInspect(context.Background(), "nothing") 120 if err == nil || err.Error() != "Error response from daemon: Server error" { 121 t.Fatalf("expected a Server Error, got %v", err) 122 } 123 } 124 125 func TestContainerExecInspect(t *testing.T) { 126 expectedURL := "/exec/exec_id/json" 127 client := &Client{ 128 client: newMockClient(func(req *http.Request) (*http.Response, error) { 129 if !strings.HasPrefix(req.URL.Path, expectedURL) { 130 return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) 131 } 132 b, err := json.Marshal(types.ContainerExecInspect{ 133 ExecID: "exec_id", 134 ContainerID: "container_id", 135 }) 136 if err != nil { 137 return nil, err 138 } 139 return &http.Response{ 140 StatusCode: http.StatusOK, 141 Body: ioutil.NopCloser(bytes.NewReader(b)), 142 }, nil 143 }), 144 } 145 146 inspect, err := client.ContainerExecInspect(context.Background(), "exec_id") 147 if err != nil { 148 t.Fatal(err) 149 } 150 if inspect.ExecID != "exec_id" { 151 t.Fatalf("expected ExecID to be `exec_id`, got %s", inspect.ExecID) 152 } 153 if inspect.ContainerID != "container_id" { 154 t.Fatalf("expected ContainerID `container_id`, got %s", inspect.ContainerID) 155 } 156 }