Kaydet (Commit) cec3fe7c authored tarafından Joffrey F's avatar Joffrey F

Update tests to avoid failures on Windows platforms

Signed-off-by: 's avatarJoffrey F <joffrey@docker.com>
üst 9fc06b19
import io import io
import json
import os import os
import shutil import shutil
import tempfile import tempfile
...@@ -22,14 +21,11 @@ class BuildTest(BaseIntegrationTest): ...@@ -22,14 +21,11 @@ class BuildTest(BaseIntegrationTest):
'ADD https://dl.dropboxusercontent.com/u/20637798/silence.tar.gz' 'ADD https://dl.dropboxusercontent.com/u/20637798/silence.tar.gz'
' /tmp/silence.tar.gz' ' /tmp/silence.tar.gz'
]).encode('ascii')) ]).encode('ascii'))
stream = self.client.build(fileobj=script, stream=True) stream = self.client.build(fileobj=script, stream=True, decode=True)
logs = '' logs = []
for chunk in stream: for chunk in stream:
if six.PY3: logs.append(chunk)
chunk = chunk.decode('utf-8') assert len(logs) > 0
json.loads(chunk) # ensure chunk is a single, valid JSON blob
logs += chunk
self.assertNotEqual(logs, '')
def test_build_from_stringio(self): def test_build_from_stringio(self):
if six.PY3: if six.PY3:
......
from __future__ import print_function from __future__ import print_function
import json
import sys import sys
import warnings import warnings
...@@ -18,8 +17,7 @@ def setup_test_session(): ...@@ -18,8 +17,7 @@ def setup_test_session():
c.inspect_image(BUSYBOX) c.inspect_image(BUSYBOX)
except docker.errors.NotFound: except docker.errors.NotFound:
print("\npulling {0}".format(BUSYBOX), file=sys.stderr) print("\npulling {0}".format(BUSYBOX), file=sys.stderr)
for data in c.pull(BUSYBOX, stream=True): for data in c.pull(BUSYBOX, stream=True, decode=True):
data = json.loads(data.decode('utf-8'))
status = data.get("status") status = data.get("status")
progress = data.get("progress") progress = data.get("progress")
detail = "{0} - {1}".format(status, progress) detail = "{0} - {1}".format(status, progress)
......
...@@ -3,6 +3,7 @@ import signal ...@@ -3,6 +3,7 @@ import signal
import tempfile import tempfile
import docker import docker
from docker.constants import IS_WINDOWS_PLATFORM
from docker.utils.socket import next_frame_size from docker.utils.socket import next_frame_size
from docker.utils.socket import read_exactly from docker.utils.socket import read_exactly
import pytest import pytest
...@@ -523,13 +524,13 @@ class ArchiveTest(BaseIntegrationTest): ...@@ -523,13 +524,13 @@ class ArchiveTest(BaseIntegrationTest):
def test_copy_file_to_container(self): def test_copy_file_to_container(self):
data = b'Deaf To All But The Song' data = b'Deaf To All But The Song'
with tempfile.NamedTemporaryFile() as test_file: with tempfile.NamedTemporaryFile(delete=False) as test_file:
test_file.write(data) test_file.write(data)
test_file.seek(0) test_file.seek(0)
ctnr = self.client.create_container( ctnr = self.client.create_container(
BUSYBOX, BUSYBOX,
'cat {0}'.format( 'cat {0}'.format(
os.path.join('/vol1', os.path.basename(test_file.name)) os.path.join('/vol1/', os.path.basename(test_file.name))
), ),
volumes=['/vol1'] volumes=['/vol1']
) )
...@@ -821,11 +822,12 @@ class KillTest(BaseIntegrationTest): ...@@ -821,11 +822,12 @@ class KillTest(BaseIntegrationTest):
self.assertEqual(state['Running'], False) self.assertEqual(state['Running'], False)
def test_kill_with_signal(self): def test_kill_with_signal(self):
container = self.client.create_container(BUSYBOX, ['sleep', '60']) id = self.client.create_container(BUSYBOX, ['sleep', '60'])
id = container['Id']
self.client.start(id)
self.tmp_containers.append(id) self.tmp_containers.append(id)
self.client.kill(id, signal=signal.SIGKILL) self.client.start(id)
self.client.kill(
id, signal=signal.SIGKILL if not IS_WINDOWS_PLATFORM else 9
)
exitcode = self.client.wait(id) exitcode = self.client.wait(id)
self.assertNotEqual(exitcode, 0) self.assertNotEqual(exitcode, 0)
container_info = self.client.inspect_container(id) container_info = self.client.inspect_container(id)
...@@ -901,28 +903,34 @@ class PortTest(BaseIntegrationTest): ...@@ -901,28 +903,34 @@ class PortTest(BaseIntegrationTest):
class ContainerTopTest(BaseIntegrationTest): class ContainerTopTest(BaseIntegrationTest):
def test_top(self): def test_top(self):
container = self.client.create_container( container = self.client.create_container(
BUSYBOX, ['sleep', '60']) BUSYBOX, ['sleep', '60']
)
id = container['Id'] self.tmp_containers.append(container)
self.client.start(container) self.client.start(container)
res = self.client.top(container['Id']) res = self.client.top(container)
self.assertEqual( if IS_WINDOWS_PLATFORM:
res['Titles'], assert res['Titles'] == ['PID', 'USER', 'TIME', 'COMMAND']
['UID', 'PID', 'PPID', 'C', 'STIME', 'TTY', 'TIME', 'CMD'] else:
) assert res['Titles'] == [
self.assertEqual(len(res['Processes']), 1) 'UID', 'PID', 'PPID', 'C', 'STIME', 'TTY', 'TIME', 'CMD'
self.assertEqual(res['Processes'][0][7], 'sleep 60') ]
self.client.kill(id) assert len(res['Processes']) == 1
assert res['Processes'][0][-1] == 'sleep 60'
self.client.kill(container)
@pytest.mark.skipif(
IS_WINDOWS_PLATFORM, reason='No psargs support on windows'
)
def test_top_with_psargs(self): def test_top_with_psargs(self):
container = self.client.create_container( container = self.client.create_container(
BUSYBOX, ['sleep', '60']) BUSYBOX, ['sleep', '60'])
id = container['Id'] self.tmp_containers.append(container)
self.client.start(container) self.client.start(container)
res = self.client.top(container['Id'], 'waux') res = self.client.top(container, 'waux')
self.assertEqual( self.assertEqual(
res['Titles'], res['Titles'],
['USER', 'PID', '%CPU', '%MEM', 'VSZ', 'RSS', ['USER', 'PID', '%CPU', '%MEM', 'VSZ', 'RSS',
...@@ -930,7 +938,6 @@ class ContainerTopTest(BaseIntegrationTest): ...@@ -930,7 +938,6 @@ class ContainerTopTest(BaseIntegrationTest):
) )
self.assertEqual(len(res['Processes']), 1) self.assertEqual(len(res['Processes']), 1)
self.assertEqual(res['Processes'][0][10], 'sleep 60') self.assertEqual(res['Processes'][0][10], 'sleep 60')
self.client.kill(id)
class RestartContainerTest(BaseIntegrationTest): class RestartContainerTest(BaseIntegrationTest):
......
...@@ -55,12 +55,10 @@ class PullImageTest(BaseIntegrationTest): ...@@ -55,12 +55,10 @@ class PullImageTest(BaseIntegrationTest):
self.client.remove_image('hello-world') self.client.remove_image('hello-world')
except docker.errors.APIError: except docker.errors.APIError:
pass pass
stream = self.client.pull('hello-world', stream=True) stream = self.client.pull('hello-world', stream=True, decode=True)
self.tmp_imgs.append('hello-world') self.tmp_imgs.append('hello-world')
for chunk in stream: for chunk in stream:
if six.PY3: assert isinstance(chunk, dict)
chunk = chunk.decode('utf-8')
json.loads(chunk) # ensure chunk is a single, valid JSON blob
self.assertGreaterEqual( self.assertGreaterEqual(
len(self.client.images('hello-world')), 1 len(self.client.images('hello-world')), 1
) )
...@@ -150,7 +148,7 @@ class ImportImageTest(BaseIntegrationTest): ...@@ -150,7 +148,7 @@ class ImportImageTest(BaseIntegrationTest):
@contextlib.contextmanager @contextlib.contextmanager
def dummy_tar_file(self, n_bytes): def dummy_tar_file(self, n_bytes):
'''Yields the name of a valid tar file of size n_bytes.''' '''Yields the name of a valid tar file of size n_bytes.'''
with tempfile.NamedTemporaryFile() as tar_file: with tempfile.NamedTemporaryFile(delete=False) as tar_file:
self.write_dummy_tar_content(n_bytes, tar_file) self.write_dummy_tar_content(n_bytes, tar_file)
tar_file.seek(0) tar_file.seek(0)
yield tar_file.name yield tar_file.name
......
...@@ -72,15 +72,15 @@ class TestNetworks(BaseIntegrationTest): ...@@ -72,15 +72,15 @@ class TestNetworks(BaseIntegrationTest):
assert ipam['Driver'] == 'default' assert ipam['Driver'] == 'default'
assert ipam['Config'] == [{ assert ipam['Config'] == [{
'Subnet': "172.28.0.0/16", 'Subnet': "172.28.0.0/16",
'IPRange': "172.28.5.0/24", 'IPRange': "172.28.5.0/24",
'Gateway': "172.28.5.254", 'Gateway': "172.28.5.254",
'AuxiliaryAddresses': { 'AuxiliaryAddresses': {
"a": "172.28.1.5", "a": "172.28.1.5",
"b": "172.28.1.6", "b": "172.28.1.6",
"c": "172.28.1.7", "c": "172.28.1.7",
}, },
}] }]
@requires_api_version('1.21') @requires_api_version('1.21')
def test_create_network_with_host_driver_fails(self): def test_create_network_with_host_driver_fails(self):
......
...@@ -86,7 +86,7 @@ def fake_delete(self, url, *args, **kwargs): ...@@ -86,7 +86,7 @@ def fake_delete(self, url, *args, **kwargs):
def fake_read_from_socket(self, response, stream): def fake_read_from_socket(self, response, stream):
return six.binary_type() return six.binary_type()
url_base = 'http+docker://localunixsocket/' url_base = '{0}/'.format(fake_api.prefix)
url_prefix = '{0}v{1}/'.format( url_prefix = '{0}v{1}/'.format(
url_base, url_base,
docker.constants.DEFAULT_DOCKER_API_VERSION) docker.constants.DEFAULT_DOCKER_API_VERSION)
...@@ -422,6 +422,9 @@ class StreamTest(base.Cleanup, base.BaseTestCase): ...@@ -422,6 +422,9 @@ class StreamTest(base.Cleanup, base.BaseTestCase):
data += connection.recv(2048) data += connection.recv(2048)
@pytest.mark.skipif(
docker.constants.IS_WINDOWS_PLATFORM, reason='Unix only'
)
def test_early_stream_response(self): def test_early_stream_response(self):
self.request_handler = self.early_response_sending_handler self.request_handler = self.early_response_sending_handler
lines = [] lines = []
......
...@@ -270,8 +270,8 @@ class CreateContainerTest(DockerClientTest): ...@@ -270,8 +270,8 @@ class CreateContainerTest(DockerClientTest):
{'Content-Type': 'application/json'}) {'Content-Type': 'application/json'})
def test_create_container_with_cpu_shares(self): def test_create_container_with_cpu_shares(self):
self.client.create_container('busybox', 'ls', with pytest.deprecated_call():
cpu_shares=5) self.client.create_container('busybox', 'ls', cpu_shares=5)
args = fake_request.call_args args = fake_request.call_args
self.assertEqual(args[0][1], self.assertEqual(args[0][1],
...@@ -316,8 +316,8 @@ class CreateContainerTest(DockerClientTest): ...@@ -316,8 +316,8 @@ class CreateContainerTest(DockerClientTest):
{'Content-Type': 'application/json'}) {'Content-Type': 'application/json'})
def test_create_container_with_cpuset(self): def test_create_container_with_cpuset(self):
self.client.create_container('busybox', 'ls', with pytest.deprecated_call():
cpuset='0,1') self.client.create_container('busybox', 'ls', cpuset='0,1')
args = fake_request.call_args args = fake_request.call_args
self.assertEqual(args[0][1], self.assertEqual(args[0][1],
......
...@@ -408,6 +408,9 @@ def post_fake_update_container(): ...@@ -408,6 +408,9 @@ def post_fake_update_container():
# Maps real api url to fake response callback # Maps real api url to fake response callback
prefix = 'http+docker://localunixsocket' prefix = 'http+docker://localunixsocket'
if constants.IS_WINDOWS_PLATFORM:
prefix = 'http+docker://localnpipe'
fake_responses = { fake_responses = {
'{0}/version'.format(prefix): '{0}/version'.format(prefix):
get_fake_raw_version, get_fake_raw_version,
......
...@@ -13,7 +13,9 @@ import pytest ...@@ -13,7 +13,9 @@ import pytest
import six import six
from docker.client import Client from docker.client import Client
from docker.constants import DEFAULT_DOCKER_API_VERSION from docker.constants import (
DEFAULT_DOCKER_API_VERSION, IS_WINDOWS_PLATFORM
)
from docker.errors import DockerException, InvalidVersion from docker.errors import DockerException, InvalidVersion
from docker.utils import ( from docker.utils import (
parse_repository_tag, parse_host, convert_filters, kwargs_from_env, parse_repository_tag, parse_host, convert_filters, kwargs_from_env,
...@@ -809,6 +811,12 @@ class PortsTest(base.BaseTestCase): ...@@ -809,6 +811,12 @@ class PortsTest(base.BaseTestCase):
self.assertEqual(port_bindings["2000"], [("127.0.0.1", "2000")]) self.assertEqual(port_bindings["2000"], [("127.0.0.1", "2000")])
def convert_paths(collection):
if not IS_WINDOWS_PLATFORM:
return collection
return set(map(lambda x: x.replace('/', '\\'), collection))
class ExcludePathsTest(base.BaseTestCase): class ExcludePathsTest(base.BaseTestCase):
dirs = [ dirs = [
'foo', 'foo',
...@@ -843,7 +851,7 @@ class ExcludePathsTest(base.BaseTestCase): ...@@ -843,7 +851,7 @@ class ExcludePathsTest(base.BaseTestCase):
return set(exclude_paths(self.base, patterns, dockerfile=dockerfile)) return set(exclude_paths(self.base, patterns, dockerfile=dockerfile))
def test_no_excludes(self): def test_no_excludes(self):
assert self.exclude(['']) == self.all_paths assert self.exclude(['']) == convert_paths(self.all_paths)
def test_no_dupes(self): def test_no_dupes(self):
paths = exclude_paths(self.base, ['!a.py']) paths = exclude_paths(self.base, ['!a.py'])
...@@ -858,7 +866,9 @@ class ExcludePathsTest(base.BaseTestCase): ...@@ -858,7 +866,9 @@ class ExcludePathsTest(base.BaseTestCase):
Dockerfile and/or .dockerignore, don't exclude them from Dockerfile and/or .dockerignore, don't exclude them from
the actual tar file. the actual tar file.
""" """
assert self.exclude(['Dockerfile', '.dockerignore']) == self.all_paths assert self.exclude(['Dockerfile', '.dockerignore']) == convert_paths(
self.all_paths
)
def test_exclude_custom_dockerfile(self): def test_exclude_custom_dockerfile(self):
""" """
...@@ -877,94 +887,116 @@ class ExcludePathsTest(base.BaseTestCase): ...@@ -877,94 +887,116 @@ class ExcludePathsTest(base.BaseTestCase):
assert 'foo/a.py' not in includes assert 'foo/a.py' not in includes
def test_single_filename(self): def test_single_filename(self):
assert self.exclude(['a.py']) == self.all_paths - set(['a.py']) assert self.exclude(['a.py']) == convert_paths(
self.all_paths - set(['a.py'])
)
def test_single_filename_leading_dot_slash(self): def test_single_filename_leading_dot_slash(self):
assert self.exclude(['./a.py']) == self.all_paths - set(['a.py']) assert self.exclude(['./a.py']) == convert_paths(
self.all_paths - set(['a.py'])
)
# As odd as it sounds, a filename pattern with a trailing slash on the # As odd as it sounds, a filename pattern with a trailing slash on the
# end *will* result in that file being excluded. # end *will* result in that file being excluded.
def test_single_filename_trailing_slash(self): def test_single_filename_trailing_slash(self):
assert self.exclude(['a.py/']) == self.all_paths - set(['a.py']) assert self.exclude(['a.py/']) == convert_paths(
self.all_paths - set(['a.py'])
)
def test_wildcard_filename_start(self): def test_wildcard_filename_start(self):
assert self.exclude(['*.py']) == self.all_paths - set([ assert self.exclude(['*.py']) == convert_paths(
'a.py', 'b.py', 'cde.py', self.all_paths - set(['a.py', 'b.py', 'cde.py'])
]) )
def test_wildcard_with_exception(self): def test_wildcard_with_exception(self):
assert self.exclude(['*.py', '!b.py']) == self.all_paths - set([ assert self.exclude(['*.py', '!b.py']) == convert_paths(
'a.py', 'cde.py', self.all_paths - set(['a.py', 'cde.py'])
]) )
def test_wildcard_with_wildcard_exception(self): def test_wildcard_with_wildcard_exception(self):
assert self.exclude(['*.*', '!*.go']) == self.all_paths - set([ assert self.exclude(['*.*', '!*.go']) == convert_paths(
'a.py', 'b.py', 'cde.py', 'Dockerfile.alt', self.all_paths - set([
]) 'a.py', 'b.py', 'cde.py', 'Dockerfile.alt',
])
)
def test_wildcard_filename_end(self): def test_wildcard_filename_end(self):
assert self.exclude(['a.*']) == self.all_paths - set(['a.py', 'a.go']) assert self.exclude(['a.*']) == convert_paths(
self.all_paths - set(['a.py', 'a.go'])
)
def test_question_mark(self): def test_question_mark(self):
assert self.exclude(['?.py']) == self.all_paths - set(['a.py', 'b.py']) assert self.exclude(['?.py']) == convert_paths(
self.all_paths - set(['a.py', 'b.py'])
)
def test_single_subdir_single_filename(self): def test_single_subdir_single_filename(self):
assert self.exclude(['foo/a.py']) == self.all_paths - set(['foo/a.py']) assert self.exclude(['foo/a.py']) == convert_paths(
self.all_paths - set(['foo/a.py'])
)
def test_single_subdir_with_path_traversal(self): def test_single_subdir_with_path_traversal(self):
assert self.exclude(['foo/whoops/../a.py']) == self.all_paths - set([ assert self.exclude(['foo/whoops/../a.py']) == convert_paths(
'foo/a.py', self.all_paths - set(['foo/a.py'])
]) )
def test_single_subdir_wildcard_filename(self): def test_single_subdir_wildcard_filename(self):
assert self.exclude(['foo/*.py']) == self.all_paths - set([ assert self.exclude(['foo/*.py']) == convert_paths(
'foo/a.py', 'foo/b.py', self.all_paths - set(['foo/a.py', 'foo/b.py'])
]) )
def test_wildcard_subdir_single_filename(self): def test_wildcard_subdir_single_filename(self):
assert self.exclude(['*/a.py']) == self.all_paths - set([ assert self.exclude(['*/a.py']) == convert_paths(
'foo/a.py', 'bar/a.py', self.all_paths - set(['foo/a.py', 'bar/a.py'])
]) )
def test_wildcard_subdir_wildcard_filename(self): def test_wildcard_subdir_wildcard_filename(self):
assert self.exclude(['*/*.py']) == self.all_paths - set([ assert self.exclude(['*/*.py']) == convert_paths(
'foo/a.py', 'foo/b.py', 'bar/a.py', self.all_paths - set(['foo/a.py', 'foo/b.py', 'bar/a.py'])
]) )
def test_directory(self): def test_directory(self):
assert self.exclude(['foo']) == self.all_paths - set([ assert self.exclude(['foo']) == convert_paths(
'foo', 'foo/a.py', 'foo/b.py', self.all_paths - set([
'foo/bar', 'foo/bar/a.py', 'foo/Dockerfile3' 'foo', 'foo/a.py', 'foo/b.py', 'foo/bar', 'foo/bar/a.py',
]) 'foo/Dockerfile3'
])
)
def test_directory_with_trailing_slash(self): def test_directory_with_trailing_slash(self):
assert self.exclude(['foo']) == self.all_paths - set([ assert self.exclude(['foo']) == convert_paths(
'foo', 'foo/a.py', 'foo/b.py', self.all_paths - set([
'foo/bar', 'foo/bar/a.py', 'foo/Dockerfile3' 'foo', 'foo/a.py', 'foo/b.py',
]) 'foo/bar', 'foo/bar/a.py', 'foo/Dockerfile3'
])
)
def test_directory_with_single_exception(self): def test_directory_with_single_exception(self):
assert self.exclude(['foo', '!foo/bar/a.py']) == self.all_paths - set([ assert self.exclude(['foo', '!foo/bar/a.py']) == convert_paths(
'foo/a.py', 'foo/b.py', 'foo', 'foo/bar', self.all_paths - set([
'foo/Dockerfile3' 'foo/a.py', 'foo/b.py', 'foo', 'foo/bar',
]) 'foo/Dockerfile3'
])
)
def test_directory_with_subdir_exception(self): def test_directory_with_subdir_exception(self):
assert self.exclude(['foo', '!foo/bar']) == self.all_paths - set([ assert self.exclude(['foo', '!foo/bar']) == convert_paths(
'foo/a.py', 'foo/b.py', 'foo', self.all_paths - set([
'foo/Dockerfile3' 'foo/a.py', 'foo/b.py', 'foo', 'foo/Dockerfile3'
]) ])
)
def test_directory_with_wildcard_exception(self): def test_directory_with_wildcard_exception(self):
assert self.exclude(['foo', '!foo/*.py']) == self.all_paths - set([ assert self.exclude(['foo', '!foo/*.py']) == convert_paths(
'foo/bar', 'foo/bar/a.py', 'foo', self.all_paths - set([
'foo/Dockerfile3' 'foo/bar', 'foo/bar/a.py', 'foo', 'foo/Dockerfile3'
]) ])
)
def test_subdirectory(self): def test_subdirectory(self):
assert self.exclude(['foo/bar']) == self.all_paths - set([ assert self.exclude(['foo/bar']) == convert_paths(
'foo/bar', 'foo/bar/a.py', self.all_paths - set(['foo/bar', 'foo/bar/a.py'])
]) )
class TarTest(base.Cleanup, base.BaseTestCase): class TarTest(base.Cleanup, base.BaseTestCase):
...@@ -1023,6 +1055,7 @@ class TarTest(base.Cleanup, base.BaseTestCase): ...@@ -1023,6 +1055,7 @@ class TarTest(base.Cleanup, base.BaseTestCase):
tar_data = tarfile.open(fileobj=archive) tar_data = tarfile.open(fileobj=archive)
self.assertEqual(sorted(tar_data.getnames()), ['bar', 'foo']) self.assertEqual(sorted(tar_data.getnames()), ['bar', 'foo'])
@pytest.mark.skipif(IS_WINDOWS_PLATFORM, reason='No symlinks on Windows')
def test_tar_with_file_symlinks(self): def test_tar_with_file_symlinks(self):
base = tempfile.mkdtemp() base = tempfile.mkdtemp()
self.addCleanup(shutil.rmtree, base) self.addCleanup(shutil.rmtree, base)
...@@ -1036,6 +1069,7 @@ class TarTest(base.Cleanup, base.BaseTestCase): ...@@ -1036,6 +1069,7 @@ class TarTest(base.Cleanup, base.BaseTestCase):
sorted(tar_data.getnames()), ['bar', 'bar/foo', 'foo'] sorted(tar_data.getnames()), ['bar', 'bar/foo', 'foo']
) )
@pytest.mark.skipif(IS_WINDOWS_PLATFORM, reason='No symlinks on Windows')
def test_tar_with_directory_symlinks(self): def test_tar_with_directory_symlinks(self):
base = tempfile.mkdtemp() base = tempfile.mkdtemp()
self.addCleanup(shutil.rmtree, base) self.addCleanup(shutil.rmtree, base)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment