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