summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAlex Grönholm <alex.gronholm@nextday.fi>2018-05-26 20:51:16 +0300
committerAlex Grönholm <alex.gronholm@nextday.fi>2018-07-17 15:02:50 +0300
commit89492505b968f6bf9ae9cc35f88f8ecd6ce6cbf1 (patch)
tree3364662e4c077856db8d06fa3d57b4b544da21f8 /tests
parent353217fb496d61b3c5ce287b9c61a229e2ed27fe (diff)
downloadwheel-git-89492505b968f6bf9ae9cc35f88f8ecd6ce6cbf1.tar.gz
Renamed the wheel.tool package to wheel.cli and migrated CLI stuff there
The VerifyingZipFile class was also merged to the WheelFile class.
Diffstat (limited to 'tests')
-rw-r--r--tests/cli/eggnames.txt (renamed from tests/eggnames.txt)0
-rw-r--r--tests/cli/test_convert.py (renamed from tests/test_egg2wheel.py)9
-rw-r--r--tests/cli/test_install.py (renamed from tests/headers.dist/header.h)0
-rw-r--r--tests/cli/test_unpack.py10
-rw-r--r--tests/conftest.py47
-rw-r--r--tests/test_install.py71
-rw-r--r--tests/test_ranking.py43
-rw-r--r--tests/test_tool.py15
-rw-r--r--tests/test_wheelfile.py180
-rw-r--r--tests/testdata/complex-dist/complexdist/__init__.py (renamed from tests/complex-dist/complexdist/__init__.py)0
-rw-r--r--tests/testdata/complex-dist/setup.py (renamed from tests/complex-dist/setup.py)0
-rw-r--r--tests/testdata/extension.dist/extension.c (renamed from tests/extension.dist/extension.c)0
-rw-r--r--tests/testdata/extension.dist/setup.cfg (renamed from tests/extension.dist/setup.cfg)0
-rw-r--r--tests/testdata/extension.dist/setup.py (renamed from tests/extension.dist/setup.py)0
-rw-r--r--tests/testdata/headers.dist/header.h (renamed from tests/headers.dist/headersdist.py)0
-rw-r--r--tests/testdata/headers.dist/headersdist.py (renamed from tests/simple.dist/simpledist/__init__.py)0
-rw-r--r--tests/testdata/headers.dist/setup.cfg (renamed from tests/headers.dist/setup.cfg)0
-rw-r--r--tests/testdata/headers.dist/setup.py (renamed from tests/headers.dist/setup.py)0
-rw-r--r--tests/testdata/simple.dist/setup.py (renamed from tests/simple.dist/setup.py)0
-rw-r--r--tests/testdata/simple.dist/simpledist/__init__.py (renamed from tests/unicode.dist/unicodedist/__init__.py)0
-rw-r--r--tests/testdata/test-1.0-py2.py3-none-win32.whl (renamed from tests/test-1.0-py2.py3-none-win32.whl)bin5226 -> 5226 bytes
-rw-r--r--tests/testdata/unicode.dist/setup.py (renamed from tests/unicode.dist/setup.py)0
-rw-r--r--tests/testdata/unicode.dist/unicodedist/__init__.py (renamed from tests/unicode.dist/unicodedist/åäö_日本語.py)0
-rw-r--r--tests/testdata/unicode.dist/unicodedist/åäö_日本語.py0
24 files changed, 147 insertions, 228 deletions
diff --git a/tests/eggnames.txt b/tests/cli/eggnames.txt
index d422120..d422120 100644
--- a/tests/eggnames.txt
+++ b/tests/cli/eggnames.txt
diff --git a/tests/test_egg2wheel.py b/tests/cli/test_convert.py
index 1455c55..5ba1947 100644
--- a/tests/test_egg2wheel.py
+++ b/tests/cli/test_convert.py
@@ -1,6 +1,6 @@
import os.path
-from wheel import egg2wheel
+from wheel.cli.convert import convert, egg_info_re
def test_egg_re():
@@ -10,4 +10,9 @@ def test_egg_re():
for line in egg_names:
line = line.strip()
if line:
- assert egg2wheel.egg_info_re.match(line), line
+ assert egg_info_re.match(line), line
+
+
+def test_convert_egg(egg_paths, tmpdir):
+ convert(egg_paths, str(tmpdir), verbose=False)
+ assert len(tmpdir.listdir()) == len(egg_paths)
diff --git a/tests/headers.dist/header.h b/tests/cli/test_install.py
index e69de29..e69de29 100644
--- a/tests/headers.dist/header.h
+++ b/tests/cli/test_install.py
diff --git a/tests/cli/test_unpack.py b/tests/cli/test_unpack.py
new file mode 100644
index 0000000..531ca7d
--- /dev/null
+++ b/tests/cli/test_unpack.py
@@ -0,0 +1,10 @@
+from wheel.cli.unpack import unpack
+
+
+def test_unpack(wheel_paths, tmpdir):
+ """
+ Make sure 'wheel unpack' works.
+ This also verifies the integrity of our testing wheel files.
+ """
+ for wheel_path in wheel_paths:
+ unpack(wheel_path, str(tmpdir))
diff --git a/tests/conftest.py b/tests/conftest.py
index 1431c3f..18cd748 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -2,54 +2,12 @@
pytest local configuration plug-in
"""
-import gc
import os.path
import subprocess
import sys
from shutil import rmtree
import pytest
-import warnings
-
-THISDIR = os.path.dirname(__file__)
-
-
-@pytest.fixture(autouse=True)
-def error_on_ResourceWarning():
- """This fixture captures ResourceWarning's and reports an "error"
- describing the file handles left open.
-
- This is shown regardless of how successful the test was, if a test fails
- and leaves files open then those files will be reported. Ideally, even
- those files should be closed properly after a test failure or exception.
-
- Since only Python 3 and PyPy3 have ResourceWarning's, this context will
- have no effect when running tests on Python 2 or PyPy.
-
- Because of autouse=True, this function will be automatically enabled for
- all test_* functions in this module.
-
- This code is primarily based on the examples found here:
- https://stackoverflow.com/questions/24717027/convert-python-3-resourcewarnings-into-exception
- """
- try:
- ResourceWarning
- except NameError:
- # Python 2, PyPy
- yield
- return
-
- # Python 3, PyPy3
- with warnings.catch_warnings(record=True) as caught:
- warnings.resetwarnings() # clear all filters
- warnings.simplefilter('ignore') # ignore all
- warnings.simplefilter('always', ResourceWarning) # noqa: F821
- yield # run tests in this context
- gc.collect() # run garbage collection (for pypy3)
- if caught:
- pytest.fail('The following file descriptors were not closed properly:\n' +
- '\n'.join((str(warning.message) for warning in caught)),
- pytrace=False)
@pytest.fixture(scope='session')
@@ -58,8 +16,9 @@ def wheels_and_eggs():
test_distributions = "complex-dist", "simple.dist", "headers.dist", "unicode.dist"
files = []
pwd = os.path.abspath(os.curdir)
+ this_dir = os.path.dirname(__file__)
for dist in test_distributions:
- os.chdir(os.path.join(THISDIR, dist))
+ os.chdir(os.path.join(this_dir, 'testdata', dist))
subprocess.check_call([sys.executable, 'setup.py', 'bdist_egg', 'bdist_wheel'])
dist_path = os.path.join(os.curdir, 'dist')
files.extend([os.path.abspath(os.path.join(dist_path, fname))
@@ -72,7 +31,7 @@ def wheels_and_eggs():
for dist in test_distributions:
for subdir in ('build', 'dist'):
try:
- rmtree(os.path.join(THISDIR, dist, subdir))
+ rmtree(os.path.join(this_dir, dist, subdir))
except OSError:
pass
diff --git a/tests/test_install.py b/tests/test_install.py
deleted file mode 100644
index aee57cd..0000000
--- a/tests/test_install.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# Test wheel.
-# The file has the following contents:
-# hello.pyd
-# hello/hello.py
-# hello/__init__.py
-# test-1.0.data/data/hello.dat
-# test-1.0.data/headers/hello.dat
-# test-1.0.data/scripts/hello.sh
-# test-1.0.dist-info/WHEEL
-# test-1.0.dist-info/METADATA
-# test-1.0.dist-info/RECORD
-# The root is PLATLIB
-# So, some in PLATLIB, and one in each of DATA, HEADERS and SCRIPTS.
-
-import os
-
-from wheel.install import WheelFile
-
-THISDIR = os.path.dirname(__file__)
-TESTWHEEL = os.path.join(THISDIR, 'test-1.0-py2.py3-none-win32.whl')
-
-
-def test_compatibility_tags():
- """Test compatibilty tags are working."""
- wf = WheelFile("package-1.0.0-cp32.cp33-noabi-noarch.whl")
- assert (list(wf.compatibility_tags) ==
- [('cp32', 'noabi', 'noarch'), ('cp33', 'noabi', 'noarch')])
- assert wf.arity == 2
-
- wf2 = WheelFile("package-1.0.0-1st-cp33-noabi-noarch.whl")
- wf2_info = wf2.parsed_filename.groupdict()
- assert wf2_info['build'] == '1st', wf2_info
-
-
-def test_pick_best():
- """Test the wheel ranking algorithm."""
- def get_tags(res):
- info = res[-1].parsed_filename.groupdict()
- return info['pyver'], info['abi'], info['plat']
-
- cand_tags = [('py27', 'noabi', 'noarch'), ('py26', 'noabi', 'noarch'),
- ('cp27', 'noabi', 'linux_i686'),
- ('cp26', 'noabi', 'linux_i686'),
- ('cp27', 'noabi', 'linux_x86_64'),
- ('cp26', 'noabi', 'linux_x86_64')]
- cand_wheels = [WheelFile('testpkg-1.0-%s-%s-%s.whl' % t)
- for t in cand_tags]
-
- supported = [('cp27', 'noabi', 'linux_i686'), ('py27', 'noabi', 'noarch')]
- supported2 = [('cp27', 'noabi', 'linux_i686'), ('py27', 'noabi', 'noarch'),
- ('cp26', 'noabi', 'linux_i686'), ('py26', 'noabi', 'noarch')]
- supported3 = [('cp26', 'noabi', 'linux_i686'), ('py26', 'noabi', 'noarch'),
- ('cp27', 'noabi', 'linux_i686'), ('py27', 'noabi', 'noarch')]
-
- for supp in (supported, supported2, supported3):
- def context():
- return list(supp)
-
- for wheel_ in cand_wheels:
- wheel_.context = context
- best = max(cand_wheels)
- assert list(best.tags)[0] == supp[0]
-
- # assert_equal(
- # list(map(get_tags, pick_best(cand_wheels, supp, top=False))), supp)
-
-
-def test_wheelfile_re():
- # Regression test for #208
- wf = WheelFile('foo-2-py3-none-any.whl')
- assert wf.distinfo_name == 'foo-2.dist-info'
diff --git a/tests/test_ranking.py b/tests/test_ranking.py
deleted file mode 100644
index fed2de7..0000000
--- a/tests/test_ranking.py
+++ /dev/null
@@ -1,43 +0,0 @@
-from wheel.install import WheelFile
-from wheel.pep425tags import get_supported
-
-WHEELPAT = "%(name)s-%(ver)s-%(pyver)s-%(abi)s-%(arch)s.whl"
-
-
-def make_wheel(name, ver, pyver, abi, arch):
- name = WHEELPAT % {'name': name, 'ver': ver, 'pyver': pyver, 'abi': abi, 'arch': arch}
- return WheelFile(name)
-
-
-# This relies on the fact that generate_supported will always return the
-# exact pyver, abi, and architecture for its first (best) match.
-sup = get_supported()
-pyver, abi, arch = sup[0]
-genver = 'py' + pyver[2:]
-majver = genver[:3]
-
-COMBINATIONS = (
- ('bar', '0.9', 'py2.py3', 'none', 'any'),
- ('bar', '0.9', majver, 'none', 'any'),
- ('bar', '0.9', genver, 'none', 'any'),
- ('bar', '0.9', pyver, abi, arch),
- ('bar', '1.3.2', majver, 'none', 'any'),
- ('bar', '3.1', genver, 'none', 'any'),
- ('bar', '3.1', pyver, abi, arch),
- ('foo', '1.0', majver, 'none', 'any'),
- ('foo', '1.1', pyver, abi, arch),
- ('foo', '2.1', majver + '0', 'none', 'any'),
- # This will not be compatible for Python x.0. Beware when we hit Python
- # 4.0, and don't test with 3.0!!!
- ('foo', '2.1', majver + '1', 'none', 'any'),
- ('foo', '2.1', pyver, 'none', 'any'),
- ('foo', '2.1', pyver, abi, arch),
-)
-
-WHEELS = [make_wheel(*args) for args in COMBINATIONS]
-
-
-def test_comparison():
- for i in range(len(WHEELS)-1):
- for j in range(i):
- assert WHEELS[j] < WHEELS[i]
diff --git a/tests/test_tool.py b/tests/test_tool.py
deleted file mode 100644
index 2af28e1..0000000
--- a/tests/test_tool.py
+++ /dev/null
@@ -1,15 +0,0 @@
-from wheel import tool
-
-
-def test_convert_egg(egg_paths, tmpdir):
- tool.convert(egg_paths, str(tmpdir), verbose=False)
- assert len(tmpdir.listdir()) == len(egg_paths)
-
-
-def test_unpack(wheel_paths, tmpdir):
- """
- Make sure 'wheel unpack' works.
- This also verifies the integrity of our testing wheel files.
- """
- for wheel_path in wheel_paths:
- tool.unpack(wheel_path, str(tmpdir))
diff --git a/tests/test_wheelfile.py b/tests/test_wheelfile.py
index 16ca83e..03eeac7 100644
--- a/tests/test_wheelfile.py
+++ b/tests/test_wheelfile.py
@@ -1,89 +1,163 @@
-import hashlib
-import zipfile
-from io import BytesIO
+# coding: utf-8
+from __future__ import unicode_literals
+
+from zipfile import ZipFile, ZIP_DEFLATED
import pytest
-import wheel.archive
-import wheel.install
+from wheel.cli import WheelError
+from wheel.util import native, as_bytes
+from wheel.wheelfile import WheelFile
+
+
+@pytest.fixture
+def wheel_path(tmpdir):
+ return str(tmpdir.join('test-1.0-py2.py3-none-any.whl'))
+
+
+def test_wheelfile_re(tmpdir):
+ # Regression test for #208
+ path = tmpdir.join('foo-2-py3-none-any.whl')
+ with WheelFile(str(path), 'w') as wf:
+ assert wf.parsed_filename.group('namever') == 'foo-2'
+
+
+@pytest.mark.parametrize('filename', [
+ 'test.whl',
+ 'test-1.0.whl',
+ 'test-1.0-py2.whl',
+ 'test-1.0-py2-none.whl',
+ 'test-1.0-py2-none-any'
+])
+def test_bad_wheel_filename(filename):
+ exc = pytest.raises(WheelError, WheelFile, filename)
+ exc.match('^Bad wheel filename {!r}$'.format(filename))
+
+
+def test_missing_record(wheel_path):
+ with ZipFile(wheel_path, 'w') as zf:
+ zf.writestr(native('hello/héllö.py'), as_bytes('print("Héllö, w0rld!")\n'))
+ exc = pytest.raises(WheelError, WheelFile, wheel_path)
+ exc.match("^Missing test-1.0.dist-info/RECORD file$")
-def test_verifying_zipfile():
- if not hasattr(zipfile.ZipExtFile, '_update_crc'):
- pytest.skip('No ZIP verification. Missing ZipExtFile._update_crc.')
- bio = BytesIO()
- zf = zipfile.ZipFile(bio, 'w')
- zf.writestr("one", b"first file")
- zf.writestr("two", b"second file")
- zf.writestr("three", b"third file")
- zf.close()
+def test_unsupported_hash_algorithm(wheel_path):
+ with ZipFile(wheel_path, 'w') as zf:
+ zf.writestr(native('hello/héllö.py'), as_bytes('print("Héllö, w0rld!")\n'))
+ zf.writestr(
+ 'test-1.0.dist-info/RECORD',
+ as_bytes('hello/héllö.py,sha000=bv-QV3RciQC2v3zL8Uvhd_arp40J5A9xmyubN34OVwo,25'))
- # In default mode, VerifyingZipFile checks the hash of any read file
- # mentioned with set_expected_hash(). Files not mentioned with
- # set_expected_hash() are not checked.
- vzf = wheel.install.VerifyingZipFile(bio, 'r')
- vzf.set_expected_hash("one", hashlib.sha256(b"first file").digest())
- vzf.set_expected_hash("three", "blurble")
- vzf.open("one").read()
- vzf.open("two").read()
- pytest.raises(wheel.install.BadWheelFile, vzf.open("three").read)
+ exc = pytest.raises(WheelError, WheelFile, wheel_path)
+ exc.match("^Unsupported hash algorithm: sha000$")
- # In strict mode, VerifyingZipFile requires every read file to be
- # mentioned with set_expected_hash().
- vzf.strict = True
- pytest.raises(wheel.install.BadWheelFile, vzf.open, "two")
- vzf.set_expected_hash("two", None)
- vzf.open("two").read()
+@pytest.mark.parametrize('algorithm, digest', [
+ ('md5', '4J-scNa2qvSgy07rS4at-Q'),
+ ('sha1', 'QjCnGu5Qucb6-vir1a6BVptvOA4')
+], ids=['md5', 'sha1'])
+def test_weak_hash_algorithm(wheel_path, algorithm, digest):
+ hash_string = '{}={}'.format(algorithm, digest)
+ with ZipFile(wheel_path, 'w') as zf:
+ zf.writestr(native('hello/héllö.py'), as_bytes('print("Héllö, w0rld!")\n'))
+ zf.writestr('test-1.0.dist-info/RECORD',
+ as_bytes('hello/héllö.py,{},25'.format(hash_string)))
+ exc = pytest.raises(WheelError, WheelFile, wheel_path)
+ exc.match(r"^Weak hash algorithm \({}\) is not permitted by PEP 427$".format(algorithm))
-def test_pop_zipfile():
- bio = BytesIO()
- zf = wheel.install.VerifyingZipFile(bio, 'w')
- zf.writestr("one", b"first file")
- zf.writestr("two", b"second file")
- zf.close()
- pytest.raises(RuntimeError, zf.pop)
+@pytest.mark.parametrize('algorithm, digest', [
+ ('sha256', 'bv-QV3RciQC2v3zL8Uvhd_arp40J5A9xmyubN34OVwo'),
+ ('sha384', 'cDXriAy_7i02kBeDkN0m2RIDz85w6pwuHkt2PZ4VmT2PQc1TZs8Ebvf6eKDFcD_S'),
+ ('sha512', 'kdX9CQlwNt4FfOpOKO_X0pn_v1opQuksE40SrWtMyP1NqooWVWpzCE3myZTfpy8g2azZON_'
+ 'iLNpWVxTwuDWqBQ')
+], ids=['sha256', 'sha384', 'sha512'])
+def test_testzip(wheel_path, algorithm, digest):
+ hash_string = '{}={}'.format(algorithm, digest)
+ with ZipFile(wheel_path, 'w') as zf:
+ zf.writestr(native('hello/héllö.py'), as_bytes('print("Héllö, world!")\n'))
+ zf.writestr('test-1.0.dist-info/RECORD',
+ as_bytes('hello/héllö.py,{},25'.format(hash_string)))
- zf = wheel.install.VerifyingZipFile(bio, 'a')
- zf.pop()
- zf.close()
+ with WheelFile(wheel_path) as wf:
+ wf.testzip()
- zf = wheel.install.VerifyingZipFile(bio, 'r')
- assert len(zf.infolist()) == 1
+def test_testzip_missing_hash(wheel_path):
+ with ZipFile(wheel_path, 'w') as zf:
+ zf.writestr(native('hello/héllö.py'), as_bytes('print("Héllö, world!")\n'))
+ zf.writestr('test-1.0.dist-info/RECORD', '')
-def test_zipfile_timestamp(tmpdir, monkeypatch):
+ with WheelFile(wheel_path) as wf:
+ exc = pytest.raises(WheelError, wf.testzip)
+ exc.match(native("^No hash found for file 'hello/héllö.py'$"))
+
+
+def test_testzip_bad_hash(wheel_path):
+ with ZipFile(wheel_path, 'w') as zf:
+ zf.writestr(native('hello/héllö.py'), as_bytes('print("Héllö, w0rld!")\n'))
+ zf.writestr(
+ 'test-1.0.dist-info/RECORD',
+ as_bytes('hello/héllö.py,sha256=bv-QV3RciQC2v3zL8Uvhd_arp40J5A9xmyubN34OVwo,25'))
+
+ with WheelFile(wheel_path) as wf:
+ exc = pytest.raises(WheelError, wf.testzip)
+ exc.match(native("^Hash mismatch for file 'hello/héllö.py'$"))
+
+
+def test_write_str(wheel_path):
+ with WheelFile(wheel_path, 'w') as wf:
+ wf.writestr(native('hello/héllö.py'), as_bytes('print("Héllö, world!")\n'))
+
+ with ZipFile(wheel_path, 'r') as zf:
+ infolist = zf.infolist()
+ assert len(infolist) == 2
+ assert infolist[0].filename == native('hello/héllö.py')
+ assert infolist[0].file_size == 25
+ assert infolist[1].filename == 'test-1.0.dist-info/RECORD'
+
+ record = zf.read('test-1.0.dist-info/RECORD')
+ assert record == as_bytes(
+ 'hello/héllö.py,sha256=bv-QV3RciQC2v3zL8Uvhd_arp40J5A9xmyubN34OVwo,25\n'
+ 'test-1.0.dist-info/RECORD,,\n')
+
+
+def test_timestamp(tmpdir_factory, wheel_path, monkeypatch):
# An environment variable can be used to influence the timestamp on
# TarInfo objects inside the zip. See issue #143.
+ build_dir = tmpdir_factory.mktemp('build')
for filename in ('one', 'two', 'three'):
- tmpdir.join(filename).write(filename + '\n')
+ build_dir.join(filename).write(filename + '\n')
# The earliest date representable in TarInfos, 1980-01-01
monkeypatch.setenv('SOURCE_DATE_EPOCH', '315576060')
- zip_base_name = str(tmpdir.join('dummy'))
- zip_filename = wheel.archive.make_wheelfile_inner(zip_base_name, str(tmpdir))
- with zipfile.ZipFile(zip_filename, 'r') as zf:
+ with WheelFile(wheel_path, 'w') as wf:
+ wf.write_files(str(build_dir))
+
+ with ZipFile(wheel_path, 'r') as zf:
for info in zf.infolist():
assert info.date_time[:3] == (1980, 1, 1)
+ assert info.compress_type == ZIP_DEFLATED
-def test_zipfile_attributes(tmpdir):
+def test_attributes(tmpdir_factory, wheel_path):
# With the change from ZipFile.write() to .writestr(), we need to manually
# set member attributes.
+ build_dir = tmpdir_factory.mktemp('build')
files = (('foo', 0o644), ('bar', 0o755))
for filename, mode in files:
- path = tmpdir.join(filename)
+ path = build_dir.join(filename)
path.write(filename + '\n')
path.chmod(mode)
- zip_base_name = str(tmpdir.join('dummy'))
- zip_filename = wheel.archive.make_wheelfile_inner(zip_base_name, str(tmpdir))
- with zipfile.ZipFile(zip_filename, 'r') as zf:
+ with WheelFile(wheel_path, 'w') as wf:
+ wf.write_files(str(build_dir))
+
+ with ZipFile(wheel_path, 'r') as zf:
for filename, mode in files:
- info = zf.getinfo(str(tmpdir.join(filename)))
+ info = zf.getinfo(filename)
assert info.external_attr == (mode | 0o100000) << 16
- assert info.compress_type == zipfile.ZIP_DEFLATED
+ assert info.compress_type == ZIP_DEFLATED
diff --git a/tests/complex-dist/complexdist/__init__.py b/tests/testdata/complex-dist/complexdist/__init__.py
index 559fbb7..559fbb7 100644
--- a/tests/complex-dist/complexdist/__init__.py
+++ b/tests/testdata/complex-dist/complexdist/__init__.py
diff --git a/tests/complex-dist/setup.py b/tests/testdata/complex-dist/setup.py
index 41cfb04..41cfb04 100644
--- a/tests/complex-dist/setup.py
+++ b/tests/testdata/complex-dist/setup.py
diff --git a/tests/extension.dist/extension.c b/tests/testdata/extension.dist/extension.c
index a37c3fa..a37c3fa 100644
--- a/tests/extension.dist/extension.c
+++ b/tests/testdata/extension.dist/extension.c
diff --git a/tests/extension.dist/setup.cfg b/tests/testdata/extension.dist/setup.cfg
index 9f6ff39..9f6ff39 100644
--- a/tests/extension.dist/setup.cfg
+++ b/tests/testdata/extension.dist/setup.cfg
diff --git a/tests/extension.dist/setup.py b/tests/testdata/extension.dist/setup.py
index 3ffd839..3ffd839 100644
--- a/tests/extension.dist/setup.py
+++ b/tests/testdata/extension.dist/setup.py
diff --git a/tests/headers.dist/headersdist.py b/tests/testdata/headers.dist/header.h
index e69de29..e69de29 100644
--- a/tests/headers.dist/headersdist.py
+++ b/tests/testdata/headers.dist/header.h
diff --git a/tests/simple.dist/simpledist/__init__.py b/tests/testdata/headers.dist/headersdist.py
index e69de29..e69de29 100644
--- a/tests/simple.dist/simpledist/__init__.py
+++ b/tests/testdata/headers.dist/headersdist.py
diff --git a/tests/headers.dist/setup.cfg b/tests/testdata/headers.dist/setup.cfg
index 7c964b4..7c964b4 100644
--- a/tests/headers.dist/setup.cfg
+++ b/tests/testdata/headers.dist/setup.cfg
diff --git a/tests/headers.dist/setup.py b/tests/testdata/headers.dist/setup.py
index 67cada3..67cada3 100644
--- a/tests/headers.dist/setup.py
+++ b/tests/testdata/headers.dist/setup.py
diff --git a/tests/simple.dist/setup.py b/tests/testdata/simple.dist/setup.py
index d2aaac9..d2aaac9 100644
--- a/tests/simple.dist/setup.py
+++ b/tests/testdata/simple.dist/setup.py
diff --git a/tests/unicode.dist/unicodedist/__init__.py b/tests/testdata/simple.dist/simpledist/__init__.py
index e69de29..e69de29 100644
--- a/tests/unicode.dist/unicodedist/__init__.py
+++ b/tests/testdata/simple.dist/simpledist/__init__.py
diff --git a/tests/test-1.0-py2.py3-none-win32.whl b/tests/testdata/test-1.0-py2.py3-none-win32.whl
index dfd3070..dfd3070 100644
--- a/tests/test-1.0-py2.py3-none-win32.whl
+++ b/tests/testdata/test-1.0-py2.py3-none-win32.whl
Binary files differ
diff --git a/tests/unicode.dist/setup.py b/tests/testdata/unicode.dist/setup.py
index bb0ff60..bb0ff60 100644
--- a/tests/unicode.dist/setup.py
+++ b/tests/testdata/unicode.dist/setup.py
diff --git a/tests/unicode.dist/unicodedist/åäö_日本語.py b/tests/testdata/unicode.dist/unicodedist/__init__.py
index e69de29..e69de29 100644
--- a/tests/unicode.dist/unicodedist/åäö_日本語.py
+++ b/tests/testdata/unicode.dist/unicodedist/__init__.py
diff --git a/tests/testdata/unicode.dist/unicodedist/åäö_日本語.py b/tests/testdata/unicode.dist/unicodedist/åäö_日本語.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/testdata/unicode.dist/unicodedist/åäö_日本語.py