# Copyright (C) 2015 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from __future__ import print_function import atexit from distutils import spawn import json import os import pkg_resources import shlex import shutil import subprocess import sys import tempfile import unittest import zipfile def _write_wct_conf(root, exports): with open(os.path.join(root, 'wct.conf.js'), 'w') as f: f.write('module.exports = %s;\n' % json.dumps(exports)) def _wct_cmd(): return ['wct'] + shlex.split(os.environ.get('WCT_ARGS', '')) class PolyGerritWctTests(unittest.TestCase): # Should really be setUpClass/tearDownClass, but Buck's test runner doesn't # produce sane stack traces from those methods. There's only one test method # anyway, so just use setUp. def _check_wct(self): self.assertTrue( spawn.find_executable('wct'), msg='wct not found; try `npm install -g web-component-tester`') def _extract_resources(self): tmpdir = tempfile.mkdtemp() atexit.register(lambda: shutil.rmtree(tmpdir)) root = os.path.join(tmpdir, 'polygerrit') os.mkdir(root) tr = 'test_resources.zip' zip_path = os.path.join(tmpdir, tr) s = pkg_resources.resource_stream(__name__, tr) with open(zip_path, 'w') as f: shutil.copyfileobj(s, f) with zipfile.ZipFile(zip_path, 'r') as z: z.extractall(root) return tmpdir, root def test_wct(self): self._check_wct() tmpdir, root = self._extract_resources() cmd = _wct_cmd() print('Running %s in %s' % (cmd, root), file=sys.stderr) _write_wct_conf(root, { 'suites': ['test'], 'webserver': { 'pathMappings': [ {'/components/bower_components': 'bower_components'}, ], }, 'plugins': { 'local': { # For some reason wct tries to install selenium into its node_modules # directory on first run. If you've installed into /usr/local and # aren't running wct as root, you're screwed. Turning this option off # seems to still work, so there's that. 'skipSeleniumInstall': True, }, 'sauce': { # Disabled by default in order to run local tests only. # Run it with (saucelabs.com account required; free for open source): # WCT_ARGS='--plugin sauce' buck test --no-results-cache --include web 'disabled': True, 'browsers': [ 'OS X 10.11/chrome', 'Windows 10/chrome', 'Linux/firefox', 'OS X 10.11/safari', 'Windows 10/microsoftedge', ], }, }, }) p = subprocess.Popen(cmd, cwd=root, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() sys.stdout.write(out) sys.stderr.write(err) self.assertEquals(0, p.returncode) # Only remove tmpdir if successful, to allow debugging. shutil.rmtree(tmpdir) if __name__ == '__main__': unittest.main()