hs-test: test tcp with loss

This adds basic, functional-only, test of TCP connection with delay and
packet loss introduced by Network Delay Simulator.

Type: test
Signed-off-by: Maros Ondrejicka <maros.ondrejicka@pantheon.tech>
Change-Id: Ibedf4c680c152921b733cf39d99b178412748d3c
diff --git a/extras/hs-test/vcl_test.go b/extras/hs-test/vcl_test.go
index e1d23bd..b68385a 100755
--- a/extras/hs-test/vcl_test.go
+++ b/extras/hs-test/vcl_test.go
@@ -187,3 +187,50 @@
 	}
 	fmt.Println("Done.")
 }
+
+func (s *VethsSuite) TestTcpWithLoss() {
+	serverContainer, err := s.NewContainer("server")
+	s.assertNil(err, "creating container failed")
+	err = serverContainer.run()
+	s.assertNil(err)
+
+	serverVpp := NewVppInstance(serverContainer)
+	s.assertNotNil(serverVpp)
+	serverVpp.setCliSocket("/var/run/vpp/cli.sock")
+	serverVpp.set2VethsServer()
+	err = serverVpp.start()
+	s.assertNil(err, "starting VPP failed")
+
+	_, err = serverVpp.vppctl("test echo server uri tcp://10.10.10.1/20022")
+	s.assertNil(err, "starting echo server failed")
+
+	clientContainer, err := s.NewContainer("client")
+	s.assertNil(err, "creating container failed")
+	err = clientContainer.run()
+	s.assertNil(err, "starting container failed")
+
+	clientVpp := NewVppInstance(clientContainer)
+	s.assertNotNil(clientVpp)
+	clientVpp.setCliSocket("/var/run/vpp/cli.sock")
+	clientVpp.set2VethsClient()
+	err = clientVpp.start()
+	s.assertNil(err, "starting VPP failed")
+
+	// Ensure that VPP doesn't abort itself with NSIM enabled
+	// Warning: Removing this ping will make the test fail!
+	_, err = serverVpp.vppctl("ping 10.10.10.2")
+	s.assertNil(err, "ping failed")
+
+	// Add loss of packets with Network Delay Simulator
+	_, err = clientVpp.vppctl("set nsim poll-main-thread delay 0.01 ms bandwidth 40 gbit packet-size 1400 packets-per-drop 1000")
+	s.assertNil(err, "configuring NSIM failed")
+	_, err = clientVpp.vppctl("nsim output-feature enable-disable host-vppcln")
+	s.assertNil(err, "enabling NSIM failed")
+
+	// Do echo test from client-vpp container
+	output, err := clientVpp.vppctl("test echo client uri tcp://10.10.10.1/20022 mbytes 50")
+	s.assertNil(err)
+	s.assertEqual(true, len(output) != 0)
+	s.assertNotContains(output, "failed: timeout")
+	fmt.Println(output)
+}