Skip to content

Commit de61737

Browse files
committed
Move methods/classes used by all integration tests to helpers.py
Ensure setup_module is called at session level, making the test suite not order dependent. Test files can be invoked independently. Signed-off-by: Joffrey F <[email protected]>
1 parent e1eefce commit de61737

File tree

10 files changed

+179
-178
lines changed

10 files changed

+179
-178
lines changed

tests/helpers.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
import os
22
import os.path
3+
import shutil
34
import tarfile
45
import tempfile
6+
import unittest
7+
8+
import docker
9+
import six
10+
11+
BUSYBOX = 'busybox:buildroot-2014.02'
12+
EXEC_DRIVER = []
513

614

715
def make_tree(dirs, files):
@@ -35,3 +43,82 @@ def untar_file(tardata, filename):
3543
result = f.read()
3644
f.close()
3745
return result
46+
47+
48+
def exec_driver_is_native():
49+
global EXEC_DRIVER
50+
if not EXEC_DRIVER:
51+
c = docker_client()
52+
EXEC_DRIVER = c.info()['ExecutionDriver']
53+
c.close()
54+
return EXEC_DRIVER.startswith('native')
55+
56+
57+
def docker_client(**kwargs):
58+
return docker.Client(**docker_client_kwargs(**kwargs))
59+
60+
61+
def docker_client_kwargs(**kwargs):
62+
client_kwargs = docker.utils.kwargs_from_env(assert_hostname=False)
63+
client_kwargs.update(kwargs)
64+
return client_kwargs
65+
66+
67+
class BaseTestCase(unittest.TestCase):
68+
tmp_imgs = []
69+
tmp_containers = []
70+
tmp_folders = []
71+
tmp_volumes = []
72+
73+
def setUp(self):
74+
if six.PY2:
75+
self.assertRegex = self.assertRegexpMatches
76+
self.assertCountEqual = self.assertItemsEqual
77+
self.client = docker_client(timeout=60)
78+
self.tmp_imgs = []
79+
self.tmp_containers = []
80+
self.tmp_folders = []
81+
self.tmp_volumes = []
82+
self.tmp_networks = []
83+
84+
def tearDown(self):
85+
for img in self.tmp_imgs:
86+
try:
87+
self.client.remove_image(img)
88+
except docker.errors.APIError:
89+
pass
90+
for container in self.tmp_containers:
91+
try:
92+
self.client.stop(container, timeout=1)
93+
self.client.remove_container(container)
94+
except docker.errors.APIError:
95+
pass
96+
for network in self.tmp_networks:
97+
try:
98+
self.client.remove_network(network)
99+
except docker.errors.APIError:
100+
pass
101+
for folder in self.tmp_folders:
102+
shutil.rmtree(folder)
103+
104+
for volume in self.tmp_volumes:
105+
try:
106+
self.client.remove_volume(volume)
107+
except docker.errors.APIError:
108+
pass
109+
110+
self.client.close()
111+
112+
def run_container(self, *args, **kwargs):
113+
container = self.client.create_container(*args, **kwargs)
114+
self.tmp_containers.append(container)
115+
self.client.start(container)
116+
exitcode = self.client.wait(container)
117+
118+
if exitcode != 0:
119+
output = self.client.logs(container)
120+
raise Exception(
121+
"Container exited with code {}:\n{}"
122+
.format(exitcode, output))
123+
124+
return container

tests/integration/api_test.py

Lines changed: 13 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,125 +1,16 @@
11
import base64
2-
import json
32
import os
4-
import shutil
53
import tempfile
64
import time
75
import unittest
86
import warnings
97

108
import docker
11-
import six
129

13-
BUSYBOX = 'busybox:buildroot-2014.02'
14-
EXEC_DRIVER = []
10+
from .. import helpers
1511

1612

17-
def exec_driver_is_native():
18-
global EXEC_DRIVER
19-
if not EXEC_DRIVER:
20-
c = docker_client()
21-
EXEC_DRIVER = c.info()['ExecutionDriver']
22-
c.close()
23-
return EXEC_DRIVER.startswith('native')
24-
25-
26-
def docker_client(**kwargs):
27-
return docker.Client(**docker_client_kwargs(**kwargs))
28-
29-
30-
def docker_client_kwargs(**kwargs):
31-
client_kwargs = docker.utils.kwargs_from_env(assert_hostname=False)
32-
client_kwargs.update(kwargs)
33-
return client_kwargs
34-
35-
36-
def setup_module():
37-
warnings.simplefilter('error')
38-
c = docker_client()
39-
try:
40-
c.inspect_image(BUSYBOX)
41-
except docker.errors.NotFound:
42-
os.write(2, "\npulling busybox\n".encode('utf-8'))
43-
for data in c.pull(BUSYBOX, stream=True):
44-
data = json.loads(data.decode('utf-8'))
45-
os.write(2, ("%c[2K\r" % 27).encode('utf-8'))
46-
status = data.get("status")
47-
progress = data.get("progress")
48-
detail = "{0} - {1}".format(status, progress).encode('utf-8')
49-
os.write(2, detail)
50-
os.write(2, "\npulled busybox\n".encode('utf-8'))
51-
52-
# Double make sure we now have busybox
53-
c.inspect_image(BUSYBOX)
54-
c.close()
55-
56-
57-
class BaseTestCase(unittest.TestCase):
58-
tmp_imgs = []
59-
tmp_containers = []
60-
tmp_folders = []
61-
tmp_volumes = []
62-
63-
def setUp(self):
64-
if six.PY2:
65-
self.assertRegex = self.assertRegexpMatches
66-
self.assertCountEqual = self.assertItemsEqual
67-
self.client = docker_client(timeout=60)
68-
self.tmp_imgs = []
69-
self.tmp_containers = []
70-
self.tmp_folders = []
71-
self.tmp_volumes = []
72-
self.tmp_networks = []
73-
74-
def tearDown(self):
75-
for img in self.tmp_imgs:
76-
try:
77-
self.client.remove_image(img)
78-
except docker.errors.APIError:
79-
pass
80-
for container in self.tmp_containers:
81-
try:
82-
self.client.stop(container, timeout=1)
83-
self.client.remove_container(container)
84-
except docker.errors.APIError:
85-
pass
86-
for network in self.tmp_networks:
87-
try:
88-
self.client.remove_network(network)
89-
except docker.errors.APIError:
90-
pass
91-
for folder in self.tmp_folders:
92-
shutil.rmtree(folder)
93-
94-
for volume in self.tmp_volumes:
95-
try:
96-
self.client.remove_volume(volume)
97-
except docker.errors.APIError:
98-
pass
99-
100-
self.client.close()
101-
102-
def run_container(self, *args, **kwargs):
103-
container = self.client.create_container(*args, **kwargs)
104-
self.tmp_containers.append(container)
105-
self.client.start(container)
106-
exitcode = self.client.wait(container)
107-
108-
if exitcode != 0:
109-
output = self.client.logs(container)
110-
raise Exception(
111-
"Container exited with code {}:\n{}"
112-
.format(exitcode, output))
113-
114-
return container
115-
116-
117-
#########################
118-
# INFORMATION TESTS #
119-
#########################
120-
121-
122-
class InformationTest(BaseTestCase):
13+
class InformationTest(helpers.BaseTestCase):
12314
def test_version(self):
12415
res = self.client.version()
12516
self.assertIn('GoVersion', res)
@@ -133,24 +24,19 @@ def test_info(self):
13324
self.assertIn('Debug', res)
13425

13526
def test_search(self):
136-
self.client = docker_client(timeout=10)
27+
self.client = helpers.docker_client(timeout=10)
13728
res = self.client.search('busybox')
13829
self.assertTrue(len(res) >= 1)
13930
base_img = [x for x in res if x['name'] == 'busybox']
14031
self.assertEqual(len(base_img), 1)
14132
self.assertIn('description', base_img[0])
14233

14334

144-
#################
145-
# LINKS TESTS #
146-
#################
147-
148-
149-
class LinkTest(BaseTestCase):
35+
class LinkTest(helpers.BaseTestCase):
15036
def test_remove_link(self):
15137
# Create containers
15238
container1 = self.client.create_container(
153-
BUSYBOX, 'cat', detach=True, stdin_open=True
39+
helpers.BUSYBOX, 'cat', detach=True, stdin_open=True
15440
)
15541
container1_id = container1['Id']
15642
self.tmp_containers.append(container1_id)
@@ -162,7 +48,7 @@ def test_remove_link(self):
16248
link_alias = 'mylink'
16349

16450
container2 = self.client.create_container(
165-
BUSYBOX, 'cat', host_config=self.client.create_host_config(
51+
helpers.BUSYBOX, 'cat', host_config=self.client.create_host_config(
16652
links={link_path: link_alias}, network_mode='none'
16753
)
16854
)
@@ -188,11 +74,7 @@ def test_remove_link(self):
18874
self.assertEqual(len(retrieved), 2)
18975

19076

191-
#######################
192-
# PY SPECIFIC TESTS #
193-
#######################
194-
195-
class LoadConfigTest(BaseTestCase):
77+
class LoadConfigTest(helpers.BaseTestCase):
19678
def test_load_legacy_config(self):
19779
folder = tempfile.mkdtemp()
19880
self.tmp_folders.append(folder)
@@ -231,7 +113,7 @@ def test_load_json_config(self):
231113

232114
class AutoDetectVersionTest(unittest.TestCase):
233115
def test_client_init(self):
234-
client = docker_client(version='auto')
116+
client = helpers.docker_client(version='auto')
235117
client_version = client._version
236118
api_version = client.version(api_version=False)['ApiVersion']
237119
self.assertEqual(client_version, api_version)
@@ -240,15 +122,17 @@ def test_client_init(self):
240122
client.close()
241123

242124
def test_auto_client(self):
243-
client = docker.AutoVersionClient(**docker_client_kwargs())
125+
client = docker.AutoVersionClient(**helpers.docker_client_kwargs())
244126
client_version = client._version
245127
api_version = client.version(api_version=False)['ApiVersion']
246128
self.assertEqual(client_version, api_version)
247129
api_version_2 = client.version()['ApiVersion']
248130
self.assertEqual(client_version, api_version_2)
249131
client.close()
250132
with self.assertRaises(docker.errors.DockerException):
251-
docker.AutoVersionClient(**docker_client_kwargs(version='1.11'))
133+
docker.AutoVersionClient(
134+
**helpers.docker_client_kwargs(version='1.11')
135+
)
252136

253137

254138
class ConnectionTimeoutTest(unittest.TestCase):
@@ -283,7 +167,7 @@ def test_resource_warnings(self):
283167
with warnings.catch_warnings(record=True) as w:
284168
warnings.simplefilter('always')
285169

286-
client = docker_client()
170+
client = helpers.docker_client()
287171
client.images()
288172
client.close()
289173
del client

tests/integration/build_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66

77
import six
88

9-
from . import api_test
9+
from .. import helpers
1010
from ..base import requires_api_version
1111

1212

13-
class BuildTest(api_test.BaseTestCase):
13+
class BuildTest(helpers.BaseTestCase):
1414
def test_build_streaming(self):
1515
script = io.BytesIO('\n'.join([
1616
'FROM busybox',

tests/integration/conftest.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from __future__ import print_function
2+
3+
import json
4+
import sys
5+
import warnings
6+
7+
import docker.errors
8+
import pytest
9+
10+
from ..helpers import BUSYBOX
11+
from ..helpers import docker_client
12+
13+
14+
@pytest.fixture(autouse=True, scope='session')
15+
def setup_test_session():
16+
warnings.simplefilter('error')
17+
c = docker_client()
18+
try:
19+
c.inspect_image(BUSYBOX)
20+
except docker.errors.NotFound:
21+
print("\npulling {0}".format(BUSYBOX), file=sys.stderr)
22+
for data in c.pull(BUSYBOX, stream=True):
23+
data = json.loads(data.decode('utf-8'))
24+
status = data.get("status")
25+
progress = data.get("progress")
26+
detail = "{0} - {1}".format(status, progress)
27+
print(detail, file=sys.stderr)
28+
29+
# Double make sure we now have busybox
30+
c.inspect_image(BUSYBOX)
31+
c.close()

0 commit comments

Comments
 (0)