def test_compute_param_updates(self): from rosmaster.registrations import Registrations from rosmaster.paramserver import compute_param_updates # spec requires that subscriptions always have a trailing slash tests = [ # [correct val], (subscribers, param_key, param_value) ([],({}, '/foo', 1)), ([],({'/bar': 'barapi'}, '/foo/', 1)), ([],({'/bar/': 'barapi'}, '/foo/', 1)), # make sure that it's robust to aliases ([('fooapi', '/foo/', 1)], ({'/foo/': 'fooapi'}, '/foo', 1)), ([('fooapi', '/foo/', 1)], ({'/foo/': 'fooapi'}, '/foo/', 1)), # check namespace subscription ([('fooapi', '/foo/val/', 1)], ({'/foo/': 'fooapi'}, '/foo/val', 1)), # check against dictionary param values ([],({'/bar/': 'barapi'}, '/foo/', {'bar': 2})), ([('fooapi', '/foo/val/', 1)], ({'/foo/val/': 'fooapi'}, '/foo', {'val' : 1})), ([('fooapi', '/foo/bar/val/', 1)], ({'/foo/bar/val/': 'fooapi'}, '/foo', {'bar' : {'val' : 1}})), ([('fooapi', '/foo/bar/', {'val': 1})], ({'/foo/bar/': 'fooapi'}, '/foo', {'bar' : {'val' : 1}})), ([('fooapi', '/foo/', {'bar':{'val': 1}})], ({'/foo/': 'fooapi'}, '/foo', {'bar' : {'val' : 1}})), ([('fooapi', '/foo/', {'bar': 1, 'baz': 2}), ('foobazapi', '/foo/baz/', 2)], ({'/foo/': 'fooapi', '/foo/baz/': 'foobazapi'}, '/foo', {'bar' : 1, 'baz': 2})), ([('foobarapi', '/foo/bar/', 1), ('foobazapi', '/foo/baz/', 2)], ({'/foo/bar/': 'foobarapi', '/foo/baz/': 'foobazapi'}, '/foo', {'bar' : 1, 'baz': 2})), # deletion of higher level tree ([('delapi', '/del/bar/', {})], ({'/del/bar/': 'delapi'}, '/del', {})), ] for correct, args in tests: reg = Registrations(Registrations.PARAM_SUBSCRIPTIONS) reg.map = args[0] param_key = args[1] param_val = args[2] val = compute_param_updates(reg, param_key, param_val) self.assertEquals(len(correct), len(val), "Failed: \n%s \nreturned \n%s\nvs correct\n%s"%(str(args), str(val), str(correct))) for c in correct: self.assert_(c in val, "Failed: \n%s \ndid not include \n%s. \nIt returned \n%s"%(str(args), c, val))