[lxc-devel] [go-lxc/v2] improve test suite
caglar10ur on Github
lxc-bot at linuxcontainers.org
Thu Dec 27 21:29:12 UTC 2018
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 490 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20181227/82657d48/attachment.bin>
-------------- next part --------------
From 4a02f67957aba7b7f4e8edc6d38a3dc94fef04f3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=2E=C3=87a=C4=9Flar=20Onur?= <caglar at 10ur.org>
Date: Thu, 27 Dec 2018 09:47:40 -0800
Subject: [PATCH] improve test suite
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
so that both privileged and unprivileged tests
run fine under host machine/in nested environments
(like termina at chromeos) and travis.
Signed-off-by: S.Çağlar Onur <caglar at 10ur.org>
---
.travis.yml | 12 +-
Makefile | 20 +--
lxc_test.go | 408 +++++++++++++++++++++++++++++++++++++---------------
3 files changed, 311 insertions(+), 129 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index cfbae9a..abff5d6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,9 +4,6 @@ os:
- linux
go:
- - "1.6"
- - "1.7"
- - "1.8"
- "1.9"
- "1.10"
- "1.11"
@@ -30,16 +27,21 @@ before_install:
- echo "lxc.id_map = g 0 100000 65536" | sudo tee -a ${HOME}/.config/lxc/default.conf
- "make setup-test-cgroup"
- mkdir -p ${HOME}/.local/share/lxc
+ - chmod +x ${HOME}
+ - chmod +x ${HOME}/.local
+ - chmod +x ${HOME}/.local/share
+ - chmod +x ${HOME}/.local/share/lxc
install:
+ - go get golang.org/x/tools/cmd/goimports
- go get gopkg.in/lxc/go-lxc.v2
script:
- "make all"
- "make test"
- "make test-race"
-# - "make test-unprivileged"
-# - "make test-unprivileged-race"
+ - "make test-unprivileged"
+ - "make test-unprivileged-race"
- "make cover"
notifications:
diff --git a/Makefile b/Makefile
index 149ce66..4f60152 100644
--- a/Makefile
+++ b/Makefile
@@ -9,24 +9,26 @@ format:
@goimports -w *.go || true
test:
- @echo "$(OK_COLOR)==> Running go test $(NO_COLOR)"
- @sudo `which go` test -v
+ @echo "$(OK_COLOR)==> Running tests for priveleged user $(NO_COLOR)"
+ @sudo `which go` test -v -coverprofile=/tmp/priv.out
test-race:
- @echo "$(OK_COLOR)==> Running go test $(NO_COLOR)"
+ @echo "$(OK_COLOR)==> Running tests with -race flag for priveleged user $(NO_COLOR)"
@sudo `which go` test -race -v
test-unprivileged:
- @echo "$(OK_COLOR)==> Running go test for unprivileged user$(NO_COLOR)"
- @`which go` test -v
+ @echo "$(OK_COLOR)==> Running tests for unprivileged user $(NO_COLOR)"
+ @`which go` test -v -coverprofile=/tmp/unpriv.out
test-unprivileged-race:
- @echo "$(OK_COLOR)==> Running go test for unprivileged user$(NO_COLOR)"
+ @echo "$(OK_COLOR)==> Running tests with -race flag for unprivileged user $(NO_COLOR)"
@`which go` test -race -v
cover:
- @sudo `which go` test -v -coverprofile=coverage.out
- @`which go` tool cover -func=coverage.out
+ @echo "$(OK_COLOR)==> Running cover for privileged user $(NO_COLOR)"
+ @`which go` tool cover -func=/tmp/priv.out || true
+ @echo "$(OK_COLOR)==> Running cover for unprivileged user $(NO_COLOR)"
+ @`which go` tool cover -func=/tmp/unpriv.out || true
doc:
@`which godoc` gopkg.in/lxc/go-lxc.v2 | less
@@ -40,7 +42,7 @@ lint:
@`which golint` . || true
escape-analysis:
- @go build -gcflags -m
+ @`which go` build -gcflags -m
ctags:
@ctags -R --languages=c,go
diff --git a/lxc_test.go b/lxc_test.go
index 3e8d3b5..77d12a4 100644
--- a/lxc_test.go
+++ b/lxc_test.go
@@ -8,7 +8,9 @@ package lxc
import (
"fmt"
+ "io/ioutil"
"math/rand"
+ "net"
"os"
"runtime"
"strconv"
@@ -20,15 +22,15 @@ import (
)
const (
- ContainerName = "lorem"
- SnapshotName = "snap0"
- ContainerRestoreName = "ipsum"
- ContainerCloneName = "consectetur"
- ContainerCloneOverlayName = "adipiscing"
- ContainerCloneAufsName = "pellentesque"
+ DefaultContainerName = "lorem"
+ DefaultSnapshotName = "snap0"
+ DefaultContainerRestoreName = "ipsum"
+ DefaultContainerCloneName = "consectetur"
+ DefaultContainerCloneOverlayName = "adipiscing"
+ DefaultContainerCloneAufsName = "pellentesque"
)
-func PathExists(name string) bool {
+func exists(name string) bool {
_, err := os.Lstat(name)
if err != nil && os.IsNotExist(err) {
return false
@@ -40,6 +42,11 @@ func unprivileged() bool {
return os.Geteuid() != 0
}
+func travis() bool {
+ // https://docs.travis-ci.com/user/environment-variables/#default-environment-variables
+ return os.Getenv("TRAVIS") == "true"
+}
+
func supported(moduleName string) bool {
if _, err := os.Stat("/sys/module/" + moduleName); err != nil {
return false
@@ -47,6 +54,76 @@ func supported(moduleName string) bool {
return true
}
+func ipv6() bool {
+ lxcbr0, err := net.InterfaceByName("lxcbr0")
+ if err != nil {
+ return false
+ }
+
+ addresses, err := lxcbr0.Addrs()
+ if err != nil {
+ return false
+ }
+
+ // https://github.com/asaskevich/govalidator/blob/master/validator.go#L621
+ for _, v := range addresses {
+ if ipnet, ok := v.(*net.IPNet); ok && strings.Count(v.String(), ":") >= 2 && !ipnet.IP.IsLinkLocalUnicast() {
+ return true
+ }
+ }
+
+ return false
+}
+
+func template() TemplateOptions {
+ if !unprivileged() {
+ return BusyboxTemplateOptions
+ }
+
+ // travis uses trusy which comes with lxc 1.0.x so use a compatible image
+ return TemplateOptions{
+ Template: "download",
+ Distro: "ubuntu",
+ Release: "trusty",
+ Arch: "amd64",
+ }
+}
+
+func ContainerName() string {
+ if unprivileged() {
+ return fmt.Sprintf("%s-unprivileged", DefaultContainerName)
+ }
+ return DefaultContainerName
+}
+
+func ContainerRestoreName() string {
+ if unprivileged() {
+ return fmt.Sprintf("%s-unprivileged", DefaultContainerRestoreName)
+ }
+ return DefaultContainerRestoreName
+}
+
+func ContainerCloneName() string {
+ if unprivileged() {
+ return fmt.Sprintf("%s-unprivileged", DefaultContainerCloneName)
+ }
+ return DefaultContainerCloneName
+}
+
+func ContainerCloneOverlayName() string {
+ if unprivileged() {
+ return fmt.Sprintf("%s-unprivileged", DefaultContainerCloneOverlayName)
+ }
+ return DefaultContainerCloneOverlayName
+}
+
+func ContainerCloneAufsName() string {
+ if unprivileged() {
+ return fmt.Sprintf("%s-unprivileged", DefaultContainerCloneAufsName)
+ }
+ return DefaultContainerCloneAufsName
+}
+
func TestVersion(t *testing.T) {
t.Logf("LXC version: %s", Version())
}
@@ -58,10 +135,11 @@ func TestDefaultConfigPath(t *testing.T) {
}
func TestSetConfigPath(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
currentPath := c.ConfigPath()
if err := c.SetConfigPath("/tmp"); err != nil {
@@ -75,10 +153,11 @@ func TestSetConfigPath(t *testing.T) {
}
func TestAcquire(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
Acquire(c)
Release(c)
@@ -96,6 +175,7 @@ func TestConcurrentDefined_Negative(t *testing.T) {
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
// sleep for a while to simulate some dummy work
time.Sleep(time.Millisecond * time.Duration(rand.Intn(250)))
@@ -110,10 +190,11 @@ func TestConcurrentDefined_Negative(t *testing.T) {
}
func TestDefined_Negative(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if c.Defined() {
t.Errorf("Defined_Negative failed...")
@@ -125,10 +206,11 @@ func TestExecute(t *testing.T) {
t.Skip("skipping test in unprivileged mode.")
}
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.Execute("/bin/true"); err != nil {
t.Errorf(err.Error())
@@ -136,47 +218,53 @@ func TestExecute(t *testing.T) {
}
func TestSetVerbosity(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
c.SetVerbosity(Quiet)
}
func TestCreate(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
- if err := c.Create(BusyboxTemplateOptions); err != nil {
+ c.SetVerbosity(Verbose)
+
+ if err := c.Create(template()); err != nil {
t.Errorf(err.Error())
}
}
func TestClone(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
- if err = c.Clone(ContainerCloneName, DefaultCloneOptions); err != nil {
+ if err = c.Clone(ContainerCloneName(), DefaultCloneOptions); err != nil {
t.Errorf(err.Error())
}
}
func TestCloneUsingOverlayfs(t *testing.T) {
- if !supported("overlayfs") {
+ if !(supported("overlayfs") || supported("overlay")) {
t.Skip("skipping test as overlayfs support is missing.")
}
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
- err = c.Clone(ContainerCloneOverlayName, CloneOptions{
+ err = c.Clone(ContainerCloneOverlayName(), CloneOptions{
Backend: Overlayfs,
KeepName: true,
KeepMAC: true,
@@ -196,12 +284,13 @@ func TestCloneUsingAufs(t *testing.T) {
t.Skip("skipping test as aufs support is missing.")
}
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
- err = c.Clone(ContainerCloneAufsName, CloneOptions{
+ err = c.Clone(ContainerCloneAufsName(), CloneOptions{
Backend: Aufs,
KeepName: true,
KeepMAC: true,
@@ -213,10 +302,11 @@ func TestCloneUsingAufs(t *testing.T) {
}
func TestCreateSnapshot(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.CreateSnapshot(); err != nil {
t.Errorf(err.Error())
@@ -224,10 +314,11 @@ func TestCreateSnapshot(t *testing.T) {
}
func TestCreateSnapshots(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
for i := 0; i < 3; i++ {
if _, err := c.CreateSnapshot(); err != nil {
@@ -237,13 +328,14 @@ func TestCreateSnapshots(t *testing.T) {
}
func TestRestoreSnapshot(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
- snapshot := Snapshot{Name: SnapshotName}
- if err := c.RestoreSnapshot(snapshot, ContainerRestoreName); err != nil {
+ snapshot := Snapshot{Name: DefaultSnapshotName}
+ if err := c.RestoreSnapshot(snapshot, ContainerRestoreName()); err != nil {
t.Errorf(err.Error())
}
}
@@ -257,7 +349,7 @@ func TestConcurrentCreate(t *testing.T) {
var wg sync.WaitGroup
- options := BusyboxTemplateOptions
+ options := template()
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
@@ -265,6 +357,7 @@ func TestConcurrentCreate(t *testing.T) {
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
// sleep for a while to simulate some dummy work
time.Sleep(time.Millisecond * time.Duration(rand.Intn(250)))
@@ -279,10 +372,11 @@ func TestConcurrentCreate(t *testing.T) {
}
func TestSnapshots(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.Snapshots(); err != nil {
t.Errorf(err.Error())
@@ -305,6 +399,7 @@ func TestConcurrentStart(t *testing.T) {
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.Start(); err != nil {
t.Errorf(err.Error())
@@ -322,10 +417,11 @@ func TestConcurrentStart(t *testing.T) {
}
func TestConfigFileName(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if c.ConfigFileName() == "" {
t.Errorf("ConfigFileName failed...")
@@ -333,10 +429,11 @@ func TestConfigFileName(t *testing.T) {
}
func TestDefined_Positive(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if !c.Defined() {
t.Errorf("Defined_Positive failed...")
@@ -359,6 +456,7 @@ func TestConcurrentDefined_Positive(t *testing.T) {
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
// sleep for a while to simulate some dummy work
time.Sleep(time.Millisecond * time.Duration(rand.Intn(250)))
@@ -373,10 +471,11 @@ func TestConcurrentDefined_Positive(t *testing.T) {
}
func TestInitPid_Negative(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if c.InitPid() != -1 {
t.Errorf("InitPid failed...")
@@ -384,10 +483,16 @@ func TestInitPid_Negative(t *testing.T) {
}
func TestStart(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
+
+ log := fmt.Sprintf("/tmp/%s", ContainerName())
+ if err := c.SetLogFile(log); err != nil {
+ t.Errorf("SetLogFile failed...")
+ }
if err := c.Start(); err != nil {
t.Errorf(err.Error())
@@ -396,6 +501,12 @@ func TestStart(t *testing.T) {
c.Wait(RUNNING, 30*time.Second)
if !c.Running() {
t.Errorf("Starting the container failed...")
+
+ b, err := ioutil.ReadFile(log)
+ if err != nil {
+ t.Errorf("Reading %s file failed...", log)
+ }
+ t.Logf("%s\n", b)
}
}
@@ -404,10 +515,11 @@ func TestWaitIPAddresses(t *testing.T) {
t.Skip("skipping test in privileged mode.")
}
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.WaitIPAddresses(30 * time.Second); err != nil {
t.Errorf(err.Error())
@@ -415,10 +527,11 @@ func TestWaitIPAddresses(t *testing.T) {
}
func TestControllable(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if !c.Controllable() {
t.Errorf("Controling the container failed...")
@@ -462,10 +575,11 @@ func TestActiveContainers(t *testing.T) {
}
func TestRunning(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if !c.Running() {
t.Errorf("Checking the container failed...")
@@ -473,10 +587,11 @@ func TestRunning(t *testing.T) {
}
func TestWantDaemonize(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.WantDaemonize(false); err != nil || c.Daemonize() {
t.Errorf("WantDaemonize failed...")
@@ -484,10 +599,11 @@ func TestWantDaemonize(t *testing.T) {
}
func TestWantCloseAllFds(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.WantCloseAllFds(true); err != nil {
t.Errorf("WantCloseAllFds failed...")
@@ -495,10 +611,11 @@ func TestWantCloseAllFds(t *testing.T) {
}
func TestSetLogLevel(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.SetLogLevel(WARN); err != nil || c.LogLevel() != WARN {
t.Errorf("SetLogLevel( failed...")
@@ -506,21 +623,23 @@ func TestSetLogLevel(t *testing.T) {
}
func TestSetLogFile(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
- if err := c.SetLogFile("/tmp/" + ContainerName); err != nil || c.LogFile() != "/tmp/"+ContainerName {
+ if err := c.SetLogFile("/tmp/" + ContainerName()); err != nil || c.LogFile() != "/tmp/"+ContainerName() {
t.Errorf("SetLogFile failed...")
}
}
func TestInitPid_Positive(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if c.InitPid() == -1 {
t.Errorf("InitPid failed...")
@@ -528,21 +647,23 @@ func TestInitPid_Positive(t *testing.T) {
}
func TestName(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
- if c.Name() != ContainerName {
+ if c.Name() != ContainerName() {
t.Errorf("Name failed...")
}
}
func TestFreeze(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.Freeze(); err != nil {
t.Errorf(err.Error())
@@ -555,10 +676,11 @@ func TestFreeze(t *testing.T) {
}
func TestUnfreeze(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.Unfreeze(); err != nil {
t.Errorf(err.Error())
@@ -571,10 +693,11 @@ func TestUnfreeze(t *testing.T) {
}
func TestLoadConfigFile(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.LoadConfigFile(c.ConfigFileName()); err != nil {
t.Errorf(err.Error())
@@ -582,10 +705,11 @@ func TestLoadConfigFile(t *testing.T) {
}
func TestSaveConfigFile(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.SaveConfigFile(c.ConfigFileName()); err != nil {
t.Errorf(err.Error())
@@ -593,36 +717,39 @@ func TestSaveConfigFile(t *testing.T) {
}
func TestConfigItem(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
- if c.ConfigItem("lxc.utsname")[0] != ContainerName {
+ if c.ConfigItem("lxc.utsname")[0] != ContainerName() {
t.Errorf("ConfigItem failed...")
}
}
func TestSetConfigItem(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
- if err := c.SetConfigItem("lxc.utsname", ContainerName); err != nil {
+ if err := c.SetConfigItem("lxc.utsname", ContainerName()); err != nil {
t.Errorf(err.Error())
}
- if c.ConfigItem("lxc.utsname")[0] != ContainerName {
+ if c.ConfigItem("lxc.utsname")[0] != ContainerName() {
t.Errorf("ConfigItem failed...")
}
}
func TestRunningConfigItem(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if c.RunningConfigItem("lxc.network.0.type") == nil {
t.Errorf("RunningConfigItem failed...")
@@ -630,10 +757,11 @@ func TestRunningConfigItem(t *testing.T) {
}
func TestSetCgroupItem(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
maxMem := c.CgroupItem("memory.max_usage_in_bytes")[0]
currentMem := c.CgroupItem("memory.limit_in_bytes")[0]
@@ -648,10 +776,11 @@ func TestSetCgroupItem(t *testing.T) {
}
func TestClearConfigItem(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.ClearConfigItem("lxc.cap.drop"); err != nil {
t.Errorf(err.Error())
@@ -662,10 +791,11 @@ func TestClearConfigItem(t *testing.T) {
}
func TestConfigKeys(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
keys := ""
if VersionAtLeast(2, 1, 0) {
@@ -680,10 +810,11 @@ func TestConfigKeys(t *testing.T) {
}
func TestInterfaces(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.Interfaces(); err != nil {
t.Errorf(err.Error())
@@ -691,10 +822,11 @@ func TestInterfaces(t *testing.T) {
}
func TestInterfaceStats(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.InterfaceStats(); err != nil {
t.Errorf(err.Error())
@@ -702,10 +834,11 @@ func TestInterfaceStats(t *testing.T) {
}
func TestMemoryUsage(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.MemoryUsage(); err != nil {
t.Errorf(err.Error())
@@ -713,10 +846,11 @@ func TestMemoryUsage(t *testing.T) {
}
func TestKernelMemoryUsage(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.KernelMemoryUsage(); err != nil {
t.Errorf(err.Error())
@@ -724,14 +858,15 @@ func TestKernelMemoryUsage(t *testing.T) {
}
func TestMemorySwapUsage(t *testing.T) {
- if !PathExists("/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes") {
+ if !exists("/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes") {
t.Skip("skipping the test as it requires memory.memsw.limit_in_bytes to be set")
}
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.MemorySwapUsage(); err != nil {
t.Errorf(err.Error())
@@ -739,10 +874,11 @@ func TestMemorySwapUsage(t *testing.T) {
}
func TestBlkioUsage(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.BlkioUsage(); err != nil {
t.Errorf(err.Error())
@@ -750,10 +886,11 @@ func TestBlkioUsage(t *testing.T) {
}
func TestMemoryLimit(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.MemoryLimit(); err != nil {
t.Errorf(err.Error())
@@ -761,10 +898,11 @@ func TestMemoryLimit(t *testing.T) {
}
func TestSoftMemoryLimit(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.SoftMemoryLimit(); err != nil {
t.Errorf(err.Error())
@@ -772,10 +910,11 @@ func TestSoftMemoryLimit(t *testing.T) {
}
func TestKernelMemoryLimit(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.KernelMemoryLimit(); err != nil {
t.Errorf(err.Error())
@@ -783,14 +922,15 @@ func TestKernelMemoryLimit(t *testing.T) {
}
func TestMemorySwapLimit(t *testing.T) {
- if !PathExists("/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes") {
+ if !exists("/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes") {
t.Skip("skipping the test as it requires memory.memsw.limit_in_bytes to be set")
}
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.MemorySwapLimit(); err != nil {
t.Errorf(err.Error())
@@ -798,10 +938,11 @@ func TestMemorySwapLimit(t *testing.T) {
}
func TestSetMemoryLimit(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
oldMemLimit, err := c.MemoryLimit()
if err != nil {
@@ -823,10 +964,11 @@ func TestSetMemoryLimit(t *testing.T) {
}
func TestSetSoftMemoryLimit(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
oldMemLimit, err := c.MemoryLimit()
if err != nil {
@@ -850,10 +992,11 @@ func TestSetSoftMemoryLimit(t *testing.T) {
func TestSetKernelMemoryLimit(t *testing.T) {
t.Skip("skipping the test as it requires memory.kmem.limit_in_bytes to be set")
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
oldMemLimit, err := c.KernelMemoryLimit()
if err != nil {
@@ -876,14 +1019,15 @@ func TestSetKernelMemoryLimit(t *testing.T) {
}
func TestSetMemorySwapLimit(t *testing.T) {
- if !PathExists("/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes") {
+ if !exists("/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes") {
t.Skip("skipping the test as it requires memory.memsw.limit_in_bytes to be set")
}
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
oldMemorySwapLimit, err := c.MemorySwapLimit()
if err != nil {
@@ -905,10 +1049,11 @@ func TestSetMemorySwapLimit(t *testing.T) {
}
func TestCPUTime(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.CPUTime(); err != nil {
t.Errorf(err.Error())
@@ -916,10 +1061,11 @@ func TestCPUTime(t *testing.T) {
}
func TestCPUTimePerCPU(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.CPUTimePerCPU(); err != nil {
t.Errorf(err.Error())
@@ -927,10 +1073,11 @@ func TestCPUTimePerCPU(t *testing.T) {
}
func TestCPUStats(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.CPUStats(); err != nil {
t.Errorf(err.Error())
@@ -943,8 +1090,9 @@ func TestRunCommandNoWait(t *testing.T) {
t.Errorf(err.Error())
t.FailNow()
}
+ defer c.Release()
- if err := c.Create(BusyboxTemplateOptions); err != nil {
+ if err := c.Create(template()); err != nil {
t.Errorf(err.Error())
t.FailNow()
}
@@ -1006,10 +1154,11 @@ func TestRunCommandNoWait(t *testing.T) {
}
func TestRunCommand(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
argsThree := []string{"/bin/sh", "-c", "exit 0"}
ok, err := c.RunCommand(argsThree, DefaultAttachOptions)
@@ -1031,10 +1180,11 @@ func TestRunCommand(t *testing.T) {
}
func TestCommandWithEnv(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
options := DefaultAttachOptions
options.Env = []string{"FOO=BAR"}
@@ -1051,10 +1201,11 @@ func TestCommandWithEnv(t *testing.T) {
}
func TestCommandWithEnvToKeep(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
options := DefaultAttachOptions
options.ClearEnv = true
@@ -1071,10 +1222,11 @@ func TestCommandWithEnvToKeep(t *testing.T) {
}
func TestCommandWithCwd(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
options := DefaultAttachOptions
options.Cwd = "/tmp"
@@ -1090,10 +1242,11 @@ func TestCommandWithCwd(t *testing.T) {
}
func TestCommandWithUIDGID(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
options := DefaultAttachOptions
options.UID = 1000
@@ -1127,10 +1280,11 @@ func TestCommandWithArch(t *testing.T) {
t.Skip("skipping architecture test, not on x86")
}
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
options := DefaultAttachOptions
options.Arch = X86
@@ -1146,10 +1300,11 @@ func TestCommandWithArch(t *testing.T) {
}
func TestConsoleFd(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.ConsoleFd(0); err != nil {
t.Errorf(err.Error())
@@ -1157,14 +1312,11 @@ func TestConsoleFd(t *testing.T) {
}
func TestIPAddress(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
-
- if unprivileged() {
- time.Sleep(3 * time.Second)
- }
+ defer c.Release()
if _, err := c.IPAddress("lo"); err != nil {
t.Errorf(err.Error())
@@ -1172,14 +1324,11 @@ func TestIPAddress(t *testing.T) {
}
func TestIPv4Address(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
-
- if unprivileged() {
- time.Sleep(3 * time.Second)
- }
+ defer c.Release()
if _, err := c.IPv4Address("lo"); err != nil {
t.Errorf(err.Error())
@@ -1187,14 +1336,15 @@ func TestIPv4Address(t *testing.T) {
}
func TestIPv46ddress(t *testing.T) {
- c, err := NewContainer(ContainerName)
- if err != nil {
- t.Errorf(err.Error())
+ if !ipv6() {
+ t.Skip("skipping test since lxc bridge does not have ipv6 address")
}
- if unprivileged() {
- time.Sleep(3 * time.Second)
+ c, err := NewContainer(ContainerName())
+ if err != nil {
+ t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.IPv6Address("lo"); err != nil {
t.Errorf(err.Error())
@@ -1206,10 +1356,15 @@ func TestAddDeviceNode(t *testing.T) {
t.Skip("skipping test in unprivileged mode.")
}
- c, err := NewContainer(ContainerName)
+ if !exists("/dev/network_latency") {
+ t.Skip("skipping the test as it requires/dev/network_latency")
+ }
+
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.AddDeviceNode("/dev/network_latency"); err != nil {
t.Errorf(err.Error())
@@ -1221,10 +1376,15 @@ func TestRemoveDeviceNode(t *testing.T) {
t.Skip("skipping test in unprivileged mode.")
}
- c, err := NewContainer(ContainerName)
+ if !exists("/dev/network_latency") {
+ t.Skip("skipping the test as it requires/dev/network_latency")
+ }
+
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.RemoveDeviceNode("/dev/network_latency"); err != nil {
t.Errorf(err.Error())
@@ -1236,10 +1396,11 @@ func TestIPv4Addresses(t *testing.T) {
t.Skip("skipping test in privileged mode.")
}
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.IPv4Addresses(); err != nil {
t.Errorf(err.Error())
@@ -1251,10 +1412,15 @@ func TestIPv6Addresses(t *testing.T) {
t.Skip("skipping test in privileged mode.")
}
- c, err := NewContainer(ContainerName)
+ if !ipv6() {
+ t.Skip("skipping test since lxc bridge does not have ipv6 address")
+ }
+
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if _, err := c.IPv6Addresses(); err != nil {
t.Errorf(err.Error())
@@ -1262,10 +1428,11 @@ func TestIPv6Addresses(t *testing.T) {
}
func TestReboot(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.Reboot(); err != nil {
t.Errorf("Rebooting the container failed...")
@@ -1289,6 +1456,7 @@ func TestConcurrentShutdown(t *testing.T) {
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.Shutdown(30 * time.Second); err != nil {
t.Errorf(err.Error())
@@ -1306,10 +1474,11 @@ func TestConcurrentShutdown(t *testing.T) {
}
func TestShutdown(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.Shutdown(30 * time.Second); err != nil {
t.Errorf(err.Error())
@@ -1322,10 +1491,11 @@ func TestShutdown(t *testing.T) {
}
func TestStop(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.Start(); err != nil {
t.Errorf(err.Error())
@@ -1342,22 +1512,24 @@ func TestStop(t *testing.T) {
}
func TestDestroySnapshot(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
- snapshot := Snapshot{Name: SnapshotName}
+ snapshot := Snapshot{Name: DefaultSnapshotName}
if err := c.DestroySnapshot(snapshot); err != nil {
t.Errorf(err.Error())
}
}
func TestDestroyAllSnapshots(t *testing.T) {
- c, err := NewContainer(ContainerName)
+ c, err := NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.DestroyAllSnapshots(); err != nil {
if err == ErrNotSupported {
@@ -1368,11 +1540,12 @@ func TestDestroyAllSnapshots(t *testing.T) {
}
func TestDestroy(t *testing.T) {
- if supported("overlayfs") {
- c, err := NewContainer(ContainerCloneOverlayName)
+ if supported("overlayfs") || supported("overlay") {
+ c, err := NewContainer(ContainerCloneOverlayName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.Destroy(); err != nil {
t.Errorf(err.Error())
@@ -1380,37 +1553,41 @@ func TestDestroy(t *testing.T) {
}
if !unprivileged() && supported("aufs") {
- c, err := NewContainer(ContainerCloneAufsName)
+ c, err := NewContainer(ContainerCloneAufsName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.Destroy(); err != nil {
t.Errorf(err.Error())
}
}
- c, err := NewContainer(ContainerCloneName)
+ c, err := NewContainer(ContainerCloneName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.Destroy(); err != nil {
t.Errorf(err.Error())
}
- c, err = NewContainer(ContainerRestoreName)
+ c, err = NewContainer(ContainerRestoreName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.Destroy(); err != nil {
t.Errorf(err.Error())
}
- c, err = NewContainer(ContainerName)
+ c, err = NewContainer(ContainerName())
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
if err := c.Destroy(); err != nil {
t.Errorf(err.Error())
@@ -1433,6 +1610,7 @@ func TestConcurrentDestroy(t *testing.T) {
if err != nil {
t.Errorf(err.Error())
}
+ defer c.Release()
// sleep for a while to simulate some dummy work
time.Sleep(time.Millisecond * time.Duration(rand.Intn(250)))
More information about the lxc-devel
mailing list