2007-01-20 Mark Rowe <mrowe@apple.com>
[WebKit-https.git] / WebKitTools / BuildSlaveSupport / build.webkit.org-config / webkit / steps.py
1 from webkit.basesteps import ShellCommand, SVN, Test, Compile, UploadCommand
2 from buildbot.status.builder import SUCCESS, FAILURE, WARNINGS
3
4 class CheckOutSource(SVN):
5     svnurl = "svn://anoncvs.opensource.apple.com/svn/webkit/trunk"
6     mode = "update"
7     def __init__(self, *args, **kwargs):
8         SVN.__init__(self, svnurl=self.svnurl, mode=self.mode, *args, **kwargs)
9
10 class SetConfiguration(ShellCommand):
11     command = ["./WebKitTools/Scripts/set-webkit-configuration"]
12     
13     def __init__(self, *args, **kwargs):
14         configuration = kwargs.pop('configuration')
15         self.command = self.command + ['--' + configuration]
16         self.name = "set-configuration-%s" % (configuration,  )
17         self.description = ["set configuration %s" % (configuration, )]
18         self.descriptionDone = ["set configuration %s" % (configuration, )]
19         ShellCommand.__init__(self, *args, **kwargs)
20
21
22 class LayoutTest(Test):
23     name = "layout-test"
24     description = ["layout-tests running"]
25     descriptionDone = ["layout-tests"]
26     command = ["./WebKitTools/Scripts/run-webkit-tests", "--no-launch-safari", "--no-new-test-results", "--results-directory", "layout-test-results"]
27
28     def commandComplete(self, cmd):
29         Test.commandComplete(self, cmd)
30         
31         logText = cmd.logs['stdio'].getText()
32         incorrectLayoutLines = [line for line in logText.splitlines() if line.find('had incorrect layout') >= 0]
33         if incorrectLayoutLines:
34             self.incorrectLayoutLine = incorrectLayoutLines[0]
35         else:
36             self.incorrectLayoutLine = None
37
38     def getText(self, cmd, results):
39         return self.getText2(cmd, results)
40
41     def getText2(self, cmd, results):
42         if results != SUCCESS and self.incorrectLayoutLine:
43             return [self.incorrectLayoutLine]
44
45         return [self.name]
46
47
48 class JavaScriptCoreTest(Test):
49     name = "jscore-test"
50     description = ["jscore-tests running"]
51     descriptionDone = ["jscore-tests"]
52     command = ["./WebKitTools/Scripts/run-javascriptcore-tests"]
53     logfiles = {'results': 'JavaScriptCore/tests/mozilla/actual.html'}
54
55     def commandComplete(self, cmd):
56         Test.commandComplete(self, cmd)
57
58         logText = cmd.logs['stdio'].getText()
59         statusLines = [line for line in logText.splitlines() if line.find('regression') >= 0 and line.find(' found.') >= 0]
60         if statusLines and statusLines[0].split()[0] != '0':
61             self.regressionLine = statusLines[0]
62         else:
63             self.regressionLine = None
64
65     def evaluateCommand(self, cmd):
66         if cmd.rc != 0:
67             return FAILURE
68
69         if self.regressionLine:
70             return FAILURE
71
72         return SUCCESS
73
74     def getText(self, cmd, results):
75         return self.getText2(cmd, results)
76
77     def getText2(self, cmd, results):
78         if results != SUCCESS and self.regressionLine:
79             return [self.name, self.regressionLine]
80
81         return [self.name]
82
83 class PixelLayoutTest(LayoutTest):
84     name = "pixel-layout-test"
85     description = ["pixel-layout-tests running"]
86     descriptionDone = ["pixel-layout-tests"]
87     command = LayoutTest.command + ["--pixel"]
88
89     
90 class LeakTest(Test):
91     name = "leak-test"
92     description = ["leak-tests running"]
93     descriptionDone = ["leak-tests"]
94     command = ["./WebKitTools/Scripts/run-webkit-tests", "--no-launch-safari", "--quiet", "--leaks", "--results-directory", "layout-test-results"]
95
96     def commandComplete(self, cmd):
97         Test.commandComplete(self, cmd)
98
99         logText = cmd.logs['stdio'].getText()
100         self.totalLeakLines = [line for line in logText.splitlines() if line.find('total leaks found!') >= 0]
101         self.totalLeakLines += [line for line in logText.splitlines() if line.find('LEAK: ') >= 0]
102         self.totalLeakLines = [' '.join(x.split()[1:]) for x in self.totalLeakLines]
103
104     def evaluateCommand(self, cmd):
105         if cmd.rc != 0:
106             return FAILURE
107
108         if self.totalLeakLines:
109             return FAILURE
110
111         return SUCCESS
112
113     def getText(self, cmd, results):
114         return self.getText2(cmd, results)
115
116     def getText2(self, cmd, results):
117         if results != SUCCESS and self.totalLeakLines:
118             return self.totalLeakLines
119         return [self.name]
120
121
122 class PageLoadTest(UploadCommand, Test):
123     name = "page-load-test"
124     description = ["page-load-tests running"]
125     descriptionDone = ["page-load-tests"]
126     command = ["./WebKitTools/BuildSlaveSupport/run-performance-tests"]
127
128     def __init__(self, *args, **kwargs):
129         UploadCommand.__init__(self, *args, **kwargs)
130         self.command = self.command + ['--upload-results', self.getRemotePath()]
131         Test.__init__(self, *args, **kwargs)
132
133     def getURLPath(self):
134         return UploadCommand.getURLPath(self) + 'PerformanceReportSummary.xml'
135
136
137 class UploadLayoutResults(UploadCommand, ShellCommand):
138     name = "upload-results"
139     description = ["uploading results"]
140     descriptionDone = ["uploaded-results"]
141
142     def __init__(self, *args, **kwargs):
143         UploadCommand.__init__(self, *args, **kwargs)
144         
145         self.command = 'if [[ -d layout-test-results ]]; then find layout-test-results -type d -print0 | xargs -0 chmod ug+rx; find layout-test-results -type f -print0 | xargs -0 chmod ug+r;  rsync -rlvzP --rsync-path="/home/buildresults/bin/rsync" layout-test-results/ %s && rm -rf layout-test-results; fi' % (self.getRemotePath(), )
146
147         ShellCommand.__init__(self, *args, **kwargs)
148
149
150 class CompileWebKit(Compile):
151     command = ["./WebKitTools/Scripts/build-webkit", "--no-color"]
152     def __init__(self, *args, **kwargs):
153         configuration = kwargs.pop('configuration')
154         
155         self.name = "compile-" + configuration
156         self.description = ["compiling " + configuration]
157         self.descriptionDone = ["compiled " + configuration]
158
159         Compile.__init__(self, *args, **kwargs)
160
161
162 class CompileWebKitNoSVG(CompileWebKit):
163     command = 'rm -rf WebKitBuild && ./WebKitTools/Scripts/build-webkit --no-svg --no-color'
164
165 class InstallWin32Dependencies(ShellCommand):
166     description = ["installing Windows dependencies"]
167     descriptionDone = ["installed Windows dependencies"]
168     command = ["WebKitTools/Scripts/install-win-extras"]
169
170
171 class UploadDiskImage(UploadCommand, ShellCommand):
172     description = ["uploading disk image"]
173     descriptionDone = ["uploaded disk image"]
174     name = "upload-disk-image"
175
176     def __init__(self, *args, **kwargs):
177         UploadCommand.__init__(self, *args, **kwargs)
178         self.command = 'umask 002 && ./WebKitTools/BuildSlaveSupport/build-launcher-app && ./WebKitTools/BuildSlaveSupport/build-launcher-dmg --upload-to-host %s' % (self.getRemotePath(), )
179         ShellCommand.__init__(self, *args, **kwargs)