github.com/sijibomii/docker@v0.0.0-20231230191044-5cf6ca554647/api/client/exec_test.go (about)

     1  package client
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"testing"
     7  
     8  	flag "github.com/docker/docker/pkg/mflag"
     9  	"github.com/docker/engine-api/types"
    10  )
    11  
    12  type arguments struct {
    13  	args []string
    14  }
    15  
    16  func TestParseExec(t *testing.T) {
    17  	invalids := map[*arguments]error{
    18  		&arguments{[]string{"-unknown"}}: fmt.Errorf("flag provided but not defined: -unknown"),
    19  		&arguments{[]string{"-u"}}:       fmt.Errorf("flag needs an argument: -u"),
    20  		&arguments{[]string{"--user"}}:   fmt.Errorf("flag needs an argument: --user"),
    21  	}
    22  	valids := map[*arguments]*types.ExecConfig{
    23  		&arguments{
    24  			[]string{"container", "command"},
    25  		}: {
    26  			Container:    "container",
    27  			Cmd:          []string{"command"},
    28  			AttachStdout: true,
    29  			AttachStderr: true,
    30  		},
    31  		&arguments{
    32  			[]string{"container", "command1", "command2"},
    33  		}: {
    34  			Container:    "container",
    35  			Cmd:          []string{"command1", "command2"},
    36  			AttachStdout: true,
    37  			AttachStderr: true,
    38  		},
    39  		&arguments{
    40  			[]string{"-i", "-t", "-u", "uid", "container", "command"},
    41  		}: {
    42  			User:         "uid",
    43  			AttachStdin:  true,
    44  			AttachStdout: true,
    45  			AttachStderr: true,
    46  			Tty:          true,
    47  			Container:    "container",
    48  			Cmd:          []string{"command"},
    49  		},
    50  		&arguments{
    51  			[]string{"-d", "container", "command"},
    52  		}: {
    53  			AttachStdin:  false,
    54  			AttachStdout: false,
    55  			AttachStderr: false,
    56  			Detach:       true,
    57  			Container:    "container",
    58  			Cmd:          []string{"command"},
    59  		},
    60  		&arguments{
    61  			[]string{"-t", "-i", "-d", "container", "command"},
    62  		}: {
    63  			AttachStdin:  false,
    64  			AttachStdout: false,
    65  			AttachStderr: false,
    66  			Detach:       true,
    67  			Tty:          true,
    68  			Container:    "container",
    69  			Cmd:          []string{"command"},
    70  		},
    71  	}
    72  	for invalid, expectedError := range invalids {
    73  		cmd := flag.NewFlagSet("exec", flag.ContinueOnError)
    74  		cmd.ShortUsage = func() {}
    75  		cmd.SetOutput(ioutil.Discard)
    76  		_, err := ParseExec(cmd, invalid.args)
    77  		if err == nil || err.Error() != expectedError.Error() {
    78  			t.Fatalf("Expected an error [%v] for %v, got %v", expectedError, invalid, err)
    79  		}
    80  
    81  	}
    82  	for valid, expectedExecConfig := range valids {
    83  		cmd := flag.NewFlagSet("exec", flag.ContinueOnError)
    84  		cmd.ShortUsage = func() {}
    85  		cmd.SetOutput(ioutil.Discard)
    86  		execConfig, err := ParseExec(cmd, valid.args)
    87  		if err != nil {
    88  			t.Fatal(err)
    89  		}
    90  		if !compareExecConfig(expectedExecConfig, execConfig) {
    91  			t.Fatalf("Expected [%v] for %v, got [%v]", expectedExecConfig, valid, execConfig)
    92  		}
    93  	}
    94  }
    95  
    96  func compareExecConfig(config1 *types.ExecConfig, config2 *types.ExecConfig) bool {
    97  	if config1.AttachStderr != config2.AttachStderr {
    98  		return false
    99  	}
   100  	if config1.AttachStdin != config2.AttachStdin {
   101  		return false
   102  	}
   103  	if config1.AttachStdout != config2.AttachStdout {
   104  		return false
   105  	}
   106  	if config1.Container != config2.Container {
   107  		return false
   108  	}
   109  	if config1.Detach != config2.Detach {
   110  		return false
   111  	}
   112  	if config1.Privileged != config2.Privileged {
   113  		return false
   114  	}
   115  	if config1.Tty != config2.Tty {
   116  		return false
   117  	}
   118  	if config1.User != config2.User {
   119  		return false
   120  	}
   121  	if len(config1.Cmd) != len(config2.Cmd) {
   122  		return false
   123  	}
   124  	for index, value := range config1.Cmd {
   125  		if value != config2.Cmd[index] {
   126  			return false
   127  		}
   128  	}
   129  	return true
   130  }