diff --git a/Makefile b/Makefile index eaf8b5e3f0..ac65b39fad 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ uninstall: @$(WAF) uninstall test: all - python tools/test.py --mode=release simple + python tools/test.py --mode=release simple message test-all: all python tools/test.py --mode=debug,release @@ -24,6 +24,9 @@ test-release: all test-debug: all python tools/test.py --mode=debug +test-message: all + python tools/test.py message + test-simple: all python tools/test.py simple diff --git a/test/message/2100bytes.js b/test/message/2100bytes.js new file mode 100644 index 0000000000..64a2a29a9c --- /dev/null +++ b/test/message/2100bytes.js @@ -0,0 +1,48 @@ +require('../common'); + +sys = require('sys'); +sys.error([ + '***********************************************50', + '**********************************************100', + '**********************************************150', + '**********************************************200', + '**********************************************250', + '**********************************************300', + '**********************************************350', + '**********************************************400', + '**********************************************450', + '**********************************************500', + '**********************************************550', + '**********************************************600', + '**********************************************650', + '**********************************************700', + '**********************************************750', + '**********************************************800', + '**********************************************850', + '**********************************************900', + '**********************************************950', + '*********************************************1000', + '*********************************************1050', + '*********************************************1100', + '*********************************************1150', + '*********************************************1200', + '*********************************************1250', + '*********************************************1300', + '*********************************************1350', + '*********************************************1400', + '*********************************************1450', + '*********************************************1500', + '*********************************************1550', + '*********************************************1600', + '*********************************************1650', + '*********************************************1700', + '*********************************************1750', + '*********************************************1800', + '*********************************************1850', + '*********************************************1900', + '*********************************************1950', + '*********************************************2000', + '*********************************************2050', + '*********************************************2100', +].join('\n')); + diff --git a/test/message/2100bytes.out b/test/message/2100bytes.out new file mode 100644 index 0000000000..61e1383d3b --- /dev/null +++ b/test/message/2100bytes.out @@ -0,0 +1,42 @@ +***********************************************50 +**********************************************100 +**********************************************150 +**********************************************200 +**********************************************250 +**********************************************300 +**********************************************350 +**********************************************400 +**********************************************450 +**********************************************500 +**********************************************550 +**********************************************600 +**********************************************650 +**********************************************700 +**********************************************750 +**********************************************800 +**********************************************850 +**********************************************900 +**********************************************950 +*********************************************1000 +*********************************************1050 +*********************************************1100 +*********************************************1150 +*********************************************1200 +*********************************************1250 +*********************************************1300 +*********************************************1350 +*********************************************1400 +*********************************************1450 +*********************************************1500 +*********************************************1550 +*********************************************1600 +*********************************************1650 +*********************************************1700 +*********************************************1750 +*********************************************1800 +*********************************************1850 +*********************************************1900 +*********************************************1950 +*********************************************2000 +*********************************************2050 +*********************************************2100 diff --git a/test/message/hello_world.js b/test/message/hello_world.js new file mode 100644 index 0000000000..2bb74e8ca9 --- /dev/null +++ b/test/message/hello_world.js @@ -0,0 +1,3 @@ +require('../common'); + +error('hello world'); diff --git a/test/message/hello_world.out b/test/message/hello_world.out new file mode 100644 index 0000000000..3b18e512db --- /dev/null +++ b/test/message/hello_world.out @@ -0,0 +1 @@ +hello world diff --git a/test/message/testcfg.py b/test/message/testcfg.py new file mode 100644 index 0000000000..0aafdd7689 --- /dev/null +++ b/test/message/testcfg.py @@ -0,0 +1,135 @@ +# 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 +from os.path import join, dirname, exists, basename, isdir +import re + +FLAGS_PATTERN = re.compile(r"//\s+Flags:(.*)") + +class MessageTestCase(test.TestCase): + + def __init__(self, path, file, expected, mode, context, config): + super(MessageTestCase, self).__init__(context, path) + self.file = file + self.expected = expected + self.config = config + self.mode = mode + + def IgnoreLine(self, str): + """Ignore empty lines and valgrind output.""" + if not str: return True + else: return str.startswith('==') or str.startswith('**') + + def IsFailureOutput(self, output): + f = file(self.expected) + # Skip initial '#' comment and spaces + for line in f: + if (not line.startswith('#')) and (not line.strip()): + break + # Convert output lines to regexps that we can match + env = { 'basename': basename(self.file) } + patterns = [ ] + for line in f: + if not line.strip(): + continue + pattern = re.escape(line.rstrip() % env) + pattern = pattern.replace('\\*', '.*') + pattern = '^%s$' % pattern + patterns.append(pattern) + # Compare actual output with the expected + raw_lines = output.stdout.split('\n') + outlines = [ s for s in raw_lines if not self.IgnoreLine(s) ] + if len(outlines) != len(patterns): + return True + for i in xrange(len(patterns)): + if not re.match(patterns[i], outlines[i]): + return True + return False + + 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.mode)] + source = open(self.file).read() + flags_match = FLAGS_PATTERN.search(source) + if flags_match: + result += flags_match.group(1).strip().split() + result.append(self.file) + return result + + def GetSource(self): + return (open(self.file).read() + + "\n--- expected output ---\n" + + open(self.expected).read()) + + +class MessageTestConfiguration(test.TestConfiguration): + + def __init__(self, context, root): + super(MessageTestConfiguration, self).__init__(context, root) + + def Ls(self, path): + if isdir(path): + return [f[:-3] for f in os.listdir(path) if f.endswith('.js')] + else: + return [] + + def ListTests(self, current_path, path, mode): + mjsunit = [current_path + [t] for t in self.Ls(self.root)] + #regress = [current_path + ['regress', t] for t in self.Ls(join(self.root, 'regress'))] + #bugs = [current_path + ['bugs', t] for t in self.Ls(join(self.root, 'bugs'))] + all_tests = mjsunit #+ regress + bugs + result = [] + for test in all_tests: + if self.Contains(path, test): + file_prefix = join(self.root, reduce(join, test[1:], "")) + file_path = file_prefix + ".js" + output_path = file_prefix + ".out" + if not exists(output_path): + print "Could not find %s" % output_path + continue + result.append(MessageTestCase(test, file_path, output_path, mode, + self.context, self)) + return result + + def GetBuildRequirements(self): + return ['sample', 'sample=shell'] + + def GetTestStatus(self, sections, defs): + status_file = join(self.root, 'message.status') + if exists(status_file): + test.ReadConfigurationInto(status_file, sections, defs) + + +def GetConfiguration(context, root): + return MessageTestConfiguration(context, root)