| # Copyright 2008 the V8 project authors. All rights reserved. |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are |
| # met: |
| # |
| # * Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # * Redistributions in binary form must reproduce the above |
| # copyright notice, this list of conditions and the following |
| # disclaimer in the documentation and/or other materials provided |
| # with the distribution. |
| # * Neither the name of Google Inc. nor the names of its |
| # contributors may be used to endorse or promote products derived |
| # from this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| import test |
| import os |
| import re |
| from functools import reduce |
| |
| |
| FLAGS_PATTERN = re.compile(r"//\s+Flags:(.*)") |
| LS_RE = re.compile(r'^test-.*\.m?js$') |
| |
| class SimpleTestCase(test.TestCase): |
| |
| def __init__(self, path, file, arch, mode, context, config, additional=None): |
| super(SimpleTestCase, self).__init__(context, path, arch, mode) |
| self.file = file |
| self.config = config |
| self.arch = arch |
| self.mode = mode |
| if additional is not None: |
| self.additional_flags = additional |
| else: |
| self.additional_flags = [] |
| |
| |
| def GetLabel(self): |
| return "%s %s" % (self.mode, self.GetName()) |
| |
| def GetName(self): |
| return self.path[-1] |
| |
| def GetCommand(self): |
| result = [self.config.context.GetVm(self.arch, self.mode)] |
| source = open(self.file).read() |
| flags_match = FLAGS_PATTERN.search(source) |
| if flags_match: |
| flags = flags_match.group(1).strip().split() |
| # The following block reads config.gypi to extract the v8_enable_inspector |
| # value. This is done to check if the inspector is disabled in which case |
| # the '--inspect' flag cannot be passed to the node process as it will |
| # cause node to exit and report the test as failed. The use case |
| # is currently when Node is configured --without-ssl and the tests should |
| # still be runnable but skip any tests that require ssl (which includes the |
| # inspector related tests). Also, if there is no ssl support the options |
| # '--use-bundled-ca' and '--use-openssl-ca' will also cause a similar |
| # failure so such tests are also skipped. |
| if (any(flag.startswith('--inspect') for flag in flags) and |
| not self.context.v8_enable_inspector): |
| print(': Skipping as node was compiled without inspector support') |
| elif (('--use-bundled-ca' in flags or |
| '--use-openssl-ca' in flags or |
| '--tls-v1.0' in flags or |
| '--tls-v1.1' in flags) and |
| not self.context.node_has_crypto): |
| print(': Skipping as node was compiled without crypto support') |
| else: |
| result += flags |
| |
| if self.additional_flags: |
| result += self.additional_flags |
| |
| result += [self.file] |
| |
| return result |
| |
| def GetSource(self): |
| return open(self.file).read() |
| |
| |
| class SimpleTestConfiguration(test.TestConfiguration): |
| def __init__(self, context, root, section, additional=None): |
| super(SimpleTestConfiguration, self).__init__(context, root, section) |
| if additional is not None: |
| self.additional_flags = additional |
| else: |
| self.additional_flags = [] |
| |
| def Ls(self, path): |
| return [f for f in os.listdir(path) if LS_RE.match(f)] |
| |
| def ListTests(self, current_path, path, arch, mode): |
| all_tests = [current_path + [t] for t in self.Ls(os.path.join(self.root))] |
| result = [] |
| for tst in all_tests: |
| if self.Contains(path, tst): |
| file_path = os.path.join(self.root, reduce(os.path.join, tst[1:], "")) |
| test_name = tst[:-1] + [os.path.splitext(tst[-1])[0]] |
| result.append(SimpleTestCase(test_name, file_path, arch, mode, |
| self.context, self, self.additional_flags)) |
| return result |
| |
| def GetBuildRequirements(self): |
| return ['sample', 'sample=shell'] |
| |
| class ParallelTestConfiguration(SimpleTestConfiguration): |
| def __init__(self, context, root, section, additional=None): |
| super(ParallelTestConfiguration, self).__init__(context, root, section, |
| additional) |
| |
| def ListTests(self, current_path, path, arch, mode): |
| result = super(ParallelTestConfiguration, self).ListTests( |
| current_path, path, arch, mode) |
| for tst in result: |
| tst.parallel = True |
| return result |
| |
| class AddonTestConfiguration(SimpleTestConfiguration): |
| def __init__(self, context, root, section, additional=None): |
| super(AddonTestConfiguration, self).__init__(context, root, section, additional) |
| |
| def Ls(self, path): |
| def SelectTest(name): |
| return name.endswith('.js') |
| |
| result = [] |
| for subpath in os.listdir(path): |
| if os.path.isdir(os.path.join(path, subpath)): |
| for f in os.listdir(os.path.join(path, subpath)): |
| if SelectTest(f): |
| result.append([subpath, f[:-3]]) |
| return result |
| |
| def ListTests(self, current_path, path, arch, mode): |
| all_tests = [current_path + t for t in self.Ls(os.path.join(self.root))] |
| result = [] |
| for tst in all_tests: |
| if self.Contains(path, tst): |
| file_path = os.path.join(self.root, reduce(os.path.join, tst[1:], "") + ".js") |
| result.append( |
| SimpleTestCase(tst, file_path, arch, mode, self.context, self, self.additional_flags)) |
| return result |
| |
| class AbortTestConfiguration(SimpleTestConfiguration): |
| def __init__(self, context, root, section, additional=None): |
| super(AbortTestConfiguration, self).__init__(context, root, section, |
| additional) |
| |
| def ListTests(self, current_path, path, arch, mode): |
| result = super(AbortTestConfiguration, self).ListTests( |
| current_path, path, arch, mode) |
| for tst in result: |
| tst.disable_core_files = True |
| return result |