def test_search_param(self): from rosmaster.paramserver import ParamDictionary param_server = ParamDictionary(None) caller_id = '/node' # vals are mostly identical, save some randomness. we want # identical structure in order to stress lookup rules val1 = { 'level1_p1': random.randint(0, 10000), 'level1_p2' : { 'level2_p2': random.randint(0, 10000) }} val2 = { 'level1_p1': random.randint(0, 10000), 'level1_p2' : { 'level2_p2': random.randint(0, 10000) }} val3 = { 'level1_p1': random.randint(0, 10000), 'level1_p2' : { 'level2_p2': random.randint(0, 10000) }} val4 = { 'level1_p1': random.randint(0, 10000), 'level1_p2' : { 'level2_p2': random.randint(0, 10000) }} full_dict = {} # test invalid input for k in ['', None, '~param']: try: param_server.search_param('/level1/level2', k) self.fail("param_server search should have failed on [%s]"%k) except ValueError: pass for ns in ['', None, 'relative', '~param']: try: param_server.search_param(ns, 'param') self.fail("param_server search should have failed on %s"%k) except ValueError: pass # set the val parameter at four levels so we can validate search # - set val1 self.failIf(param_server.has_param('/level1/param')) self.failIf(param_server.search_param('/level1/node', 'param')) param_server.set_param('/level1/param', val1) # - test param on val1 for ns in ['/level1/node', '/level1/level2/node', '/level1/level2/level3/node']: self.assertEquals('/level1/param', param_server.search_param(ns, 'param'), "failed with ns[%s]"%ns) self.assertEquals('/level1/param/', param_server.search_param(ns, 'param/')) self.assertEquals('/level1/param/level1_p1', param_server.search_param(ns, 'param/level1_p1')) self.assertEquals('/level1/param/level1_p2/level2_p2', param_server.search_param(ns, 'param/level1_p2/level2_p2')) self.assertEquals(None, param_server.search_param('/root', 'param')) self.assertEquals(None, param_server.search_param('/root', 'param/')) # - set val2 self.failIf(param_server.has_param('/level1/level2/param')) param_server.set_param('/level1/level2/param', val2) # - test param on val2 for ns in ['/level1/level2/node', '/level1/level2/level3/node', '/level1/level2/level3/level4/node']: self.assertEquals('/level1/level2/param', param_server.search_param(ns, 'param')) self.assertEquals('/level1/level2/param/', param_server.search_param(ns, 'param/')) self.assertEquals('/level1/param', param_server.search_param('/level1/node', 'param')) self.assertEquals('/level1/param/', param_server.search_param('/level1/node', 'param/')) self.assertEquals(None, param_server.search_param('/root', 'param')) # - set val3 self.failIf(param_server.has_param('/level1/level2/level3/param')) param_server.set_param('/level1/level2/level3/param', val3) # - test param on val3 for ns in ['/level1/level2/level3/node', '/level1/level2/level3/level4/node']: self.assertEquals('/level1/level2/level3/param', param_server.search_param(ns, 'param')) self.assertEquals('/level1/level2/param', param_server.search_param('/level1/level2/node', 'param')) self.assertEquals('/level1/param', param_server.search_param('/level1/node', 'param')) # test subparams before we set val4 on the root # - test looking for param/sub_param self.assertEquals(None, param_server.search_param('/root', 'param')) self.assertEquals(None, param_server.search_param('/root', 'param/level1_p1')) self.assertEquals(None, param_server.search_param('/not/level1/level2/level3/level4/node', 'param/level1_p1')) tests = [ ('/level1/node', '/level1/param/'), ('/level1/level2/', '/level1/level2/param/'), ('/level1/level2', '/level1/level2/param/'), ('/level1/level2/node', '/level1/level2/param/'), ('/level1/level2/notlevel3', '/level1/level2/param/'), ('/level1/level2/notlevel3/node', '/level1/level2/param/'), ('/level1/level2/level3/level4', '/level1/level2/level3/param/'), ('/level1/level2/level3/level4/', '/level1/level2/level3/param/'), ('/level1/level2/level3/level4/node', '/level1/level2/level3/param/'), ] for ns, pbase in tests: self.assertEquals(pbase+'level1_p1', param_server.search_param(ns, 'param/level1_p1')) retval = param_server.search_param(ns, 'param/level1_p2/level2_p2') self.assertEquals(pbase+'level1_p2/level2_p2', retval, "failed with ns[%s] pbase[%s]: %s"%(ns, pbase, retval)) # - set val4 on the root self.failIf(param_server.has_param('/param')) param_server.set_param('/param', val4) self.assertEquals('/param', param_server.search_param('/root', 'param')) self.assertEquals('/param', param_server.search_param('/notlevel1/node', 'param')) self.assertEquals('/level1/param', param_server.search_param('/level1/node', 'param')) self.assertEquals('/level1/param', param_server.search_param('/level1', 'param')) self.assertEquals('/level1/param', param_server.search_param('/level1/', 'param')) # make sure that partial match works val5 = { 'level1_p1': random.randint(0, 10000), 'level1_p2' : { }} self.failIf(param_server.has_param('/partial1/param')) param_server.set_param('/partial1/param', val5) self.assertEquals('/partial1/param', param_server.search_param('/partial1', 'param')) self.assertEquals('/partial1/param/level1_p1', param_server.search_param('/partial1', 'param/level1_p1')) # - this is the important check, should return key even if it doesn't exist yet based on stem match self.assertEquals('/partial1/param/non_existent', param_server.search_param('/partial1', 'param/non_existent')) self.assertEquals('/partial1/param/level1_p2/non_existent', param_server.search_param('/partial1', 'param/level1_p2/non_existent'))