blob: 90b469d701e1fa37bb3c3075eb7ee4f8e138e88f [file] [log] [blame]
#!/usr/bin/env python
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
import os
import shutil
import tempfile
import unittest
from manifestparser import convert
from manifestparser import ManifestParser
here = os.path.dirname(os.path.abspath(__file__))
# In some cases tempfile.mkdtemp() may returns a path which contains
# symlinks. Some tests here will then break, as the manifestparser.convert
# function returns paths that does not contains symlinks.
#
# Workaround is to use the following function, if absolute path of temp dir
# must be compared.
def create_realpath_tempdir():
"""
Create a tempdir without symlinks.
"""
return os.path.realpath(tempfile.mkdtemp())
class TestDirectoryConversion(unittest.TestCase):
"""test conversion of a directory tree to a manifest structure"""
def create_stub(self, directory=None):
"""stub out a directory with files in it"""
files = ('foo', 'bar', 'fleem')
if directory is None:
directory = create_realpath_tempdir()
for i in files:
file(os.path.join(directory, i), 'w').write(i)
subdir = os.path.join(directory, 'subdir')
os.mkdir(subdir)
file(os.path.join(subdir, 'subfile'), 'w').write('baz')
return directory
def test_directory_to_manifest(self):
"""
Test our ability to convert a static directory structure to a
manifest.
"""
# create a stub directory
stub = self.create_stub()
try:
stub = stub.replace(os.path.sep, "/")
self.assertTrue(os.path.exists(stub) and os.path.isdir(stub))
# Make a manifest for it
manifest = convert([stub])
self.assertEqual(str(manifest),
"""[%(stub)s/bar]
subsuite =
[%(stub)s/fleem]
subsuite =
[%(stub)s/foo]
subsuite =
[%(stub)s/subdir/subfile]
subsuite =
""" % dict(stub=stub))
except:
raise
finally:
shutil.rmtree(stub) # cleanup
def test_convert_directory_manifests_in_place(self):
"""
keep the manifests in place
"""
stub = self.create_stub()
try:
ManifestParser.populate_directory_manifests([stub], filename='manifest.ini')
self.assertEqual(sorted(os.listdir(stub)),
['bar', 'fleem', 'foo', 'manifest.ini', 'subdir'])
parser = ManifestParser()
parser.read(os.path.join(stub, 'manifest.ini'))
self.assertEqual([i['name'] for i in parser.tests],
['subfile', 'bar', 'fleem', 'foo'])
parser = ManifestParser()
parser.read(os.path.join(stub, 'subdir', 'manifest.ini'))
self.assertEqual(len(parser.tests), 1)
self.assertEqual(parser.tests[0]['name'], 'subfile')
except:
raise
finally:
shutil.rmtree(stub)
def test_manifest_ignore(self):
"""test manifest `ignore` parameter for ignoring directories"""
stub = self.create_stub()
try:
ManifestParser.populate_directory_manifests([stub], filename='manifest.ini', ignore=('subdir',))
parser = ManifestParser()
parser.read(os.path.join(stub, 'manifest.ini'))
self.assertEqual([i['name'] for i in parser.tests],
['bar', 'fleem', 'foo'])
self.assertFalse(os.path.exists(os.path.join(stub, 'subdir', 'manifest.ini')))
except:
raise
finally:
shutil.rmtree(stub)
def test_pattern(self):
"""test directory -> manifest with a file pattern"""
stub = self.create_stub()
try:
parser = convert([stub], pattern='f*', relative_to=stub)
self.assertEqual([i['name'] for i in parser.tests],
['fleem', 'foo'])
# test multiple patterns
parser = convert([stub], pattern=('f*', 's*'), relative_to=stub)
self.assertEqual([i['name'] for i in parser.tests],
['fleem', 'foo', 'subdir/subfile'])
except:
raise
finally:
shutil.rmtree(stub)
def test_update(self):
"""
Test our ability to update tests from a manifest and a directory of
files
"""
# boilerplate
tempdir = create_realpath_tempdir()
for i in range(10):
file(os.path.join(tempdir, str(i)), 'w').write(str(i))
# otherwise empty directory with a manifest file
newtempdir = create_realpath_tempdir()
manifest_file = os.path.join(newtempdir, 'manifest.ini')
manifest_contents = str(convert([tempdir], relative_to=tempdir))
with file(manifest_file, 'w') as f:
f.write(manifest_contents)
# get the manifest
manifest = ManifestParser(manifests=(manifest_file,))
# All of the tests are initially missing:
paths = [str(i) for i in range(10)]
self.assertEqual([i['name'] for i in manifest.missing()],
paths)
# But then we copy one over:
self.assertEqual(manifest.get('name', name='1'), ['1'])
manifest.update(tempdir, name='1')
self.assertEqual(sorted(os.listdir(newtempdir)),
['1', 'manifest.ini'])
# Update that one file and copy all the "tests":
file(os.path.join(tempdir, '1'), 'w').write('secret door')
manifest.update(tempdir)
self.assertEqual(sorted(os.listdir(newtempdir)),
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'manifest.ini'])
self.assertEqual(file(os.path.join(newtempdir, '1')).read().strip(),
'secret door')
# clean up:
shutil.rmtree(tempdir)
shutil.rmtree(newtempdir)
if __name__ == '__main__':
unittest.main()