summaryrefslogtreecommitdiff
path: root/src/mongo/util/procparser_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/util/procparser_test.cpp')
-rw-r--r--src/mongo/util/procparser_test.cpp132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/mongo/util/procparser_test.cpp b/src/mongo/util/procparser_test.cpp
index 81bf17ac8df..ff620b8ac61 100644
--- a/src/mongo/util/procparser_test.cpp
+++ b/src/mongo/util/procparser_test.cpp
@@ -85,6 +85,11 @@ StringMap toNestedStringMap(BSONObj& obj) {
ASSERT_OK(procparser::parseProcMemInfo(_keys, _x, &builder)); \
auto obj = builder.obj(); \
auto stringMap = toStringMap(obj);
+#define ASSERT_PARSE_NETSTAT(_keys, _x) \
+ BSONObjBuilder builder; \
+ ASSERT_OK(procparser::parseProcNetstat(_keys, _x, &builder)); \
+ auto obj = builder.obj(); \
+ auto stringMap = toStringMap(obj);
#define ASSERT_PARSE_DISKSTATS(_disks, _x) \
BSONObjBuilder builder; \
ASSERT_OK(procparser::parseProcDiskStats(_disks, _x, &builder)); \
@@ -368,6 +373,133 @@ TEST(FTDCProcMemInfo, TestLocalNonExistentMemInfo) {
ASSERT_NOT_OK(procparser::parseProcMemInfoFile("/proc/does_not_exist", keys, &builder));
}
+TEST(FTDCProcNetstat, TestNetstat) {
+
+ // test keys
+ std::vector<StringData> keys{"pfx1", "pfx2", "pfx3"};
+
+ // Normal case
+ {
+ ASSERT_PARSE_NETSTAT(keys,
+ "pfx1 key1 key2 key3\n"
+ "pfx1 1 2 3\n"
+ "pfxX key1 key2\n"
+ "pfxX key1 key2\n"
+ "pfx2 key4 key5\n"
+ "pfx2 4 5\n");
+ ASSERT_KEY_AND_VALUE("pfx1key1", 1UL);
+ ASSERT_KEY_AND_VALUE("pfx1key2", 2UL);
+ ASSERT_NO_KEY("pfxXkey1");
+ ASSERT_NO_KEY("pfxXkey2");
+ ASSERT_KEY_AND_VALUE("pfx1key3", 3UL)
+ ASSERT_KEY_AND_VALUE("pfx2key4", 4UL);
+ ASSERT_KEY_AND_VALUE("pfx2key5", 5UL);
+ }
+
+ // Mismatched keys and values
+ {
+ ASSERT_PARSE_NETSTAT(keys,
+ "pfx1 key1 key2 key3\n"
+ "pfx1 1 2 3 4\n"
+ "pfx2 key4 key5\n"
+ "pfx2 4\n"
+ "pfx3 key6 key7\n");
+ ASSERT_KEY_AND_VALUE("pfx1key1", 1UL);
+ ASSERT_KEY_AND_VALUE("pfx1key2", 2UL);
+ ASSERT_KEY_AND_VALUE("pfx1key3", 3UL);
+ ASSERT_NO_KEY("pfx1key4");
+ ASSERT_KEY_AND_VALUE("pfx2key4", 4UL);
+ ASSERT_NO_KEY("pfx2key5");
+ ASSERT_NO_KEY("pfx3key6");
+ ASSERT_NO_KEY("pfx3key7");
+ }
+
+ // Non-numeric value
+ {
+ ASSERT_PARSE_NETSTAT(keys,
+ "pfx1 key1 key2 key3\n"
+ "pfx1 1 foo 3\n");
+ ASSERT_KEY_AND_VALUE("pfx1key1", 1UL);
+ ASSERT_NO_KEY("pfx1key2");
+ ASSERT_KEY_AND_VALUE("pfx1key3", 3UL)
+ }
+
+ // No newline
+ {
+ ASSERT_PARSE_NETSTAT(keys,
+ "pfx1 key1 key2 key3\n"
+ "pfx1 1 2 3\n"
+ "pfx2 key4 key5\n"
+ "pfx2 4 5");
+ ASSERT_KEY_AND_VALUE("pfx1key1", 1UL);
+ ASSERT_KEY_AND_VALUE("pfx1key2", 2UL);
+ ASSERT_KEY_AND_VALUE("pfx1key3", 3UL)
+ ASSERT_KEY_AND_VALUE("pfx2key4", 4UL);
+ ASSERT_KEY_AND_VALUE("pfx2key5", 5UL);
+ }
+
+ // Single line only
+ {
+ BSONObjBuilder builder;
+ ASSERT_NOT_OK(procparser::parseProcNetstat(keys, "pfx1 key1 key2 key3\n", &builder));
+ }
+
+ // Empty string
+ {
+ BSONObjBuilder builder;
+ ASSERT_NOT_OK(procparser::parseProcNetstat(keys, "", &builder));
+ }
+}
+
+// Test we can parse the /proc/net/netstat on this machine and assert we have some expected fields
+// Some keys can vary between distros, so we test only for the existence of a few basic ones
+TEST(FTDCProcNetstat, TestLocalNetstat) {
+
+ BSONObjBuilder builder;
+
+ std::vector<StringData> keys{"TcpExt:"_sd, "IpExt:"_sd};
+
+ ASSERT_OK(procparser::parseProcNetstatFile(keys, "/proc/net/netstat", &builder));
+
+ BSONObj obj = builder.obj();
+ auto stringMap = toStringMap(obj);
+ log() << "OBJ:" << obj;
+ ASSERT_KEY("TcpExt:TCPTimeouts");
+ ASSERT_KEY("TcpExt:TCPPureAcks");
+ ASSERT_KEY("TcpExt:TCPAbortOnTimeout");
+ ASSERT_KEY("TcpExt:EmbryonicRsts");
+ ASSERT_KEY("TcpExt:ListenDrops");
+ ASSERT_KEY("TcpExt:ListenOverflows");
+ ASSERT_KEY("TcpExt:DelayedACKs");
+ ASSERT_KEY("IpExt:OutOctets");
+ ASSERT_KEY("IpExt:InOctets");
+}
+
+// Test we can parse the /proc/net/snmp on this machine and assert we have some expected fields
+// Some keys can vary between distros, so we test only for the existence of a few basic ones
+TEST(FTDCProcNetstat, TestLocalNetSnmp) {
+
+ BSONObjBuilder builder;
+
+ std::vector<StringData> keys{"Tcp:"_sd, "Ip:"_sd};
+
+ ASSERT_OK(procparser::parseProcNetstatFile(keys, "/proc/net/snmp", &builder));
+
+ BSONObj obj = builder.obj();
+ auto stringMap = toStringMap(obj);
+ log() << "OBJ:" << obj;
+ ASSERT_KEY("Ip:InReceives");
+ ASSERT_KEY("Ip:OutRequests");
+ ASSERT_KEY("Tcp:InSegs");
+ ASSERT_KEY("Tcp:OutSegs");
+}
+
+TEST(FTDCProcNetstat, TestLocalNonExistentNetstat) {
+ std::vector<StringData> keys{};
+ BSONObjBuilder builder;
+
+ ASSERT_NOT_OK(procparser::parseProcNetstatFile(keys, "/proc/does_not_exist", &builder));
+}
TEST(FTDCProcDiskStats, TestDiskStats) {