6e58817b0d77ee4b3d76b67168b44656e89a5305
[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", "--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
54     def commandComplete(self, cmd):
55         Test.commandComplete(self, cmd)
56
57         logText = cmd.logs['stdio'].getText()
58         statusLines = [line for line in logText.splitlines() if line.find('regressions found.') >= 0]
59         if statusLines and statusLines[0].split()[0] != '0':
60             self.regressionLine = statusLines[0]
61         else:
62             self.regressionLine = None
63
64     def evaluateCommand(self, cmd):
65         if cmd.rc != 0:
66             return FAILURE
67
68         if self.regressionLine:
69             return FAILURE
70
71         return SUCCESS
72
73     def getText(self, cmd, results):
74         return self.getText2(cmd, results)
75
76     def getText2(self, cmd, results):
77         if results != SUCCESS and self.regressionLine:
78             return [self.name, self.regressionLine]
79
80         return [self.name]
81
82 class PixelLayoutTest(LayoutTest):
83     name = "pixel-layout-test"
84     description = ["pixel-layout-tests running"]
85     descriptionDone = ["pixel-layout-tests"]
86     command = LayoutTest.command + ["--pixel"]
87
88     
89 class LeakTest(Test):
90     name = "leak-test"
91     description = ["leak-tests running"]
92     descriptionDone = ["leak-tests"]
93     command = ["./WebKitTools/Scripts/run-webkit-tests", "--no-launch-safari", "--quiet", "--leaks", "--results-directory", "layout-test-results"]
94
95     def commandComplete(self, cmd):
96         Test.commandComplete(self, cmd)
97
98         logText = cmd.logs['stdio'].getText()
99         self.totalLeakLines = [line for line in logText.splitlines() if line.find('total leaks found!') >= 0]
100         self.totalLeakLines += [line for line in logText.splitlines() if line.find('LEAK: ') >= 0]
101         self.totalLeakLines = [' '.join(x.split()[1:]) for x in self.totalLeakLines]
102
103     def evaluateCommand(self, cmd):
104         if cmd.rc != 0:
105             return FAILURE
106
107         if self.totalLeakLines:
108             return FAILURE
109
110         return SUCCESS
111
112     def getText(self, cmd, results):
113         return self.getText2(cmd, results)
114
115     def getText2(self, cmd, results):
116         if results != SUCCESS and self.totalLeakLines:
117             return self.totalLeakLines
118         return [self.name]
119
120
121 class PageLoadTest(UploadCommand, Test):
122     name = "page-load-test"
123     description = ["page-load-tests running"]
124     descriptionDone = ["page-load-tests"]
125     command = ["./WebKitTools/BuildSlaveSupport/run-performance-tests"]
126
127     def __init__(self, *args, **kwargs):
128         UploadCommand.__init__(self, *args, **kwargs)
129         self.command = self.command + ['--upload-results', self.getRemotePath()]
130         Test.__init__(self, *args, **kwargs)
131
132     def getURLPath(self):
133         return UploadCommand.getURLPath(self) + 'PerformanceReportSummary.xml'
134
135
136 class UploadLayoutResults(UploadCommand, ShellCommand):
137     name = "upload-results"
138     description = ["uploading results"]
139     descriptionDone = ["uploaded-results"]
140
141     def __init__(self, *args, **kwargs):
142         UploadCommand.__init__(self, *args, **kwargs)
143         
144         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(), )
145
146         ShellCommand.__init__(self, *args, **kwargs)
147
148
149 class CompileWebKit(Compile):
150     command = ["./WebKitTools/Scripts/build-webkit", "--no-color"]
151     def __init__(self, *args, **kwargs):
152         configuration = kwargs.pop('configuration')
153         
154         self.name = "compile-" + configuration
155         self.description = ["compiling " + configuration]
156         self.descriptionDone = ["compiled " + configuration]
157
158         Compile.__init__(self, *args, **kwargs)
159
160
161 class CompileWebKitNoSVG(CompileWebKit):
162     command = 'rm -rf WebKitBuild && ./WebKitTools/Scripts/build-webkit --no-svg --no-color'
163
164 class InstallWin32Dependencies(ShellCommand):
165     description = ["installing Windows dependencies"]
166     descriptionDone = ["installed Windows dependencies"]
167     command = ["WebKitTools/Scripts/install-win-extras"]
168
169
170 class UploadDiskImage(UploadCommand, ShellCommand):
171     description = ["uploading disk image"]
172     descriptionDone = ["uploaded disk image"]
173     name = "upload-disk-image"
174
175     def __init__(self, *args, **kwargs):
176         UploadCommand.__init__(self, *args, **kwargs)
177         self.command = 'umask 002 && ./WebKitTools/BuildSlaveSupport/build-launcher-app && ./WebKitTools/BuildSlaveSupport/build-launcher-dmg --upload-to-host %s' % (self.getRemotePath(), )
178         ShellCommand.__init__(self, *args, **kwargs)