diff mbox series

[ovs-dev,7/7] system-event: add event testsuite

Message ID 2565e390c582380dd66cf24d68ced20f3dc05f7d.1591091223.git.gmuthukr@redhat.com
State New
Headers show
Series user defined events and notification | expand

Commit Message

Gowrishankar Muthukrishnan June 2, 2020, 10:09 a.m. UTC
Add iperf3 performance testsuite for checking events.

Signed-off-by: Gowrishankar Muthukrishnan <gmuthukr@redhat.com>
---
This is not complete test suite as I would like to get first set of 
feedbacks on implementation and write unit tests accordingly. This
test is to check if event API works expectedly while running some
traffic profile.

Run ovs-testeventd before test (though not mandatory if "notify:"
is removed in json file as test generates).

$ sudo sh -c "while true;do ./utilities/ovs-testeventd /tmp/event.sock;done"
$ sudo -E PATH=$DPDK_BUILD/app:$PATH make check-event
$ for i in `seq 1 4`;do echo test $i; pushd tests/system-event-testsuite.dir/$i > /dev/null; grep 'sender' -A1 -B1 system-event-testsuite.log; cat event_list;popd > /dev/null; done

Sample results from my VM (not server :) ):

test 1
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   296 MBytes   249 Mbits/sec  837             sender
[  4]   0.00-10.00  sec   294 MBytes   246 Mbits/sec                  receiver
List of events:
netdev_send:
  resource       : timer
  no_of_samples  : 50
  max duration   : 349 (us)
  min duration   : 3 (us)
  95% of times   : 169.623093 (us)
  hit count      : 10

rte_vhost_enqueue_burst:
  resource       : timer
  no_of_samples  : 50
  max duration   : 43 (us)
  min duration   : 1 (us)
  95% of times   : 3.891219 (us)
  hit count      : 10

List of events not yet added:
test 2
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.01  sec   267 MBytes   224 Mbits/sec   31             sender
[  4]   0.00-10.01  sec   266 MBytes   223 Mbits/sec                  receiver
List of events:
netdev_send:
  resource       : timer
  no_of_samples  : 50
  max duration   : 283 (us)
  min duration   : 2 (us)
  95% of times   : 150.735806 (us)
  hit count      : 10

rte_vhost_enqueue_burst:
  resource       : timer
  no_of_samples  : 50
  max duration   : 7 (us)
  min duration   : 1 (us)
  95% of times   : 3.955793 (us)
  hit count      : 10

List of events not yet added:
test 3
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   326 MBytes   273 Mbits/sec  599             sender
[  4]   0.00-10.00  sec   323 MBytes   270 Mbits/sec                  receiver
List of events:
netdev_send:
  resource       : timer
  no_of_samples  : 50
  max duration   : 278 (us)
  min duration   : 6 (us)
  95% of times   : 179.230316 (us)
  hit count      : 10

rte_vhost_enqueue_burst:
  resource       : timer
  no_of_samples  : 50
  max duration   : 39 (us)
  min duration   : 1 (us)
  95% of times   : 4.549241 (us)
  hit count      : 10

List of events not yet added:
test 4
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.01  sec   257 MBytes   216 Mbits/sec   75             sender
[  4]   0.00-10.01  sec   256 MBytes   214 Mbits/sec                  receiver
List of events:
netdev_send:
  resource       : timer
  no_of_samples  : 50
  max duration   : 428 (us)
  min duration   : 4 (us)
  95% of times   : 129.270144 (us)
  hit count      : 11

rte_vhost_enqueue_burst:
  resource       : timer
  no_of_samples  : 50
  max duration   : 12 (us)
  min duration   : 1 (us)
  95% of times   : 3.113697 (us)
  hit count      : 11

List of events not yet added:

---
 tests/automake.mk     |  18 +++
 tests/system-event.at | 351 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 369 insertions(+)
 create mode 100644 tests/system-event.at
diff mbox series

Patch

diff --git a/tests/automake.mk b/tests/automake.mk
index cbba5b1..ea8f318 100644
--- a/tests/automake.mk
+++ b/tests/automake.mk
@@ -8,6 +8,7 @@  EXTRA_DIST += \
 	$(SYSTEM_AFXDP_TESTSUITE_AT) \
 	$(SYSTEM_OFFLOADS_TESTSUITE_AT) \
 	$(SYSTEM_DPDK_TESTSUITE_AT) \
+	$(SYSTEM_EVENT_TESTSUITE_AT) \
 	$(OVSDB_CLUSTER_TESTSUITE_AT) \
 	$(TESTSUITE) \
 	$(SYSTEM_KMOD_TESTSUITE) \
@@ -16,6 +17,7 @@  EXTRA_DIST += \
 	$(SYSTEM_AFXDP_TESTSUITE) \
 	$(SYSTEM_OFFLOADS_TESTSUITE) \
 	$(SYSTEM_DPDK_TESTSUITE) \
+	$(SYSTEM_EVENT_TESTSUITE) \
 	$(OVSDB_CLUSTER_TESTSUITE) \
 	tests/atlocal.in \
 	$(srcdir)/package.m4 \
@@ -184,6 +186,12 @@  SYSTEM_DPDK_TESTSUITE_AT = \
 	tests/system-dpdk-testsuite.at \
 	tests/system-dpdk.at
 
+SYSTEM_EVENT_TESTSUITE_AT = \
+	tests/system-common-macros.at \
+	tests/system-dpdk-macros.at \
+	tests/system-dpdk-testsuite.at \
+	tests/system-event.at
+
 check_SCRIPTS += tests/atlocal
 
 TESTSUITE = $(srcdir)/tests/testsuite
@@ -194,6 +202,7 @@  SYSTEM_TSO_TESTSUITE = $(srcdir)/tests/system-tso-testsuite
 SYSTEM_AFXDP_TESTSUITE = $(srcdir)/tests/system-afxdp-testsuite
 SYSTEM_OFFLOADS_TESTSUITE = $(srcdir)/tests/system-offloads-testsuite
 SYSTEM_DPDK_TESTSUITE = $(srcdir)/tests/system-dpdk-testsuite
+SYSTEM_EVENT_TESTSUITE = $(srcdir)/tests/system-event-testsuite
 OVSDB_CLUSTER_TESTSUITE = $(srcdir)/tests/ovsdb-cluster-testsuite
 DISTCLEANFILES += tests/atconfig tests/atlocal
 
@@ -356,6 +365,10 @@  check-dpdk: all
 	set $(SHELL) '$(SYSTEM_DPDK_TESTSUITE)' -C tests  AUTOTEST_PATH='$(AUTOTEST_PATH)'; \
 	"$$@" $(TESTSUITEFLAGS) -j1 || (test X'$(RECHECK)' = Xyes && "$$@" --recheck)
 
+check-event: all
+	set $(SHELL) '$(SYSTEM_EVENT_TESTSUITE)' -C tests  AUTOTEST_PATH='$(AUTOTEST_PATH)'; \
+	"$$@" $(TESTSUITEFLAGS) -j1 || (test X'$(RECHECK)' = Xyes && "$$@" --recheck)
+
 clean-local:
 	test ! -f '$(TESTSUITE)' || $(SHELL) '$(TESTSUITE)' -C tests --clean
 
@@ -401,6 +414,11 @@  $(SYSTEM_DPDK_TESTSUITE): package.m4 $(SYSTEM_TESTSUITE_AT) $(SYSTEM_DPDK_TESTSU
 	$(AM_V_GEN)$(AUTOTEST) -I '$(srcdir)' -o $@.tmp $@.at
 	$(AM_V_at)mv $@.tmp $@
 
+$(SYSTEM_EVENT_TESTSUITE): package.m4 $(SYSTEM_TESTSUITE_AT) $(SYSTEM_EVENT_TESTSUITE_AT) $(COMMON_MACROS_AT)
+	$(AM_V_GEN)$(AUTOTEST) -I '$(srcdir)' -o $@.tmp $@.at
+	$(AM_V_at)mv $@.tmp $@
+
+$(OVSDB_CLUSTER_TESTSUITE): package.m4 $(OVSDB_CLUSTER_TESTSUITE_AT) $(COMMON_MACROS_AT)
 $(OVSDB_CLUSTER_TESTSUITE): package.m4 $(OVSDB_CLUSTER_TESTSUITE_AT) $(COMMON_MACROS_AT)
 	$(AM_V_GEN)$(AUTOTEST) -I '$(srcdir)' -o $@.tmp $@.at
 	$(AM_V_at)mv $@.tmp $@
diff --git a/tests/system-event.at b/tests/system-event.at
new file mode 100644
index 0000000..bc9ba1d
--- /dev/null
+++ b/tests/system-event.at
@@ -0,0 +1,351 @@ 
+m4_define([CONFIGURE_VETH_OFFLOADS],
+   [AT_CHECK([ethtool -K $1 tx off], [0], [ignore], [ignore])])
+
+m4_define([SET_NUMA_NODE],
+   [
+    AT_CHECK([lscpu | awk '/NUMA node\(s\)/ {c=1; while (c++<$(3)) {printf "$1,"}; print "$1"}' > NUMA_NODE])
+])
+
+m4_define([CREATE_EVENT_JSON],
+   [
+    AT_CHECK[cat > $abs_top_srcdir/tests/event.json <<EOF
+[
+  {
+    "name": "rte_vhost_enqueue_burst",
+    "type": "message",
+    "definition": {
+      "resource": "timer",
+      "samples": 50,
+      "unit": "us"
+    },
+    "notify": "/tmp/event.sock"
+  },
+  {
+    "name": "netdev_send",
+    "type": "message",
+    "definition": {
+      "resource": "timer",
+      "samples": 50,
+      "unit": "us"
+    },
+    "notify": "/tmp/event.sock"
+  }
+]
+EOF]
+])
+
+AT_BANNER([OVS-DPDK perf tests])
+
+dnl --------------------------------------------------------------------------
+dnl iperf on vhostuserclient (with userspace-tso)
+AT_SETUP([OVS-DPDK - iperf on vhostuserclient (with userspace-tso)])
+AT_KEYWORDS([dpdk])
+OVS_DPDK_PRE_CHECK()
+AT_SKIP_IF([! which testpmd >/dev/null 2>/dev/null])
+OVS_DB_START()
+AT_CHECK([ovs-vsctl --no-wait set Open_vSwitch . other_config:userspace-tso-enable=true])
+AT_CHECK([ovs-vsctl --no-wait set Open_vSwitch . other_config:user_defined_event_enable=true])
+OVS_DPDK_START()
+AT_CHECK([grep -c 'Userspace TCP Segmentation Offloading support enabled' \
+          ovs-vswitchd.log],[ignore],[dnl
+1
+])
+
+dnl Find number of sockets
+SET_NUMA_NODE([512])
+
+dnl Add userspace bridge and attach it to OVS
+AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev])
+AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuserclient0 -- set Interface \
+          dpdkvhostuserclient0 \
+          type=dpdkvhostuserclient \
+          options:vhost-server-path=$OVS_RUNDIR/dpdkvhostclient0], [],
+         [stdout], [stderr])
+AT_CHECK([ovs-vsctl show], [], [stdout])
+
+dnl Set up namespaces
+ADD_NAMESPACES(ns1, ns2)
+
+dnl Add veth device
+ADD_VETH(tap1, ns2, br10, "172.31.110.12/24")
+
+dnl Execute testpmd in background
+on_exit "pkill -f -x -9 'tail -f /dev/null'"
+AT_CHECK([echo "show device info all" > CMDFILE])
+AT_CHECK([echo "show port 0 tx_offload capabilities" >> CMDFILE])
+tail -f /dev/null | testpmd --socket-mem="$(cat NUMA_NODE)" --no-pci\
+           --vdev="net_virtio_user,path=$OVS_RUNDIR/dpdkvhostclient0,server=1" \
+           --vdev="net_tap0,iface=tap0" --file-prefix page0 \
+           --single-file-segments -- --cmdline-file=CMDFILE \
+           -a >$OVS_RUNDIR/testpmd-dpdkvhostuserclient0.log 2>&1 &
+
+dnl Give settling time to the testpmd processes - NOTE: this is bad form.
+sleep 10
+
+dnl Move the tap devices to the namespaces
+AT_CHECK([ps aux | grep testpmd], [], [stdout], [stderr])
+AT_CHECK([ip link show], [], [stdout], [stderr])
+AT_CHECK([ip link set tap0 netns ns1], [], [stdout], [stderr])
+
+AT_CHECK([ip netns exec ns1 ip link show], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ip link show | grep tap0], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ip link set tap0 up], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ip addr add 172.31.110.11/24 dev tap0], [],
+         [stdout], [stderr])
+
+AT_CHECK([ip netns exec ns1 ip link show], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns2 ip link show], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ping -c 4 -I tap0 172.31.110.12], [], [stdout],
+         [stderr])
+
+CREATE_EVENT_JSON()
+AT_CHECK([ovs-appctl event/define $abs_top_srcdir/tests/event.json],[],[ignore])
+AT_CHECK([ip netns exec ns2 iperf3 -s -1 -D])
+AT_CHECK([ip netns exec ns1 iperf3 -c 172.31.110.12],[],[stdout])
+AT_CHECK([ovs-appctl event/list --all-timer > event_list])
+
+dnl Clean up
+AT_CHECK([ovs-vsctl del-port br10 dpdkvhostuserclient0], [], [stdout], [stderr])
+
+dnl Clean up the testpmd now
+pkill -f -x -9 'tail -f /dev/null'
+
+AT_FAIL_IF([true])
+OVS_VSWITCHD_STOP()
+AT_CLEANUP
+dnl --------------------------------------------------------------------------
+
+dnl --------------------------------------------------------------------------
+dnl iperf on vhostuser (with userspace-tso)
+AT_SETUP([OVS-DPDK - iperf on vhostuser (with userspace-tso)])
+AT_KEYWORDS([dpdk])
+OVS_DPDK_PRE_CHECK()
+AT_SKIP_IF([! which testpmd >/dev/null 2>/dev/null])
+OVS_DB_START()
+AT_CHECK([ovs-vsctl --no-wait set Open_vSwitch . other_config:userspace-tso-enable=true])
+AT_CHECK([ovs-vsctl --no-wait set Open_vSwitch . other_config:user_defined_event_enable=true])
+OVS_DPDK_START()
+AT_CHECK([grep -c 'Userspace TCP Segmentation Offloading support enabled' \
+          ovs-vswitchd.log],[ignore],[dnl
+1
+])
+
+dnl Find number of sockets
+SET_NUMA_NODE([512])
+
+dnl Add userspace bridge and attach it to OVS
+AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev])
+AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuser0 -- set Interface dpdkvhostuser0 \
+          type=dpdkvhostuser], [],
+         [stdout], [stderr])
+AT_CHECK([ovs-vsctl show], [], [stdout])
+
+dnl Set up namespaces
+ADD_NAMESPACES(ns1, ns2)
+
+dnl Add veth device
+ADD_VETH(tap1, ns2, br10, "172.31.110.12/24")
+
+dnl Execute testpmd in background
+on_exit "pkill -f -x -9 'tail -f /dev/null'"
+AT_CHECK([echo "show device info all" > CMDFILE])
+AT_CHECK([echo "show port 0 tx_offload capabilities" >> CMDFILE])
+tail -f /dev/null | testpmd --socket-mem="$(cat NUMA_NODE)" --no-pci\
+           --vdev="net_virtio_user,path=$OVS_RUNDIR/dpdkvhostuser0" \
+           --vdev="net_tap0,iface=tap0" --file-prefix page0 \
+           --single-file-segments -- --cmdline-file=CMDFILE \
+           -a >$OVS_RUNDIR/testpmd-dpdkvhostuser0.log 2>&1 &
+
+dnl Give settling time to the testpmd processes - NOTE: this is bad form.
+sleep 10
+
+dnl Move the tap devices to the namespaces
+AT_CHECK([ps aux | grep testpmd], [], [stdout], [stderr])
+AT_CHECK([ip link show], [], [stdout], [stderr])
+AT_CHECK([ip link set tap0 netns ns1], [], [stdout], [stderr])
+
+AT_CHECK([ip netns exec ns1 ip link show], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ip link show | grep tap0], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ip link set tap0 up], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ip addr add 172.31.110.11/24 dev tap0], [],
+         [stdout], [stderr])
+
+AT_CHECK([ip netns exec ns1 ip link show], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns2 ip link show], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ping -c 4 -I tap0 172.31.110.12], [], [stdout],
+         [stderr])
+
+CREATE_EVENT_JSON()
+AT_CHECK([ovs-appctl event/define $abs_top_srcdir/tests/event.json],[],[ignore])
+AT_CHECK([ip netns exec ns2 iperf3 -s -1 -D])
+AT_CHECK([ip netns exec ns1 iperf3 -c 172.31.110.12],[],[stdout])
+AT_CHECK([ovs-appctl event/list --all-timer > event_list])
+
+dnl Clean up the testpmd now
+pkill -f -x -9 'tail -f /dev/null'
+
+dnl Clean up
+AT_CHECK([ovs-vsctl del-port br10 dpdkvhostuser0], [], [stdout], [stderr])
+
+AT_FAIL_IF([true])
+OVS_VSWITCHD_STOP()
+AT_CLEANUP
+dnl --------------------------------------------------------------------------
+
+dnl --------------------------------------------------------------------------
+dnl iperf on vhostuserclient (without userspace-tso)
+AT_SETUP([OVS-DPDK - iperf on vhostuserclient (without userspace-tso)])
+AT_KEYWORDS([dpdk])
+OVS_DPDK_PRE_CHECK()
+AT_SKIP_IF([! which testpmd >/dev/null 2>/dev/null])
+OVS_DB_START()
+AT_CHECK([ovs-vsctl --no-wait set Open_vSwitch . other_config:userspace-tso-enable=false])
+AT_CHECK([ovs-vsctl --no-wait set Open_vSwitch . other_config:user_defined_event_enable=true])
+OVS_DPDK_START()
+AT_CHECK([grep -c 'Userspace TCP Segmentation Offloading support enabled' \
+          ovs-vswitchd.log],[ignore],[dnl
+0
+])
+
+dnl Find number of sockets
+SET_NUMA_NODE([512])
+
+dnl Add userspace bridge and attach it to OVS
+AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev])
+AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuserclient0 -- set Interface \
+          dpdkvhostuserclient0 \
+          type=dpdkvhostuserclient \
+          options:vhost-server-path=$OVS_RUNDIR/dpdkvhostclient0], [],
+         [stdout], [stderr])
+AT_CHECK([ovs-vsctl show], [], [stdout])
+
+dnl Set up namespaces
+ADD_NAMESPACES(ns1, ns2)
+
+dnl Add veth device
+ADD_VETH(tap1, ns2, br10, "172.31.110.12/24")
+
+dnl Execute testpmd in background
+on_exit "pkill -f -x -9 'tail -f /dev/null'"
+AT_CHECK([echo "show device info all" > CMDFILE])
+AT_CHECK([echo "show port 0 tx_offload capabilities" >> CMDFILE])
+tail -f /dev/null | testpmd --socket-mem="$(cat NUMA_NODE)" --no-pci\
+           --vdev="net_virtio_user,path=$OVS_RUNDIR/dpdkvhostclient0,server=1" \
+           --vdev="net_tap0,iface=tap0" --file-prefix page0 \
+           --single-file-segments -- --cmdline-file=CMDFILE \
+           -a >$OVS_RUNDIR/testpmd-dpdkvhostuserclient0.log 2>&1 &
+
+dnl Give settling time to the testpmd processes - NOTE: this is bad form.
+sleep 10
+
+dnl Move the tap devices to the namespaces
+AT_CHECK([ps aux | grep testpmd], [], [stdout], [stderr])
+AT_CHECK([ip link show], [], [stdout], [stderr])
+AT_CHECK([ip link set tap0 netns ns1], [], [stdout], [stderr])
+
+AT_CHECK([ip netns exec ns1 ip link show], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ip link show | grep tap0], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ip link set tap0 up], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ip addr add 172.31.110.11/24 dev tap0], [],
+         [stdout], [stderr])
+
+AT_CHECK([ip netns exec ns1 ip link show], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns2 ip link show], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ping -c 4 -I tap0 172.31.110.12], [], [stdout],
+         [stderr])
+
+CREATE_EVENT_JSON()
+AT_CHECK([ovs-appctl event/define $abs_top_srcdir/tests/event.json],[],[ignore])
+AT_CHECK([ip netns exec ns2 iperf3 -s -1 -D])
+AT_CHECK([ip netns exec ns1 iperf3 -c 172.31.110.12],[],[stdout])
+AT_CHECK([ovs-appctl event/list --all-timer > event_list])
+
+dnl Clean up
+AT_CHECK([ovs-vsctl del-port br10 dpdkvhostuserclient0], [], [stdout], [stderr])
+
+dnl Clean up the testpmd now
+pkill -f -x -9 'tail -f /dev/null'
+
+AT_FAIL_IF([true])
+OVS_VSWITCHD_STOP()
+AT_CLEANUP
+dnl --------------------------------------------------------------------------
+
+dnl --------------------------------------------------------------------------
+dnl iperf on vhostuser (without userspace-tso)
+AT_SETUP([OVS-DPDK - iperf on vhostuser (without userspace-tso)])
+AT_KEYWORDS([dpdk])
+OVS_DPDK_PRE_CHECK()
+AT_SKIP_IF([! which testpmd >/dev/null 2>/dev/null])
+OVS_DB_START()
+AT_CHECK([ovs-vsctl --no-wait set Open_vSwitch . other_config:userspace-tso-enable=false])
+AT_CHECK([ovs-vsctl --no-wait set Open_vSwitch . other_config:user_defined_event_enable=true])
+OVS_DPDK_START()
+AT_CHECK([grep -c 'Userspace TCP Segmentation Offloading support enabled' \
+          ovs-vswitchd.log],[ignore],[dnl
+0
+])
+
+dnl Find number of sockets
+SET_NUMA_NODE([512])
+
+dnl Add userspace bridge and attach it to OVS
+AT_CHECK([ovs-vsctl add-br br10 -- set bridge br10 datapath_type=netdev])
+AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuser0 -- set Interface dpdkvhostuser0 \
+          type=dpdkvhostuser], [],
+         [stdout], [stderr])
+AT_CHECK([ovs-vsctl show], [], [stdout])
+
+dnl Set up namespaces
+ADD_NAMESPACES(ns1, ns2)
+
+dnl Add veth device
+ADD_VETH(tap1, ns2, br10, "172.31.110.12/24")
+
+dnl Execute testpmd in background
+on_exit "pkill -f -x -9 'tail -f /dev/null'"
+AT_CHECK([echo "show device info all" > CMDFILE])
+AT_CHECK([echo "show port 0 tx_offload capabilities" >> CMDFILE])
+tail -f /dev/null | testpmd --socket-mem="$(cat NUMA_NODE)" --no-pci\
+           --vdev="net_virtio_user,path=$OVS_RUNDIR/dpdkvhostuser0" \
+           --vdev="net_tap0,iface=tap0" --file-prefix page0 \
+           --single-file-segments -- --cmdline-file=CMDFILE \
+           -a >$OVS_RUNDIR/testpmd-dpdkvhostuser0.log 2>&1 &
+
+dnl Give settling time to the testpmd processes - NOTE: this is bad form.
+sleep 10
+
+dnl Move the tap devices to the namespaces
+AT_CHECK([ps aux | grep testpmd], [], [stdout], [stderr])
+AT_CHECK([ip link show], [], [stdout], [stderr])
+AT_CHECK([ip link set tap0 netns ns1], [], [stdout], [stderr])
+
+AT_CHECK([ip netns exec ns1 ip link show], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ip link show | grep tap0], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ip link set tap0 up], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ip addr add 172.31.110.11/24 dev tap0], [],
+         [stdout], [stderr])
+
+AT_CHECK([ip netns exec ns1 ip link show], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns2 ip link show], [], [stdout], [stderr])
+AT_CHECK([ip netns exec ns1 ping -c 4 -I tap0 172.31.110.12], [], [stdout],
+         [stderr])
+
+CREATE_EVENT_JSON()
+AT_CHECK([ovs-appctl event/define $abs_top_srcdir/tests/event.json],[],[ignore])
+AT_CHECK([ip netns exec ns2 iperf3 -s -1 -D])
+AT_CHECK([ip netns exec ns1 iperf3 -c 172.31.110.12],[],[stdout])
+AT_CHECK([ovs-appctl event/list --all-timer > event_list])
+
+dnl Clean up the testpmd now
+pkill -f -x -9 'tail -f /dev/null'
+
+dnl Clean up
+AT_CHECK([ovs-vsctl del-port br10 dpdkvhostuser0], [], [stdout], [stderr])
+
+AT_FAIL_IF([true])
+OVS_VSWITCHD_STOP()
+AT_CLEANUP
+dnl --------------------------------------------------------------------------
+
+