summaryrefslogtreecommitdiffhomepage
path: root/test/syscalls
diff options
context:
space:
mode:
authorJianfeng Tan <henry.tjf@antfin.com>2019-05-20 11:26:10 +0000
committerJianfeng Tan <henry.tjf@antfin.com>2019-10-15 16:38:41 +0000
commitd277bfba2702b319d8336b65429cf8775661ea2f (patch)
tree5f23548038554d51968d3ee4ec4ea7cb016c50dd /test/syscalls
parentaee2c93366f451b9cc0a62430185749556fc3900 (diff)
epsocket: support /proc/net/snmp
Netstack has its own stats, we use this to fill /proc/net/snmp. Note that some metrics are not recorded in Netstack, which will be shown as 0 in the proc file. Signed-off-by: Jianfeng Tan <henry.tjf@antfin.com> Change-Id: Ie0089184507d16f49bc0057b4b0482094417ebe1
Diffstat (limited to 'test/syscalls')
-rw-r--r--test/syscalls/linux/proc_net.cc23
1 files changed, 23 insertions, 0 deletions
diff --git a/test/syscalls/linux/proc_net.cc b/test/syscalls/linux/proc_net.cc
index af4cd616a..d0ef8d380 100644
--- a/test/syscalls/linux/proc_net.cc
+++ b/test/syscalls/linux/proc_net.cc
@@ -15,11 +15,14 @@
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
+#include <poll.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/syscall.h>
#include "absl/strings/str_split.h"
+#include "absl/time/clock.h"
+#include "absl/time/time.h"
#include "gtest/gtest.h"
#include "test/util/capability_util.h"
#include "test/syscalls/linux/socket_test_util.h"
@@ -184,11 +187,31 @@ TEST(ProcNetSnmp, TcpEstab) {
EXPECT_EQ(oldPassiveOpens, newPassiveOpens - 1);
EXPECT_EQ(oldCurrEstab, newCurrEstab - 2);
+ // Send 1 byte from client to server.
ASSERT_THAT(send(s_connect.get(), "a", 1, 0), SyscallSucceedsWithValue(1));
+ constexpr int kPollTimeoutMs = 20000; // Wait up to 20 seconds for the data.
+
+ // Wait until server-side fd sees the data on its side but don't read it.
+ struct pollfd poll_fd = {s_accept.get(), POLLIN, 0};
+ ASSERT_THAT(RetryEINTR(poll)(&poll_fd, 1, kPollTimeoutMs),
+ SyscallSucceedsWithValue(1));
+
+ // Now close server-side fd without reading the data which leads to a RST
+ // packet sent to client side.
s_accept.reset(-1);
+
+ // Wait until client-side fd sees RST packet.
+ struct pollfd poll_fd1 = {s_connect.get(), POLLIN, 0};
+ ASSERT_THAT(RetryEINTR(poll)(&poll_fd1, 1, kPollTimeoutMs),
+ SyscallSucceedsWithValue(1));
+
+ // Now close client-side fd.
s_connect.reset(-1);
+ // Wait until the process of the netstack.
+ absl::SleepFor(absl::Seconds(1.0));
+
snmp = ASSERT_NO_ERRNO_AND_VALUE(GetContents("/proc/net/snmp"));
newCurrEstab = ASSERT_NO_ERRNO_AND_VALUE(GetSNMPMetricFromProc(snmp, "Tcp", "CurrEstab"));
newEstabResets = ASSERT_NO_ERRNO_AND_VALUE(GetSNMPMetricFromProc(snmp, "Tcp", "EstabResets"));