Do not assume order of lvm.tun_ofports set elements

This fixes the test_fdb_add_flows unit test that breaks with a randomized PYTHONHASHSEED
(see the bug report).

The test assumed that the lvm.tun_ofports set had
elements in a particular order. Found with PYTHONHASHSEED=2455351445 and
1595538922.

The fix sorts the actions output string so that it is always sorted when the
outputs are compared.

Partial-bug: #1348818

Note: There are several other unrelated unit tests that also break with a
randomized PYTHONHASHSEED, but they are not addressed here. They will be
addressed in separate patches.

Change-Id: I86b453a93f3ba09212709caf462cf3bfc5b21ee9
This commit is contained in:
Bradley Jones 2014-08-05 17:55:44 +01:00
parent baa572ab8d
commit ffd5650eb5

View File

@ -1049,6 +1049,20 @@ class TestOvsNeutronAgent(base.BaseTestCase):
{'2.2.2.2': {'2.2.2.2':
[[FAKE_MAC, FAKE_IP1], [[FAKE_MAC, FAKE_IP1],
n_const.FLOODING_ENTRY]}}} n_const.FLOODING_ENTRY]}}}
class ActionMatcher(object):
def __init__(self, action_str):
self.ordered = self.order_ports(action_str)
def order_ports(self, action_str):
halves = action_str.split('output:')
ports = sorted(halves.pop().split(','))
halves.append(','.join(ports))
return 'output:'.join(halves)
def __eq__(self, other):
return self.ordered == self.order_ports(other)
with contextlib.nested( with contextlib.nested(
mock.patch.object(self.agent.tun_br, 'deferred'), mock.patch.object(self.agent.tun_br, 'deferred'),
mock.patch.object(self.agent.tun_br, 'do_action_flows'), mock.patch.object(self.agent.tun_br, 'do_action_flows'),
@ -1076,8 +1090,8 @@ class TestOvsNeutronAgent(base.BaseTestCase):
'set_tunnel:seg1,output:2')]), 'set_tunnel:seg1,output:2')]),
mock.call('mod', [dict(table=constants.FLOOD_TO_TUN, mock.call('mod', [dict(table=constants.FLOOD_TO_TUN,
dl_vlan='vlan1', dl_vlan='vlan1',
actions='strip_vlan,' actions=ActionMatcher('strip_vlan,'
'set_tunnel:seg1,output:1,2')]), 'set_tunnel:seg1,output:1,2'))]),
] ]
do_action_flows_fn.assert_has_calls(expected_calls) do_action_flows_fn.assert_has_calls(expected_calls)