Home | History | Annotate | Download | only in gpu
      1 #!/usr/bin/env python
      2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 """Auto-generates the WebGL conformance test list header file.
      7 
      8 Parses the WebGL conformance test *.txt file, which contains a list of URLs
      9 for individual conformance tests (each on a new line). It recursively parses
     10 *.txt files. For each test URL, the matching gtest call is created and
     11 sent to the C++ header file.
     12 """
     13 
     14 import getopt
     15 import os
     16 import re
     17 import sys
     18 
     19 COPYRIGHT = """\
     20 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
     21 // Use of this source code is governed by a BSD-style license that can be
     22 // found in the LICENSE file.
     23 
     24 """
     25 WARNING = """\
     26 // DO NOT EDIT! This file is auto-generated by
     27 //   generate_webgl_conformance_test_list.py
     28 // It is included by webgl_conformance_test.cc
     29 
     30 """
     31 HEADER_GUARD = """\
     32 #ifndef CONTENT_TEST_GPU_WEBGL_CONFORMANCE_TEST_LIST_AUTOGEN_H_
     33 #define CONTENT_TEST_GPU_WEBGL_CONFORMANCE_TEST_LIST_AUTOGEN_H_
     34 
     35 """
     36 HEADER_GUARD_END = """
     37 #endif  // CONTENT_TEST_GPU_WEBGL_CONFORMANCE_TEST_LIST_AUTOGEN_H_
     38 
     39 """
     40 
     41 # Assume this script is run from the src/content/test/gpu directory.
     42 INPUT_DIR = "../../../third_party/webgl_conformance"
     43 INPUT_FILE = "00_test_list.txt"
     44 OUTPUT_FILE = "webgl_conformance_test_list_autogen.h"
     45 
     46 def main(argv):
     47   """Main function for the WebGL conformance test list generator.
     48   """
     49   if not os.path.exists(os.path.join(INPUT_DIR, INPUT_FILE)):
     50     print >> sys.stderr, "ERROR: WebGL conformance tests do not exist."
     51     print >> sys.stderr, "Run the script from the directory containing it."
     52     return 1
     53 
     54   output = open(OUTPUT_FILE, "w")
     55   output.write(COPYRIGHT)
     56   output.write(WARNING)
     57   output.write(HEADER_GUARD)
     58 
     59   test_prefix = {}
     60 
     61   unparsed_files = [INPUT_FILE]
     62   while unparsed_files:
     63     filename = unparsed_files.pop(0)
     64     try:
     65       input = open(os.path.join(INPUT_DIR, filename))
     66     except IOError:
     67       print >> sys.stderr, "WARNING: %s does not exist (skipped)." % filename
     68       continue
     69 
     70     for url in input:
     71       url = re.sub("//.*", "", url)
     72       url = re.sub("#.*", "", url)
     73       url = url.strip()
     74       # Some filename has options before them, for example,
     75       # --min-version 1.0.2 testname.html
     76       pos = url.rfind(" ")
     77       if pos != -1:
     78         url = url[pos+1:]
     79 
     80       if not url:
     81         continue
     82 
     83       # Cannot use os.path.join() because Windows with use "\\" but this path
     84       # is sent through javascript.
     85       if os.path.dirname(filename):
     86         url = "%s/%s" % (os.path.dirname(filename), url)
     87 
     88       # Queue all text files for parsing, because test list URLs are nested
     89       # through .txt files.
     90       if re.match(".+\.txt\s*$", url):
     91         unparsed_files.append(url)
     92 
     93       # Convert the filename to a valid test name and output the gtest code.
     94       else:
     95         name = os.path.splitext(url)[0]
     96         name = re.sub("\W+", "_", name)
     97         if os.path.exists(os.path.join(INPUT_DIR, url)):
     98           output.write('CONFORMANCE_TEST(%s,\n  "%s");\n' % (name, url))
     99         else:
    100           print >> sys.stderr, "WARNING: %s does not exist (skipped)." % url
    101     input.close()
    102 
    103   output.write(HEADER_GUARD_END)
    104   output.close()
    105   return 0
    106 
    107 if __name__ == "__main__":
    108   sys.exit(main(sys.argv[1:]))
    109