From 2b0a742237d223f21717d722b4622458af870526 Mon Sep 17 00:00:00 2001 From: John Howard Date: Sat, 23 Jan 2016 11:04:57 -0800 Subject: [PATCH] Windows CI: Fix api_containers_test.go Signed-off-by: John Howard --- integration-cli/docker_api_containers_test.go | 137 ++++++++++++------ 1 file changed, 90 insertions(+), 47 deletions(-) diff --git a/integration-cli/docker_api_containers_test.go b/integration-cli/docker_api_containers_test.go index ca5de07540..e45c7b5251 100644 --- a/integration-cli/docker_api_containers_test.go +++ b/integration-cli/docker_api_containers_test.go @@ -23,8 +23,15 @@ import ( "github.com/go-check/check" ) +var sleepCmd = "/bin/sleep" + +func init() { + if daemonPlatform == "windows" { + sleepCmd = "sleep" + } +} + func (s *DockerSuite) TestContainerApiGetAll(c *check.C) { - testRequires(c, DaemonIsLinux) startCount, err := getContainerCount() c.Assert(err, checker.IsNil, check.Commentf("Cannot query container count")) @@ -49,7 +56,6 @@ func (s *DockerSuite) TestContainerApiGetAll(c *check.C) { // regression test for empty json field being omitted #13691 func (s *DockerSuite) TestContainerApiGetJSONNoFieldsOmitted(c *check.C) { - testRequires(c, DaemonIsLinux) dockerCmd(c, "run", "busybox", "true") status, body, err := sockRequest("GET", "/containers/json?all=1", nil) @@ -86,11 +92,12 @@ type containerPs struct { } // regression test for non-empty fields from #13901 -func (s *DockerSuite) TestContainerPsOmitFields(c *check.C) { +func (s *DockerSuite) TestContainerApiPsOmitFields(c *check.C) { + // Problematic for Windows porting due to networking not yet being passed back testRequires(c, DaemonIsLinux) name := "pstest" port := 80 - dockerCmd(c, "run", "-d", "--name", name, "--expose", strconv.Itoa(port), "busybox", "top") + dockerCmd(c, "run", "-d", "--name", name, "--expose", strconv.Itoa(port), "busybox", sleepCmd, "60") status, body, err := sockRequest("GET", "/containers/json?all=1", nil) c.Assert(err, checker.IsNil) @@ -119,6 +126,7 @@ func (s *DockerSuite) TestContainerPsOmitFields(c *check.C) { } func (s *DockerSuite) TestContainerApiGetExport(c *check.C) { + // TODO: Investigate why this fails on Windows to Windows CI testRequires(c, DaemonIsLinux) name := "exportcontainer" dockerCmd(c, "run", "--name", name, "busybox", "touch", "/test") @@ -142,6 +150,7 @@ func (s *DockerSuite) TestContainerApiGetExport(c *check.C) { } func (s *DockerSuite) TestContainerApiGetChanges(c *check.C) { + // Not supported on Windows as Windows does not support docker diff (/containers/name/changes) testRequires(c, DaemonIsLinux) name := "changescontainer" dockerCmd(c, "run", "--name", name, "busybox", "rm", "/etc/passwd") @@ -167,11 +176,16 @@ func (s *DockerSuite) TestContainerApiGetChanges(c *check.C) { } func (s *DockerSuite) TestContainerApiStartVolumeBinds(c *check.C) { + // TODO Windows CI: Investigate further why this fails on Windows to Windows CI. testRequires(c, DaemonIsLinux) + path := "/foo" + if daemonPlatform == "windows" { + path = `c:\foo` + } name := "testing" config := map[string]interface{}{ "Image": "busybox", - "Volumes": map[string]struct{}{"/tmp": {}}, + "Volumes": map[string]struct{}{path: {}}, } status, _, err := sockRequest("POST", "/containers/create?name="+name, config) @@ -180,19 +194,20 @@ func (s *DockerSuite) TestContainerApiStartVolumeBinds(c *check.C) { bindPath := randomTmpDirPath("test", daemonPlatform) config = map[string]interface{}{ - "Binds": []string{bindPath + ":/tmp"}, + "Binds": []string{bindPath + ":" + path}, } status, _, err = sockRequest("POST", "/containers/"+name+"/start", config) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) - pth, err := inspectMountSourceField(name, "/tmp") + pth, err := inspectMountSourceField(name, path) c.Assert(err, checker.IsNil) c.Assert(pth, checker.Equals, bindPath, check.Commentf("expected volume host path to be %s, got %s", bindPath, pth)) } // Test for GH#10618 func (s *DockerSuite) TestContainerApiStartDupVolumeBinds(c *check.C) { + // TODO Windows to Windows CI - Port this testRequires(c, DaemonIsLinux) name := "testdups" config := map[string]interface{}{ @@ -217,6 +232,7 @@ func (s *DockerSuite) TestContainerApiStartDupVolumeBinds(c *check.C) { } func (s *DockerSuite) TestContainerApiStartVolumesFrom(c *check.C) { + // TODO Windows to Windows CI - Port this testRequires(c, DaemonIsLinux) volName := "voltst" volPath := "/tmp" @@ -248,6 +264,7 @@ func (s *DockerSuite) TestContainerApiStartVolumesFrom(c *check.C) { } func (s *DockerSuite) TestGetContainerStats(c *check.C) { + // Problematic on Windows as Windows does not support stats testRequires(c, DaemonIsLinux) var ( name = "statscontainer" @@ -286,6 +303,7 @@ func (s *DockerSuite) TestGetContainerStats(c *check.C) { } func (s *DockerSuite) TestGetContainerStatsRmRunning(c *check.C) { + // Problematic on Windows as Windows does not support stats testRequires(c, DaemonIsLinux) out, _ := dockerCmd(c, "run", "-d", "busybox", "top") id := strings.TrimSpace(out) @@ -326,6 +344,7 @@ func (s *DockerSuite) TestGetContainerStatsRmRunning(c *check.C) { // previous test was just checking one stat entry so it didn't fail (stats with // stream false always return one stat) func (s *DockerSuite) TestGetContainerStatsStream(c *check.C) { + // Problematic on Windows as Windows does not support stats testRequires(c, DaemonIsLinux) name := "statscontainer" dockerCmd(c, "run", "-d", "--name", name, "busybox", "top") @@ -363,6 +382,7 @@ func (s *DockerSuite) TestGetContainerStatsStream(c *check.C) { } func (s *DockerSuite) TestGetContainerStatsNoStream(c *check.C) { + // Problematic on Windows as Windows does not support stats testRequires(c, DaemonIsLinux) name := "statscontainer" dockerCmd(c, "run", "-d", "--name", name, "busybox", "top") @@ -398,6 +418,7 @@ func (s *DockerSuite) TestGetContainerStatsNoStream(c *check.C) { } func (s *DockerSuite) TestGetStoppedContainerStats(c *check.C) { + // Problematic on Windows as Windows does not support stats testRequires(c, DaemonIsLinux) // TODO: this test does nothing because we are c.Assert'ing in goroutine var ( @@ -419,6 +440,7 @@ func (s *DockerSuite) TestGetStoppedContainerStats(c *check.C) { // #9981 - Allow a docker created volume (ie, one in /var/lib/docker/volumes) to be used to overwrite (via passing in Binds on api start) an existing volume func (s *DockerSuite) TestPostContainerBindNormalVolume(c *check.C) { + // TODO Windows to Windows CI - Port this testRequires(c, DaemonIsLinux) dockerCmd(c, "create", "-v", "/foo", "--name=one", "busybox") @@ -438,6 +460,7 @@ func (s *DockerSuite) TestPostContainerBindNormalVolume(c *check.C) { } func (s *DockerSuite) TestContainerApiPause(c *check.C) { + // Problematic on Windows as Windows does not support pause testRequires(c, DaemonIsLinux) defer unpauseAllContainers() out, _ := dockerCmd(c, "run", "-d", "busybox", "sleep", "30") @@ -464,6 +487,7 @@ func (s *DockerSuite) TestContainerApiPause(c *check.C) { } func (s *DockerSuite) TestContainerApiTop(c *check.C) { + // Problematic on Windows as Windows does not support top testRequires(c, DaemonIsLinux) out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "top") id := strings.TrimSpace(string(out)) @@ -489,7 +513,6 @@ func (s *DockerSuite) TestContainerApiTop(c *check.C) { } func (s *DockerSuite) TestContainerApiCommit(c *check.C) { - testRequires(c, DaemonIsLinux) cName := "testapicommit" dockerCmd(c, "run", "--name="+cName, "busybox", "/bin/sh", "-c", "touch /test") @@ -513,7 +536,6 @@ func (s *DockerSuite) TestContainerApiCommit(c *check.C) { } func (s *DockerSuite) TestContainerApiCommitWithLabelInConfig(c *check.C) { - testRequires(c, DaemonIsLinux) cName := "testapicommitwithconfig" dockerCmd(c, "run", "--name="+cName, "busybox", "/bin/sh", "-c", "touch /test") @@ -549,6 +571,7 @@ func (s *DockerSuite) TestContainerApiCommitWithLabelInConfig(c *check.C) { } func (s *DockerSuite) TestContainerApiBadPort(c *check.C) { + // TODO Windows to Windows CI - Port this test testRequires(c, DaemonIsLinux) config := map[string]interface{}{ "Image": "busybox", @@ -573,7 +596,6 @@ func (s *DockerSuite) TestContainerApiBadPort(c *check.C) { } func (s *DockerSuite) TestContainerApiCreate(c *check.C) { - testRequires(c, DaemonIsLinux) config := map[string]interface{}{ "Image": "busybox", "Cmd": []string{"/bin/sh", "-c", "touch /test && ls /test"}, @@ -605,6 +627,7 @@ func (s *DockerSuite) TestContainerApiCreateEmptyConfig(c *check.C) { } func (s *DockerSuite) TestContainerApiCreateWithHostName(c *check.C) { + // TODO Windows: Port this test once hostname is supported testRequires(c, DaemonIsLinux) hostName := "test-host" config := map[string]interface{}{ @@ -629,6 +652,7 @@ func (s *DockerSuite) TestContainerApiCreateWithHostName(c *check.C) { } func (s *DockerSuite) TestContainerApiCreateWithDomainName(c *check.C) { + // TODO Windows: Port this test once domain name is supported testRequires(c, DaemonIsLinux) domainName := "test-domain" config := map[string]interface{}{ @@ -653,11 +677,13 @@ func (s *DockerSuite) TestContainerApiCreateWithDomainName(c *check.C) { } func (s *DockerSuite) TestContainerApiCreateBridgeNetworkMode(c *check.C) { + // Windows does not support bridge testRequires(c, DaemonIsLinux) UtilCreateNetworkMode(c, "bridge") } func (s *DockerSuite) TestContainerApiCreateOtherNetworkModes(c *check.C) { + // Windows does not support these network modes testRequires(c, DaemonIsLinux, NotUserNamespace) UtilCreateNetworkMode(c, "host") UtilCreateNetworkMode(c, "container:web1") @@ -686,6 +712,7 @@ func UtilCreateNetworkMode(c *check.C, networkMode string) { } func (s *DockerSuite) TestContainerApiCreateWithCpuSharesCpuset(c *check.C) { + // TODO Windows to Windows CI. The CpuShares part could be ported. testRequires(c, DaemonIsLinux) config := map[string]interface{}{ "Image": "busybox", @@ -718,7 +745,6 @@ func (s *DockerSuite) TestContainerApiCreateWithCpuSharesCpuset(c *check.C) { } func (s *DockerSuite) TestContainerApiVerifyHeader(c *check.C) { - testRequires(c, DaemonIsLinux) config := map[string]interface{}{ "Image": "busybox", } @@ -750,10 +776,10 @@ func (s *DockerSuite) TestContainerApiVerifyHeader(c *check.C) { //Issue 14230. daemon should return 500 for invalid port syntax func (s *DockerSuite) TestContainerApiInvalidPortSyntax(c *check.C) { - testRequires(c, DaemonIsLinux) config := `{ "Image": "busybox", "HostConfig": { + "NetworkMode": "default", "PortBindings": { "19039;1230": [ {} @@ -774,6 +800,8 @@ func (s *DockerSuite) TestContainerApiInvalidPortSyntax(c *check.C) { // Issue 7941 - test to make sure a "null" in JSON is just ignored. // W/o this fix a null in JSON would be parsed into a string var as "null" func (s *DockerSuite) TestContainerApiPostCreateNull(c *check.C) { + // TODO Windows to Windows CI. Bit of this with alternate fields checked + // can probably be ported. testRequires(c, DaemonIsLinux) config := `{ "Hostname":"", @@ -809,7 +837,6 @@ func (s *DockerSuite) TestContainerApiPostCreateNull(c *check.C) { } var container createResp c.Assert(json.Unmarshal(b, &container), checker.IsNil) - out, err := inspectField(container.ID, "HostConfig.CpusetCpus") c.Assert(err, checker.IsNil) c.Assert(out, checker.Equals, "") @@ -823,6 +850,7 @@ func (s *DockerSuite) TestContainerApiPostCreateNull(c *check.C) { } func (s *DockerSuite) TestCreateWithTooLowMemoryLimit(c *check.C) { + // TODO Windows: Port once memory is supported testRequires(c, DaemonIsLinux) config := `{ "Image": "busybox", @@ -842,6 +870,7 @@ func (s *DockerSuite) TestCreateWithTooLowMemoryLimit(c *check.C) { } func (s *DockerSuite) TestStartWithTooLowMemoryLimit(c *check.C) { + // TODO Windows: Port once memory is supported testRequires(c, DaemonIsLinux) out, _ := dockerCmd(c, "create", "busybox") @@ -861,6 +890,7 @@ func (s *DockerSuite) TestStartWithTooLowMemoryLimit(c *check.C) { } func (s *DockerSuite) TestContainerApiRename(c *check.C) { + // TODO Windows: Enable for TP5. Fails on TP4. testRequires(c, DaemonIsLinux) out, _ := dockerCmd(c, "run", "--name", "TestContainerApiRename", "-d", "busybox", "sh") @@ -876,9 +906,8 @@ func (s *DockerSuite) TestContainerApiRename(c *check.C) { } func (s *DockerSuite) TestContainerApiKill(c *check.C) { - testRequires(c, DaemonIsLinux) name := "test-api-kill" - dockerCmd(c, "run", "-di", "--name", name, "busybox", "top") + dockerCmd(c, "run", "-di", "--name", name, "busybox", sleepCmd, "60") status, _, err := sockRequest("POST", "/containers/"+name+"/kill", nil) c.Assert(err, checker.IsNil) @@ -890,6 +919,7 @@ func (s *DockerSuite) TestContainerApiKill(c *check.C) { } func (s *DockerSuite) TestContainerApiRestart(c *check.C) { + // TODO Windows to Windows CI. This is flaky due to the timing testRequires(c, DaemonIsLinux) name := "test-api-restart" dockerCmd(c, "run", "-di", "--name", name, "busybox", "top") @@ -901,6 +931,7 @@ func (s *DockerSuite) TestContainerApiRestart(c *check.C) { } func (s *DockerSuite) TestContainerApiRestartNotimeoutParam(c *check.C) { + // TODO Windows to Windows CI. This is flaky due to the timing testRequires(c, DaemonIsLinux) name := "test-api-restart-no-timeout-param" out, _ := dockerCmd(c, "run", "-di", "--name", name, "busybox", "top") @@ -914,11 +945,10 @@ func (s *DockerSuite) TestContainerApiRestartNotimeoutParam(c *check.C) { } func (s *DockerSuite) TestContainerApiStart(c *check.C) { - testRequires(c, DaemonIsLinux) name := "testing-start" config := map[string]interface{}{ "Image": "busybox", - "Cmd": []string{"/bin/sh", "-c", "/bin/top"}, + "Cmd": []string{"/bin/sh", "-c", sleepCmd, "60"}, "OpenStdin": true, } @@ -938,30 +968,28 @@ func (s *DockerSuite) TestContainerApiStart(c *check.C) { } func (s *DockerSuite) TestContainerApiStop(c *check.C) { - testRequires(c, DaemonIsLinux) name := "test-api-stop" - dockerCmd(c, "run", "-di", "--name", name, "busybox", "top") + dockerCmd(c, "run", "-di", "--name", name, "busybox", sleepCmd, "60") - status, _, err := sockRequest("POST", "/containers/"+name+"/stop?t=1", nil) + status, _, err := sockRequest("POST", "/containers/"+name+"/stop?t=30", nil) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) - c.Assert(waitInspect(name, "{{ .State.Running }}", "false", 5*time.Second), checker.IsNil) + c.Assert(waitInspect(name, "{{ .State.Running }}", "false", 60*time.Second), checker.IsNil) // second call to start should give 304 - status, _, err = sockRequest("POST", "/containers/"+name+"/stop?t=1", nil) + status, _, err = sockRequest("POST", "/containers/"+name+"/stop?t=30", nil) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNotModified) } func (s *DockerSuite) TestContainerApiWait(c *check.C) { - testRequires(c, DaemonIsLinux) name := "test-api-wait" - dockerCmd(c, "run", "--name", name, "busybox", "sleep", "5") + dockerCmd(c, "run", "--name", name, "busybox", sleepCmd, "5") status, body, err := sockRequest("POST", "/containers/"+name+"/wait", nil) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(waitInspect(name, "{{ .State.Running }}", "false", 5*time.Second), checker.IsNil) + c.Assert(waitInspect(name, "{{ .State.Running }}", "false", 60*time.Second), checker.IsNil) var waitres types.ContainerWaitResponse c.Assert(json.Unmarshal(body, &waitres), checker.IsNil) @@ -969,6 +997,7 @@ func (s *DockerSuite) TestContainerApiWait(c *check.C) { } func (s *DockerSuite) TestContainerApiCopy(c *check.C) { + // TODO Windows to Windows CI. This can be ported. testRequires(c, DaemonIsLinux) name := "test-container-api-copy" dockerCmd(c, "run", "--name", name, "busybox", "touch", "/test.txt") @@ -999,6 +1028,7 @@ func (s *DockerSuite) TestContainerApiCopy(c *check.C) { } func (s *DockerSuite) TestContainerApiCopyResourcePathEmpty(c *check.C) { + // TODO Windows to Windows CI. This can be ported. testRequires(c, DaemonIsLinux) name := "test-container-api-copy-resource-empty" dockerCmd(c, "run", "--name", name, "busybox", "touch", "/test.txt") @@ -1014,6 +1044,7 @@ func (s *DockerSuite) TestContainerApiCopyResourcePathEmpty(c *check.C) { } func (s *DockerSuite) TestContainerApiCopyResourcePathNotFound(c *check.C) { + // TODO Windows to Windows CI. This can be ported. testRequires(c, DaemonIsLinux) name := "test-container-api-copy-resource-not-found" dockerCmd(c, "run", "--name", name, "busybox") @@ -1039,8 +1070,7 @@ func (s *DockerSuite) TestContainerApiCopyContainerNotFound(c *check.C) { } func (s *DockerSuite) TestContainerApiDelete(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") + out, _ := dockerCmd(c, "run", "-d", "busybox", sleepCmd, "60") id := strings.TrimSpace(out) c.Assert(waitRun(id), checker.IsNil) @@ -1060,8 +1090,7 @@ func (s *DockerSuite) TestContainerApiDeleteNotExist(c *check.C) { } func (s *DockerSuite) TestContainerApiDeleteForce(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") + out, _ := dockerCmd(c, "run", "-d", "busybox", sleepCmd, "60") id := strings.TrimSpace(out) c.Assert(waitRun(id), checker.IsNil) @@ -1072,6 +1101,7 @@ func (s *DockerSuite) TestContainerApiDeleteForce(c *check.C) { } func (s *DockerSuite) TestContainerApiDeleteRemoveLinks(c *check.C) { + // Windows does not support links testRequires(c, DaemonIsLinux) out, _ := dockerCmd(c, "run", "-d", "--name", "tlink1", "busybox", "top") @@ -1097,8 +1127,7 @@ func (s *DockerSuite) TestContainerApiDeleteRemoveLinks(c *check.C) { } func (s *DockerSuite) TestContainerApiDeleteConflict(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") + out, _ := dockerCmd(c, "run", "-d", "busybox", sleepCmd, "60") id := strings.TrimSpace(out) c.Assert(waitRun(id), checker.IsNil) @@ -1109,15 +1138,19 @@ func (s *DockerSuite) TestContainerApiDeleteConflict(c *check.C) { } func (s *DockerSuite) TestContainerApiDeleteRemoveVolume(c *check.C) { - testRequires(c, DaemonIsLinux) testRequires(c, SameHostDaemon) - out, _ := dockerCmd(c, "run", "-d", "-v", "/testvolume", "busybox", "top") + vol := "/testvolume" + if daemonPlatform == "windows" { + vol = `c:\testvolume` + } + + out, _ := dockerCmd(c, "run", "-d", "-v", vol, "busybox", sleepCmd, "60") id := strings.TrimSpace(out) c.Assert(waitRun(id), checker.IsNil) - source, err := inspectMountSourceField(id, "/testvolume") + source, err := inspectMountSourceField(id, vol) _, err = os.Stat(source) c.Assert(err, checker.IsNil) @@ -1129,7 +1162,8 @@ func (s *DockerSuite) TestContainerApiDeleteRemoveVolume(c *check.C) { } // Regression test for https://github.com/docker/docker/issues/6231 -func (s *DockerSuite) TestContainersApiChunkedEncoding(c *check.C) { +func (s *DockerSuite) TestContainerApiChunkedEncoding(c *check.C) { + // TODO Windows CI: This can be ported testRequires(c, DaemonIsLinux) out, _ := dockerCmd(c, "create", "-v", "/foo", "busybox", "true") id := strings.TrimSpace(out) @@ -1164,9 +1198,8 @@ func (s *DockerSuite) TestContainersApiChunkedEncoding(c *check.C) { c.Assert(binds[0], checker.Equals, expected, check.Commentf("got incorrect bind spec")) } -func (s *DockerSuite) TestPostContainerStop(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") +func (s *DockerSuite) TestContainerApiPostContainerStop(c *check.C) { + out, _ := dockerCmd(c, "run", "-d", "busybox", sleepCmd, "60") containerID := strings.TrimSpace(out) c.Assert(waitRun(containerID), checker.IsNil) @@ -1179,8 +1212,7 @@ func (s *DockerSuite) TestPostContainerStop(c *check.C) { } // #14170 -func (s *DockerSuite) TestPostContainersCreateWithStringOrSliceEntrypoint(c *check.C) { - testRequires(c, DaemonIsLinux) +func (s *DockerSuite) TestPostContainerApiCreateWithStringOrSliceEntrypoint(c *check.C) { config := struct { Image string Entrypoint string @@ -1204,7 +1236,6 @@ func (s *DockerSuite) TestPostContainersCreateWithStringOrSliceEntrypoint(c *che // #14170 func (s *DockerSuite) TestPostContainersCreateWithStringOrSliceCmd(c *check.C) { - testRequires(c, DaemonIsLinux) config := struct { Image string Entrypoint string @@ -1227,6 +1258,7 @@ func (s *DockerSuite) TestPostContainersCreateWithStringOrSliceCmd(c *check.C) { // regression #14318 func (s *DockerSuite) TestPostContainersCreateWithStringOrSliceCapAddDrop(c *check.C) { + // Windows doesn't support CapAdd/CapDrop testRequires(c, DaemonIsLinux) config := struct { Image string @@ -1249,9 +1281,11 @@ func (s *DockerSuite) TestPostContainersCreateWithStringOrSliceCapAddDrop(c *che // #14640 func (s *DockerSuite) TestPostContainersStartWithoutLinksInHostConfig(c *check.C) { + // TODO Windows: Windows doesn't support supplying a hostconfig on start. + // An alternate test could be written to validate the negative testing aspect of this testRequires(c, DaemonIsLinux) name := "test-host-config-links" - dockerCmd(c, "create", "--name", name, "busybox", "top") + dockerCmd(c, "create", "--name", name, "busybox", sleepCmd, "60") hc, err := inspectFieldJSON(name, "HostConfig") c.Assert(err, checker.IsNil) @@ -1265,6 +1299,8 @@ func (s *DockerSuite) TestPostContainersStartWithoutLinksInHostConfig(c *check.C // #14640 func (s *DockerSuite) TestPostContainersStartWithLinksInHostConfig(c *check.C) { + // TODO Windows: Windows doesn't support supplying a hostconfig on start. + // An alternate test could be written to validate the negative testing aspect of this testRequires(c, DaemonIsLinux) name := "test-host-config-links" dockerCmd(c, "run", "--name", "foo", "-d", "busybox", "top") @@ -1282,6 +1318,7 @@ func (s *DockerSuite) TestPostContainersStartWithLinksInHostConfig(c *check.C) { // #14640 func (s *DockerSuite) TestPostContainersStartWithLinksInHostConfigIdLinked(c *check.C) { + // Windows does not support links testRequires(c, DaemonIsLinux) name := "test-host-config-links" out, _ := dockerCmd(c, "run", "--name", "link0", "-d", "busybox", "top") @@ -1299,8 +1336,7 @@ func (s *DockerSuite) TestPostContainersStartWithLinksInHostConfigIdLinked(c *ch } // #14915 -func (s *DockerSuite) TestContainersApiCreateNoHostConfig118(c *check.C) { - testRequires(c, DaemonIsLinux) +func (s *DockerSuite) TestContainerApiCreateNoHostConfig118(c *check.C) { config := struct { Image string }{"busybox"} @@ -1313,6 +1349,7 @@ func (s *DockerSuite) TestContainersApiCreateNoHostConfig118(c *check.C) { // extract an archive to a symlink in a writable volume which points to a // directory outside of the volume. func (s *DockerSuite) TestPutContainerArchiveErrSymlinkInVolumeToReadOnlyRootfs(c *check.C) { + // Windows does not support read-only rootfs // Requires local volume mount bind. // --read-only + userns has remount issues testRequires(c, SameHostDaemon, NotUserNamespace, DaemonIsLinux) @@ -1343,9 +1380,7 @@ func (s *DockerSuite) TestPutContainerArchiveErrSymlinkInVolumeToReadOnlyRootfs( } } -func (s *DockerSuite) TestContainersApiGetContainersJSONEmpty(c *check.C) { - testRequires(c, DaemonIsLinux) - +func (s *DockerSuite) TestContainerApiGetContainersJSONEmpty(c *check.C) { status, body, err := sockRequest("GET", "/containers/json?all=1", nil) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -1353,6 +1388,7 @@ func (s *DockerSuite) TestContainersApiGetContainersJSONEmpty(c *check.C) { } func (s *DockerSuite) TestPostContainersCreateWithWrongCpusetValues(c *check.C) { + // Not supported on Windows testRequires(c, DaemonIsLinux) c1 := struct { @@ -1379,6 +1415,7 @@ func (s *DockerSuite) TestPostContainersCreateWithWrongCpusetValues(c *check.C) } func (s *DockerSuite) TestStartWithNilDNS(c *check.C) { + // TODO Windows: Add once DNS is supported testRequires(c, DaemonIsLinux) out, _ := dockerCmd(c, "create", "busybox") containerID := strings.TrimSpace(out) @@ -1396,6 +1433,7 @@ func (s *DockerSuite) TestStartWithNilDNS(c *check.C) { } func (s *DockerSuite) TestPostContainersCreateShmSizeNegative(c *check.C) { + // ShmSize is not supported on Windows testRequires(c, DaemonIsLinux) config := map[string]interface{}{ "Image": "busybox", @@ -1409,6 +1447,7 @@ func (s *DockerSuite) TestPostContainersCreateShmSizeNegative(c *check.C) { } func (s *DockerSuite) TestPostContainersCreateShmSizeHostConfigOmitted(c *check.C) { + // ShmSize is not supported on Windows testRequires(c, DaemonIsLinux) var defaultSHMSize int64 = 67108864 config := map[string]interface{}{ @@ -1440,6 +1479,7 @@ func (s *DockerSuite) TestPostContainersCreateShmSizeHostConfigOmitted(c *check. } func (s *DockerSuite) TestPostContainersCreateShmSizeOmitted(c *check.C) { + // ShmSize is not supported on Windows testRequires(c, DaemonIsLinux) config := map[string]interface{}{ "Image": "busybox", @@ -1471,6 +1511,7 @@ func (s *DockerSuite) TestPostContainersCreateShmSizeOmitted(c *check.C) { } func (s *DockerSuite) TestPostContainersCreateWithShmSize(c *check.C) { + // ShmSize is not supported on Windows testRequires(c, DaemonIsLinux) config := map[string]interface{}{ "Image": "busybox", @@ -1502,6 +1543,7 @@ func (s *DockerSuite) TestPostContainersCreateWithShmSize(c *check.C) { } func (s *DockerSuite) TestPostContainersCreateMemorySwappinessHostConfigOmitted(c *check.C) { + // Swappiness is not supported on Windows testRequires(c, DaemonIsLinux) config := map[string]interface{}{ "Image": "busybox", @@ -1526,6 +1568,7 @@ func (s *DockerSuite) TestPostContainersCreateMemorySwappinessHostConfigOmitted( // check validation is done daemon side and not only in cli func (s *DockerSuite) TestPostContainersCreateWithOomScoreAdjInvalidRange(c *check.C) { + // OomScoreAdj is not supported on Windows testRequires(c, DaemonIsLinux) config := struct {