~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to test_on_merge.py

  • Committer: Maris Fogels
  • Date: 2010-05-26 15:37:08 UTC
  • mto: This revision was merged to the branch mainline in revision 11372.
  • Revision ID: maris.fogels@canonical.com-20100526153708-i3apiqe7fg4axi0l
Split test_on_merge.py into functions, marked the tabnanny code as broken and needing fixing, and added a test process fork to address the case where the script was started directly from the command line.

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
# This will set the timeout to 10 minutes.
25
25
TIMEOUT = 60 * 10
26
26
 
 
27
HERE = os.path.dirname(os.path.realpath(__file__))
 
28
 
27
29
 
28
30
def main():
29
31
    """Call bin/test with whatever arguments this script was run with.
30
32
 
31
 
    If the tests ran ok (last line of stderr is 'OK<return>') then suppress
32
 
    output and exit(0).
33
 
 
34
 
    Otherwise, print output and exit(1).
35
 
    """
36
 
    here = os.path.dirname(os.path.realpath(__file__))
37
 
 
38
 
    # Tabnanny
39
 
    # NB. If tabnanny raises an exception, run
40
 
    # python /usr/lib/python2.5/tabnanny.py -vv lib/canonical
41
 
    # for more detailed output.
 
33
    Prior to running the tests this script checks the project files with
 
34
    Python2.5's tabnanny and sets up the test database.
 
35
 
 
36
    Returns 1 on error, otherwise it returns the testrunner's exit code.
 
37
    """
 
38
    if run_tabnanny() != 0:
 
39
        return 1
 
40
 
 
41
    if setup_test_database() != 0:
 
42
        return 1
 
43
 
 
44
    return run_test_process()
 
45
 
 
46
 
 
47
def run_tabnanny():
 
48
    """Run the tabnanny, return its exit code.
 
49
 
 
50
    If tabnanny raises an exception, run "python /usr/lib/python2.5/tabnanny.py
 
51
    -vv lib/canonical for more detailed output.
 
52
    """
 
53
    # XXX mars 2010-05-26
 
54
    # Tabnanny reports some of its errors on sys.stderr, so this code is
 
55
    # already wrong.  subprocess.Popen.communicate() would work better.
 
56
    print "Checking the source tree with tabnanny..."
42
57
    org_stdout = sys.stdout
43
58
    sys.stdout = StringIO()
44
 
    tabnanny.check(os.path.join(here, 'lib', 'canonical'))
 
59
    tabnanny.check(os.path.join(HERE, 'lib', 'canonical'))
 
60
    tabnanny.check(os.path.join(HERE, 'lib', 'lp'))
45
61
    tabnanny_results = sys.stdout.getvalue()
46
62
    sys.stdout = org_stdout
47
63
    if len(tabnanny_results) > 0:
49
65
        print tabnanny_results
50
66
        print '---- end tabnanny bitching ----'
51
67
        return 1
52
 
 
 
68
    else:
 
69
        print "Done"
 
70
        return 0
 
71
 
 
72
 
 
73
def setup_test_database():
 
74
    """Set up a test instance of our postgresql database.
 
75
 
 
76
    Returns 0 for success, 1 for errors.
 
77
    """
53
78
    # Sanity check PostgreSQL version. No point in trying to create a test
54
79
    # database when PostgreSQL is too old.
55
80
    con = psycopg2.connect('dbname=template1')
93
118
    con.close()
94
119
 
95
120
    # Build the template database. Tests duplicate this.
96
 
    here = os.path.dirname(os.path.realpath(__file__))
97
 
    schema_dir = os.path.join(here, 'database', 'schema')
 
121
    schema_dir = os.path.join(HERE, 'database', 'schema')
98
122
    if os.system('cd %s; make test > /dev/null' % (schema_dir)) != 0:
99
123
        print 'Failed to create database or load sampledata.'
100
124
        return 1
136
160
    con.close()
137
161
    del con
138
162
 
 
163
    return 0
 
164
 
 
165
 
 
166
def run_test_process():
 
167
    """Start the testrunner process and return its exit code."""
 
168
    # Fork a child process so that we get a new process ID that we can
 
169
    # guarantee is not currently in use as a process group leader. This
 
170
    # addresses the case where this script has been started directly in the
 
171
    # shell using "python foo.py" or "./foo.py".
 
172
    pid = os.fork()
 
173
    if pid != 0:
 
174
        pid, exitstatus = os.waitpid(pid, os.P_WAIT)
 
175
        return exitstatus
 
176
 
139
177
    print 'Running tests.'
140
 
    os.chdir(here)
 
178
    os.chdir(HERE)
141
179
 
142
180
    # Play shenanigans with our process group. We want to kill off our child
143
181
    # groups while at the same time not slaughtering ourselves!
156
194
        'xvfb-run',
157
195
        '-s',
158
196
        "'-screen 0 1024x768x24'",
159
 
        os.path.join(here, 'bin', 'test')] + sys.argv[1:]
 
197
        os.path.join(HERE, 'bin', 'test')] + sys.argv[1:]
160
198
 
161
199
    command_line = ' '.join(cmd)
162
200
    print "Running command:", command_line