github.com/portworx/docker@v1.12.1/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  			Cmd:          []string{"command"},
    27  			AttachStdout: true,
    28  			AttachStderr: true,
    29  		},
    30  		&arguments{
    31  			[]string{"container", "command1", "command2"},
    32  		}: {
    33  			Cmd:          []string{"command1", "command2"},
    34  			AttachStdout: true,
    35  			AttachStderr: true,
    36  		},
    37  		&arguments{
    38  			[]string{"-i", "-t", "-u", "uid", "container", "command"},
    39  		}: {
    40  			User:         "uid",
    41  			AttachStdin:  true,
    42  			AttachStdout: true,
    43  			AttachStderr: true,
    44  			Tty:          true,
    45  			Cmd:          []string{"command"},
    46  		},
    47  		&arguments{
    48  			[]string{"-d", "container", "command"},
    49  		}: {
    50  			AttachStdin:  false,
    51  			AttachStdout: false,
    52  			AttachStderr: false,
    53  			Detach:       true,
    54  			Cmd:          []string{"command"},
    55  		},
    56  		&arguments{
    57  			[]string{"-t", "-i", "-d", "container", "command"},
    58  		}: {
    59  			AttachStdin:  false,
    60  			AttachStdout: false,
    61  			AttachStderr: false,
    62  			Detach:       true,
    63  			Tty:          true,
    64  			Cmd:          []string{"command"},
    65  		},
    66  	}
    67  	for invalid, expectedError := range invalids {
    68  		cmd := flag.NewFlagSet("exec", flag.ContinueOnError)
    69  		cmd.ShortUsage = func() {}
    70  		cmd.SetOutput(ioutil.Discard)
    71  		_, err := ParseExec(cmd, invalid.args)
    72  		if err == nil || err.Error() != expectedError.Error() {
    73  			t.Fatalf("Expected an error [%v] for %v, got %v", expectedError, invalid, err)
    74  		}
    75  
    76  	}
    77  	for valid, expectedExecConfig := range valids {
    78  		cmd := flag.NewFlagSet("exec", flag.ContinueOnError)
    79  		cmd.ShortUsage = func() {}
    80  		cmd.SetOutput(ioutil.Discard)
    81  		execConfig, err := ParseExec(cmd, valid.args)
    82  		if err != nil {
    83  			t.Fatal(err)
    84  		}
    85  		if !compareExecConfig(expectedExecConfig, execConfig) {
    86  			t.Fatalf("Expected [%v] for %v, got [%v]", expectedExecConfig, valid, execConfig)
    87  		}
    88  	}
    89  }
    90  
    91  func compareExecConfig(config1 *types.ExecConfig, config2 *types.ExecConfig) bool {
    92  	if config1.AttachStderr != config2.AttachStderr {
    93  		return false
    94  	}
    95  	if config1.AttachStdin != config2.AttachStdin {
    96  		return false
    97  	}
    98  	if config1.AttachStdout != config2.AttachStdout {
    99  		return false
   100  	}
   101  	if config1.Detach != config2.Detach {
   102  		return false
   103  	}
   104  	if config1.Privileged != config2.Privileged {
   105  		return false
   106  	}
   107  	if config1.Tty != config2.Tty {
   108  		return false
   109  	}
   110  	if config1.User != config2.User {
   111  		return false
   112  	}
   113  	if len(config1.Cmd) != len(config2.Cmd) {
   114  		return false
   115  	}
   116  	for index, value := range config1.Cmd {
   117  		if value != config2.Cmd[index] {
   118  			return false
   119  		}
   120  	}
   121  	return true
   122  }