summaryrefslogtreecommitdiffstats
path: root/dom/browser-element/mochitest/createNewTest.py
blob: 309ff953443c369e993ff00028fbd209112a81a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
"""A script to generate the browser-element test boilerplate.

This script requires Python 2.7."""

from __future__ import print_function

import sys
import os
import stat
import argparse
import textwrap
import subprocess

html_template = textwrap.dedent("""\
    <!DOCTYPE HTML>
    <html>
    <head>
      <title>Test for Bug {bug}</title>
      <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
      <script type="application/javascript" src="browserElementTestHelpers.js"></script>
      <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
    </head>
    <body>
    <script type="application/javascript;version=1.7" src="browserElement_{test}.js">
    </script>
    </body>
    </html>""")

# Note: Curly braces are escaped as "{{".
js_template = textwrap.dedent("""\
    /* Any copyright is dedicated to the public domain.
       http://creativecommons.org/publicdomain/zero/1.0/ */

    // Bug {bug} - FILL IN TEST DESCRIPTION
    "use strict";

    SimpleTest.waitForExplicitFinish();
    browserElementTestHelpers.setEnabledPref(true);
    browserElementTestHelpers.addPermission();

    function runTest() {{
      var iframe = document.createElement('iframe');
      iframe.setAttribute('mozbrowser', 'true');

      // FILL IN TEST

      document.body.appendChild(iframe);
    }}

    addEventListener('testready', runTest);
    """)

def print_fill(s):
    print(textwrap.fill(textwrap.dedent(s)))

def add_to_ini(filename, test, support_file=None):
    """Add test to mochitest config {filename}, then open
    $EDITOR and let the user move the filenames to their appropriate
    places in the file.

    """
    lines_to_write = ['[{0}]'.format(test)]
    if support_file:
        lines_to_write += ['support-files = {0}'.format(support_file)]
    lines_to_write += ['']
    with open(filename, 'a') as f:
        f.write('\n'.join(lines_to_write))

    if 'EDITOR' not in os.environ or not os.environ['EDITOR']:
        print_fill("""\
            Now open {filename} and move the filenames to their correct places.")
            (Define $EDITOR and I'll open your editor for you next time.)""".format(filename=filename))
        return

    # Count the number of lines in the file
    with open(filename, 'r') as f:
        num_lines = len(f.readlines())

    try:
        subprocess.call([os.environ['EDITOR'],
                         '+%d' % (num_lines - len(lines_to_write) + 2),
                         filename])
    except Exception as e:
        print_fill("Error opening $EDITOR: {0}.".format(e))
        print()
        print_fill("""\
            Please open {filename} and move the filenames at the bottom of the
            file to their correct places.""".format(filename=filename))

def main(test_name, bug_number):
    global html_template, js_template

    def format(str):
        return str.format(bug=bug_number, test=test_name)

    def create_file(filename, template):
        path = os.path.join(os.path.dirname(sys.argv[0]), format(filename))
        # Create a new file, bailing with an error if the file exists.
        fd = os.open(path, os.O_WRONLY | os.O_CREAT | os.O_EXCL)

        try:
            # This file has 777 permission when created, for whatever reason.  Make it rw-rw-r---.
            os.fchmod(fd, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH)
        except:
            # fchmod doesn't work on Windows.
            pass

        with os.fdopen(fd, 'w') as file:
            file.write(format(template))

    create_file('browserElement_{test}.js', js_template)
    create_file('test_browserElement_inproc_{test}.html', html_template)
    create_file('test_browserElement_oop_{test}.html', html_template)

    add_to_ini('mochitest.ini',
               format('test_browserElement_inproc_{test}.html'),
               format('browserElement_{test}.js'))
    add_to_ini('mochitest-oop.ini',
               format('test_browserElement_oop_{test}.html'))

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="Create a new browser-element testcase.")
    parser.add_argument('test_name')
    parser.add_argument('bug_number', type=int)
    args = parser.parse_args()
    main(args.test_name, args.bug_number)