github.com/xladykiller/docker@v1.9.1-rc1/runconfig/hostconfig_test.go (about)

     1  // +build !windows
     2  
     3  package runconfig
     4  
     5  import (
     6  	"bytes"
     7  	"fmt"
     8  	"io/ioutil"
     9  	"testing"
    10  )
    11  
    12  // TODO Windows: This will need addressing for a Windows daemon.
    13  func TestNetworkModeTest(t *testing.T) {
    14  	networkModes := map[NetworkMode][]bool{
    15  		// private, bridge, host, container, none, default
    16  		"":                         {true, false, false, false, false, false},
    17  		"something:weird":          {true, false, false, false, false, false},
    18  		"bridge":                   {true, true, false, false, false, false},
    19  		DefaultDaemonNetworkMode(): {true, true, false, false, false, false},
    20  		"host":           {false, false, true, false, false, false},
    21  		"container:name": {false, false, false, true, false, false},
    22  		"none":           {true, false, false, false, true, false},
    23  		"default":        {true, false, false, false, false, true},
    24  	}
    25  	networkModeNames := map[NetworkMode]string{
    26  		"":                         "",
    27  		"something:weird":          "something:weird",
    28  		"bridge":                   "bridge",
    29  		DefaultDaemonNetworkMode(): "bridge",
    30  		"host":           "host",
    31  		"container:name": "container",
    32  		"none":           "none",
    33  		"default":        "default",
    34  	}
    35  	for networkMode, state := range networkModes {
    36  		if networkMode.IsPrivate() != state[0] {
    37  			t.Fatalf("NetworkMode.IsPrivate for %v should have been %v but was %v", networkMode, state[0], networkMode.IsPrivate())
    38  		}
    39  		if networkMode.IsBridge() != state[1] {
    40  			t.Fatalf("NetworkMode.IsBridge for %v should have been %v but was %v", networkMode, state[1], networkMode.IsBridge())
    41  		}
    42  		if networkMode.IsHost() != state[2] {
    43  			t.Fatalf("NetworkMode.IsHost for %v should have been %v but was %v", networkMode, state[2], networkMode.IsHost())
    44  		}
    45  		if networkMode.IsContainer() != state[3] {
    46  			t.Fatalf("NetworkMode.IsContainer for %v should have been %v but was %v", networkMode, state[3], networkMode.IsContainer())
    47  		}
    48  		if networkMode.IsNone() != state[4] {
    49  			t.Fatalf("NetworkMode.IsNone for %v should have been %v but was %v", networkMode, state[4], networkMode.IsNone())
    50  		}
    51  		if networkMode.IsDefault() != state[5] {
    52  			t.Fatalf("NetworkMode.IsDefault for %v should have been %v but was %v", networkMode, state[5], networkMode.IsDefault())
    53  		}
    54  		if networkMode.NetworkName() != networkModeNames[networkMode] {
    55  			t.Fatalf("Expected name %v, got %v", networkModeNames[networkMode], networkMode.NetworkName())
    56  		}
    57  	}
    58  }
    59  
    60  func TestIpcModeTest(t *testing.T) {
    61  	ipcModes := map[IpcMode][]bool{
    62  		// private, host, container, valid
    63  		"":                         {true, false, false, true},
    64  		"something:weird":          {true, false, false, false},
    65  		":weird":                   {true, false, false, true},
    66  		"host":                     {false, true, false, true},
    67  		"container:name":           {false, false, true, true},
    68  		"container:name:something": {false, false, true, false},
    69  		"container:":               {false, false, true, false},
    70  	}
    71  	for ipcMode, state := range ipcModes {
    72  		if ipcMode.IsPrivate() != state[0] {
    73  			t.Fatalf("IpcMode.IsPrivate for %v should have been %v but was %v", ipcMode, state[0], ipcMode.IsPrivate())
    74  		}
    75  		if ipcMode.IsHost() != state[1] {
    76  			t.Fatalf("IpcMode.IsHost for %v should have been %v but was %v", ipcMode, state[1], ipcMode.IsHost())
    77  		}
    78  		if ipcMode.IsContainer() != state[2] {
    79  			t.Fatalf("IpcMode.IsContainer for %v should have been %v but was %v", ipcMode, state[2], ipcMode.IsContainer())
    80  		}
    81  		if ipcMode.Valid() != state[3] {
    82  			t.Fatalf("IpcMode.Valid for %v should have been %v but was %v", ipcMode, state[3], ipcMode.Valid())
    83  		}
    84  	}
    85  	containerIpcModes := map[IpcMode]string{
    86  		"":                      "",
    87  		"something":             "",
    88  		"something:weird":       "weird",
    89  		"container":             "",
    90  		"container:":            "",
    91  		"container:name":        "name",
    92  		"container:name1:name2": "name1:name2",
    93  	}
    94  	for ipcMode, container := range containerIpcModes {
    95  		if ipcMode.Container() != container {
    96  			t.Fatalf("Expected %v for %v but was %v", container, ipcMode, ipcMode.Container())
    97  		}
    98  	}
    99  }
   100  
   101  func TestUTSModeTest(t *testing.T) {
   102  	utsModes := map[UTSMode][]bool{
   103  		// private, host, valid
   104  		"":                {true, false, true},
   105  		"something:weird": {true, false, false},
   106  		"host":            {false, true, true},
   107  		"host:name":       {true, false, true},
   108  	}
   109  	for utsMode, state := range utsModes {
   110  		if utsMode.IsPrivate() != state[0] {
   111  			t.Fatalf("UtsMode.IsPrivate for %v should have been %v but was %v", utsMode, state[0], utsMode.IsPrivate())
   112  		}
   113  		if utsMode.IsHost() != state[1] {
   114  			t.Fatalf("UtsMode.IsHost for %v should have been %v but was %v", utsMode, state[1], utsMode.IsHost())
   115  		}
   116  		if utsMode.Valid() != state[2] {
   117  			t.Fatalf("UtsMode.Valid for %v should have been %v but was %v", utsMode, state[2], utsMode.Valid())
   118  		}
   119  	}
   120  }
   121  
   122  func TestPidModeTest(t *testing.T) {
   123  	pidModes := map[PidMode][]bool{
   124  		// private, host, valid
   125  		"":                {true, false, true},
   126  		"something:weird": {true, false, false},
   127  		"host":            {false, true, true},
   128  		"host:name":       {true, false, true},
   129  	}
   130  	for pidMode, state := range pidModes {
   131  		if pidMode.IsPrivate() != state[0] {
   132  			t.Fatalf("PidMode.IsPrivate for %v should have been %v but was %v", pidMode, state[0], pidMode.IsPrivate())
   133  		}
   134  		if pidMode.IsHost() != state[1] {
   135  			t.Fatalf("PidMode.IsHost for %v should have been %v but was %v", pidMode, state[1], pidMode.IsHost())
   136  		}
   137  		if pidMode.Valid() != state[2] {
   138  			t.Fatalf("PidMode.Valid for %v should have been %v but was %v", pidMode, state[2], pidMode.Valid())
   139  		}
   140  	}
   141  }
   142  
   143  func TestRestartPolicy(t *testing.T) {
   144  	restartPolicies := map[RestartPolicy][]bool{
   145  		// none, always, failure
   146  		RestartPolicy{}:                {false, false, false},
   147  		RestartPolicy{"something", 0}:  {false, false, false},
   148  		RestartPolicy{"no", 0}:         {true, false, false},
   149  		RestartPolicy{"always", 0}:     {false, true, false},
   150  		RestartPolicy{"on-failure", 0}: {false, false, true},
   151  	}
   152  	for restartPolicy, state := range restartPolicies {
   153  		if restartPolicy.IsNone() != state[0] {
   154  			t.Fatalf("RestartPolicy.IsNone for %v should have been %v but was %v", restartPolicy, state[0], restartPolicy.IsNone())
   155  		}
   156  		if restartPolicy.IsAlways() != state[1] {
   157  			t.Fatalf("RestartPolicy.IsAlways for %v should have been %v but was %v", restartPolicy, state[1], restartPolicy.IsAlways())
   158  		}
   159  		if restartPolicy.IsOnFailure() != state[2] {
   160  			t.Fatalf("RestartPolicy.IsOnFailure for %v should have been %v but was %v", restartPolicy, state[2], restartPolicy.IsOnFailure())
   161  		}
   162  	}
   163  }
   164  
   165  func TestLxcConfigMarshalJSON(t *testing.T) {
   166  	lxcConfigs := map[*LxcConfig]string{
   167  		nil:          "",
   168  		&LxcConfig{}: "null",
   169  		&LxcConfig{
   170  			[]KeyValuePair{{"key1", "value1"}},
   171  		}: `[{"Key":"key1","Value":"value1"}]`,
   172  	}
   173  
   174  	for lxcconfig, expected := range lxcConfigs {
   175  		data, err := lxcconfig.MarshalJSON()
   176  		if err != nil {
   177  			t.Fatal(err)
   178  		}
   179  		if string(data) != expected {
   180  			t.Fatalf("Expected %v, got %v", expected, string(data))
   181  		}
   182  	}
   183  }
   184  
   185  func TestLxcConfigUnmarshalJSON(t *testing.T) {
   186  	keyvaluePairs := map[string][]KeyValuePair{
   187  		"":   {{"key1", "value1"}},
   188  		"[]": {},
   189  		`[{"Key":"key2","Value":"value2"}]`: {{"key2", "value2"}},
   190  	}
   191  	for json, expectedParts := range keyvaluePairs {
   192  		lxcConfig := &LxcConfig{
   193  			[]KeyValuePair{{"key1", "value1"}},
   194  		}
   195  		if err := lxcConfig.UnmarshalJSON([]byte(json)); err != nil {
   196  			t.Fatal(err)
   197  		}
   198  
   199  		actualParts := lxcConfig.Slice()
   200  		if len(actualParts) != len(expectedParts) {
   201  			t.Fatalf("Expected %v keyvaluePairs, got %v (%v)", len(expectedParts), len(actualParts), expectedParts)
   202  		}
   203  		for index, part := range actualParts {
   204  			if part != expectedParts[index] {
   205  				t.Fatalf("Expected %v, got %v", expectedParts, actualParts)
   206  				break
   207  			}
   208  		}
   209  	}
   210  }
   211  
   212  func TestMergeConfigs(t *testing.T) {
   213  	expectedHostname := "hostname"
   214  	expectedContainerIDFile := "containerIdFile"
   215  	config := &Config{
   216  		Hostname: expectedHostname,
   217  	}
   218  	hostConfig := &HostConfig{
   219  		ContainerIDFile: expectedContainerIDFile,
   220  	}
   221  	containerConfigWrapper := MergeConfigs(config, hostConfig)
   222  	if containerConfigWrapper.Config.Hostname != expectedHostname {
   223  		t.Fatalf("containerConfigWrapper config hostname expected %v got %v", expectedHostname, containerConfigWrapper.Config.Hostname)
   224  	}
   225  	if containerConfigWrapper.InnerHostConfig.ContainerIDFile != expectedContainerIDFile {
   226  		t.Fatalf("containerConfigWrapper hostconfig containerIdfile expected %v got %v", expectedContainerIDFile, containerConfigWrapper.InnerHostConfig.ContainerIDFile)
   227  	}
   228  	if containerConfigWrapper.Cpuset != "" {
   229  		t.Fatalf("Expected empty Cpuset, got %v", containerConfigWrapper.Cpuset)
   230  	}
   231  }
   232  
   233  func TestDecodeHostConfig(t *testing.T) {
   234  	fixtures := []struct {
   235  		file string
   236  	}{
   237  		{"fixtures/container_hostconfig_1_14.json"},
   238  		{"fixtures/container_hostconfig_1_19.json"},
   239  	}
   240  
   241  	for _, f := range fixtures {
   242  		b, err := ioutil.ReadFile(f.file)
   243  		if err != nil {
   244  			t.Fatal(err)
   245  		}
   246  
   247  		c, err := DecodeHostConfig(bytes.NewReader(b))
   248  		if err != nil {
   249  			t.Fatal(fmt.Errorf("Error parsing %s: %v", f, err))
   250  		}
   251  
   252  		if c.Privileged != false {
   253  			t.Fatalf("Expected privileged false, found %v\n", c.Privileged)
   254  		}
   255  
   256  		if l := len(c.Binds); l != 1 {
   257  			t.Fatalf("Expected 1 bind, found %d\n", l)
   258  		}
   259  
   260  		if c.CapAdd.Len() != 1 && c.CapAdd.Slice()[0] != "NET_ADMIN" {
   261  			t.Fatalf("Expected CapAdd NET_ADMIN, got %v", c.CapAdd)
   262  		}
   263  
   264  		if c.CapDrop.Len() != 1 && c.CapDrop.Slice()[0] != "NET_ADMIN" {
   265  			t.Fatalf("Expected CapDrop MKNOD, got %v", c.CapDrop)
   266  		}
   267  	}
   268  }