1 # -*- test-case-name: buildbot.test.test_transfer -*-
4 from stat
import ST_MODE
5 from twisted
.trial
import unittest
6 from buildbot
.steps
.transfer
import FileUpload
, FileDownload
7 from buildbot
.test
.runutils
import StepTester
8 from buildbot
.status
.builder
import SUCCESS
, FAILURE
11 # these steps pass a pb.Referenceable inside their arguments, so we have to
12 # catch and wrap them. If the LocalAsRemote wrapper were a proper membrane,
13 # we wouldn't have to do this.
15 class Upload(StepTester
, unittest
.TestCase
):
17 def filterArgs(self
, args
):
19 args
["writer"] = self
.wrap(args
["writer"])
22 def testSuccess(self
):
23 self
.slavebase
= "Upload.testSuccess.slave"
24 self
.masterbase
= "Upload.testSuccess.master"
25 sb
= self
.makeSlaveBuilder()
26 os
.mkdir(os
.path
.join(self
.slavebase
, self
.slavebuilderbase
,
28 # the buildmaster normally runs chdir'ed into masterbase, so uploaded
29 # files will appear there. Under trial, we're chdir'ed into
30 # _trial_temp instead, so use a different masterdest= to keep the
31 # uploaded file in a test-local directory
32 masterdest
= os
.path
.join(self
.masterbase
, "dest.text")
33 step
= self
.makeStep(FileUpload
,
34 slavesrc
="source.txt",
35 masterdest
=masterdest
)
36 slavesrc
= os
.path
.join(self
.slavebase
,
37 self
.slavebuilderbase
,
40 contents
= "this is the source file\n" * 1000
41 open(slavesrc
, "w").write(contents
)
42 f
= open(masterdest
, "w")
43 f
.write("overwrite me\n")
46 d
= self
.runStep(step
)
47 def _checkUpload(results
):
48 step_status
= step
.step_status
49 #l = step_status.getLogs()
51 # logtext = l[0].getText()
53 self
.failUnlessEqual(results
, SUCCESS
)
54 self
.failUnless(os
.path
.exists(masterdest
))
55 masterdest_contents
= open(masterdest
, "r").read()
56 self
.failUnlessEqual(masterdest_contents
, contents
)
57 d
.addCallback(_checkUpload
)
60 def testMaxsize(self
):
61 self
.slavebase
= "Upload.testMaxsize.slave"
62 self
.masterbase
= "Upload.testMaxsize.master"
63 sb
= self
.makeSlaveBuilder()
64 os
.mkdir(os
.path
.join(self
.slavebase
, self
.slavebuilderbase
,
66 masterdest
= os
.path
.join(self
.masterbase
, "dest2.text")
67 step
= self
.makeStep(FileUpload
,
68 slavesrc
="source.txt",
69 masterdest
=masterdest
,
71 slavesrc
= os
.path
.join(self
.slavebase
,
72 self
.slavebuilderbase
,
75 contents
= "this is the source file\n" * 1000
76 open(slavesrc
, "w").write(contents
)
77 f
= open(masterdest
, "w")
78 f
.write("overwrite me\n")
81 d
= self
.runStep(step
)
82 def _checkUpload(results
):
83 step_status
= step
.step_status
84 #l = step_status.getLogs()
86 # logtext = l[0].getText()
88 self
.failUnlessEqual(results
, FAILURE
)
89 self
.failUnless(os
.path
.exists(masterdest
))
90 masterdest_contents
= open(masterdest
, "r").read()
91 self
.failUnlessEqual(len(masterdest_contents
), 12345)
92 self
.failUnlessEqual(masterdest_contents
, contents
[:12345])
93 d
.addCallback(_checkUpload
)
97 self
.slavebase
= "Upload.testMode.slave"
98 self
.masterbase
= "Upload.testMode.master"
99 sb
= self
.makeSlaveBuilder()
100 os
.mkdir(os
.path
.join(self
.slavebase
, self
.slavebuilderbase
,
102 masterdest
= os
.path
.join(self
.masterbase
, "dest3.text")
103 step
= self
.makeStep(FileUpload
,
104 slavesrc
="source.txt",
105 masterdest
=masterdest
,
107 slavesrc
= os
.path
.join(self
.slavebase
,
108 self
.slavebuilderbase
,
111 contents
= "this is the source file\n"
112 open(slavesrc
, "w").write(contents
)
113 f
= open(masterdest
, "w")
114 f
.write("overwrite me\n")
117 d
= self
.runStep(step
)
118 def _checkUpload(results
):
119 step_status
= step
.step_status
120 #l = step_status.getLogs()
122 # logtext = l[0].getText()
124 self
.failUnlessEqual(results
, SUCCESS
)
125 self
.failUnless(os
.path
.exists(masterdest
))
126 masterdest_contents
= open(masterdest
, "r").read()
127 self
.failUnlessEqual(masterdest_contents
, contents
)
128 # and with 0777 to ignore sticky bits
129 dest_mode
= os
.stat(masterdest
)[ST_MODE
] & 0777
130 self
.failUnlessEqual(dest_mode
, 0755,
131 "target mode was %o, we wanted %o" %
133 d
.addCallback(_checkUpload
)
136 def testMissingFile(self
):
137 self
.slavebase
= "Upload.testMissingFile.slave"
138 self
.masterbase
= "Upload.testMissingFile.master"
139 sb
= self
.makeSlaveBuilder()
140 step
= self
.makeStep(FileUpload
,
141 slavesrc
="MISSING.txt",
142 masterdest
="dest.txt")
143 masterdest
= os
.path
.join(self
.masterbase
, "dest4.txt")
145 d
= self
.runStep(step
)
146 def _checkUpload(results
):
147 step_status
= step
.step_status
148 self
.failUnlessEqual(results
, FAILURE
)
149 self
.failIf(os
.path
.exists(masterdest
))
150 l
= step_status
.getLogs()
151 logtext
= l
[0].getText().strip()
152 self
.failUnless(logtext
.startswith("Cannot open file"))
153 self
.failUnless(logtext
.endswith("for upload"))
154 d
.addCallback(_checkUpload
)
159 class Download(StepTester
, unittest
.TestCase
):
161 def filterArgs(self
, args
):
163 args
["reader"] = self
.wrap(args
["reader"])
166 def testSuccess(self
):
167 self
.slavebase
= "Download.testSuccess.slave"
168 self
.masterbase
= "Download.testSuccess.master"
169 sb
= self
.makeSlaveBuilder()
170 os
.mkdir(os
.path
.join(self
.slavebase
, self
.slavebuilderbase
,
172 mastersrc
= os
.path
.join(self
.masterbase
, "source.text")
173 slavedest
= os
.path
.join(self
.slavebase
,
174 self
.slavebuilderbase
,
177 step
= self
.makeStep(FileDownload
,
179 slavedest
="dest.txt")
180 contents
= "this is the source file\n" * 1000 # 24kb, so two blocks
181 open(mastersrc
, "w").write(contents
)
182 f
= open(slavedest
, "w")
183 f
.write("overwrite me\n")
186 d
= self
.runStep(step
)
187 def _checkDownload(results
):
188 step_status
= step
.step_status
189 self
.failUnlessEqual(results
, SUCCESS
)
190 self
.failUnless(os
.path
.exists(slavedest
))
191 slavedest_contents
= open(slavedest
, "r").read()
192 self
.failUnlessEqual(slavedest_contents
, contents
)
193 d
.addCallback(_checkDownload
)
196 def testMaxsize(self
):
197 self
.slavebase
= "Download.testMaxsize.slave"
198 self
.masterbase
= "Download.testMaxsize.master"
199 sb
= self
.makeSlaveBuilder()
200 os
.mkdir(os
.path
.join(self
.slavebase
, self
.slavebuilderbase
,
202 mastersrc
= os
.path
.join(self
.masterbase
, "source.text")
203 slavedest
= os
.path
.join(self
.slavebase
,
204 self
.slavebuilderbase
,
207 step
= self
.makeStep(FileDownload
,
209 slavedest
="dest.txt",
211 contents
= "this is the source file\n" * 1000 # 24kb, so two blocks
212 open(mastersrc
, "w").write(contents
)
213 f
= open(slavedest
, "w")
214 f
.write("overwrite me\n")
217 d
= self
.runStep(step
)
218 def _checkDownload(results
):
219 step_status
= step
.step_status
220 # the file should be truncated, and the step a FAILURE
221 self
.failUnlessEqual(results
, FAILURE
)
222 self
.failUnless(os
.path
.exists(slavedest
))
223 slavedest_contents
= open(slavedest
, "r").read()
224 self
.failUnlessEqual(len(slavedest_contents
), 12345)
225 self
.failUnlessEqual(slavedest_contents
, contents
[:12345])
226 d
.addCallback(_checkDownload
)
230 self
.slavebase
= "Download.testMode.slave"
231 self
.masterbase
= "Download.testMode.master"
232 sb
= self
.makeSlaveBuilder()
233 os
.mkdir(os
.path
.join(self
.slavebase
, self
.slavebuilderbase
,
235 mastersrc
= os
.path
.join(self
.masterbase
, "source.text")
236 slavedest
= os
.path
.join(self
.slavebase
,
237 self
.slavebuilderbase
,
240 step
= self
.makeStep(FileDownload
,
242 slavedest
="dest.txt",
244 contents
= "this is the source file\n"
245 open(mastersrc
, "w").write(contents
)
246 f
= open(slavedest
, "w")
247 f
.write("overwrite me\n")
250 d
= self
.runStep(step
)
251 def _checkDownload(results
):
252 step_status
= step
.step_status
253 self
.failUnlessEqual(results
, SUCCESS
)
254 self
.failUnless(os
.path
.exists(slavedest
))
255 slavedest_contents
= open(slavedest
, "r").read()
256 self
.failUnlessEqual(slavedest_contents
, contents
)
257 # and with 0777 to ignore sticky bits
258 dest_mode
= os
.stat(slavedest
)[ST_MODE
] & 0777
259 self
.failUnlessEqual(dest_mode
, 0755,
260 "target mode was %o, we wanted %o" %
262 d
.addCallback(_checkDownload
)
265 def testMissingFile(self
):
266 self
.slavebase
= "Download.testMissingFile.slave"
267 self
.masterbase
= "Download.testMissingFile.master"
268 sb
= self
.makeSlaveBuilder()
269 os
.mkdir(os
.path
.join(self
.slavebase
, self
.slavebuilderbase
,
271 mastersrc
= os
.path
.join(self
.masterbase
, "MISSING.text")
272 slavedest
= os
.path
.join(self
.slavebase
,
273 self
.slavebuilderbase
,
276 step
= self
.makeStep(FileDownload
,
278 slavedest
="dest.txt")
280 d
= self
.runStep(step
)
281 def _checkDownload(results
):
282 step_status
= step
.step_status
283 self
.failUnlessEqual(results
, FAILURE
)
284 self
.failIf(os
.path
.exists(slavedest
))
285 l
= step_status
.getLogs()
286 logtext
= l
[0].getText().strip()
287 self
.failUnless(logtext
.endswith(" not available at master"))
288 d
.addCallbacks(_checkDownload
)
294 # test relative paths, ~/paths
295 # need to implement expanduser() for slave-side
296 # test error message when master-side file is in a missing directory
297 # remove workdir= default?