[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