github.com/portworx/docker@v1.12.1/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  	"github.com/docker/engine-api/types/container"
    12  )
    13  
    14  // TODO Windows: This will need addressing for a Windows daemon.
    15  func TestNetworkModeTest(t *testing.T) {
    16  	networkModes := map[container.NetworkMode][]bool{
    17  		// private, bridge, host, container, none, default
    18  		"":                         {true, false, false, false, false, false},
    19  		"something:weird":          {true, false, false, false, false, false},
    20  		"bridge":                   {true, true, false, false, false, false},
    21  		DefaultDaemonNetworkMode(): {true, true, false, false, false, false},
    22  		"host":           {false, false, true, false, false, false},
    23  		"container:name": {false, false, false, true, false, false},
    24  		"none":           {true, false, false, false, true, false},
    25  		"default":        {true, false, false, false, false, true},
    26  	}
    27  	networkModeNames := map[container.NetworkMode]string{
    28  		"":                         "",
    29  		"something:weird":          "something:weird",
    30  		"bridge":                   "bridge",
    31  		DefaultDaemonNetworkMode(): "bridge",
    32  		"host":           "host",
    33  		"container:name": "container",
    34  		"none":           "none",
    35  		"default":        "default",
    36  	}
    37  	for networkMode, state := range networkModes {
    38  		if networkMode.IsPrivate() != state[0] {
    39  			t.Fatalf("NetworkMode.IsPrivate for %v should have been %v but was %v", networkMode, state[0], networkMode.IsPrivate())
    40  		}
    41  		if networkMode.IsBridge() != state[1] {
    42  			t.Fatalf("NetworkMode.IsBridge for %v should have been %v but was %v", networkMode, state[1], networkMode.IsBridge())
    43  		}
    44  		if networkMode.IsHost() != state[2] {
    45  			t.Fatalf("NetworkMode.IsHost for %v should have been %v but was %v", networkMode, state[2], networkMode.IsHost())
    46  		}
    47  		if networkMode.IsContainer() != state[3] {
    48  			t.Fatalf("NetworkMode.IsContainer for %v should have been %v but was %v", networkMode, state[3], networkMode.IsContainer())
    49  		}
    50  		if networkMode.IsNone() != state[4] {
    51  			t.Fatalf("NetworkMode.IsNone for %v should have been %v but was %v", networkMode, state[4], networkMode.IsNone())
    52  		}
    53  		if networkMode.IsDefault() != state[5] {
    54  			t.Fatalf("NetworkMode.IsDefault for %v should have been %v but was %v", networkMode, state[5], networkMode.IsDefault())
    55  		}
    56  		if networkMode.NetworkName() != networkModeNames[networkMode] {
    57  			t.Fatalf("Expected name %v, got %v", networkModeNames[networkMode], networkMode.NetworkName())
    58  		}
    59  	}
    60  }
    61  
    62  func TestIpcModeTest(t *testing.T) {
    63  	ipcModes := map[container.IpcMode][]bool{
    64  		// private, host, container, valid
    65  		"":                         {true, false, false, true},
    66  		"something:weird":          {true, false, false, false},
    67  		":weird":                   {true, false, false, true},
    68  		"host":                     {false, true, false, true},
    69  		"container:name":           {false, false, true, true},
    70  		"container:name:something": {false, false, true, false},
    71  		"container:":               {false, false, true, false},
    72  	}
    73  	for ipcMode, state := range ipcModes {
    74  		if ipcMode.IsPrivate() != state[0] {
    75  			t.Fatalf("IpcMode.IsPrivate for %v should have been %v but was %v", ipcMode, state[0], ipcMode.IsPrivate())
    76  		}
    77  		if ipcMode.IsHost() != state[1] {
    78  			t.Fatalf("IpcMode.IsHost for %v should have been %v but was %v", ipcMode, state[1], ipcMode.IsHost())
    79  		}
    80  		if ipcMode.IsContainer() != state[2] {
    81  			t.Fatalf("IpcMode.IsContainer for %v should have been %v but was %v", ipcMode, state[2], ipcMode.IsContainer())
    82  		}
    83  		if ipcMode.Valid() != state[3] {
    84  			t.Fatalf("IpcMode.Valid for %v should have been %v but was %v", ipcMode, state[3], ipcMode.Valid())
    85  		}
    86  	}
    87  	containerIpcModes := map[container.IpcMode]string{
    88  		"":                      "",
    89  		"something":             "",
    90  		"something:weird":       "weird",
    91  		"container":             "",
    92  		"container:":            "",
    93  		"container:name":        "name",
    94  		"container:name1:name2": "name1:name2",
    95  	}
    96  	for ipcMode, container := range containerIpcModes {
    97  		if ipcMode.Container() != container {
    98  			t.Fatalf("Expected %v for %v but was %v", container, ipcMode, ipcMode.Container())
    99  		}
   100  	}
   101  }
   102  
   103  func TestUTSModeTest(t *testing.T) {
   104  	utsModes := map[container.UTSMode][]bool{
   105  		// private, host, valid
   106  		"":                {true, false, true},
   107  		"something:weird": {true, false, false},
   108  		"host":            {false, true, true},
   109  		"host:name":       {true, false, true},
   110  	}
   111  	for utsMode, state := range utsModes {
   112  		if utsMode.IsPrivate() != state[0] {
   113  			t.Fatalf("UtsMode.IsPrivate for %v should have been %v but was %v", utsMode, state[0], utsMode.IsPrivate())
   114  		}
   115  		if utsMode.IsHost() != state[1] {
   116  			t.Fatalf("UtsMode.IsHost for %v should have been %v but was %v", utsMode, state[1], utsMode.IsHost())
   117  		}
   118  		if utsMode.Valid() != state[2] {
   119  			t.Fatalf("UtsMode.Valid for %v should have been %v but was %v", utsMode, state[2], utsMode.Valid())
   120  		}
   121  	}
   122  }
   123  
   124  func TestUsernsModeTest(t *testing.T) {
   125  	usrensMode := map[container.UsernsMode][]bool{
   126  		// private, host, valid
   127  		"":                {true, false, true},
   128  		"something:weird": {true, false, false},
   129  		"host":            {false, true, true},
   130  		"host:name":       {true, false, true},
   131  	}
   132  	for usernsMode, state := range usrensMode {
   133  		if usernsMode.IsPrivate() != state[0] {
   134  			t.Fatalf("UsernsMode.IsPrivate for %v should have been %v but was %v", usernsMode, state[0], usernsMode.IsPrivate())
   135  		}
   136  		if usernsMode.IsHost() != state[1] {
   137  			t.Fatalf("UsernsMode.IsHost for %v should have been %v but was %v", usernsMode, state[1], usernsMode.IsHost())
   138  		}
   139  		if usernsMode.Valid() != state[2] {
   140  			t.Fatalf("UsernsMode.Valid for %v should have been %v but was %v", usernsMode, state[2], usernsMode.Valid())
   141  		}
   142  	}
   143  }
   144  
   145  func TestPidModeTest(t *testing.T) {
   146  	pidModes := map[container.PidMode][]bool{
   147  		// private, host, valid
   148  		"":                {true, false, true},
   149  		"something:weird": {true, false, false},
   150  		"host":            {false, true, true},
   151  		"host:name":       {true, false, true},
   152  	}
   153  	for pidMode, state := range pidModes {
   154  		if pidMode.IsPrivate() != state[0] {
   155  			t.Fatalf("PidMode.IsPrivate for %v should have been %v but was %v", pidMode, state[0], pidMode.IsPrivate())
   156  		}
   157  		if pidMode.IsHost() != state[1] {
   158  			t.Fatalf("PidMode.IsHost for %v should have been %v but was %v", pidMode, state[1], pidMode.IsHost())
   159  		}
   160  		if pidMode.Valid() != state[2] {
   161  			t.Fatalf("PidMode.Valid for %v should have been %v but was %v", pidMode, state[2], pidMode.Valid())
   162  		}
   163  	}
   164  }
   165  
   166  func TestRestartPolicy(t *testing.T) {
   167  	restartPolicies := map[container.RestartPolicy][]bool{
   168  		// none, always, failure
   169  		container.RestartPolicy{}:                {true, false, false},
   170  		container.RestartPolicy{"something", 0}:  {false, false, false},
   171  		container.RestartPolicy{"no", 0}:         {true, false, false},
   172  		container.RestartPolicy{"always", 0}:     {false, true, false},
   173  		container.RestartPolicy{"on-failure", 0}: {false, false, true},
   174  	}
   175  	for restartPolicy, state := range restartPolicies {
   176  		if restartPolicy.IsNone() != state[0] {
   177  			t.Fatalf("RestartPolicy.IsNone for %v should have been %v but was %v", restartPolicy, state[0], restartPolicy.IsNone())
   178  		}
   179  		if restartPolicy.IsAlways() != state[1] {
   180  			t.Fatalf("RestartPolicy.IsAlways for %v should have been %v but was %v", restartPolicy, state[1], restartPolicy.IsAlways())
   181  		}
   182  		if restartPolicy.IsOnFailure() != state[2] {
   183  			t.Fatalf("RestartPolicy.IsOnFailure for %v should have been %v but was %v", restartPolicy, state[2], restartPolicy.IsOnFailure())
   184  		}
   185  	}
   186  }
   187  func TestDecodeHostConfig(t *testing.T) {
   188  	fixtures := []struct {
   189  		file string
   190  	}{
   191  		{"fixtures/unix/container_hostconfig_1_14.json"},
   192  		{"fixtures/unix/container_hostconfig_1_19.json"},
   193  	}
   194  
   195  	for _, f := range fixtures {
   196  		b, err := ioutil.ReadFile(f.file)
   197  		if err != nil {
   198  			t.Fatal(err)
   199  		}
   200  
   201  		c, err := DecodeHostConfig(bytes.NewReader(b))
   202  		if err != nil {
   203  			t.Fatal(fmt.Errorf("Error parsing %s: %v", f, err))
   204  		}
   205  
   206  		if c.Privileged != false {
   207  			t.Fatalf("Expected privileged false, found %v\n", c.Privileged)
   208  		}
   209  
   210  		if l := len(c.Binds); l != 1 {
   211  			t.Fatalf("Expected 1 bind, found %d\n", l)
   212  		}
   213  
   214  		if len(c.CapAdd) != 1 && c.CapAdd[0] != "NET_ADMIN" {
   215  			t.Fatalf("Expected CapAdd NET_ADMIN, got %v", c.CapAdd)
   216  		}
   217  
   218  		if len(c.CapDrop) != 1 && c.CapDrop[0] != "NET_ADMIN" {
   219  			t.Fatalf("Expected CapDrop MKNOD, got %v", c.CapDrop)
   220  		}
   221  	}
   222  }