cpython/Lib/packaging/tests/test_command_install_distinfo.py
Éric Araujo f53cd89006 Fix omission in test for packaging install_distinfo command.
The code does not write checksum or file length for .pyc and .pyo in the RECORD
file, in compliance with PEP 376, but the test forgot to take .pyo into
account.  This was not caught because there were no .pyo in the checkout, but
after installing there are .pyo files created by compileall, and the test picks
them up.
2011-06-10 03:53:49 +02:00

193 lines
6.3 KiB
Python

"""Tests for ``packaging.command.install_distinfo``. """
import os
import csv
import hashlib
import sys
from packaging.command.install_distinfo import install_distinfo
from packaging.command.cmd import Command
from packaging.metadata import Metadata
from packaging.tests import unittest, support
class DummyInstallCmd(Command):
def __init__(self, dist=None):
self.outputs = []
self.distribution = dist
def __getattr__(self, name):
return None
def ensure_finalized(self):
pass
def get_outputs(self):
return (self.outputs +
self.get_finalized_command('install_distinfo').get_outputs())
class InstallDistinfoTestCase(support.TempdirManager,
support.LoggingCatcher,
unittest.TestCase):
checkLists = lambda self, x, y: self.assertListEqual(sorted(x), sorted(y))
def test_empty_install(self):
pkg_dir, dist = self.create_dist(name='foo',
version='1.0')
install_dir = self.mkdtemp()
install = DummyInstallCmd(dist)
dist.command_obj['install_dist'] = install
cmd = install_distinfo(dist)
dist.command_obj['install_distinfo'] = cmd
cmd.initialize_options()
cmd.distinfo_dir = install_dir
cmd.ensure_finalized()
cmd.run()
self.checkLists(os.listdir(install_dir), ['foo-1.0.dist-info'])
dist_info = os.path.join(install_dir, 'foo-1.0.dist-info')
self.checkLists(os.listdir(dist_info),
['METADATA', 'RECORD', 'REQUESTED', 'INSTALLER'])
with open(os.path.join(dist_info, 'INSTALLER')) as fp:
self.assertEqual(fp.read(), 'distutils')
with open(os.path.join(dist_info, 'REQUESTED')) as fp:
self.assertEqual(fp.read(), '')
meta_path = os.path.join(dist_info, 'METADATA')
self.assertTrue(Metadata(path=meta_path).check())
def test_installer(self):
pkg_dir, dist = self.create_dist(name='foo',
version='1.0')
install_dir = self.mkdtemp()
install = DummyInstallCmd(dist)
dist.command_obj['install_dist'] = install
cmd = install_distinfo(dist)
dist.command_obj['install_distinfo'] = cmd
cmd.initialize_options()
cmd.distinfo_dir = install_dir
cmd.installer = 'bacon-python'
cmd.ensure_finalized()
cmd.run()
dist_info = os.path.join(install_dir, 'foo-1.0.dist-info')
with open(os.path.join(dist_info, 'INSTALLER')) as fp:
self.assertEqual(fp.read(), 'bacon-python')
def test_requested(self):
pkg_dir, dist = self.create_dist(name='foo',
version='1.0')
install_dir = self.mkdtemp()
install = DummyInstallCmd(dist)
dist.command_obj['install_dist'] = install
cmd = install_distinfo(dist)
dist.command_obj['install_distinfo'] = cmd
cmd.initialize_options()
cmd.distinfo_dir = install_dir
cmd.requested = False
cmd.ensure_finalized()
cmd.run()
dist_info = os.path.join(install_dir, 'foo-1.0.dist-info')
self.checkLists(os.listdir(dist_info),
['METADATA', 'RECORD', 'INSTALLER'])
def test_no_record(self):
pkg_dir, dist = self.create_dist(name='foo',
version='1.0')
install_dir = self.mkdtemp()
install = DummyInstallCmd(dist)
dist.command_obj['install_dist'] = install
cmd = install_distinfo(dist)
dist.command_obj['install_distinfo'] = cmd
cmd.initialize_options()
cmd.distinfo_dir = install_dir
cmd.no_record = True
cmd.ensure_finalized()
cmd.run()
dist_info = os.path.join(install_dir, 'foo-1.0.dist-info')
self.checkLists(os.listdir(dist_info),
['METADATA', 'REQUESTED', 'INSTALLER'])
def test_record(self):
pkg_dir, dist = self.create_dist(name='foo',
version='1.0')
install_dir = self.mkdtemp()
install = DummyInstallCmd(dist)
dist.command_obj['install_dist'] = install
fake_dists = os.path.join(os.path.dirname(__file__), 'fake_dists')
fake_dists = os.path.realpath(fake_dists)
# for testing, we simply add all files from _backport's fake_dists
dirs = []
for dir in os.listdir(fake_dists):
full_path = os.path.join(fake_dists, dir)
if (not dir.endswith('.egg') or dir.endswith('.egg-info') or
dir.endswith('.dist-info')) and os.path.isdir(full_path):
dirs.append(full_path)
for dir in dirs:
for path, subdirs, files in os.walk(dir):
install.outputs += [os.path.join(path, f) for f in files]
install.outputs += [os.path.join('path', f + 'c')
for f in files if f.endswith('.py')]
cmd = install_distinfo(dist)
dist.command_obj['install_distinfo'] = cmd
cmd.initialize_options()
cmd.distinfo_dir = install_dir
cmd.ensure_finalized()
cmd.run()
dist_info = os.path.join(install_dir, 'foo-1.0.dist-info')
expected = []
for f in install.get_outputs():
if (f.endswith(('.pyc', '.pyo')) or f == os.path.join(
install_dir, 'foo-1.0.dist-info', 'RECORD')):
expected.append([f, '', ''])
else:
size = os.path.getsize(f)
md5 = hashlib.md5()
with open(f, 'rb') as fp:
md5.update(fp.read())
hash = md5.hexdigest()
expected.append([f, hash, str(size)])
parsed = []
with open(os.path.join(dist_info, 'RECORD'), 'r') as f:
reader = csv.reader(f, delimiter=',',
lineterminator=os.linesep,
quotechar='"')
parsed = list(reader)
self.maxDiff = None
self.checkLists(parsed, expected)
def test_suite():
return unittest.makeSuite(InstallDistinfoTestCase)
if __name__ == "__main__":
unittest.main(defaultTest="test_suite")