github.com/glycerine/docker@v1.8.2/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  }