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