Bug 1374348 - Rewrite paths from JAR files. r=chmanchester

--HG--
extra : rebase_source : cf94efafe34b2d72b21c839bd7422225de758173
This commit is contained in:
Marco Castelluccio 2017-06-22 21:54:12 +01:00
parent 4773d84ed5
commit 98273422c7
2 changed files with 90 additions and 2 deletions

View File

@ -591,7 +591,36 @@ class UrlFinder(object):
url = url.split(' -> ')[1].rstrip()
url_obj = urlparse.urlparse(url)
if url_obj.scheme == 'file' and os.path.isabs(url_obj.path):
if url_obj.scheme == 'jar':
app_name = buildconfig.substs.get('MOZ_APP_NAME')
omnijar_name = buildconfig.substs.get('OMNIJAR_NAME')
if app_name in url:
if omnijar_name in url:
# e.g. file:///home/worker/workspace/build/application/firefox/omni.ja!/components/MainProcessSingleton.js
parts = url_obj.path.split(omnijar_name + '!', 1)
elif '.xpi!' in url:
# e.g. file:///home/worker/workspace/build/application/firefox/browser/features/e10srollout@mozilla.org.xpi!/bootstrap.js
parts = url_obj.path.split('.xpi!', 1)
else:
# We don't know how to handle this jar: path, so return it to the
# caller to make it print a warning.
return url_obj.path, None, False
dir_parts = parts[0].rsplit(app_name + '/', 1)
url = os.path.join(self.topobjdir, 'dist', 'bin', dir_parts[1].lstrip('/'), parts[1].lstrip('/'))
elif '.xpi!' in url:
# e.g. file:///tmp/tmpMdo5gV.mozrunner/extensions/workerbootstrap-test@mozilla.org.xpi!/bootstrap.js
# This matching mechanism is quite brittle and based on examples seen in the wild.
# There's no rule to match the XPI name to the path in dist/xpi-stage.
parts = url_obj.path.split('.xpi!', 1)
addon_name = os.path.basename(parts[0])
if '-test@mozilla.org' in addon_name:
addon_name = addon_name[:-len('-test@mozilla.org')]
elif addon_name.endswith('@mozilla.org'):
addon_name = addon_name[:-len('@mozilla.org')]
url = os.path.join(self.topobjdir, 'dist', 'xpi-stage', addon_name, parts[1].lstrip('/'))
elif url_obj.scheme == 'file' and os.path.isabs(url_obj.path):
path = url_obj.path
if not os.path.isfile(path):
# This may have been in a profile directory that no
@ -600,7 +629,7 @@ class UrlFinder(object):
if not path.startswith(self.topobjdir):
return path, None, False
url = url_obj.path
if url_obj.scheme in ('http', 'https', 'javascript', 'data', 'about'):
elif url_obj.scheme in ('http', 'https', 'javascript', 'data', 'about'):
return None
result = self.find_files(url)

View File

@ -244,5 +244,64 @@ class TestLineRemapping(unittest.TestCase):
self.assertEqual(original_covered_function_count,
sum(r.covered_function_count for r in lcov_file.records))
class TestUrlFinder(unittest.TestCase):
def setUp(self):
chrome_map_file = os.path.join(buildconfig.topobjdir, 'chrome-map.json')
self._old_chrome_info_file = None
if os.path.isfile(chrome_map_file):
backup_file = os.path.join(buildconfig.topobjdir, 'chrome-map-backup.json')
self._old_chrome_info_file = backup_file
self._chrome_map_file = chrome_map_file
shutil.move(chrome_map_file, backup_file)
empty_chrome_info = [
{},
{},
{
'dist/bin/components/MainProcessSingleton.js': [
'path1',
False
],
'dist/bin/browser/components/nsSessionStartup.js': [
'path2',
False
],
'dist/bin/browser/features/e10srollout@mozilla.org/bootstrap.js': [
'path3',
False
],
'dist/bin/browser/features/firefox@getpocket.com/bootstrap.js': [
'path4',
False
],
'dist/xpi-stage/workerbootstrap/bootstrap.js': [
'path5',
False
]
},
]
with open(chrome_map_file, 'w') as fh:
json.dump(empty_chrome_info, fh)
def tearDown(self):
if self._old_chrome_info_file:
shutil.move(self._old_chrome_info_file, self._chrome_map_file)
def test_jar_paths(self):
app_name = buildconfig.substs.get('MOZ_APP_NAME')
omnijar_name = buildconfig.substs.get('OMNIJAR_NAME')
paths = [
('jar:file:///home/worker/workspace/build/application/' + app_name + '/' + omnijar_name + '!/components/MainProcessSingleton.js', 'path1'),
('jar:file:///home/worker/workspace/build/application/' + app_name + '/browser/' + omnijar_name + '!/components/nsSessionStartup.js', 'path2'),
('jar:file:///home/worker/workspace/build/application/' + app_name + '/browser/features/e10srollout@mozilla.org.xpi!/bootstrap.js', 'path3'),
('jar:file:///home/worker/workspace/build/application/' + app_name + '/browser/features/firefox@getpocket.com.xpi!/bootstrap.js', 'path4'),
('jar:file:///tmp/tmpMdo5gV.mozrunner/extensions/workerbootstrap-test@mozilla.org.xpi!/bootstrap.js', 'path5'),
]
url_finder = lcov_rewriter.UrlFinder('', '', [])
for path, expected in paths:
self.assertEqual(url_finder.rewrite_url(path)[0], expected)
if __name__ == '__main__':
mozunit.main()