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  }