2015-02-14 01:53:39 +03:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2015-02-26 07:16:44 +03:00
|
|
|
"encoding/json"
|
2015-02-25 10:19:59 +03:00
|
|
|
"fmt"
|
2015-02-26 07:16:44 +03:00
|
|
|
"log"
|
2015-02-28 01:18:11 +03:00
|
|
|
"net/http"
|
2015-02-25 10:19:59 +03:00
|
|
|
"os/exec"
|
2015-02-26 07:16:44 +03:00
|
|
|
"strings"
|
2015-02-14 01:53:39 +03:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
type TestCondition func() bool
|
|
|
|
|
|
|
|
type TestRequirement struct {
|
|
|
|
Condition TestCondition
|
|
|
|
SkipMessage string
|
|
|
|
}
|
|
|
|
|
|
|
|
// List test requirements
|
|
|
|
var (
|
2015-02-26 07:16:44 +03:00
|
|
|
daemonExecDriver string
|
|
|
|
|
2015-02-14 01:53:39 +03:00
|
|
|
SameHostDaemon = TestRequirement{
|
|
|
|
func() bool { return isLocalDaemon },
|
|
|
|
"Test requires docker daemon to runs on the same machine as CLI",
|
|
|
|
}
|
2015-02-20 12:37:27 +03:00
|
|
|
UnixCli = TestRequirement{
|
|
|
|
func() bool { return isUnixCli },
|
|
|
|
"Test requires posix utilities or functionality to run.",
|
|
|
|
}
|
2015-02-21 10:24:30 +03:00
|
|
|
ExecSupport = TestRequirement{
|
|
|
|
func() bool { return supportsExec },
|
|
|
|
"Test requires 'docker exec' capabilities on the tested daemon.",
|
|
|
|
}
|
2015-02-28 01:18:11 +03:00
|
|
|
Network = TestRequirement{
|
|
|
|
func() bool {
|
|
|
|
resp, err := http.Get("http://hub.docker.com")
|
|
|
|
if resp != nil {
|
|
|
|
resp.Body.Close()
|
|
|
|
}
|
|
|
|
return err == nil
|
|
|
|
},
|
|
|
|
"Test requires network availability, environment variable set to none to run in a non-network enabled mode.",
|
|
|
|
}
|
2015-02-25 10:19:59 +03:00
|
|
|
RegistryHosting = TestRequirement{
|
|
|
|
func() bool {
|
|
|
|
// for now registry binary is built only if we're running inside
|
|
|
|
// container through `make test`. Figure that out by testing if
|
|
|
|
// registry binary is in PATH.
|
|
|
|
_, err := exec.LookPath(v2binary)
|
|
|
|
return err == nil
|
|
|
|
},
|
|
|
|
fmt.Sprintf("Test requires an environment that can host %s in the same host", v2binary),
|
|
|
|
}
|
2015-02-26 07:16:44 +03:00
|
|
|
NativeExecDriver = TestRequirement{
|
|
|
|
func() bool {
|
|
|
|
if daemonExecDriver == "" {
|
|
|
|
// get daemon info
|
2015-04-12 00:49:14 +03:00
|
|
|
_, body, err := sockRequest("GET", "/info", nil)
|
2015-02-26 07:16:44 +03:00
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("sockRequest failed for /info: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
type infoJSON struct {
|
|
|
|
ExecutionDriver string
|
|
|
|
}
|
|
|
|
var info infoJSON
|
|
|
|
if err = json.Unmarshal(body, &info); err != nil {
|
|
|
|
log.Fatalf("unable to unmarshal body: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
daemonExecDriver = info.ExecutionDriver
|
|
|
|
}
|
|
|
|
|
|
|
|
return strings.HasPrefix(daemonExecDriver, "native")
|
|
|
|
},
|
|
|
|
"Test requires the native (libcontainer) exec driver.",
|
|
|
|
}
|
2015-03-05 08:22:01 +03:00
|
|
|
|
|
|
|
NotOverlay = TestRequirement{
|
|
|
|
func() bool {
|
|
|
|
cmd := exec.Command("grep", "^overlay / overlay", "/proc/mounts")
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
},
|
|
|
|
"Test requires underlying root filesystem not be backed by overlay.",
|
|
|
|
}
|
2015-02-14 01:53:39 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
// testRequires checks if the environment satisfies the requirements
|
|
|
|
// for the test to run or skips the tests.
|
|
|
|
func testRequires(t *testing.T, requirements ...TestRequirement) {
|
|
|
|
for _, r := range requirements {
|
|
|
|
if !r.Condition() {
|
|
|
|
t.Skip(r.SkipMessage)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|