1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """testsuite base classes and helpers for diffing strings
23 """
24
25 from twisted.spread import pb
26 from twisted.internet import reactor, defer, selectreactor
27 from twisted.trial import unittest
28
29 from flumotion.common import log
30 from flumotion.configure import configure
31
32 __version__ = "$Rev: 7541 $"
33
34
35 -class TestCase(unittest.TestCase, log.Loggable):
36
37
38
39
40 supportedReactors = [selectreactor.SelectReactor]
41
42
43 if not hasattr(unittest.TestCase, 'failUnlessFailure'):
44
46
47 def _cb(result):
48 self.fail("did not catch an error, instead got %r" %
49 (result, ))
50
51 def _eb(failure):
52 failure.trap(*expectedFailures)
53 return failure.value
54 return deferred.addCallbacks(_cb, _eb)
55 assertFailure = failUnlessFailure
56
57
58
59 - def __init__(self, methodName=' impossible-name '):
98
99
100
101 - def debug(self, *args, **kwargs):
103
104
105
106
107
108
110
111 type = "client"
112 remoteRoot = None
113
114 - def run(self, port):
115 """
116 Start the client by connecting to the server on the given port.
117
118 @type port: int
119
120 @rtype: L{twisted.internet.defer.Deferred}
121 """
122 self._f = pb.PBClientFactory()
123 self._p = reactor.connectTCP("127.0.0.1", port, self._f)
124 d = self._f.getRootObject()
125 d.addCallback(self._gotRootObject)
126 return d
127
129 """
130 Stop the client.
131
132 @rtype: L{twisted.internet.defer.Deferred}
133 """
134 self._p.disconnect()
135 return self._dDisconnect
136
146
148
149 self.object = object
150
151
154
155
158
159
161 logCategory = "testmanagerroot"
162
164 """
165 Called by a TestClient to announce the type of client, and give
166 a reference.
167 """
168 self.debug('remote_identify: who %r, ref %r' % (who, reference))
169 key = who + 'Reference'
170 setattr(self, key, reference)
171
173
174 self.object = object
175
176
178
179 - def run(self, rootClass):
180 """
181 Run the test manager. Return port it is listening on.
182
183 @type rootClass: subclass of L{TestManagerRoot}
184
185 @rtype: int
186 """
187 self.root = rootClass()
188 factory = pb.PBServerFactory(self.root)
189 factory.unsafeTracebacks = 1
190 self._p = reactor.listenTCP(0, factory, interface="127.0.0.1")
191 port = self._p.getHost().port
192 return port
193
195 """
196 Stop the server.
197 """
198 return self._p.stopListening()
199
200
202 """
203 I combine a manager and a client to test passing back and forth objects.
204 """
205 logCategory = "testpb"
206
210
214
216 d = self.manager.stop()
217 d.addCallback(lambda r: self.client.stop())
218 return d
219
220 - def send(self, object):
221 """
222 Send the object from client to server.
223 Return the server's idea of the object.
224 """
225 self.debug('sending object %r from broker %r' % (
226 object, self.client.remoteRoot.broker))
227 d = self.client.remoteRoot.callRemote('receive', object)
228 d.addCallback(lambda r: self.manager.root.object)
229 return d
230
232 """
233 Receive the object from server to client.
234 Return the client's idea of the object.
235 """
236 self.debug('receiving object %r' % object)
237 d = self.manager.root.clientReference.callRemote('receive', object)
238 d.addCallback(lambda r: self.client.object)
239 return d
240
241
243
245 from flumotion.twisted import pb
246 from flumotion.common import server, connection
247 from flumotion.manager import manager, config
248 from StringIO import StringIO
249
250 managerConf = """
251 <planet>
252 <manager name="planet">
253 <host>localhost</host>
254 <port>0</port>
255 <transport>tcp</transport>
256 <component name="manager-bouncer" type="htpasswdcrypt-bouncer">
257 <property name="data"><![CDATA[
258 user:PSfNpHTkpTx1M
259 ]]></property>
260 </component>
261 </manager>
262 </planet>
263 """
264
265 conf = config.ManagerConfigParser(StringIO(managerConf)).manager
266 self.vishnu = manager.Vishnu(conf.name,
267 unsafeTracebacks=True)
268 self.vishnu.loadManagerConfigurationXML(StringIO(managerConf))
269 s = server.Server(self.vishnu)
270 if conf.transport == "ssl":
271 p = s.startSSL(conf.host, conf.port, conf.certificate,
272 configure.configdir)
273 elif conf.transport == "tcp":
274 p = s.startTCP(conf.host, conf.port)
275 self.tport = p
276 self.port = p.getHost().port
277 i = connection.PBConnectionInfo('localhost', self.port,
278 conf.transport == 'ssl',
279 pb.Authenticator(username='user',
280 password='test'))
281 self.connectionInfo = i
282
284
285 try:
286 self.flushLoggedErrors(*types)
287 except AttributeError:
288 from twisted.python import log as tlog
289 tlog.flushErrors(*types)
290
298
299
300 -def _diff(old, new, desc):
301 import difflib
302 lines = difflib.unified_diff(old, new)
303 lines = list(lines)
304 if not lines:
305 return
306 output = ''
307 for line in lines:
308 output += '%s: %s\n' % (desc, line[:-1])
309
310 raise AssertionError(
311 ("\nError while comparing strings:\n"
312 "%s") % (output, ))
313
314
316
317 def _tolines(s):
318 return [line + '\n' for line in s.split('\n')]
319
320 return _diff(_tolines(orig),
321 _tolines(new),
322 desc=desc)
323