| Index: client/tools/htmlconverter_test.py
 | 
| ===================================================================
 | 
| --- client/tools/htmlconverter_test.py	(revision 6168)
 | 
| +++ client/tools/htmlconverter_test.py	(working copy)
 | 
| @@ -1,415 +0,0 @@
 | 
| -# Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 | 
| -# for details. All rights reserved. Use of this source code is governed by a
 | 
| -# BSD-style license that can be found in the LICENSE file.
 | 
| -
 | 
| -#!/usr/bin/env python
 | 
| -#
 | 
| -
 | 
| -"""A test for htmlconverter.py
 | 
| -"""
 | 
| -
 | 
| -from os.path import abspath, basename, dirname, exists, join, split
 | 
| -import optparse
 | 
| -import os
 | 
| -import sys
 | 
| -import subprocess
 | 
| -
 | 
| -# The inputs to our test
 | 
| -TEST1_HTML = """
 | 
| -<html>
 | 
| -  <head></head>
 | 
| -  <body>
 | 
| -    <script type="application/javascript">
 | 
| -      if (window.layoutTestController) {
 | 
| -        window.layoutTestController.dumpAsText();
 | 
| -      }
 | 
| -    </script>
 | 
| -
 | 
| -    <!-- embed source code -->
 | 
| -    <script type="application/dart">
 | 
| -      #import('dart:dom');
 | 
| -      main() {
 | 
| -        window.alert('hi');
 | 
| -      }
 | 
| -    </script>
 | 
| -  </body>
 | 
| -</html>
 | 
| -"""
 | 
| -
 | 
| -TEST1_OUTPUT = """
 | 
| -ALERT: hi
 | 
| -Content-Type: text/plain
 | 
| -
 | 
| -#EOF
 | 
| -"""
 | 
| -
 | 
| -TEST2_HTML = """
 | 
| -<html>
 | 
| -  <head></head>
 | 
| -  <body>
 | 
| -    <script type="application/javascript">
 | 
| -      if (window.layoutTestController) {
 | 
| -        window.layoutTestController.dumpAsText();
 | 
| -      }
 | 
| -    </script>
 | 
| -
 | 
| -    <!-- embed source code -->
 | 
| -    <script type="application/dart" src="test_2.dart"></script>
 | 
| -  </body>
 | 
| -</html>
 | 
| -"""
 | 
| -
 | 
| -TEST2_DART = """
 | 
| -#library('test2');
 | 
| -#import('dart:dom');
 | 
| -main() {
 | 
| -  window.alert('test2!');
 | 
| -}
 | 
| -"""
 | 
| -
 | 
| -TEST2_OUTPUT = """
 | 
| -ALERT: test2!
 | 
| -Content-Type: text/plain
 | 
| -
 | 
| -#EOF
 | 
| -"""
 | 
| -
 | 
| -TEST3_HTML = """
 | 
| -<html>
 | 
| -  <head></head>
 | 
| -  <body>
 | 
| -    <script type="application/javascript">
 | 
| -      if (window.layoutTestController) {
 | 
| -        window.layoutTestController.dumpAsText();
 | 
| -      }
 | 
| -    </script>
 | 
| -
 | 
| -    <!-- embed source code -->
 | 
| -    <script type="application/dart" src="test_3.dart"></script>
 | 
| -  </body>
 | 
| -</html>
 | 
| -"""
 | 
| -
 | 
| -TEST3_DART = """
 | 
| -#import('dart:dom');
 | 
| -#source('test_3a.dart');
 | 
| -#source('test_3b.dart');
 | 
| -"""
 | 
| -
 | 
| -TEST3_DART_A = """
 | 
| -class MyClass {
 | 
| -  static myprint() {
 | 
| -    window.alert('test3!');
 | 
| -  }
 | 
| -}
 | 
| -"""
 | 
| -
 | 
| -TEST3_DART_B = """
 | 
| -main() {
 | 
| -  MyClass.myprint();
 | 
| -}
 | 
| -"""
 | 
| -
 | 
| -TEST3_OUTPUT = """
 | 
| -ALERT: test3!
 | 
| -Content-Type: text/plain
 | 
| -
 | 
| -#EOF
 | 
| -"""
 | 
| -
 | 
| -TEST4_HTML = """
 | 
| -<html>
 | 
| -  <head></head>
 | 
| -  <body>
 | 
| -    <script type="application/javascript">
 | 
| -      if (window.layoutTestController) {
 | 
| -        window.layoutTestController.dumpAsText();
 | 
| -      }
 | 
| -    </script>
 | 
| -
 | 
| -    <script type="application/dart" src="test_4.dart"></script>
 | 
| -  </body>
 | 
| -</html>
 | 
| -"""
 | 
| -
 | 
| -TEST4_DART = """
 | 
| -#import('dart:dom');
 | 
| -#import('../samples/ui_lib/observable/observable.dart');
 | 
| -
 | 
| -main() {
 | 
| -  // use imported code
 | 
| -  var arr = new ObservableList();
 | 
| -  arr.addChangeListener((EventSummary events) {
 | 
| -    var t = ['update', 'add   ',
 | 
| -             'remove', 'global'][events.events[0].type];
 | 
| -    var o = events.events[0].oldValue;
 | 
| -    o = (o != null ? o : '_');
 | 
| -    var n = events.events[0].newValue;
 | 
| -    n = (n != null ? n : '_');
 | 
| -    window.alert(" " + t + " " + o + " -> " + n);
 | 
| -  });
 | 
| -  EventBatch.wrap((e) { arr.add(3); })(null);
 | 
| -  EventBatch.wrap((e) { arr.add(2); })(null);
 | 
| -  EventBatch.wrap((e) { arr.add(1); })(null);
 | 
| -  EventBatch.wrap((e) { arr[0] = 5; })(null);
 | 
| -  EventBatch.wrap((e) { arr[2] = 0; })(null);
 | 
| -  EventBatch.wrap((e) { arr.removeAt(1); })(null);
 | 
| -  EventBatch.wrap((e) { arr.clear(); })(null);
 | 
| -}
 | 
| -"""
 | 
| -
 | 
| -# Expected output when run in DumpRenderTree
 | 
| -TEST4_OUTPUT = """
 | 
| -ALERT:  add    _ -> 3
 | 
| -ALERT:  add    _ -> 2
 | 
| -ALERT:  add    _ -> 1
 | 
| -ALERT:  update 3 -> 5
 | 
| -ALERT:  update 1 -> 0
 | 
| -ALERT:  remove 2 -> _
 | 
| -ALERT:  global _ -> _
 | 
| -Content-Type: text/plain
 | 
| -
 | 
| -#EOF
 | 
| -"""
 | 
| -
 | 
| -TEST5_HTML = """
 | 
| -<html>
 | 
| -  <head></head>
 | 
| -  <body>
 | 
| -    <script type="application/javascript">
 | 
| -      if (window.layoutTestController) {
 | 
| -        window.layoutTestController.dumpAsText();
 | 
| -      }
 | 
| -    </script>
 | 
| -
 | 
| -    <!-- embed source code -->
 | 
| -    <script type="application/dart">
 | 
| -      #import('dart:dom');
 | 
| -      main() {
 | 
| -        var element = document.getElementById("test5div");
 | 
| -        if (element == null) {
 | 
| -          window.alert("this script shoulnd't be run synchronously");
 | 
| -        } else {
 | 
| -          window.alert(element.innerHTML);
 | 
| -        }
 | 
| -      }
 | 
| -    </script>
 | 
| -    <div id="test5div">this is visible on DOMContentLoaded</div>
 | 
| -  </body>
 | 
| -</html>
 | 
| -"""
 | 
| -
 | 
| -TEST5_OUTPUT = """
 | 
| -ALERT: this is visible on DOMContentLoaded
 | 
| -Content-Type: text/plain
 | 
| -this is visible on DOMContentLoaded
 | 
| -#EOF
 | 
| -"""
 | 
| -
 | 
| -TEST6_HTML = """
 | 
| -<html>
 | 
| -  <head></head>
 | 
| -  <body>
 | 
| -    <script type="application/javascript">
 | 
| -      if (window.layoutTestController) {
 | 
| -        window.layoutTestController.dumpAsText();
 | 
| -      }
 | 
| -    </script>
 | 
| -
 | 
| -    <!-- embed source code -->
 | 
| -    <script type="application/dart">
 | 
| -      #import('dart:html', prefix: 'html');
 | 
| -      main() {
 | 
| -        html.window.alert('hi');
 | 
| -      }
 | 
| -    </script>
 | 
| -  </body>
 | 
| -</html>
 | 
| -"""
 | 
| -
 | 
| -TEST6_OUTPUT = """
 | 
| -ALERT: hi
 | 
| -Content-Type: text/plain
 | 
| -
 | 
| -#EOF
 | 
| -"""
 | 
| -
 | 
| -
 | 
| -FILES = {
 | 
| -    'test_1.html': TEST1_HTML,
 | 
| -
 | 
| -    'test_2.html': TEST2_HTML,
 | 
| -    'test_2.dart': TEST2_DART,
 | 
| -
 | 
| -    'test_3.html': TEST3_HTML,
 | 
| -    'test_3.dart': TEST3_DART,
 | 
| -    'test_3a.dart': TEST3_DART_A,
 | 
| -    'test_3b.dart': TEST3_DART_B,
 | 
| -
 | 
| -    'test_4.html': TEST4_HTML,
 | 
| -    'test_4.dart': TEST4_DART,
 | 
| -
 | 
| -    'test_5.html': TEST5_HTML,
 | 
| -    'test_6.html': TEST6_HTML,
 | 
| -  }
 | 
| -
 | 
| -INPUTS = [
 | 
| -    'test_1.html',
 | 
| -    'test_2.html',
 | 
| -    'test_3.html',
 | 
| -    'test_4.html',
 | 
| -    'test_5.html',
 | 
| -    'test_6.html'
 | 
| -    ]
 | 
| -
 | 
| -OUTPUTS = [
 | 
| -    TEST1_OUTPUT,
 | 
| -    TEST2_OUTPUT,
 | 
| -    TEST3_OUTPUT,
 | 
| -    TEST4_OUTPUT,
 | 
| -    TEST5_OUTPUT,
 | 
| -    TEST6_OUTPUT
 | 
| -    ]
 | 
| -
 | 
| -CLIENT_PATH = dirname(dirname(abspath(__file__)))
 | 
| -RED_COLOR = "\033[31m"
 | 
| -GREEN_COLOR = "\033[32m"
 | 
| -YELLOW_COLOR = "\033[33m"
 | 
| -NO_COLOR = "\033[0m"
 | 
| -
 | 
| -last_line_length = 0
 | 
| -def printLine(s):
 | 
| -  """ Prints a line in place (erasing the previous line). """
 | 
| -  global last_line_length
 | 
| -  s = " Testing htmlconverter.py: " + s
 | 
| -  if last_line_length > 0:
 | 
| -    print "\r" + (" " * last_line_length) + "\r",
 | 
| -  last_line_length = len(s)
 | 
| -  print s,
 | 
| -  sys.stdout.flush()
 | 
| -
 | 
| -def execute(cmd, verbose=False):
 | 
| -  """Execute a command in a subprocess. """
 | 
| -  if verbose: print 'Executing: ' + ' '.join(cmd)
 | 
| -  pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 | 
| -  output, err = pipe.communicate()
 | 
| -  if pipe.returncode != 0:
 | 
| -    print 'Execution failed: ' + output + '\n' + err
 | 
| -  if verbose or pipe.returncode != 0:
 | 
| -    print output
 | 
| -    print err
 | 
| -  return pipe.returncode, output, err
 | 
| -
 | 
| -def browserRun(message, htmlfile, test, verbose):
 | 
| -  # run the generated code
 | 
| -  printLine(message + ' [%d]' % (test + 1))
 | 
| -  status, out, err = execute([
 | 
| -      'tests/drt/DumpRenderTree',
 | 
| -      htmlfile],
 | 
| -      verbose)
 | 
| -  if status != 0:
 | 
| -    printLine("%sERROR%s test output [%d]" % (RED_COLOR, NO_COLOR, test + 1))
 | 
| -    return status
 | 
| -
 | 
| -  # check that the output is equivalent and cleanup
 | 
| -  out = '\n' + out
 | 
| -  if out == OUTPUTS[test]:
 | 
| -    printLine("%sPASS%s [%d]" % (GREEN_COLOR, NO_COLOR, test + 1))
 | 
| -  else:
 | 
| -    printLine("%sFAIL%s [%d]" % (RED_COLOR, NO_COLOR, test + 1))
 | 
| -    print out
 | 
| -    print err
 | 
| -    return 1
 | 
| -
 | 
| -  return 0
 | 
| -
 | 
| -def createInputFiles():
 | 
| -  printLine("... creating input files")
 | 
| -  for filename in FILES:
 | 
| -    with open(filename, 'w') as f:
 | 
| -      f.write(FILES[filename])
 | 
| -
 | 
| -def deleteInputFiles():
 | 
| -  for filename in FILES:
 | 
| -    os.remove(filename)
 | 
| -
 | 
| -def runTest(test, target, verbose, keep_temporary_files):
 | 
| -  inputfile = INPUTS[test]
 | 
| -  suffix = '-js.html' if target == 'chromium' else '-dart.html'
 | 
| -  outfile = abspath(join('out', inputfile.replace(".html", suffix)))
 | 
| -
 | 
| -  # TODO(sigmund): tests should also run in dartium before converting them
 | 
| -
 | 
| -  # run the htmlconverter.py script on it
 | 
| -  printLine("... converting input html [%d]" % (test + 1))
 | 
| -  cmd = [sys.executable, 'tools/htmlconverter.py', inputfile,
 | 
| -         '-o', 'out/', '-t', target]
 | 
| -  if verbose: cmd.append('--verbose')
 | 
| -  status, out, err = execute(cmd, verbose)
 | 
| -  if status != 0:
 | 
| -    printLine("%sERROR%s converting [%d]" % (RED_COLOR, NO_COLOR, test + 1))
 | 
| -    print out
 | 
| -    print err
 | 
| -    return status
 | 
| -
 | 
| -  status = browserRun(
 | 
| -      "... running compiled html in %s" % target, outfile, test, verbose)
 | 
| -  if not keep_temporary_files:
 | 
| -    os.remove(outfile)
 | 
| -  return status
 | 
| -
 | 
| -def Flags():
 | 
| -  """ Consturcts a parser for extracting flags from the command line. """
 | 
| -  result = optparse.OptionParser()
 | 
| -  result.add_option("--keep_temporary_files",
 | 
| -      help="Keep temporary files created for each test",
 | 
| -      default=False,
 | 
| -      action="store_true")
 | 
| -  result.add_option("-v", "--verbose",
 | 
| -      help="Print verbose output",
 | 
| -      default=False,
 | 
| -      action="store_true")
 | 
| -  result.add_option("-t", "--target",
 | 
| -      help="The target html to generate",
 | 
| -      metavar="[chromium,dartium]",
 | 
| -      default='chromium,dartium')
 | 
| -  result.set_usage("htmlconverter_test.py [--verbose -t chromium,dartium]")
 | 
| -  return result
 | 
| -
 | 
| -def shouldRunTest(test, prefixes):
 | 
| -  if len(prefixes) == 0:
 | 
| -    return True
 | 
| -  for a in prefixes:
 | 
| -    if INPUTS[test].startswith(a):
 | 
| -      return True
 | 
| -  return False
 | 
| -
 | 
| -
 | 
| -def main():
 | 
| -  os.chdir(CLIENT_PATH)
 | 
| -  parser = Flags()
 | 
| -  options, args = parser.parse_args()
 | 
| -  verbose = options.verbose
 | 
| -  keep_temporary_files = options.keep_temporary_files
 | 
| -
 | 
| -  createInputFiles()
 | 
| -  for test in range(len(INPUTS)):
 | 
| -    if shouldRunTest(test, args):
 | 
| -      if 'chromium' in options.target:
 | 
| -        if runTest(test, 'chromium', verbose, keep_temporary_files) != 0:
 | 
| -          if not keep_temporary_files:
 | 
| -            deleteInputFiles()
 | 
| -          return 1
 | 
| -      if 'dartium' in options.target:
 | 
| -        if runTest(test, 'dartium', verbose, keep_temporary_files) != 0:
 | 
| -          if not keep_temporary_files:
 | 
| -            deleteInputFiles()
 | 
| -          return 1
 | 
| -
 | 
| -  if not keep_temporary_files:
 | 
| -    deleteInputFiles()
 | 
| -  return 0
 | 
| -
 | 
| -
 | 
| -if __name__ == '__main__':
 | 
| -  sys.exit(main())
 | 
| 
 |