cmd/swarm: fix process leak in TestACT and TestSwarmUp

Each test run we start 3 nodes, but we did not terminate them. So
those 3 nodes continued eating up 1.2GB (3.4GB with -race) after test
completion.

6b6c4d1c27 changed how we start clusters
to speed up tests. The changeset merged together test cases
and introduced a global cluster. But "forgot" about termination.

Let's get rid of "global cluster" so we have a clear owner of
termination (some time sacrifice), while leaving subtests to use the
same cluster.
This commit is contained in:
Ferenc Szabo 2019-03-19 15:28:06 +01:00
parent e0841be359
commit dbe7d298a2
3 changed files with 35 additions and 38 deletions

View file

@ -52,11 +52,12 @@ func TestACT(t *testing.T) {
t.Skip() t.Skip()
} }
initCluster(t) cluster := newTestCluster(t, clusterSize)
defer cluster.Shutdown()
cases := []struct { cases := []struct {
name string name string
f func(t *testing.T) f func(t *testing.T, cluster *testCluster)
}{ }{
{"Password", testPassword}, {"Password", testPassword},
{"PK", testPK}, {"PK", testPK},
@ -65,7 +66,9 @@ func TestACT(t *testing.T) {
} }
for _, tc := range cases { for _, tc := range cases {
t.Run(tc.name, tc.f) t.Run(tc.name, func(t *testing.T) {
tc.f(t, cluster)
})
} }
} }
@ -74,7 +77,7 @@ func TestACT(t *testing.T) {
// The parties participating - node (publisher), uploads to second node then disappears. Content which was uploaded // The parties participating - node (publisher), uploads to second node then disappears. Content which was uploaded
// is then fetched through 2nd node. since the tested code is not key-aware - we can just // is then fetched through 2nd node. since the tested code is not key-aware - we can just
// fetch from the 2nd node using HTTP BasicAuth // fetch from the 2nd node using HTTP BasicAuth
func testPassword(t *testing.T) { func testPassword(t *testing.T, cluster *testCluster) {
dataFilename := testutil.TempFileWithContent(t, data) dataFilename := testutil.TempFileWithContent(t, data)
defer os.RemoveAll(dataFilename) defer os.RemoveAll(dataFilename)
@ -226,7 +229,7 @@ func testPassword(t *testing.T) {
// The parties participating - node (publisher), uploads to second node (which is also the grantee) then disappears. // The parties participating - node (publisher), uploads to second node (which is also the grantee) then disappears.
// Content which was uploaded is then fetched through the grantee's http proxy. Since the tested code is private-key aware, // Content which was uploaded is then fetched through the grantee's http proxy. Since the tested code is private-key aware,
// the test will fail if the proxy's given private key is not granted on the ACT. // the test will fail if the proxy's given private key is not granted on the ACT.
func testPK(t *testing.T) { func testPK(t *testing.T, cluster *testCluster) {
dataFilename := testutil.TempFileWithContent(t, data) dataFilename := testutil.TempFileWithContent(t, data)
defer os.RemoveAll(dataFilename) defer os.RemoveAll(dataFilename)
@ -359,13 +362,13 @@ func testPK(t *testing.T) {
} }
// testACTWithoutBogus tests the creation of the ACT manifest end-to-end, without any bogus entries (i.e. default scenario = 3 nodes 1 unauthorized) // testACTWithoutBogus tests the creation of the ACT manifest end-to-end, without any bogus entries (i.e. default scenario = 3 nodes 1 unauthorized)
func testACTWithoutBogus(t *testing.T) { func testACTWithoutBogus(t *testing.T, cluster *testCluster) {
testACT(t, 0) testACT(t, cluster, 0)
} }
// testACTWithBogus tests the creation of the ACT manifest end-to-end, with 100 bogus entries (i.e. 100 EC keys + default scenario = 3 nodes 1 unauthorized = 103 keys in the ACT manifest) // testACTWithBogus tests the creation of the ACT manifest end-to-end, with 100 bogus entries (i.e. 100 EC keys + default scenario = 3 nodes 1 unauthorized = 103 keys in the ACT manifest)
func testACTWithBogus(t *testing.T) { func testACTWithBogus(t *testing.T, cluster *testCluster) {
testACT(t, 100) testACT(t, cluster, 100)
} }
// testACT tests the e2e creation, uploading and downloading of an ACT access control with both EC keys AND password protection // testACT tests the e2e creation, uploading and downloading of an ACT access control with both EC keys AND password protection
@ -373,7 +376,7 @@ func testACTWithBogus(t *testing.T) {
// set and also protects the ACT with a password. the third node should fail decoding the reference as it will not be granted access. // set and also protects the ACT with a password. the third node should fail decoding the reference as it will not be granted access.
// the third node then then tries to download using a correct password (and succeeds) then uses a wrong password and fails. // the third node then then tries to download using a correct password (and succeeds) then uses a wrong password and fails.
// the publisher uploads through one of the nodes then disappears. // the publisher uploads through one of the nodes then disappears.
func testACT(t *testing.T, bogusEntries int) { func testACT(t *testing.T, cluster *testCluster, bogusEntries int) {
var uploadThroughNode = cluster.Nodes[0] var uploadThroughNode = cluster.Nodes[0]
client := swarmapi.NewClient(uploadThroughNode.URL) client := swarmapi.NewClient(uploadThroughNode.URL)

View file

@ -59,15 +59,6 @@ func init() {
const clusterSize = 3 const clusterSize = 3
var clusteronce sync.Once
var cluster *testCluster
func initCluster(t *testing.T) {
clusteronce.Do(func() {
cluster = newTestCluster(t, clusterSize)
})
}
func serverFunc(api *api.API) swarmhttp.TestServer { func serverFunc(api *api.API) swarmhttp.TestServer {
return swarmhttp.NewServer(api, "") return swarmhttp.NewServer(api, "")
} }

View file

@ -46,11 +46,12 @@ func TestSwarmUp(t *testing.T) {
t.Skip() t.Skip()
} }
initCluster(t) cluster := newTestCluster(t, clusterSize)
defer cluster.Shutdown()
cases := []struct { cases := []struct {
name string name string
f func(t *testing.T) f func(t *testing.T, cluster *testCluster)
}{ }{
{"NoEncryption", testNoEncryption}, {"NoEncryption", testNoEncryption},
{"Encrypted", testEncrypted}, {"Encrypted", testEncrypted},
@ -60,31 +61,33 @@ func TestSwarmUp(t *testing.T) {
} }
for _, tc := range cases { for _, tc := range cases {
t.Run(tc.name, tc.f) t.Run(tc.name, func(t *testing.T) {
tc.f(t, cluster)
})
} }
} }
// testNoEncryption tests that running 'swarm up' makes the resulting file // testNoEncryption tests that running 'swarm up' makes the resulting file
// available from all nodes via the HTTP API // available from all nodes via the HTTP API
func testNoEncryption(t *testing.T) { func testNoEncryption(t *testing.T, cluster *testCluster) {
testDefault(false, t) testDefault(t, cluster, false)
} }
// testEncrypted tests that running 'swarm up --encrypted' makes the resulting file // testEncrypted tests that running 'swarm up --encrypted' makes the resulting file
// available from all nodes via the HTTP API // available from all nodes via the HTTP API
func testEncrypted(t *testing.T) { func testEncrypted(t *testing.T, cluster *testCluster) {
testDefault(true, t) testDefault(t, cluster, true)
} }
func testRecursiveNoEncryption(t *testing.T) { func testRecursiveNoEncryption(t *testing.T, cluster *testCluster) {
testRecursive(false, t) testRecursive(t, cluster, false)
} }
func testRecursiveEncrypted(t *testing.T) { func testRecursiveEncrypted(t *testing.T, cluster *testCluster) {
testRecursive(true, t) testRecursive(t, cluster, true)
} }
func testDefault(toEncrypt bool, t *testing.T) { func testDefault(t *testing.T, cluster *testCluster, toEncrypt bool) {
tmpFileName := testutil.TempFileWithContent(t, data) tmpFileName := testutil.TempFileWithContent(t, data)
defer os.Remove(tmpFileName) defer os.Remove(tmpFileName)
@ -189,7 +192,7 @@ func testDefault(toEncrypt bool, t *testing.T) {
} }
} }
func testRecursive(toEncrypt bool, t *testing.T) { func testRecursive(t *testing.T, cluster *testCluster, toEncrypt bool) {
tmpUploadDir, err := ioutil.TempDir("", "swarm-test") tmpUploadDir, err := ioutil.TempDir("", "swarm-test")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@ -279,14 +282,14 @@ func testRecursive(toEncrypt bool, t *testing.T) {
// testDefaultPathAll tests swarm recursive upload with relative and absolute // testDefaultPathAll tests swarm recursive upload with relative and absolute
// default paths and with encryption. // default paths and with encryption.
func testDefaultPathAll(t *testing.T) { func testDefaultPathAll(t *testing.T, cluster *testCluster) {
testDefaultPath(false, false, t) testDefaultPath(t, cluster, false, false)
testDefaultPath(false, true, t) testDefaultPath(t, cluster, false, true)
testDefaultPath(true, false, t) testDefaultPath(t, cluster, true, false)
testDefaultPath(true, true, t) testDefaultPath(t, cluster, true, true)
} }
func testDefaultPath(toEncrypt bool, absDefaultPath bool, t *testing.T) { func testDefaultPath(t *testing.T, cluster *testCluster, toEncrypt bool, absDefaultPath bool) {
tmp, err := ioutil.TempDir("", "swarm-defaultpath-test") tmp, err := ioutil.TempDir("", "swarm-defaultpath-test")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)