5297d3f75d9cc4ec87914a981ccc2b32366038c1
[WebKit-https.git] / Tools / BuildSlaveSupport / build.webkit.org-config / steps_unittest.py
1 #! /usr/bin/env python
2
3 import sys
4 import os
5 import StringIO
6 import unittest
7 import make_passwords_json
8 import json
9
10 # Show DepricationWarnings come from buildbot - it isn't default with Python 2.7 or newer.
11 # See https://bugs.webkit.org/show_bug.cgi?id=90161 for details.
12 import warnings
13 warnings.simplefilter('default')
14
15
16 class BuildBotConfigLoader(object):
17     def _add_webkitpy_to_sys_path(self):
18         # When files are passed to the python interpreter on the command line (e.g. python test.py) __file__ is a relative path.
19         absolute_file_path = os.path.abspath(__file__)
20         webkit_org_config_dir = os.path.dirname(absolute_file_path)
21         build_slave_support_dir = os.path.dirname(webkit_org_config_dir)
22         webkit_tools_dir = os.path.dirname(build_slave_support_dir)
23         scripts_dir = os.path.join(webkit_tools_dir, 'Scripts')
24         sys.path.append(scripts_dir)
25
26     def _add_dependent_modules_to_sys_modules(self):
27         self._add_webkitpy_to_sys_path()
28         from webkitpy.thirdparty.autoinstalled import buildbot
29         sys.modules['buildbot'] = buildbot
30
31
32 class RunWebKitTestsTest(unittest.TestCase):
33     def test_nrwt_leaks_parsing(self):
34         run_webkit_tests = RunWebKitTests()  # pylint is confused by the way we import the module ... pylint: disable-msg=E0602
35         log_text = """
36 12:44:24.295 77706 13981 total leaks found for a total of 197,936 bytes.
37 12:44:24.295 77706 1 unique leaks found.
38 """
39         expected_incorrect_lines = [
40             '13981 total leaks found for a total of 197,936 bytes.',
41             '1 unique leaks found.',
42         ]
43         run_webkit_tests._parseRunWebKitTestsOutput(log_text)
44         self.assertEqual(run_webkit_tests.incorrectLayoutLines, expected_incorrect_lines)
45
46     def test_nrwt_missing_results(self):
47         run_webkit_tests = RunWebKitTests()  # pylint is confused by the way we import the module ... pylint: disable-msg=E0602
48         log_text = """
49 Expected to fail, but passed: (2)
50   animations/additive-transform-animations.html
51   animations/cross-fade-webkit-mask-box-image.html
52
53 Unexpected flakiness: text-only failures (2)
54   fast/events/touch/touch-inside-iframe.html [ Failure Pass ]
55   http/tests/inspector-enabled/console-clear-arguments-on-frame-navigation.html [ Failure Pass ]
56
57 Unexpected flakiness: timeouts (1)
58   svg/text/foreignObject-repaint.xml [ Timeout Pass ]
59
60 Regressions: Unexpected missing results (1)
61   svg/custom/zero-path-square-cap-rendering2.svg [ Missing ]
62
63 Regressions: Unexpected text-only failures (1)
64   svg/custom/zero-path-square-cap-rendering2.svg [ Failure ]
65 """
66         run_webkit_tests._parseRunWebKitTestsOutput(log_text)
67         self.assertEqual(set(run_webkit_tests.incorrectLayoutLines),
68             set(['2 new passes', '3 flakes', '1 missing results', '1 failures']))
69
70
71 class StubStdio(object):
72     def __init__(self, stdio):
73         self._stdio = stdio
74
75     def getText(self):
76         return self._stdio
77
78
79 class StubRemoteCommand(object):
80     def __init__(self, rc, stdio):
81         self.rc = rc
82         self.logs = {'stdio': StubStdio(stdio)}
83
84
85 class RunJavaScriptCoreTestsTest(unittest.TestCase):
86     def assertResults(self, expected_result, expected_text, rc, stdio):
87         cmd = StubRemoteCommand(rc, stdio)
88         step = RunJavaScriptCoreTests()
89         step.commandComplete(cmd)
90         actual_results = step.evaluateCommand(cmd)
91         actual_text = step.getText2(cmd, actual_results)
92
93         self.assertEqual(expected_result, actual_results)
94         self.assertEqual(actual_text, expected_text)
95
96     def test_no_regressions_old_output(self):
97         self.assertResults(SUCCESS, ["jscore-test"], 0, """Results for Mozilla tests:
98     0 regressions found.
99     0 tests fixed.
100     OK.""")
101
102     def test_no_failure_new_output(self):
103         self.assertResults(SUCCESS, ["jscore-test"], 0, """Results for JSC stress tests:
104     0 failures found.
105     OK.""")
106
107     def test_mozilla_failure_old_output(self):
108         self.assertResults(FAILURE, ["1 JSC test failed"], 1, """Results for Mozilla tests:
109     1 regression found.
110     0 tests fixed.""")
111
112     def test_mozilla_failures_old_output(self):
113         self.assertResults(FAILURE, ["2 JSC tests failed"], 1, """Results for Mozilla tests:
114     2 regressions found.
115     0 tests fixed.""")
116
117     def test_jsc_stress_failure_new_output(self):
118         self.assertResults(FAILURE, ["1 JSC test failed"], 1,  """Results for JSC stress tests:
119     1 failure found.""")
120
121     def test_jsc_stress_failures_new_output(self):
122         self.assertResults(FAILURE, ["5 JSC tests failed"], 1,  """Results for JSC stress tests:
123     5 failures found.""")
124
125
126 class RunTest262TestsTest(unittest.TestCase):
127     def assertResults(self, expected_result, expected_text, rc, stdio):
128         cmd = StubRemoteCommand(rc, stdio)
129         step = RunTest262Tests()
130         step.commandComplete(cmd)
131         actual_results = step.evaluateCommand(cmd)
132         actual_text = step.getText2(cmd, actual_results)
133
134         self.assertEqual(expected_result, actual_results)
135         self.assertEqual(actual_text, expected_text)
136
137     def test_no_regressions_output(self):
138         self.assertResults(SUCCESS, ["test262-test"], 0, """
139 -------------------------Settings------------------------
140 Test262 Dir: JSTests/test262
141 JSC: WebKitBuild/Release/jsc
142 DYLD_FRAMEWORK_PATH: WebKitBuild/Release
143 Child Processes: 32
144 Config file: Tools/Scripts/test262/config.yaml
145 Expectations file: Tools/Scripts/test262/expectations.yaml
146 --------------------------------------------------------
147
148 NEW PASS: test/annexB/built-ins/Date/prototype/getYear/length.js (default)
149 NEW PASS test/language/expressions/class/fields-after-same-line-static-method-computed-symbol-names.js (default)
150
151 Run with --save to save a new expectations file
152 Saved all the results in Tools/Scripts/test262/results.yaml
153 Summarizing results...
154 See summarized results in Tools/Scripts/test262/results-summary.txt
155
156 56071 tests ran
157 0 expected tests failed
158 0 tests newly fail
159 2546 tests newly pass
160 1241 test files skipped
161 Done in 247 seconds!
162 """)
163
164     def test_failure_output(self):
165         self.assertResults(FAILURE, ["1 Test262 test failed"], 0, """
166 -------------------------Settings------------------------
167 Test262 Dir: JSTests/test262
168 JSC: WebKitBuild/Release/jsc
169 DYLD_FRAMEWORK_PATH: WebKitBuild/Release
170 Child Processes: 32
171 Config file: Tools/Scripts/test262/config.yaml
172 Expectations file: Tools/Scripts/test262/expectations.yaml
173 --------------------------------------------------------
174
175 ! NEW FAIL: test/annexB/built-ins/Date/prototype/getYear/length.js (default)
176 NEW PASS test/language/expressions/class/fields-after-same-line-static-method-computed-symbol-names.js (default)
177
178 Run with --save to save a new expectations file
179 Saved all the results in Tools/Scripts/test262/results.yaml
180 Summarizing results...
181 See summarized results in Tools/Scripts/test262/results-summary.txt
182
183 56071 tests ran
184 0 expected tests failed
185 0 tests newly fail
186 2546 tests newly pass
187 1241 test files skipped
188 Done in 247 seconds!
189 """)
190
191     def test_failures_output(self):
192         self.assertResults(FAILURE, ["2 Test262 tests failed"], 0, """
193 -------------------------Settings------------------------
194 Test262 Dir: JSTests/test262
195 JSC: WebKitBuild/Release/jsc
196 DYLD_FRAMEWORK_PATH: WebKitBuild/Release
197 Child Processes: 32
198 Config file: Tools/Scripts/test262/config.yaml
199 Expectations file: Tools/Scripts/test262/expectations.yaml
200 --------------------------------------------------------
201
202 NEW PASS test/language/statements/class/fields-after-same-line-static-async-gen-computed-names.js (default)
203 ! NEW FAIL: test/annexB/built-ins/Date/prototype/getYear/length.js (default)
204 ! NEW FAIL: test/annexB/built-ins/Date/prototype/getYear/length.js (strict mode)
205 NEW PASS test/language/expressions/class/fields-after-same-line-static-method-computed-symbol-names.js (default)
206
207 Run with --save to save a new expectations file
208 Saved all the results in Tools/Scripts/test262/results.yaml
209 Summarizing results...
210 See summarized results in Tools/Scripts/test262/results-summary.txt
211
212 56071 tests ran
213 0 expected tests failed
214 0 tests newly fail
215 2546 tests newly pass
216 1241 test files skipped
217 Done in 247 seconds!
218 """)
219
220
221 class RunLLINTCLoopTestsTest(unittest.TestCase):
222     def assertResults(self, expected_result, expected_text, rc, stdio):
223         cmd = StubRemoteCommand(rc, stdio)
224         step = RunLLINTCLoopTests()
225         step.commandComplete(cmd)
226         actual_results = step.evaluateCommand(cmd)
227         actual_text = step.getText2(cmd, actual_results)
228
229         self.assertEqual(expected_result, actual_results)
230         self.assertEqual(actual_text, expected_text)
231
232     def test_failures(self):
233         self.assertResults(FAILURE, ['5 regressions found.'], 1,  '    5 regressions found.')
234
235     def test_failure(self):
236         self.assertResults(FAILURE, ['1 regression found.'], 1,  '    1 regression found.')
237
238     def test_no_failure(self):
239         self.assertResults(SUCCESS, ['webkit-jsc-cloop-test'], 0,  '    0 regressions found.')
240
241
242 class Run32bitJSCTestsTest(unittest.TestCase):
243     def assertResults(self, expected_result, expected_text, rc, stdio):
244         cmd = StubRemoteCommand(rc, stdio)
245         step = Run32bitJSCTests()
246         step.commandComplete(cmd)
247         actual_results = step.evaluateCommand(cmd)
248         actual_text = step.getText2(cmd, actual_results)
249
250         self.assertEqual(expected_result, actual_results)
251         self.assertEqual(actual_text, expected_text)
252
253     def test_failures(self):
254         self.assertResults(FAILURE, ['5 regressions found.'], 1,  '    5 failures found.')
255
256     def test_failure(self):
257         self.assertResults(FAILURE, ['1 regression found.'], 1,  '    1 failure found.')
258
259     def test_no_failure(self):
260         self.assertResults(SUCCESS, ['webkit-32bit-jsc-test'], 0,  '    0 failures found.')
261
262
263 class RunAPITestsTest(unittest.TestCase):
264     def assertFailures(self, expected_failure_count, stdio):
265         if expected_failure_count:
266             rc = 1
267             expected_results = FAILURE
268             plural_suffix = "" if expected_failure_count == 1 else "s"
269             expected_text = '%d api test%s failed or timed out' % (expected_failure_count, plural_suffix)
270         else:
271             rc = 0
272             expected_results = SUCCESS
273             expected_text = 'run-api-tests'
274
275         cmd = StubRemoteCommand(rc, stdio)
276         step = RunAPITests()
277         step.commandComplete(cmd)
278         actual_results = step.evaluateCommand(cmd)
279         actual_failure_count = step.failedTestCount
280         actual_text = step.getText(cmd, actual_results)[0]
281
282         self.assertEqual(expected_results, actual_results)
283         self.assertEqual(expected_failure_count, actual_failure_count)
284         self.assertEqual(expected_text, actual_text)
285
286     def test_no_failures_or_timeouts(self):
287         self.assertFailures(0, """...
288 worker/0 TestWTF.WTF_Variant.OperatorAmpersand Passed
289 worker/0 TestWTF.WTF_Variant.Ref Passed
290 worker/0 TestWTF.WTF_Variant.RefPtr Passed
291 worker/0 TestWTF.WTF_Variant.RetainPtr Passed
292 worker/0 TestWTF.WTF_Variant.VisitorUsingMakeVisitor Passed
293 worker/0 TestWTF.WTF_Variant.VisitorUsingSwitchOn Passed
294 worker/0 exiting
295 Ran 1888 tests of 1888 with 1888 successful
296 ------------------------------
297 All tests successfully passed!
298 """)
299
300     def test_no_failures_or_timeouts_with_disabled(self):
301         self.assertFailures(0, """...
302 worker/0 TestWTF.WTF_Variant.OperatorAmpersand Passed
303 worker/0 TestWTF.WTF_Variant.Ref Passed
304 worker/0 TestWTF.WTF_Variant.RefPtr Passed
305 worker/0 TestWTF.WTF_Variant.RetainPtr Passed
306 worker/0 TestWTF.WTF_Variant.VisitorUsingMakeVisitor Passed
307 worker/0 TestWTF.WTF_Variant.VisitorUsingSwitchOn Passed
308 worker/0 exiting
309 Ran 1881 tests of 1888 with 1881 successful
310 ------------------------------
311 All tests successfully passed!
312 """)
313
314     def test_one_failure(self):
315         self.assertFailures(1, """...
316 worker/0 TestWTF.WTF_Variant.OperatorAmpersand Passed
317 worker/0 TestWTF.WTF_Variant.Ref Passed
318 worker/0 TestWTF.WTF_Variant.RefPtr Passed
319 worker/0 TestWTF.WTF_Variant.RetainPtr Passed
320 worker/0 TestWTF.WTF_Variant.VisitorUsingMakeVisitor Passed
321 worker/0 TestWTF.WTF_Variant.VisitorUsingSwitchOn Passed
322 worker/0 exiting
323 Ran 1888 tests of 1888 with 1887 successful
324 ------------------------------
325 Test suite failed
326
327 Crashed
328
329     TestWTF.WTF.StringConcatenate_Unsigned
330         **FAIL** WTF.StringConcatenate_Unsigned
331
332         C:\\cygwin\\home\\buildbot\\slave\\win-release\\build\\Tools\\TestWebKitAPI\\Tests\\WTF\\StringConcatenate.cpp:84
333         Value of: makeString("hello ", static_cast<unsigned short>(42) , " world")
334           Actual: hello 42 world
335         Expected: "hello * world"
336         Which is: 74B00C9C
337
338 Testing completed, Exit status: 3
339 """)
340
341     def test_multiple_failures(self):
342         self.assertFailures(2, """...
343 worker/0 TestWTF.WTF_Variant.OperatorAmpersand Passed
344 worker/0 TestWTF.WTF_Variant.Ref Passed
345 worker/0 TestWTF.WTF_Variant.RefPtr Passed
346 worker/0 TestWTF.WTF_Variant.RetainPtr Passed
347 worker/0 TestWTF.WTF_Variant.VisitorUsingMakeVisitor Passed
348 worker/0 TestWTF.WTF_Variant.VisitorUsingSwitchOn Passed
349 worker/0 exiting
350 Ran 1888 tests of 1888 with 1886 successful
351 ------------------------------
352 Test suite failed
353
354 Crashed
355
356     TestWTF.WTF.StringConcatenate_Unsigned
357         **FAIL** WTF.StringConcatenate_Unsigned
358
359         C:\\cygwin\\home\\buildbot\\slave\\win-release\\build\\Tools\\TestWebKitAPI\\Tests\\WTF\\StringConcatenate.cpp:84
360         Value of: makeString("hello ", static_cast<unsigned short>(42) , " world")
361           Actual: hello 42 world
362         Expected: "hello * world"
363         Which is: 74B00C9C
364
365     TestWTF.WTF_Expected.Unexpected
366         **FAIL** WTF_Expected.Unexpected
367
368         C:\cygwin\home\buildbot\slave\win-release\build\Tools\TestWebKitAPI\Tests\WTF\Expected.cpp:96
369         Value of: s1
370           Actual: oops
371         Expected: s0
372         Which is: oops
373
374 Testing completed, Exit status: 3
375 """)
376
377     def test_one_timeout(self):
378         self.assertFailures(1, """...
379 worker/0 TestWTF.WTF_Variant.OperatorAmpersand Passed
380 worker/0 TestWTF.WTF_Variant.Ref Passed
381 worker/0 TestWTF.WTF_Variant.RefPtr Passed
382 worker/0 TestWTF.WTF_Variant.RetainPtr Passed
383 worker/0 TestWTF.WTF_Variant.VisitorUsingMakeVisitor Passed
384 worker/0 TestWTF.WTF_Variant.VisitorUsingSwitchOn Passed
385 worker/0 exiting
386 Ran 1888 tests of 1888 with 1887 successful
387 ------------------------------
388 Test suite failed
389
390 Timeout
391
392      TestWTF.WTF_PoisonedUniquePtrForTriviallyDestructibleArrays.Assignment
393
394 Testing completed, Exit status: 3
395 """)
396
397     def test_multiple_timeouts(self):
398         self.assertFailures(2, """...
399 worker/0 TestWTF.WTF_Variant.OperatorAmpersand Passed
400 worker/0 TestWTF.WTF_Variant.Ref Passed
401 worker/0 TestWTF.WTF_Variant.RefPtr Passed
402 worker/0 TestWTF.WTF_Variant.RetainPtr Passed
403 worker/0 TestWTF.WTF_Variant.VisitorUsingMakeVisitor Passed
404 worker/0 TestWTF.WTF_Variant.VisitorUsingSwitchOn Passed
405 worker/0 exiting
406 Ran 1888 tests of 1888 with 1886 successful
407 ------------------------------
408 Test suite failed
409
410 Timeout
411
412     TestWTF.WTF_PoisonedUniquePtrForTriviallyDestructibleArrays.Assignment
413     TestWTF.WTF_Lock.ContendedShortSection
414
415 Testing completed, Exit status: 3
416 """)
417
418     def test_multiple_failures_and_timeouts(self):
419         self.assertFailures(4, """...
420 worker/0 TestWTF.WTF_Variant.OperatorAmpersand Passed
421 worker/0 TestWTF.WTF_Variant.Ref Passed
422 worker/0 TestWTF.WTF_Variant.RefPtr Passed
423 worker/0 TestWTF.WTF_Variant.RetainPtr Passed
424 worker/0 TestWTF.WTF_Variant.VisitorUsingMakeVisitor Passed
425 worker/0 TestWTF.WTF_Variant.VisitorUsingSwitchOn Passed
426 worker/0 exiting
427 Ran 1888 tests of 1888 with 1884 successful
428 ------------------------------
429 Test suite failed
430
431 Crashed
432
433     TestWTF.WTF.StringConcatenate_Unsigned
434         **FAIL** WTF.StringConcatenate_Unsigned
435
436         C:\\cygwin\\home\\buildbot\\slave\\win-release\\build\\Tools\\TestWebKitAPI\\Tests\\WTF\\StringConcatenate.cpp:84
437         Value of: makeString("hello ", static_cast<unsigned short>(42) , " world")
438           Actual: hello 42 world
439         Expected: "hello * world"
440         Which is: 74B00C9C
441
442     TestWTF.WTF_Expected.Unexpected
443         **FAIL** WTF_Expected.Unexpected
444
445         C:\cygwin\home\buildbot\slave\win-release\build\Tools\TestWebKitAPI\Tests\WTF\Expected.cpp:96
446         Value of: s1
447           Actual: oops
448         Expected: s0
449         Which is: oops
450
451 Timeout
452
453     TestWTF.WTF_PoisonedUniquePtrForTriviallyDestructibleArrays.Assignment
454     TestWTF.WTF_Lock.ContendedShortSection
455
456 Testing completed, Exit status: 3
457 """)
458
459
460 class SVNMirrorTest(unittest.TestCase):
461     def setUp(self):
462         self.config = json.load(open('config.json'))
463
464     def get_SVNMirrorFromConfig(self, builderName):
465         SVNMirror = None
466         for builder in self.config['builders']:
467             if builder['name'] == builderName:
468                 SVNMirror = builder.pop('SVNMirror', 'https://svn.webkit.org/repository/webkit/')
469         return SVNMirror
470
471     def test_CheckOutSource(self):
472         # SVN mirror feature isn't unittestable now with source.oldsource.SVN(==source.SVN) , only with source.svn.SVN(==SVN)
473         # https://bugs.webkit.org/show_bug.cgi?id=85887
474         if issubclass(CheckOutSource, source.SVN):
475             return
476
477         # Compare CheckOutSource.baseURL with SVNMirror (or with the default URL) in config.json for all builders
478         for builder in c['builders']:
479             for buildStepFactory, kwargs in builder['factory'].steps:
480                 if str(buildStepFactory).split('.')[-1] == 'CheckOutSource':
481                         CheckOutSourceInstance = buildStepFactory(**kwargs)
482                         self.assertEqual(CheckOutSourceInstance.baseURL, self.get_SVNMirrorFromConfig(builder['name']))
483
484
485 class BuildStepsConstructorTest(unittest.TestCase):
486     # "Passing a BuildStep subclass to factory.addStep is deprecated. Please pass a BuildStep instance instead.  Support will be dropped in v0.8.7."
487     # It checks if all builder's all buildsteps can be insantiated after migration.
488     # https://bugs.webkit.org/show_bug.cgi?id=89001
489     # http://buildbot.net/buildbot/docs/0.8.6p1/manual/customization.html#writing-buildstep-constructors
490
491     @staticmethod
492     def generateTests():
493         for builderNumber, builder in enumerate(c['builders']):
494             for stepNumber, step in enumerate(builder['factory'].steps):
495                 builderName = builder['name'].encode('ascii', 'ignore')
496                 setattr(BuildStepsConstructorTest, 'test_builder%02d_step%02d' % (builderNumber, stepNumber), BuildStepsConstructorTest.createTest(builderName, step))
497
498     @staticmethod
499     def createTest(builderName, step):
500         def doTest(self):
501             try:
502                 buildStepFactory, kwargs = step
503                 buildStepFactory(**kwargs)
504             except TypeError as e:
505                 buildStepName = str(buildStepFactory).split('.')[-1]
506                 self.fail("Error during instantiation %s buildstep for %s builder: %s\n" % (buildStepName, builderName, e))
507         return doTest
508
509
510 expected_build_steps = {
511     'Apple Win 7 Release (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile', 'download-built-product', 'extract-built-product', 'jscore-test', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
512     'Apple Win 7 Release (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile', 'compile-webkit', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
513     'Apple Win 10 Debug (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile', 'download-built-product', 'extract-built-product', 'jscore-test', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
514     'Apple Win 10 Release (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile', 'download-built-product', 'extract-built-product', 'jscore-test', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
515     'Apple Win 10 Debug (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile', 'compile-webkit', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
516     'Apple Win 10 Release (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile', 'compile-webkit', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
517
518     'Apple Mojave (Leaks)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'layout-test', 'archive-test-results', 'upload', 'MasterShellCommand'],
519     'Apple Mojave Debug (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'archive-built-product', 'upload', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
520     'Apple Mojave Debug WK1 (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
521     'Apple Mojave Debug WK2 (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
522     'Apple Mojave Release (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'archive-built-product', 'upload', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
523     'Apple Mojave Release WK1 (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
524     'Apple Mojave Release WK2 (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
525
526     'Apple High Sierra Debug (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'archive-built-product', 'upload', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
527     'Apple High Sierra Debug JSC (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'jscore-test'],
528     'Apple High Sierra Debug Test262 (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'test262-test'],
529     'Apple High Sierra Debug WK1 (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
530     'Apple High Sierra Debug WK2 (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
531     'Apple High Sierra LLINT CLoop (BuildAndTest)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'webkit-jsc-cloop-test'],
532     'Apple High Sierra Release (32-bit Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit'],
533     'Apple High Sierra Release (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'archive-built-product', 'upload', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
534     'Apple High Sierra Release JSC (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'jscore-test'],
535     'Apple High Sierra Release Test262 (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'test262-test'],
536     'Apple High Sierra Release WK1 (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
537     'Apple High Sierra Release WK2 (Perf)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'perf-test'],
538     'Apple High Sierra Release WK2 (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
539
540     'Apple iOS 12 Release (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit'],
541     'Apple iOS 12 Simulator Release (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'archive-built-product', 'upload', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
542     'Apple iOS 12 Simulator Release WK2 (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
543
544     'Apple iOS 12 Simulator Debug (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'archive-built-product', 'upload', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
545     'Apple iOS 12 Simulator Debug WK2 (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
546
547     'JSCOnly Linux ARMv7 Thumb2 Release': ['configure build', 'svn', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'jscore-test'],
548     'JSCOnly Linux ARMv7 Thumb2 SoftFP Release': ['configure build', 'svn', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'jscore-test'],
549     'JSCOnly Linux ARMv7 Traditional Release': ['configure build', 'svn', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'jscore-test'],
550     'JSCOnly Linux AArch64 Release': ['configure build', 'svn', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'jscore-test'],
551     'JSCOnly Linux MIPS32el Release': ['configure build', 'svn', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'jscore-test'],
552
553     'GTK Linux 64-bit Debug (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'jhbuild', 'compile-webkit', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
554     'GTK Linux 64-bit Debug (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'jhbuild', 'download-built-product', 'extract-built-product', 'jscore-test', 'layout-test', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand', 'API tests', 'webdriver-test'],
555     'GTK Linux 64-bit Release (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'jhbuild', 'compile-webkit', 'archive-built-product', 'upload', 'generate-jsc-bundle', 'transfer-to-s3', 'trigger'],
556     'GTK Linux 64-bit Release (Perf)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'jhbuild', 'download-built-product', 'extract-built-product', 'perf-test', 'benchmark-test'],
557     'GTK Linux 64-bit Release (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'jhbuild', 'download-built-product', 'extract-built-product', 'jscore-test', 'layout-test', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand', 'API tests', 'webdriver-test'],
558     'GTK Linux 64-bit Release Wayland (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'jhbuild', 'download-built-product', 'extract-built-product', 'jscore-test', 'layout-test', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand', 'API tests', 'webdriver-test'],
559     'GTK Linux 64-bit Release Ubuntu LTS (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit'],
560     'GTK Linux 64-bit Release Debian Stable (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit'],
561
562     'WinCairo 64-bit JSC Debug (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'jscore-test'],
563     'WinCairo 64-bit JSC Release (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'jscore-test'],
564     'WinCairo 64-bit WKL Debug (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
565     'WinCairo 64-bit WKL Debug (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'wincairo-requirements', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
566     'WinCairo 64-bit WKL Release (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'compile-webkit', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
567     'WinCairo 64-bit WKL Release (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'download-built-product', 'extract-built-product', 'wincairo-requirements', 'layout-test', 'run-api-tests', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'archive-test-results', 'upload', 'MasterShellCommand'],
568
569     'WPE Linux 64-bit Release (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'jhbuild', 'compile-webkit', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
570     'WPE Linux 64-bit Release (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'jhbuild', 'download-built-product', 'extract-built-product', 'jscore-test', 'layout-test', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand', 'API tests'],
571     'WPE Linux 64-bit Debug (Build)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'jhbuild', 'compile-webkit', 'archive-built-product', 'upload', 'transfer-to-s3', 'trigger'],
572     'WPE Linux 64-bit Debug (Tests)': ['configure build', 'svn', 'kill old processes', 'delete WebKitBuild directory', 'delete stale build files', 'jhbuild', 'download-built-product', 'extract-built-product', 'jscore-test', 'layout-test', 'webkitpy-test', 'webkitperl-test', 'bindings-generation-tests', 'builtins-generator-tests', 'dashboard-tests', 'archive-test-results', 'upload', 'MasterShellCommand', 'API tests'],
573 }
574
575
576 class BuildStepsTest(unittest.TestCase):
577     @staticmethod
578     def generateTests():
579         for builder in c['builders']:
580             builderName = builder['name'].encode('ascii', 'ignore')
581             setattr(BuildStepsTest, 'test_builder %s' % builderName, BuildStepsTest.createTest(builder))
582
583     @staticmethod
584     def createTest(builder):
585         def doTest(self):
586             buildSteps = []
587             for step in builder['factory'].steps:
588                 buildSteps.append(step[0].name)
589             self.assertTrue(builder['name'] in expected_build_steps, "Missing expected result for builder: %s\n Actual result is %s" % (builder['name'], buildSteps))
590             self.assertListEqual(expected_build_steps[builder['name']], buildSteps)
591
592         return doTest
593
594     def test_unnecessary_expected_results(self):
595         builders = set()
596         for builder in c['builders']:
597             builders.add(builder['name'].encode('ascii', 'ignore'))
598
599         for builder in expected_build_steps:
600             self.assertTrue(builder in builders, "Builder %s doesn't exist, but has unnecessary expected results" % builder)
601
602
603 class RunAndUploadPerfTestsTest(unittest.TestCase):
604     def assertResults(self, rc, expected_text):
605         cmd = StubRemoteCommand(rc, expected_text)
606         step = RunAndUploadPerfTests()
607         step.commandComplete(cmd)
608         actual_results = step.evaluateCommand(cmd)
609         actual_text = str(step.getText2(cmd, actual_results)[0])
610         self.assertEqual(expected_text, actual_text)
611
612     def test_success(self):
613         self.assertResults(0, "perf-test")
614
615     def test_tests_failed(self):
616         self.assertResults(5, "5 perf tests failed")
617
618     def test_build_bad_build(self):
619         self.assertResults(255, "build not up to date")
620
621     def test_build_bad_source_json(self):
622         self.assertResults(254, "slave config JSON error")
623
624     def test_build_bad_marge(self):
625         self.assertResults(253, "output JSON merge error")
626
627     def test_build_bad_failed_uploading(self):
628         self.assertResults(252, "upload error")
629
630     def test_build_bad_preparation(self):
631         self.assertResults(251, "system dependency error")
632
633     def test_buildbot_timeout(self):
634         self.assertResults(-1, "timeout")
635
636
637 class RunBenchmarkTest(unittest.TestCase):
638     def assertResults(self, rc, expected_text):
639         cmd = StubRemoteCommand(rc, expected_text)
640         step = RunBenchmarkTests()
641         step.commandComplete(cmd)
642         actual_results = step.evaluateCommand(cmd)
643         actual_text = str(step.getText2(cmd, actual_results)[0])
644         self.assertEqual(expected_text, actual_text)
645
646     def test_success(self):
647         self.assertResults(0, "benchmark-test")
648
649     def test_tests_failed(self):
650         self.assertResults(7, "7 benchmark tests failed")
651
652
653 # FIXME: We should run this file as part of test-webkitpy.
654 # Unfortunately test-webkitpy currently requires that unittests
655 # be located in a directory with a valid module name.
656 # 'build.webkit.org-config' is not a valid module name (due to '.' and '-')
657 # so for now this is a stand-alone test harness.
658 if __name__ == '__main__':
659     BuildBotConfigLoader()._add_dependent_modules_to_sys_modules()
660     from loadConfig import *
661     c = {}
662     loadBuilderConfig(c, test_mode_is_enabled=True)
663     BuildStepsConstructorTest.generateTests()
664     BuildStepsTest.generateTests()
665     unittest.main()