2007-03-26 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 = "http://svn.webkit.org/repository/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", "--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 = '''\
146         if [[ -d layout-test-results ]]; then \
147             find layout-test-results -type d -print0 | xargs -0 chmod ug+rx; \
148             find layout-test-results -type f -print0 | xargs -0 chmod ug+r; \
149             rsync -rlvzP --rsync-path="/home/buildresults/bin/rsync" layout-test-results/ %s && rm -rf layout-test-results; \
150         fi; \
151         CRASH_LOG=~/Library/Logs/CrashReporter/DumpRenderTree*.crash*; \
152         if [[ -f $(ls -1 $CRASH_LOG | head -n 1 ) ]]; then \
153             chmod ug+r $CRASH_LOG; \
154             rsync -rlvzP --rsync-path="/home/buildresults/bin/rsync" $CRASH_LOG %s && rm -rf $CRASH_LOG; \
155         fi;''' % (self.getRemotePath(), self.getRemotePath())
156
157         ShellCommand.__init__(self, *args, **kwargs)
158
159
160 class CompileWebKit(Compile):
161     command = ["./WebKitTools/Scripts/build-webkit", "--no-color"]
162     def __init__(self, *args, **kwargs):
163         configuration = kwargs.pop('configuration')
164         
165         self.name = "compile-" + configuration
166         self.description = ["compiling " + configuration]
167         self.descriptionDone = ["compiled " + configuration]
168
169         Compile.__init__(self, *args, **kwargs)
170
171
172 class CompileWebKitNoSVG(CompileWebKit):
173     command = 'rm -rf WebKitBuild && ./WebKitTools/Scripts/build-webkit --no-svg --no-color'
174
175 class InstallWin32Dependencies(ShellCommand):
176     description = ["installing Windows dependencies"]
177     descriptionDone = ["installed Windows dependencies"]
178     command = ["WebKitTools/Scripts/install-win-extras"]
179
180
181 class UploadDiskImage(UploadCommand, ShellCommand):
182     description = ["uploading disk image"]
183     descriptionDone = ["uploaded disk image"]
184     name = "upload-disk-image"
185
186     def __init__(self, *args, **kwargs):
187         UploadCommand.__init__(self, *args, **kwargs)
188         self.command = 'umask 002 && ./WebKitTools/BuildSlaveSupport/build-launcher-app && ./WebKitTools/BuildSlaveSupport/build-launcher-dmg --upload-to-host %s' % (self.getRemotePath(), )
189         ShellCommand.__init__(self, *args, **kwargs)