diff options
author | Matthew Heon <matthew.heon@gmail.com> | 2018-03-27 13:23:23 -0400 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-03-29 02:18:45 +0000 |
commit | b1dfee50e826bb3e4a699c89fabdb3bfcdaae86b (patch) | |
tree | 4258f39aa67bbcbc220d3533cf3bc2ec86df7fd1 /libpod/container_graph_test.go | |
parent | 120520af349bd6f23133fcf2e7f3b6efa0f7a7ad (diff) | |
download | podman-b1dfee50e826bb3e4a699c89fabdb3bfcdaae86b.tar.gz podman-b1dfee50e826bb3e4a699c89fabdb3bfcdaae86b.tar.bz2 podman-b1dfee50e826bb3e4a699c89fabdb3bfcdaae86b.zip |
Add tests for container graphs
Signed-off-by: Matthew Heon <matthew.heon@gmail.com>
Closes: #557
Approved by: rhatdan
Diffstat (limited to 'libpod/container_graph_test.go')
-rw-r--r-- | libpod/container_graph_test.go | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/libpod/container_graph_test.go b/libpod/container_graph_test.go new file mode 100644 index 000000000..2303a05dd --- /dev/null +++ b/libpod/container_graph_test.go @@ -0,0 +1,293 @@ +package libpod + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBuildContainerGraphNoCtrsIsEmpty(t *testing.T) { + graph, err := buildContainerGraph([]*Container{}) + assert.NoError(t, err) + assert.Equal(t, 0, len(graph.nodes)) + assert.Equal(t, 0, len(graph.noDepNodes)) + assert.Equal(t, 0, len(graph.notDependedOnNodes)) +} + +func TestBuildContainerGraphOneCtr(t *testing.T) { + tmpDir, err := ioutil.TempDir("", tmpDirPrefix) + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + + ctr1, err := getTestCtr1(tmpDir) + assert.NoError(t, err) + + graph, err := buildContainerGraph([]*Container{ctr1}) + assert.NoError(t, err) + assert.Equal(t, 1, len(graph.nodes)) + assert.Equal(t, 1, len(graph.noDepNodes)) + assert.Equal(t, 1, len(graph.notDependedOnNodes)) + + node, ok := graph.nodes[ctr1.ID()] + assert.True(t, ok) + assert.Equal(t, ctr1.ID(), node.id) + + assert.Equal(t, ctr1.ID(), graph.noDepNodes[0].id) + assert.Equal(t, ctr1.ID(), graph.notDependedOnNodes[0].id) +} + +func TestBuildContainerGraphTwoCtrNoEdge(t *testing.T) { + tmpDir, err := ioutil.TempDir("", tmpDirPrefix) + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + + ctr1, err := getTestCtr1(tmpDir) + assert.NoError(t, err) + ctr2, err := getTestCtr2(tmpDir) + assert.NoError(t, err) + + graph, err := buildContainerGraph([]*Container{ctr1, ctr2}) + assert.NoError(t, err) + assert.Equal(t, 2, len(graph.nodes)) + assert.Equal(t, 2, len(graph.noDepNodes)) + assert.Equal(t, 2, len(graph.notDependedOnNodes)) + + node1, ok := graph.nodes[ctr1.ID()] + assert.True(t, ok) + assert.Equal(t, ctr1.ID(), node1.id) + + node2, ok := graph.nodes[ctr2.ID()] + assert.True(t, ok) + assert.Equal(t, ctr2.ID(), node2.id) +} + +func TestBuildContainerGraphTwoCtrOneEdge(t *testing.T) { + tmpDir, err := ioutil.TempDir("", tmpDirPrefix) + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + + ctr1, err := getTestCtr1(tmpDir) + assert.NoError(t, err) + ctr2, err := getTestCtr2(tmpDir) + assert.NoError(t, err) + ctr2.config.UserNsCtr = ctr1.config.ID + + graph, err := buildContainerGraph([]*Container{ctr1, ctr2}) + assert.NoError(t, err) + assert.Equal(t, 2, len(graph.nodes)) + assert.Equal(t, 1, len(graph.noDepNodes)) + assert.Equal(t, 1, len(graph.notDependedOnNodes)) + + assert.Equal(t, ctr1.ID(), graph.noDepNodes[0].id) + assert.Equal(t, ctr2.ID(), graph.notDependedOnNodes[0].id) +} + +func TestBuildContainerGraphTwoCtrCycle(t *testing.T) { + tmpDir, err := ioutil.TempDir("", tmpDirPrefix) + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + + ctr1, err := getTestCtr1(tmpDir) + assert.NoError(t, err) + ctr2, err := getTestCtr2(tmpDir) + assert.NoError(t, err) + ctr2.config.UserNsCtr = ctr1.config.ID + ctr1.config.NetNsCtr = ctr2.config.ID + + _, err = buildContainerGraph([]*Container{ctr1, ctr2}) + assert.Error(t, err) +} + +func TestBuildContainerGraphThreeCtrNoEdges(t *testing.T) { + tmpDir, err := ioutil.TempDir("", tmpDirPrefix) + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + + ctr1, err := getTestCtr1(tmpDir) + assert.NoError(t, err) + ctr2, err := getTestCtr2(tmpDir) + assert.NoError(t, err) + ctr3, err := getTestCtrN("3", tmpDir) + assert.NoError(t, err) + + graph, err := buildContainerGraph([]*Container{ctr1, ctr2, ctr3}) + assert.NoError(t, err) + assert.Equal(t, 3, len(graph.nodes)) + assert.Equal(t, 3, len(graph.noDepNodes)) + assert.Equal(t, 3, len(graph.notDependedOnNodes)) + + node1, ok := graph.nodes[ctr1.ID()] + assert.True(t, ok) + assert.Equal(t, ctr1.ID(), node1.id) + + node2, ok := graph.nodes[ctr2.ID()] + assert.True(t, ok) + assert.Equal(t, ctr2.ID(), node2.id) + + node3, ok := graph.nodes[ctr3.ID()] + assert.True(t, ok) + assert.Equal(t, ctr3.ID(), node3.id) +} + +func TestBuildContainerGraphThreeContainersTwoInCycle(t *testing.T) { + tmpDir, err := ioutil.TempDir("", tmpDirPrefix) + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + + ctr1, err := getTestCtr1(tmpDir) + assert.NoError(t, err) + ctr2, err := getTestCtr2(tmpDir) + assert.NoError(t, err) + ctr3, err := getTestCtrN("3", tmpDir) + assert.NoError(t, err) + ctr1.config.UserNsCtr = ctr2.config.ID + ctr2.config.IPCNsCtr = ctr1.config.ID + + _, err = buildContainerGraph([]*Container{ctr1, ctr2, ctr3}) + assert.Error(t, err) +} + +func TestBuildContainerGraphThreeContainersCycle(t *testing.T) { + tmpDir, err := ioutil.TempDir("", tmpDirPrefix) + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + + ctr1, err := getTestCtr1(tmpDir) + assert.NoError(t, err) + ctr2, err := getTestCtr2(tmpDir) + assert.NoError(t, err) + ctr3, err := getTestCtrN("3", tmpDir) + assert.NoError(t, err) + ctr1.config.UserNsCtr = ctr2.config.ID + ctr2.config.IPCNsCtr = ctr3.config.ID + ctr3.config.NetNsCtr = ctr1.config.ID + + _, err = buildContainerGraph([]*Container{ctr1, ctr2, ctr3}) + assert.Error(t, err) +} + +func TestBuildContainerGraphThreeContainersNoCycle(t *testing.T) { + tmpDir, err := ioutil.TempDir("", tmpDirPrefix) + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + + ctr1, err := getTestCtr1(tmpDir) + assert.NoError(t, err) + ctr2, err := getTestCtr2(tmpDir) + assert.NoError(t, err) + ctr3, err := getTestCtrN("3", tmpDir) + assert.NoError(t, err) + ctr1.config.UserNsCtr = ctr2.config.ID + ctr1.config.NetNsCtr = ctr3.config.ID + ctr2.config.IPCNsCtr = ctr3.config.ID + + graph, err := buildContainerGraph([]*Container{ctr1, ctr2, ctr3}) + assert.NoError(t, err) + assert.Equal(t, 3, len(graph.nodes)) + assert.Equal(t, 1, len(graph.noDepNodes)) + assert.Equal(t, 1, len(graph.notDependedOnNodes)) + + assert.Equal(t, ctr3.ID(), graph.noDepNodes[0].id) + assert.Equal(t, ctr1.ID(), graph.notDependedOnNodes[0].id) +} + +func TestBuildContainerGraphFourContainersNoEdges(t *testing.T) { + tmpDir, err := ioutil.TempDir("", tmpDirPrefix) + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + + ctr1, err := getTestCtr1(tmpDir) + assert.NoError(t, err) + ctr2, err := getTestCtr2(tmpDir) + assert.NoError(t, err) + ctr3, err := getTestCtrN("3", tmpDir) + assert.NoError(t, err) + ctr4, err := getTestCtrN("4", tmpDir) + + graph, err := buildContainerGraph([]*Container{ctr1, ctr2, ctr3, ctr4}) + assert.NoError(t, err) + assert.Equal(t, 4, len(graph.nodes)) + assert.Equal(t, 4, len(graph.noDepNodes)) + assert.Equal(t, 4, len(graph.notDependedOnNodes)) + + node1, ok := graph.nodes[ctr1.ID()] + assert.True(t, ok) + assert.Equal(t, ctr1.ID(), node1.id) + + node2, ok := graph.nodes[ctr2.ID()] + assert.True(t, ok) + assert.Equal(t, ctr2.ID(), node2.id) + + node3, ok := graph.nodes[ctr3.ID()] + assert.True(t, ok) + assert.Equal(t, ctr3.ID(), node3.id) + + node4, ok := graph.nodes[ctr4.ID()] + assert.True(t, ok) + assert.Equal(t, ctr4.ID(), node4.id) +} + +func TestBuildContainerGraphFourContainersTwoInCycle(t *testing.T) { + tmpDir, err := ioutil.TempDir("", tmpDirPrefix) + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + + ctr1, err := getTestCtr1(tmpDir) + assert.NoError(t, err) + ctr2, err := getTestCtr2(tmpDir) + assert.NoError(t, err) + ctr3, err := getTestCtrN("3", tmpDir) + assert.NoError(t, err) + ctr4, err := getTestCtrN("4", tmpDir) + ctr1.config.IPCNsCtr = ctr2.config.ID + ctr2.config.UserNsCtr = ctr1.config.ID + + _, err = buildContainerGraph([]*Container{ctr1, ctr2, ctr3, ctr4}) + assert.Error(t, err) +} + +func TestBuildContainerGraphFourContainersAllInCycle(t *testing.T) { + tmpDir, err := ioutil.TempDir("", tmpDirPrefix) + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + + ctr1, err := getTestCtr1(tmpDir) + assert.NoError(t, err) + ctr2, err := getTestCtr2(tmpDir) + assert.NoError(t, err) + ctr3, err := getTestCtrN("3", tmpDir) + assert.NoError(t, err) + ctr4, err := getTestCtrN("4", tmpDir) + ctr1.config.IPCNsCtr = ctr2.config.ID + ctr2.config.UserNsCtr = ctr3.config.ID + ctr3.config.NetNsCtr = ctr4.config.ID + ctr4.config.UTSNsCtr = ctr1.config.ID + + _, err = buildContainerGraph([]*Container{ctr1, ctr2, ctr3, ctr4}) + assert.Error(t, err) +} + +func TestBuildContainerGraphFourContainersNoneInCycle(t *testing.T) { + tmpDir, err := ioutil.TempDir("", tmpDirPrefix) + assert.NoError(t, err) + defer os.RemoveAll(tmpDir) + + ctr1, err := getTestCtr1(tmpDir) + assert.NoError(t, err) + ctr2, err := getTestCtr2(tmpDir) + assert.NoError(t, err) + ctr3, err := getTestCtrN("3", tmpDir) + assert.NoError(t, err) + ctr4, err := getTestCtrN("4", tmpDir) + ctr1.config.IPCNsCtr = ctr2.config.ID + ctr1.config.NetNsCtr = ctr3.config.ID + ctr2.config.UserNsCtr = ctr3.config.ID + + graph, err := buildContainerGraph([]*Container{ctr1, ctr2, ctr3, ctr4}) + assert.NoError(t, err) + assert.Equal(t, 4, len(graph.nodes)) + assert.Equal(t, 2, len(graph.noDepNodes)) + assert.Equal(t, 2, len(graph.notDependedOnNodes)) +} |