40 from xmlrpc.client
import ServerProxy
42 from xmlrpclib
import ServerProxy
47 from rosclient
import *
49 NODE_INTEGRATION_NAME =
"node_integration_test"
63 raise Exception(
"set_node_name has not been called yet")
64 ros_ns = os.environ.get(rosgraph.ROS_NAMESPACE, rosgraph.names.GLOBALNS)
65 return rosgraph.names.ns_join(ros_ns, _name)
70 super(_MasterTestCase, self).
__init__(*args)
71 self.
ns = os.environ.get(rosgraph.ROS_NAMESPACE, rosgraph.names.GLOBALNS)
75 super(_MasterTestCase, self).
setUp()
76 self.
master_uri = os.environ.get(rosgraph.ROS_MASTER_URI,
None)
83 import urllib.parse
as urlparse
86 parsed = urlparse.urlparse(uri)
87 self.assertTrue(parsed[0]
in [
'http',
'https'],
'protocol [%s] in [%s] invalid'%(parsed[0], uri))
88 self.assertTrue(parsed[1],
'host missing [%s]'%uri)
89 if not sys.version.startswith(
'2.4'):
90 self.assertTrue(parsed.port,
'port missing/invalid [%s]'%uri)
105 import urllib.parse
as urlparse
108 parsed = urlparse.urlparse(uri)
111 self.assertEqual(parsed.port, parsed2.port,
"expected ports do not match")
119 self.assertTrue(pid > 0)
127 self.assertTrue(type(uri) == str)
133 caller_id =
'/service_node'
134 caller_api =
'http://localhost:4567/'
135 service_base =
'/service'
138 for i
in range(0, 10):
139 service_name =
"%s-%s"%(service_base, i)
140 service_api =
'rosrpc://localhost:123%s/'%i
142 self.
apiSuccess(master.registerService(caller_id, service_name, service_api, caller_api))
144 val = self.
apiSuccess(master.lookupService(caller_id, service_name))
145 self.assertEqual(service_api, val)
147 self.assertEqual(caller_api, val)
150 for j
in range(0, i+1):
151 jservice_name =
"%s-%s"%(service_base, j)
152 jentry = [jservice_name, [caller_id]]
153 self.assertTrue(jentry
in srvs,
"master service list %s is missing %s"%(srvs, jentry))
165 caller_id =
'/service_node'
166 caller_api =
'http://localhost:4567/'
167 service_base =
'/service'
169 for i
in range(0, 10):
170 service_name =
"%s-%s"%(service_base, i)
171 service_api =
'rosrpc://localhost:123%s/'%i
174 code, msg, val = master.unregisterService(caller_id, service_name, service_api)
175 self.assertEqual(code, 1,
"code != 1, return message was [%s]"%msg)
178 self.
apiError(master.lookupService(self.
caller_id, service_name),
"master has a reference to unregistered service. message from master for unregister was [%s]"%msg)
182 self.assertEqual(caller_api, val,
"master prematurely invalidated node entry for [%s] (lookupNode)"%caller_id)
185 for j
in range(0, i+1):
186 jservice_name =
"%s-%s"%(service_base, j)
187 jentry = [jservice_name, [caller_id]]
188 self.assertTrue(jentry
not in srvs,
"master service list %s should not have %s"%(srvs, jentry))
189 for j
in range(i+1, 10):
190 jservice_name =
"%s-%s"%(service_base, j)
191 jentry = [jservice_name, [caller_id]]
192 self.assertTrue(jentry
in srvs,
"master service list %s is missing %s"%(srvs, jentry))
199 self.
apiError(master.lookupNode(self.
caller_id, caller_id),
"master has a stale reference to unregistered service node API")
201 srvs = [s
for s
in srvs
if not s[0].startswith(
'/rosout/')
and not s[0].endswith(
'/get_loggers')
and not s[0].endswith(
'/set_logger_level')]
202 self.assertEqual(0, len(srvs),
"all services should have been unregistered: %s"%srvs)
208 service_api =
'rosrpc://localhost:1234/'
209 caller_api =
'http://localhost:4567/'
212 self.
apiError(master.registerService())
217 self.
apiError(master.registerService(self.
caller_id,
'', service_api, caller_api))
225 service_api =
'rosrpc://localhost:1234/'
228 self.
apiError(master.unregisterService())
239 topic_type =
'test_rosmaster/String'
240 caller_api =
'http://localhost:4567/'
243 self.
apiError(master.registerPublisher())
248 self.
apiError(master.registerPublisher(self.
caller_id,
'', topic_type, caller_api))
256 caller_api =
'http://localhost:4567/'
259 self.
apiError(master.unregisterPublisher())
270 topic_type =
'test_rosmaster/String'
271 caller_api =
'http://localhost:4567/'
274 self.
apiError(master.registerSubscriber())
279 self.
apiError(master.registerSubscriber(self.
caller_id,
'', topic_type, caller_api))
287 caller_api =
'http://localhost:4567/'
290 self.
apiError(master.registerSubscriber())
301 caller_id =
'/pub_node'
302 caller_api =
'http://localhost:4567/'
303 topic_base =
'/pub_topic'
304 topic_type =
'test_rosmaster/String'
307 for i
in range(0, 10):
308 topic_name =
"%s-%s"%(topic_base, i)
310 self.
apiSuccess(master.registerPublisher(caller_id, topic_name, topic_type, caller_api))
314 self.assertEqual(caller_api, val)
317 self.assertTrue([topic_name, topic_type]
in val,
"master does not know topic type: %s"%val)
320 self.assertTrue([topic_name, topic_type]
in val,
"master does not know topic type: %s"%val)
323 for j
in range(0, i+1):
324 jtopic_name =
"%s-%s"%(topic_base, j)
325 jentry = [jtopic_name, [caller_id]]
326 self.assertTrue(jentry
in pubs,
"master pub/sub list %s is missing %s"%(pubs, jentry))
333 caller_id =
'/pub_node'
334 caller_api =
'http://localhost:4567/'
335 topic_name =
'/type_test_pub_topic'
338 val = self.
apiSuccess(master.registerPublisher(caller_id, topic_name,
'*', caller_api))
339 self.assertEqual([], val)
341 self.assertTrue([topic_name,
'*']
in val,
"master is not reporting * as type: %s"%val)
344 self.assertTrue([topic_name,
'*']
in val,
"master is not reporting * as type: %s"%val)
347 for t
in [
'test_rosmaster/String',
'*']:
348 val = self.
apiSuccess(master.registerPublisher(caller_id, topic_name, t, caller_api))
349 self.assertEqual([], val)
351 self.assertTrue([topic_name,
'test_rosmaster/String']
in val,
"master is not reporting test_rosmaster/String as type: %s"%val)
354 self.assertTrue([topic_name,
'test_rosmaster/String']
in val,
"master is not reporting test_rosmaster/String as type: %s"%val)
362 topic =
'/pub_topic-0'
363 type =
'test_rosmaster/String'
364 pub_caller_api =
'http://localhost:4567/'
367 for i
in range(5678, 5685):
368 api =
'http://localhost:%s'%i
370 self.
apiSuccess(master.registerSubscriber(
'/sub_node-%i'%i, topic, type, api))
371 val = self.
apiSuccess(master.registerPublisher(
'/pub_node', topic, type, pub_caller_api))
372 self.assertEqual(subs, val)
377 caller_id =
'/pub_node'
378 caller_api =
'http://localhost:4567/'
379 topic_base =
'/pub_topic'
381 for i
in range(0, 10):
382 topic_name =
"%s-%s"%(topic_base, i)
385 code, msg, val = master.unregisterPublisher(caller_id, topic_name, caller_api)
386 self.assertEqual(code, 1,
"code != 1, return message was [%s]"%msg)
391 self.assertEqual(caller_api, val,
"master prematurely invalidated node entry for [%s] (lookupNode)"%caller_id)
394 for j
in range(0, i+1):
395 jtopic_name =
"%s-%s"%(topic_base, j)
396 jentry = [jtopic_name, [caller_id]]
397 self.assertTrue(jentry
not in pubs,
"master pub/sub list %s should not have %s"%(pubs, jentry))
398 for j
in range(i+1, 10):
399 jtopic_name =
"%s-%s"%(topic_base, j)
400 jentry = [jtopic_name, [caller_id]]
401 self.assertTrue(jentry
in pubs,
"master pub/sub list %s is missing %s"%(pubs, jentry))
406 self.
apiError(master.lookupNode(self.
caller_id, caller_id),
"master has a stale reference to unregistered topic node API. pubs are %s"%pubs)
413 caller_id =
'/sub_node'
414 caller_api =
'http://localhost:4567/'
415 topic_base =
'/sub_topic'
416 topic_type =
'test_rosmaster/String'
419 for i
in range(0, 10):
420 topic_name =
"%s-%s"%(topic_base, i)
422 self.
apiSuccess(master.registerSubscriber(caller_id, topic_name, topic_type, caller_api))
426 self.assertEqual(caller_api, val)
430 self.assertTrue([topic_name, topic_type]
in val,
"master does not know topic type: %s"%val)
433 for j
in range(0, i+1):
434 jtopic_name =
"%s-%s"%(topic_base, j)
435 jentry = [jtopic_name, [caller_id]]
436 self.assertTrue(jentry
in subs,
"master pub/sub list %s is missing %s"%(subs, jentry))
445 caller_id =
'/sub_node'
446 caller_api =
'http://localhost:4567/'
447 topic_base =
'/sub_topic'
449 for i
in range(0, 10):
450 topic_name =
"%s-%s"%(topic_base, i)
453 code, msg, val = master.unregisterSubscriber(caller_id, topic_name, caller_api)
454 self.assertEqual(code, 1,
"code != 1, return message was [%s]"%msg)
459 self.assertEqual(caller_api, val,
"master prematurely invalidated node entry for [%s] (lookupNode)"%caller_id)
462 for j
in range(0, i+1):
463 jtopic_name =
"%s-%s"%(topic_base, j)
464 jentry = [jtopic_name, [caller_id]]
465 self.assertTrue(jentry
not in subs,
"master pub/sub list %s should not have %s"%(subs, jentry))
466 for j
in range(i+1, 10):
467 jtopic_name =
"%s-%s"%(topic_base, j)
468 jentry = [jtopic_name, [caller_id]]
469 self.assertTrue(jentry
in subs,
"master pub/sub list %s is missing %s"%(subs, jentry))
472 self.
apiError(master.lookupNode(self.
caller_id, caller_id),
"master has a stale reference to unregistered topic node API. subs are %s"%subs)