From b3f90503313949e23528495ca12a525be7c5ad9f Mon Sep 17 00:00:00 2001 From: Juraj Sloboda Date: Thu, 4 Oct 2018 15:15:16 +0200 Subject: [PATCH] vhost_user: Add test for interface states and events Change-Id: I2c330945bb0b07f649f574a055bfbea455e5d0b3 Signed-off-by: Juraj Sloboda --- test/test_vhost.py | 42 ++++++++++++++++++++++++++++++++++++++++++ test/vpp_interface.py | 27 ++++++++++++++++++++++++--- test/vpp_papi_provider.py | 5 +++++ 3 files changed, 71 insertions(+), 3 deletions(-) diff --git a/test/test_vhost.py b/test/test_vhost.py index 9ee92a91b2b..469fadaf2cd 100644 --- a/test/test_vhost.py +++ b/test/test_vhost.py @@ -12,6 +12,13 @@ class TesVhostInterface(VppTestCase): """ + def tearDown(self): + super(TesVhostInterface, self).tearDown() + if not self.vpp_dead: + if_dump = self.vapi.sw_interface_vhost_user_dump() + for ifc in if_dump: + self.vapi.delete_vhost_user_if(ifc.sw_if_index) + def test_vhost(self): """ Vhost User add/delete interface test """ self.logger.info("Vhost User add interfaces") @@ -70,5 +77,40 @@ class TesVhostInterface(VppTestCase): if_dump = self.vapi.sw_interface_vhost_user_dump() self.assertFalse(vhost_if1.is_interface_config_in_dump(if_dump)) + def test_vhost_interface_state(self): + """ Vhost User interface states and events test """ + + self.vapi.want_interface_events() + + # clear outstanding events + # (like delete interface events from other tests) + self.vapi.collect_events() + + vhost_if = VppVhostInterface(self, sock_filename='/tmp/sock1') + + # create vhost interface + vhost_if.add_vpp_config() + self.sleep(0.1) + events = self.vapi.collect_events() + # creating interface doesn't currently create events + self.assert_equal(len(events), 0, "number of events") + + vhost_if.admin_up() + vhost_if.assert_interface_state(1, 0, expect_event=True) + + vhost_if.admin_down() + vhost_if.assert_interface_state(0, 0, expect_event=True) + + # delete vhost interface + vhost_if.remove_vpp_config() + event = self.vapi.wait_for_event(timeout=1) + self.assert_equal(event.sw_if_index, vhost_if.sw_if_index, + "sw_if_index") + self.assert_equal(event.deleted, 1, "deleted flag") + + # verify there are no more events + events = self.vapi.collect_events() + self.assert_equal(len(events), 0, "number of events") + if __name__ == '__main__': unittest.main(testRunner=VppTestRunner) diff --git a/test/vpp_interface.py b/test/vpp_interface.py index 65f3c4400da..c7918fcfbd2 100644 --- a/test/vpp_interface.py +++ b/test/vpp_interface.py @@ -426,10 +426,31 @@ class VppInterface(object): dump = self.test.vapi.sw_interface_dump() return self.is_interface_config_in_dump(dump) - def is_interface_config_in_dump(self, dump): + def get_interface_config_from_dump(self, dump): for i in dump: if i.interface_name.rstrip(' \t\r\n\0') == self.name and \ i.sw_if_index == self.sw_if_index: - return True + return i else: - return False + return None + + def is_interface_config_in_dump(self, dump): + return self.get_interface_config_from_dump(dump) is not None + + def assert_interface_state(self, admin_up_down, link_up_down, + expect_event=False): + if expect_event: + event = self.test.vapi.wait_for_event(timeout=1, + name='sw_interface_event') + self.test.assert_equal(event.sw_if_index, self.sw_if_index, + "sw_if_index") + self.test.assert_equal(event.admin_up_down, admin_up_down, + "admin state") + self.test.assert_equal(event.link_up_down, link_up_down, + "link state") + dump = self.test.vapi.sw_interface_dump() + if_state = self.get_interface_config_from_dump(dump) + self.test.assert_equal(if_state.admin_up_down, admin_up_down, + "admin state") + self.test.assert_equal(if_state.link_up_down, link_up_down, + "link state") diff --git a/test/vpp_papi_provider.py b/test/vpp_papi_provider.py index 57592e854ae..1f922a07b2b 100644 --- a/test/vpp_papi_provider.py +++ b/test/vpp_papi_provider.py @@ -514,6 +514,11 @@ class VppPapiProvider(object): 'enable': enable, 'install_default_routes': install_default_routes}) + def want_interface_events(self, enable_disable=1): + return self.api(self.papi.want_interface_events, + {'enable_disable': enable_disable, + 'pid': os.getpid(), }) + def want_macs_learn_events(self, enable_disable=1, scan_delay=0, max_macs_in_event=0, learn_limit=0): return self.api(self.papi.want_l2_macs_events, -- 2.16.6