1package netns
2
3import (
4	"runtime"
5	"sync"
6	"testing"
7)
8
9func TestGetNewSetDelete(t *testing.T) {
10	runtime.LockOSThread()
11	defer runtime.UnlockOSThread()
12
13	origns, err := Get()
14	if err != nil {
15		t.Fatal(err)
16	}
17	newns, err := New()
18	if err != nil {
19		t.Fatal(err)
20	}
21	if origns.Equal(newns) {
22		t.Fatal("New ns failed")
23	}
24	if err := Set(origns); err != nil {
25		t.Fatal(err)
26	}
27	newns.Close()
28	if newns.IsOpen() {
29		t.Fatal("newns still open after close", newns)
30	}
31	ns, err := Get()
32	if err != nil {
33		t.Fatal(err)
34	}
35	if !ns.Equal(origns) {
36		t.Fatal("Reset ns failed", origns, newns, ns)
37	}
38}
39
40func TestNone(t *testing.T) {
41	ns := None()
42	if ns.IsOpen() {
43		t.Fatal("None ns is open", ns)
44	}
45}
46
47func TestThreaded(t *testing.T) {
48	ncpu := runtime.GOMAXPROCS(-1)
49	if ncpu < 2 {
50		t.Skip("-cpu=2 or larger required")
51	}
52
53	// Lock this thread simply to ensure other threads get used.
54	runtime.LockOSThread()
55	defer runtime.UnlockOSThread()
56
57	wg := &sync.WaitGroup{}
58	for i := 0; i < ncpu; i++ {
59		wg.Add(1)
60		go func() {
61			defer wg.Done()
62			TestGetNewSetDelete(t)
63		}()
64	}
65	wg.Wait()
66}
67