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  }