regression_2004: add case for truncated datagram reception

Adds a case to test reception of a truncated datagram.

Acked-by: Etienne Carriere <etienne.carriere@linaro.org>
Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
diff --git a/host/xtest/regression_2000.c b/host/xtest/regression_2000.c
index 4f89d12..600b18c 100644
--- a/host/xtest/regression_2000.c
+++ b/host/xtest/regression_2000.c
@@ -663,6 +663,62 @@
 	return sendto(fd, buf, l, 0, sa, slen) != -1;
 }
 
+static bool test_2004_send_recv(ADBG_Case_t *c,
+				struct test_200x_io_state *srv_ios,
+				struct test_200x_io_state *local_ios,
+				TEEC_Session *session, struct socket_handle *sh,
+				size_t send_sz, size_t recv_sz)
+{
+	bool ret = false;
+	uint32_t ret_orig = 0;
+	uint8_t *buf = calloc(1, send_sz);
+	uint8_t *buf2 = calloc(1, send_sz);
+	size_t blen = 0;
+
+	/* If recv_sz < send_sz we're receiving a truncated datagram */
+
+	if (!ADBG_EXPECT_NOT_NULL(c, buf) || !ADBG_EXPECT_NOT_NULL(c, buf2) ||
+	    !ADBG_EXPECT_COMPARE_UNSIGNED(c, send_sz, >=, recv_sz))
+		goto out;
+
+	/* First we're sending the packet to the echo server */
+	Do_ADBG_BeginSubCase(c, "UDP Socket send");
+	blen = send_sz;
+	rand_stream_read(local_ios->write_rs, buf, blen);
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_send(session, sh,
+			buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+		goto out;
+	ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, send_sz);
+	Do_ADBG_EndSubCase(c, "UDP Socket send");
+
+	/* Then we're receiving the packet from the echo server */
+	Do_ADBG_BeginSubCase(c, "UDP Socket recv");
+	blen = 0;
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(session, sh,
+			buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+		goto out;
+	ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, send_sz);
+	blen = recv_sz;
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(session, sh,
+			buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+		goto out;
+	if (recv_sz < send_sz)
+		ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, >=, recv_sz);
+	else
+		ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, send_sz);
+	rand_stream_read(local_ios->read_rs, buf2, send_sz);
+	ADBG_EXPECT_BUFFER(c, buf2, recv_sz, buf, recv_sz);
+	ADBG_EXPECT_TRUE(c, !srv_ios->rfail);
+	Do_ADBG_EndSubCase(c, "UDP Socket recv");
+
+	ret = true;
+out:
+	free(buf);
+	free(buf2);
+
+	return ret;
+}
+
 static void xtest_tee_test_2004(ADBG_Case_t *c)
 {
 	struct sock_server ts = { };
@@ -676,7 +732,6 @@
 	uint32_t proto_error = 0;
 	struct socket_handle sh = { };
 	uint8_t buf[64] = { };
-	uint8_t buf2[64] = { };
 	size_t blen = 0;
 	uint16_t port = 0;
 	struct test_200x_io_state server_iostate = { };
@@ -713,25 +768,19 @@
 
 	Do_ADBG_EndSubCase(c, "UDP Socket open");
 
-	Do_ADBG_BeginSubCase(c, "UDP Socket send");
-	blen = sizeof(buf);
-	rand_stream_read(local_iostate.write_rs, buf, blen);
-	if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_send(&session, &sh,
-			buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+	Do_ADBG_BeginSubCase(c, "Normal send and receive");
+	if (!ADBG_EXPECT_TRUE(c, test_2004_send_recv(c, &server_iostate,
+						     &local_iostate, &session,
+						     &sh, 64, 64)))
 		goto out_close_session;
-	ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
-	Do_ADBG_EndSubCase(c, "UDP Socket send");
+	Do_ADBG_EndSubCase(c, "Normal send and receive");
 
-	Do_ADBG_BeginSubCase(c, "UDP Socket recv");
-	blen = sizeof(buf);
-	if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(&session, &sh,
-			buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+	Do_ADBG_BeginSubCase(c, "UDP Socket truncated recv");
+	if (!ADBG_EXPECT_TRUE(c, test_2004_send_recv(c, &server_iostate,
+						     &local_iostate, &session,
+						     &sh, 64, 32)))
 		goto out_close_session;
-	ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
-	rand_stream_read(local_iostate.read_rs, buf2, blen);
-	ADBG_EXPECT_BUFFER(c, buf2, blen, buf, blen);
-	ADBG_EXPECT_TRUE(c, !server_iostate.rfail);
-	Do_ADBG_EndSubCase(c, "UDP Socket recv");
+	Do_ADBG_EndSubCase(c, "UDP Socket truncated recv");
 
 	Do_ADBG_BeginSubCase(c, "UDP Socket get error");
 	if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_get_error(&session, &sh,
@@ -812,25 +861,11 @@
 			TEE_UDP_CHANGEPORT, &port, &blen, &ret_orig)))
 		goto out_close_session;
 
-	Do_ADBG_BeginSubCase(c, "UDP Socket send");
-	blen = sizeof(buf);
-	rand_stream_read(local_iostate.write_rs, buf, blen);
-	if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_send(&session, &sh,
-			buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
-		goto out_close_session;
-	ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
-	Do_ADBG_EndSubCase(c, "UDP Socket send");
 
-	Do_ADBG_BeginSubCase(c, "UDP Socket recv");
-	blen = sizeof(buf);
-	if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(&session, &sh,
-			buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+	if (!ADBG_EXPECT_TRUE(c, test_2004_send_recv(c, &server_iostate,
+						     &local_iostate, &session,
+						     &sh, 64, 64)))
 		goto out_close_session;
-	ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
-	rand_stream_read(local_iostate.read_rs, buf2, blen);
-	ADBG_EXPECT_BUFFER(c, buf2, blen, buf, blen);
-	ADBG_EXPECT_TRUE(c, !server_iostate.rfail);
-	Do_ADBG_EndSubCase(c, "UDP Socket recv");
 	TEEC_CloseSession(&session);
 
 	Do_ADBG_EndSubCase(c, "UDP Socket change port");
@@ -859,25 +894,10 @@
 			TEE_UDP_CHANGEADDR, ts3.bind->host, &blen, &ret_orig)))
 		goto out_close_session;
 
-	Do_ADBG_BeginSubCase(c, "UDP Socket send");
-	blen = sizeof(buf);
-	rand_stream_read(local_iostate.write_rs, buf, blen);
-	if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_send(&session, &sh,
-			buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+	if (!ADBG_EXPECT_TRUE(c, test_2004_send_recv(c, &server_iostate,
+						     &local_iostate, &session,
+						     &sh, 64, 64)))
 		goto out_close_session;
-	ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
-	Do_ADBG_EndSubCase(c, "UDP Socket send");
-
-	Do_ADBG_BeginSubCase(c, "UDP Socket recv");
-	blen = sizeof(buf);
-	if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(&session, &sh,
-			buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
-		goto out_close_session;
-	ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
-	rand_stream_read(local_iostate.read_rs, buf2, blen);
-	ADBG_EXPECT_BUFFER(c, buf2, blen, buf, blen);
-	ADBG_EXPECT_TRUE(c, !server_iostate.rfail);
-	Do_ADBG_EndSubCase(c, "UDP Socket recv");
 
 	Do_ADBG_EndSubCase(c, "UDP Socket change addr");