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 michael@0: # file, You can obtain one at http://mozilla.org/MPL/2.0/. michael@0: michael@0: from mozbuild.util import ensureParentDir michael@0: michael@0: from mozpack.unify import ( michael@0: UnifiedFinder, michael@0: UnifiedBuildFinder, michael@0: ) michael@0: import mozunit michael@0: from mozpack.test.test_files import TestWithTmpDir michael@0: from mozpack.files import FileFinder michael@0: from mozpack.mozjar import JarWriter michael@0: from mozpack.test.test_files import MockDest michael@0: from cStringIO import StringIO michael@0: import os michael@0: import sys michael@0: from mozpack.errors import ( michael@0: ErrorMessage, michael@0: AccumulatedErrors, michael@0: errors, michael@0: ) michael@0: michael@0: michael@0: class TestUnified(TestWithTmpDir): michael@0: def create_one(self, which, path, content): michael@0: file = self.tmppath(os.path.join(which, path)) michael@0: ensureParentDir(file) michael@0: open(file, 'wb').write(content) michael@0: michael@0: def create_both(self, path, content): michael@0: for p in ['a', 'b']: michael@0: self.create_one(p, path, content) michael@0: michael@0: michael@0: class TestUnifiedFinder(TestUnified): michael@0: def test_unified_finder(self): michael@0: self.create_both('foo/bar', 'foobar') michael@0: self.create_both('foo/baz', 'foobaz') michael@0: self.create_one('a', 'bar', 'bar') michael@0: self.create_one('b', 'baz', 'baz') michael@0: self.create_one('a', 'qux', 'foobar') michael@0: self.create_one('b', 'qux', 'baz') michael@0: self.create_one('a', 'test/foo', 'a\nb\nc\n') michael@0: self.create_one('b', 'test/foo', 'b\nc\na\n') michael@0: self.create_both('test/bar', 'a\nb\nc\n') michael@0: michael@0: finder = UnifiedFinder(FileFinder(self.tmppath('a')), michael@0: FileFinder(self.tmppath('b')), michael@0: sorted=['test']) michael@0: self.assertEqual(sorted([(f, c.open().read()) michael@0: for f, c in finder.find('foo')]), michael@0: [('foo/bar', 'foobar'), ('foo/baz', 'foobaz')]) michael@0: self.assertRaises(ErrorMessage, any, finder.find('bar')) michael@0: self.assertRaises(ErrorMessage, any, finder.find('baz')) michael@0: self.assertRaises(ErrorMessage, any, finder.find('qux')) michael@0: self.assertEqual(sorted([(f, c.open().read()) michael@0: for f, c in finder.find('test')]), michael@0: [('test/bar', 'a\nb\nc\n'), michael@0: ('test/foo', 'a\nb\nc\n')]) michael@0: michael@0: michael@0: class TestUnifiedBuildFinder(TestUnified): michael@0: def test_unified_build_finder(self): michael@0: self.create_both('chrome.manifest', 'a\nb\nc\n') michael@0: self.create_one('a', 'chrome/chrome.manifest', 'a\nb\nc\n') michael@0: self.create_one('b', 'chrome/chrome.manifest', 'b\nc\na\n') michael@0: self.create_one('a', 'chrome/browser/foo/buildconfig.html', michael@0: '\n'.join([ michael@0: '', michael@0: '', michael@0: '

about:buildconfig

', michael@0: '
foo
', michael@0: '', michael@0: '', michael@0: ])) michael@0: self.create_one('b', 'chrome/browser/foo/buildconfig.html', michael@0: '\n'.join([ michael@0: '', michael@0: '', michael@0: '

about:buildconfig

', michael@0: '
bar
', michael@0: '', michael@0: '', michael@0: ])) michael@0: finder = UnifiedBuildFinder(FileFinder(self.tmppath('a')), michael@0: FileFinder(self.tmppath('b'))) michael@0: self.assertEqual(sorted([(f, c.open().read()) for f, c in michael@0: finder.find('**/chrome.manifest')]), michael@0: [('chrome.manifest', 'a\nb\nc\n'), michael@0: ('chrome/chrome.manifest', 'a\nb\nc\n')]) michael@0: michael@0: self.assertEqual(sorted([(f, c.open().read()) for f, c in michael@0: finder.find('**/buildconfig.html')]), michael@0: [('chrome/browser/foo/buildconfig.html', '\n'.join([ michael@0: '', michael@0: '', michael@0: '

about:buildconfig

', michael@0: '
foo
', michael@0: '
', michael@0: '
bar
', michael@0: '', michael@0: '', michael@0: ]))]) michael@0: michael@0: xpi = MockDest() michael@0: with JarWriter(fileobj=xpi, compress=True) as jar: michael@0: jar.add('foo', 'foo') michael@0: jar.add('bar', 'bar') michael@0: foo_xpi = xpi.read() michael@0: self.create_both('foo.xpi', foo_xpi) michael@0: michael@0: with JarWriter(fileobj=xpi, compress=True) as jar: michael@0: jar.add('foo', 'bar') michael@0: self.create_one('a', 'bar.xpi', foo_xpi) michael@0: self.create_one('b', 'bar.xpi', xpi.read()) michael@0: michael@0: errors.out = StringIO() michael@0: with self.assertRaises(AccumulatedErrors), errors.accumulate(): michael@0: self.assertEqual([(f, c.open().read()) for f, c in michael@0: finder.find('*.xpi')], michael@0: [('foo.xpi', foo_xpi)]) michael@0: errors.out = sys.stderr michael@0: michael@0: michael@0: if __name__ == '__main__': michael@0: mozunit.main()