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