/chrome/browser/resources/optimize_webui_test.py
Python | 221 lines | 203 code | 12 blank | 6 comment | 5 complexity | 3e6f195a7eba532bf47873825bb749c2 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-2.0, BSD-2-Clause, LGPL-2.1, MPL-2.0, 0BSD, EPL-1.0, MPL-2.0-no-copyleft-exception, GPL-2.0, BitTorrent-1.0, CPL-1.0, LGPL-3.0, Unlicense, BSD-3-Clause, CC0-1.0, JSON, MIT, GPL-3.0, CC-BY-SA-3.0, AGPL-1.0
- #!/usr/bin/env python
- # Copyright 2017 The Chromium Authors. All rights reserved.
- # Use of this source code is governed by a BSD-style license that can be
- # found in the LICENSE file.
- import optimize_webui
- import os
- import shutil
- import tempfile
- import unittest
- _HERE_DIR = os.path.dirname(__file__)
- class OptimizeWebUiTest(unittest.TestCase):
- def setUp(self):
- self._out_folder = None
- self._tmp_dirs = []
- self._tmp_src_dir = None
- def tearDown(self):
- for tmp_dir in self._tmp_dirs:
- shutil.rmtree(tmp_dir)
- def _write_file_to_src_dir(self, file_path, file_contents):
- if not self._tmp_src_dir:
- self._tmp_src_dir = self._create_tmp_dir()
- file_path_normalized = os.path.normpath(os.path.join(self._tmp_src_dir,
- file_path))
- file_dir = os.path.dirname(file_path_normalized)
- if not os.path.exists(file_dir):
- os.makedirs(file_dir)
- with open(file_path_normalized, 'w') as tmp_file:
- tmp_file.write(file_contents)
- def _create_tmp_dir(self):
- # TODO(dbeam): support cross-drive paths (i.e. d:\ vs c:\).
- tmp_dir = tempfile.mkdtemp(dir=_HERE_DIR)
- self._tmp_dirs.append(tmp_dir)
- return tmp_dir
- def _read_out_file(self, file_name):
- assert self._out_folder
- return open(os.path.join(self._out_folder, file_name), 'r').read()
- def _run_optimize(self, input_args):
- assert not self._out_folder
- self._out_folder = self._create_tmp_dir()
- # TODO(dbeam): make it possible to _run_optimize twice? Is that useful?
- args = input_args + [
- '--depfile', os.path.join(self._out_folder, 'depfile.d'),
- '--host', 'fake-host',
- '--input', self._tmp_src_dir,
- '--out_folder', self._out_folder,
- ]
- optimize_webui.main(args)
- def _write_files_to_src_dir(self):
- self._write_file_to_src_dir('element.html', '<div>got here!</div>')
- self._write_file_to_src_dir('element.js', "alert('yay');")
- self._write_file_to_src_dir('element_in_dir/element_in_dir.html',
- '<script src="element_in_dir.js">')
- self._write_file_to_src_dir('element_in_dir/element_in_dir.js',
- "alert('hello from element_in_dir');")
- self._write_file_to_src_dir('ui.html', '''
- <link rel="import" href="element.html">
- <link rel="import" href="element_in_dir/element_in_dir.html">
- <script src="element.js"></script>
- ''')
- def _write_v3_files_to_src_dir(self):
- self._write_file_to_src_dir('element.js', "alert('yay');")
- self._write_file_to_src_dir('element_in_dir/element_in_dir.js',
- "alert('hello from element_in_dir');")
- self._write_file_to_src_dir('ui.js', '''
- import './element.js';
- import './element_in_dir/element_in_dir.js';
- ''')
- self._write_file_to_src_dir('ui.html', '''
- <script type="module" src="ui.js"></script>
- ''')
- def _write_v3_files_with_resources_to_src_dir(self):
- resources_path = os.path.join(
- _HERE_DIR.replace('\\', '/'), 'gen', 'ui', 'webui', 'resources', 'js',
- 'fake_resource.m.js')
- os.makedirs(os.path.dirname(resources_path))
- self._tmp_dirs.append('gen')
- with open(resources_path, 'w') as tmp_file:
- tmp_file.write("alert('hello from shared resource');")
- self._write_file_to_src_dir('element.js', '''
- import 'chrome://resources/js/action_link.js';
- alert('yay');
- ''')
- self._write_file_to_src_dir('element_in_dir/element_in_dir.js', '''
- import {foo} from 'chrome://resources/js/fake_resource.m.js';
- import '../strings.m.js';
- alert('hello from element_in_dir');
- ''')
- self._write_file_to_src_dir('ui.js', '''
- import 'chrome://fake-host/strings.m.js';
- import './element.js';
- import './element_in_dir/element_in_dir.js';
- ''')
- self._write_file_to_src_dir('ui.html', '''
- <script type="module" src="ui.js"></script>
- ''')
- def _check_output_html(self, out_html):
- self.assertNotIn('element.html', out_html)
- self.assertNotIn('element.js', out_html)
- self.assertNotIn('element_in_dir.html', out_html)
- self.assertNotIn('element_in_dir.js', out_html)
- self.assertIn('got here!', out_html)
- def _check_output_js(self, output_js_name):
- output_js = self._read_out_file(output_js_name)
- self.assertIn('yay', output_js)
- self.assertIn('hello from element_in_dir', output_js)
- def _check_output_depfile(self, has_html):
- depfile_d = self._read_out_file('depfile.d')
- self.assertIn('element.js', depfile_d)
- self.assertIn(os.path.normpath('element_in_dir/element_in_dir.js'),
- depfile_d)
- if (has_html):
- self.assertIn('element.html', depfile_d)
- self.assertIn(os.path.normpath('element_in_dir/element_in_dir.html'),
- depfile_d)
- def testSimpleOptimize(self):
- self._write_files_to_src_dir()
- args = [
- '--html_in_files', 'ui.html',
- '--html_out_files', 'fast.html',
- '--js_out_files', 'fast.js',
- ]
- self._run_optimize(args)
- fast_html = self._read_out_file('fast.html')
- self._check_output_html(fast_html)
- self.assertIn('<script src="fast.js"></script>', fast_html)
- self._check_output_js('fast.js')
- self._check_output_depfile(True)
- def testV3SimpleOptimize(self):
- self._write_v3_files_to_src_dir()
- args = [
- '--js_module_in_files', 'ui.js',
- '--js_out_files', 'ui.rollup.js',
- ]
- self._run_optimize(args)
- self._check_output_js('ui.rollup.js')
- self._check_output_depfile(False)
- def testV3OptimizeWithResources(self):
- self._write_v3_files_with_resources_to_src_dir()
- args = [
- '--js_module_in_files', 'ui.js',
- '--js_out_files', 'ui.rollup.js',
- ]
- self._run_optimize(args)
- ui_rollup_js = self._read_out_file('ui.rollup.js')
- self.assertIn('yay', ui_rollup_js)
- self.assertIn('hello from element_in_dir', ui_rollup_js)
- self.assertIn('hello from shared resource', ui_rollup_js)
- depfile_d = self._read_out_file('depfile.d')
- self.assertIn('element.js', depfile_d)
- self.assertIn(os.path.normpath('element_in_dir/element_in_dir.js'),
- depfile_d)
- self.assertIn(
- os.path.normpath('../../../../ui/webui/resources/js/action_link.js'),
- depfile_d)
- self.assertIn(
- os.path.normpath('../gen/ui/webui/resources/js/fake_resource.m.js'),
- depfile_d)
- def testV3MultiBundleOptimize(self):
- self._write_v3_files_to_src_dir()
- self._write_file_to_src_dir('lazy_element.js',
- "alert('hello from lazy_element');")
- self._write_file_to_src_dir('lazy.js', '''
- import './lazy_element.js';
- import './element_in_dir/element_in_dir.js';
- ''')
- args = [
- '--js_module_in_files', 'ui.js', 'lazy.js',
- '--js_out_files', 'ui.rollup.js', 'lazy.rollup.js', 'shared.rollup.js',
- ]
- self._run_optimize(args)
- # Check that the shared element is in the shared bundle and the non-shared
- # elements are in the individual bundles.
- ui_js = self._read_out_file('ui.rollup.js')
- self.assertIn('yay', ui_js)
- self.assertNotIn('hello from lazy_element', ui_js)
- self.assertNotIn('hello from element_in_dir', ui_js)
- lazy_js = self._read_out_file('lazy.rollup.js')
- self.assertNotIn('yay', lazy_js)
- self.assertIn('hello from lazy_element', lazy_js)
- self.assertNotIn('hello from element_in_dir', lazy_js)
- shared_js = self._read_out_file('shared.rollup.js')
- self.assertNotIn('yay', shared_js)
- self.assertNotIn('hello from lazy_element', shared_js)
- self.assertIn('hello from element_in_dir', shared_js)
- # All 3 JS files should be in the depfile.
- self._check_output_depfile(False)
- depfile_d = self._read_out_file('depfile.d')
- self.assertIn('lazy_element.js', depfile_d)
- if __name__ == '__main__':
- unittest.main()