2
Tests for the core logic.
4
Pyro - Python Remote Objects. Copyright by Irmen de Jong.
5
irmen@razorvine.net - http://www.razorvine.net/python/Pyro
8
from __future__ import with_statement
16
def __init__(self, arg):
18
def __eq__(self,other):
19
return self.arg==other.arg
20
__hash__=object.__hash__
22
class CoreTests(unittest.TestCase):
24
self.assertTrue(type(Pyro.config.COMPRESSION) is bool)
25
self.assertTrue(type(Pyro.config.NS_PORT) is int)
26
config=Pyro.config.asDict()
27
self.assertTrue(type(config) is dict)
28
self.assertTrue("COMPRESSION" in config)
29
self.assertEqual(Pyro.config.COMPRESSION, config["COMPRESSION"])
31
def testImports(self):
32
self.assertTrue(Pyro.Proxy is Pyro.core.Proxy)
33
self.assertTrue(Pyro.URI is Pyro.core.URI)
34
self.assertTrue(Pyro.Daemon is Pyro.core.Daemon)
35
self.assertTrue(Pyro.locateNS is Pyro.naming.locateNS)
36
self.assertTrue(Pyro.resolve is Pyro.naming.resolve)
38
def testUriStrAndRepr(self):
39
uri="PYRONAME:some_obj_name"
41
self.assertEqual(uri,str(p))
42
uri="PYRONAME:some_obj_name@host.com"
44
self.assertEqual(uri+":"+str(Pyro.config.NS_PORT),str(p)) # a PYRONAME uri with a hostname gets a port too if omitted
45
uri="PYRONAME:some_obj_name@host.com:8888"
47
self.assertEqual(uri,str(p))
48
self.assertTrue("URI object at" in repr(p))
49
uri="PYRO:12345@host.com:9999"
51
self.assertEqual(uri,str(p))
52
self.assertEqual(uri,p.asString())
53
uri="PYRO:12345@./p:pipename"
55
self.assertEqual(uri,str(p))
56
uri="PYRO:12345@./u:sockname"
58
self.assertEqual(uri,str(p))
59
uri="PYRO:12345@./u:sockname"
60
unicodeuri=unicode(uri)
61
p=Pyro.core.URI(unicodeuri)
62
self.assertEqual(uri,str(p))
63
self.assertEqual(unicodeuri,unicode(p))
64
self.assertTrue(type(p.sockname) is unicode)
66
def testUriParsingPyro(self):
67
p=Pyro.core.URI("PYRONAME:some_obj_name")
68
self.assertEqual("PYRONAME",p.protocol)
69
self.assertEqual("some_obj_name",p.object)
70
self.assertEqual(None,p.host)
71
self.assertEqual(None,p.pipename)
72
self.assertEqual(None,p.sockname)
73
self.assertEqual(None,p.port)
74
p=Pyro.core.URI("PYRONAME:some_obj_name@host.com:9999")
75
self.assertEqual("PYRONAME",p.protocol)
76
self.assertEqual("some_obj_name",p.object)
77
self.assertEqual("host.com",p.host)
78
self.assertEqual(9999,p.port)
80
p=Pyro.core.URI("PYRO:12345@host.com:4444")
81
self.assertEqual("PYRO",p.protocol)
82
self.assertEqual("12345",p.object)
83
self.assertEqual("host.com",p.host)
84
self.assertEqual(None,p.pipename)
85
self.assertEqual(None,p.sockname)
86
self.assertEqual(4444,p.port)
87
p=Pyro.core.URI("PYRO:12345@./p:pipename")
88
self.assertEqual("12345",p.object)
89
self.assertEqual("pipename",p.pipename)
90
p=Pyro.core.URI("PYRO:12345@./u:sockname")
91
self.assertEqual("12345",p.object)
92
self.assertEqual("sockname",p.sockname)
94
def testUriParsingPyroname(self):
95
p=Pyro.core.URI("PYRONAME:objectname")
96
self.assertEqual("PYRONAME",p.protocol)
97
self.assertEqual("objectname",p.object)
98
self.assertEqual(None,p.host)
99
self.assertEqual(None,p.port)
100
p=Pyro.core.URI("PYRONAME:objectname@nameserverhost")
101
self.assertEqual("PYRONAME",p.protocol)
102
self.assertEqual("objectname",p.object)
103
self.assertEqual("nameserverhost",p.host)
104
self.assertEqual(Pyro.config.NS_PORT,p.port) # Pyroname uri with host gets a port too if not specified
105
p=Pyro.core.URI("PYRONAME:objectname@nameserverhost:4444")
106
self.assertEqual("PYRONAME",p.protocol)
107
self.assertEqual("objectname",p.object)
108
self.assertEqual("nameserverhost",p.host)
109
self.assertEqual(4444,p.port)
111
def testInvalidUris(self):
112
self.assertRaises(TypeError, Pyro.core.URI, None)
113
self.assertRaises(TypeError, Pyro.core.URI, 99999)
114
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "")
115
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "a")
116
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO")
117
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO:")
118
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO::")
119
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO:a")
120
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO:x@")
121
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO:x@hostname")
122
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO:@hostname:portstr")
123
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO:@hostname:7766")
124
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO:objid@hostname:7766:bogus")
125
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYROLOC:objname")
126
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYROLOC:objname@host")
127
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYROLOC:objectname@hostname:4444")
128
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRONAME:")
129
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRONAME:objname@nameserver:bogus")
130
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRONAME:objname@nameserver:7766:bogus")
131
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "FOOBAR:")
132
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "FOOBAR:objid@hostname:7766")
133
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO:12345@./p:pipename/slash")
134
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO:12345@./u:sockname/slash")
135
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO:12345@./p:pipename:9999")
136
self.assertRaises(Pyro.errors.PyroError, Pyro.core.URI, "PYRO:12345@./u:sockname:9999")
138
def testUriUnicode(self):
139
p=Pyro.core.URI(u"PYRO:12345@host.com:4444")
140
self.assertEqual("PYRO",p.protocol)
141
self.assertEqual("12345",p.object)
142
self.assertEqual("host.com",p.host)
143
self.assertTrue(type(p.protocol) is unicode)
144
self.assertTrue(type(p.object) is unicode)
145
self.assertTrue(type(p.host) is unicode)
146
self.assertEqual(None,p.pipename)
147
self.assertEqual(None,p.sockname)
148
self.assertEqual(4444,p.port)
150
uri="PYRO:12345@hostname:9999"
152
pu=Pyro.core.URI(unicode(uri))
153
self.assertEqual("PYRO",pu.protocol)
154
self.assertEqual("hostname",pu.host)
155
self.assertEqual(p,pu)
156
self.assertEqual(str(p), str(pu))
157
unicodeuri=u"PYRO:weirdchars\u20AC@host\u20AC.com:4444"
158
pu=Pyro.core.URI(unicodeuri)
159
self.assertEqual("PYRO",pu.protocol)
160
self.assertEqual(u"host\u20AC.com",pu.host)
161
self.assertEqual(u"weirdchars\u20AC",pu.object)
162
self.assertEqual(pu.asString(), pu.__str__())
163
self.assertEqual(u"PYRO:weirdchars\u20ac@host\u20ac.com:4444", pu.asString())
164
self.assertEqual(u"PYRO:weirdchars\u20ac@host\u20ac.com:4444", unicode(pu))
165
self.assertTrue("URI object at" in repr(pu))
167
def testUriCopy(self):
168
p1=Pyro.core.URI("PYRO:12345@hostname:9999")
171
self.assertEqual(p1.protocol, p2.protocol)
172
self.assertEqual(p1.host, p2.host)
173
self.assertEqual(p1.port, p2.port)
174
self.assertEqual(p1.object, p2.object)
175
self.assertEqual(p1,p2)
176
self.assertEqual(p1.protocol, p3.protocol)
177
self.assertEqual(p1.host, p3.host)
178
self.assertEqual(p1.port, p3.port)
179
self.assertEqual(p1.object, p3.object)
180
self.assertEqual(p1,p3)
182
def testUriEqual(self):
183
p1=Pyro.core.URI("PYRO:12345@host.com:9999")
184
p2=Pyro.core.URI("PYRO:12345@host.com:9999")
185
p3=Pyro.core.URI("PYRO:99999@host.com:4444")
186
self.assertEqual(p1,p2)
187
self.assertNotEqual(p1,p3)
188
self.assertNotEqual(p2,p3)
191
self.assertNotEqual(p1,p2)
192
self.assertEqual(p2,p3)
194
def testLocation(self):
195
self.assertTrue(Pyro.core.URI.isPipeOrUnixsockLocation("./p:name"))
196
self.assertTrue(Pyro.core.URI.isPipeOrUnixsockLocation("./u:name"))
197
self.assertFalse(Pyro.core.URI.isPipeOrUnixsockLocation("./x:name"))
198
self.assertFalse(Pyro.core.URI.isPipeOrUnixsockLocation("foobar"))
200
def testMsgFactory(self):
201
MF=Pyro.core.MessageFactory
202
MF.createMessage(99, None) # doesn't check msg type here
203
self.assertRaises(Pyro.errors.ProtocolError, MF.parseMessageHeader, "FOOBAR")
204
hdr=MF.createMessage(MF.MSG_CONNECT, "hello")[:-5]
205
msgType,flags,dataLen=MF.parseMessageHeader(hdr)
206
self.assertEqual(MF.MSG_CONNECT, msgType)
207
self.assertEqual(0, flags)
208
self.assertEqual(5, dataLen)
209
hdr=MF.createMessage(MF.MSG_RESULT, None)
210
msgType,flags,dataLen=MF.parseMessageHeader(hdr)
211
self.assertEqual(MF.MSG_RESULT, msgType)
212
self.assertEqual(0, flags)
213
self.assertEqual(0, dataLen)
214
hdr=MF.createMessage(MF.MSG_RESULT, "hello", 42)[:-5]
215
msgType,flags,dataLen=MF.parseMessageHeader(hdr)
216
self.assertEqual(MF.MSG_RESULT, msgType)
217
self.assertEqual(42, flags)
218
self.assertEqual(5, dataLen)
219
msg=MF.createMessage(255,None)
220
self.assertEqual("PYRO\x00"+chr(Pyro.constants.PROTOCOL_VERSION)+"\x00\xff\x00\x00\x00\x00\x00\x00",msg)
221
msg=MF.createMessage(1,None)
222
self.assertEqual("PYRO\x00"+chr(Pyro.constants.PROTOCOL_VERSION)+"\x00\x01\x00\x00\x00\x00\x00\x00",msg)
223
msg=MF.createMessage(1,None,flags=255)
224
self.assertEqual("PYRO\x00"+chr(Pyro.constants.PROTOCOL_VERSION)+"\x00\x01\x00\xff\x00\x00\x00\x00",msg)
225
# compression is a job of the code supplying the data, so the messagefactory should leave it untouched
227
msg=MF.createMessage(MF.MSG_INVOKE, data, 0)
228
msg2=MF.createMessage(MF.MSG_INVOKE, data, MF.FLAGS_COMPRESSED)
229
self.assertEquals(len(msg),len(msg2))
231
def testProxyOffline(self):
232
# only offline stuff here.
233
# online stuff needs a running daemon, so we do that in another test, to keep this one simple
234
self.assertRaises(TypeError, Pyro.core.Proxy, 999) # wrong arg
235
p1=Pyro.core.Proxy("PYRO:9999@localhost:15555")
236
p2=Pyro.core.Proxy(Pyro.core.URI("PYRO:9999@localhost:15555"))
237
self.assertEqual(p1._pyroUri, p2._pyroUri)
238
self.assertTrue(p1._pyroConnection is None)
241
# try copying a not-connected proxy
243
self.assertTrue(p3._pyroConnection is None)
244
self.assertTrue(p1._pyroConnection is None)
245
self.assertEqual(p3._pyroUri, p1._pyroUri)
246
self.assertFalse(p3._pyroUri is p1._pyroUri)
247
self.assertEqual(p3._pyroSerializer, p1._pyroSerializer)
248
self.assertTrue(p3._pyroSerializer is p1._pyroSerializer)
250
def testProxyStr(self):
251
p=Pyro.core.Proxy("PYRO:9999@localhost:15555")
252
self.assertEqual("<Pyro Proxy for PYRO:9999@localhost:15555>", str(p))
253
self.assertEqual(u"<Pyro Proxy for PYRO:9999@localhost:15555>", unicode(p))
254
self.assertTrue("Proxy object at" in repr(p))
256
def testProxySettings(self):
257
p1=Pyro.core.Proxy("PYRO:9999@localhost:15555")
258
p2=Pyro.core.Proxy("PYRO:9999@localhost:15555")
259
p1._pyroOneway.add("method")
260
self.assertTrue("method" in p1._pyroOneway, "p1 should have oneway method")
261
self.assertFalse("method" in p2._pyroOneway, "p2 should not have the same oneway method")
262
self.assertFalse(p1._pyroOneway is p2._pyroOneway, "p1 and p2 should have different oneway tables")
264
def testProxyWithStmt(self):
265
class ConnectionMock(object):
268
self.closeCalled=True
270
connMock=ConnectionMock()
271
p=Pyro.core.Proxy("PYRO:9999@localhost:15555")
272
p._pyroConnection=connMock
273
self.assertFalse(connMock.closeCalled)
275
self.assertTrue(p._pyroConnection is None)
276
self.assertTrue(connMock.closeCalled)
278
connMock=ConnectionMock()
279
with Pyro.core.Proxy("PYRO:9999@localhost:15555") as p:
280
p._pyroConnection=connMock
281
self.assertTrue(p._pyroConnection is None)
282
self.assertTrue(connMock.closeCalled)
283
connMock=ConnectionMock()
285
with Pyro.core.Proxy("PYRO:9999@localhost:15555") as p:
286
p._pyroConnection=connMock
287
print 1//0 # cause an error
288
self.fail("expected error")
289
except ZeroDivisionError:
291
self.assertTrue(p._pyroConnection is None)
292
self.assertTrue(connMock.closeCalled)
293
connMock=ConnectionMock()
294
p=Pyro.core.Proxy("PYRO:9999@localhost:15555")
296
self.assertTrue(p._pyroUri is not None)
298
self.assertTrue(p._pyroUri is not None)
300
def testRemoteMethod(self):
302
def invoke(self, name, args, kwargs):
303
return "INVOKED name=%s args=%s kwargs=%s" % (name,args,kwargs)
304
def __getattr__(self, name):
305
return Pyro.core._RemoteMethod(self.invoke, name)
307
self.assertEqual("INVOKED name=foo args=(1,) kwargs={}", o.foo(1)) #normal
308
self.assertEqual("INVOKED name=foo.bar args=(1,) kwargs={}", o.foo.bar(1)) #dotted
309
self.assertEqual("INVOKED name=foo.bar args=(1, 'hello') kwargs={'a': True}", o.foo.bar(1,"hello",a=True))
310
p=Pyro.core.Proxy("PYRO:obj@host:666")
312
self.assertTrue(isinstance(a, Pyro.core._RemoteMethod), "attribute access should just be a RemoteMethod")
314
self.assertTrue(isinstance(a2, Pyro.core._RemoteMethod), "nested attribute should just be another RemoteMethod")
316
def testTimeoutGetSet(self):
317
class ConnectionMock(object):
319
self.timeout=Pyro.config.COMMTIMEOUT
322
Pyro.config.COMMTIMEOUT=None
323
p=Pyro.core.Proxy("PYRO:obj@host:555")
324
self.assertEqual(None, p._pyroTimeout)
326
self.assertEqual(5, p._pyroTimeout)
327
p=Pyro.core.Proxy("PYRO:obj@host:555")
328
p._pyroConnection=ConnectionMock()
329
self.assertEqual(None, p._pyroTimeout)
331
self.assertEqual(5, p._pyroTimeout)
332
self.assertEqual(5, p._pyroConnection.timeout)
333
Pyro.config.COMMTIMEOUT=2
334
p=Pyro.core.Proxy("PYRO:obj@host:555")
335
p._pyroConnection=ConnectionMock()
336
self.assertEqual(2, p._pyroTimeout)
337
self.assertEqual(2, p._pyroConnection.timeout)
339
self.assertEqual(None, p._pyroTimeout)
340
self.assertEqual(None, p._pyroConnection.timeout)
341
Pyro.config.COMMTIMEOUT=None
343
def testDecorators(self):
344
# just test the decorator itself, testing the callback
345
# exception handling is kinda hard in unit tests. Maybe later.
353
self.assertEquals(True, getattr(t.method,"_pyroCallback"))
354
self.assertEquals(False, getattr(t.method2,"_pyroCallback", False))
357
if __name__ == "__main__":
358
#import sys;sys.argv = ['', 'Test.testName']