diff options
Diffstat (limited to 'src/mongo/util/procparser_test.cpp')
-rw-r--r-- | src/mongo/util/procparser_test.cpp | 132 |
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) { |