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: michael@0: class TestSymlinkConversion(unittest.TestCase): michael@0: """ michael@0: test conversion of a directory tree with symlinks to a manifest structure michael@0: """ michael@0: michael@0: # Currently broken: see michael@0: # https://bugzilla.mozilla.org/show_bug.cgi?id=902610 michael@0: # https://bugzilla.mozilla.org/show_bug.cgi?id=920938 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_relpath(self): michael@0: """test convert `relative_to` functionality""" michael@0: michael@0: oldcwd = os.getcwd() michael@0: stub = self.create_stub() michael@0: try: michael@0: # subdir with in-memory manifest michael@0: files = ['../bar', '../fleem', '../foo', 'subfile'] michael@0: subdir = os.path.join(stub, 'subdir') michael@0: os.chdir(subdir) michael@0: parser = convert([stub], relative_to='.') michael@0: self.assertEqual([i['name'] for i in parser.tests], michael@0: files) michael@0: except: michael@0: raise michael@0: finally: michael@0: shutil.rmtree(stub) michael@0: os.chdir(oldcwd) michael@0: michael@0: def test_relpath_symlink(self): michael@0: """ michael@0: Ensure `relative_to` works in a symlink. michael@0: Not available on windows. michael@0: """ michael@0: michael@0: symlink = getattr(os, 'symlink', None) michael@0: if symlink is None: michael@0: return # symlinks unavailable on this platform michael@0: michael@0: oldcwd = os.getcwd() michael@0: workspace = tempfile.mkdtemp() michael@0: try: michael@0: tmpdir = os.path.join(workspace, 'directory') michael@0: os.makedirs(tmpdir) michael@0: linkdir = os.path.join(workspace, 'link') michael@0: symlink(tmpdir, linkdir) michael@0: self.create_stub(tmpdir) michael@0: michael@0: # subdir with in-memory manifest michael@0: files = ['../bar', '../fleem', '../foo', 'subfile'] michael@0: subdir = os.path.join(linkdir, 'subdir') michael@0: os.chdir(os.path.realpath(subdir)) michael@0: for directory in (tmpdir, linkdir): michael@0: parser = convert([directory], relative_to='.') michael@0: self.assertEqual([i['name'] for i in parser.tests], michael@0: files) michael@0: finally: michael@0: shutil.rmtree(workspace) michael@0: os.chdir(oldcwd) michael@0: michael@0: # a more complicated example michael@0: oldcwd = os.getcwd() michael@0: workspace = tempfile.mkdtemp() michael@0: try: michael@0: tmpdir = os.path.join(workspace, 'directory') michael@0: os.makedirs(tmpdir) michael@0: linkdir = os.path.join(workspace, 'link') michael@0: symlink(tmpdir, linkdir) michael@0: self.create_stub(tmpdir) michael@0: files = ['../bar', '../fleem', '../foo', 'subfile'] michael@0: subdir = os.path.join(linkdir, 'subdir') michael@0: subsubdir = os.path.join(subdir, 'sub') michael@0: os.makedirs(subsubdir) michael@0: linksubdir = os.path.join(linkdir, 'linky') michael@0: linksubsubdir = os.path.join(subsubdir, 'linky') michael@0: symlink(subdir, linksubdir) michael@0: symlink(subdir, linksubsubdir) michael@0: for dest in (subdir,): michael@0: os.chdir(dest) michael@0: for directory in (tmpdir, linkdir): michael@0: parser = convert([directory], relative_to='.') michael@0: self.assertEqual([i['name'] for i in parser.tests], michael@0: files) michael@0: finally: michael@0: shutil.rmtree(workspace) michael@0: os.chdir(oldcwd) michael@0: michael@0: michael@0: if __name__ == '__main__': michael@0: unittest.main()