blob: 128dc5c91c62d834e15ecba229f874f0b93b4f7e [file] [log] [blame]
Chenbo Fengdc4e3252017-12-22 11:00:52 -08001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <fstream>
18#include <iostream>
19#include <string>
20#include <vector>
21
22#include <fcntl.h>
23#include <inttypes.h>
24#include <linux/inet_diag.h>
25#include <linux/sock_diag.h>
26#include <net/if.h>
27#include <sys/socket.h>
28#include <sys/types.h>
29#include <unistd.h>
30
31#include <gtest/gtest.h>
32
33#include <android-base/stringprintf.h>
34#include <android-base/strings.h>
35
36#include <netdutils/MockSyscalls.h>
Chenbo Feng4f6c2372018-04-26 10:37:55 -070037#include "bpf/BpfMap.h"
Chenbo Fengdc4e3252017-12-22 11:00:52 -080038#include "bpf/BpfUtils.h"
Chenbo Fengd6104d12018-10-16 20:29:29 -070039#include "netdbpf/BpfNetworkStats.h"
Chenbo Fengdc4e3252017-12-22 11:00:52 -080040
Chenbo Fengdc4e3252017-12-22 11:00:52 -080041using ::testing::Test;
42
43namespace android {
44namespace bpf {
45
Steven Morelanda3074542020-01-13 14:13:44 -080046using base::Result;
Chenbo Fengdc4e3252017-12-22 11:00:52 -080047using base::unique_fd;
Chenbo Fengdc4e3252017-12-22 11:00:52 -080048
49constexpr int TEST_MAP_SIZE = 10;
50constexpr uid_t TEST_UID1 = 10086;
51constexpr uid_t TEST_UID2 = 12345;
52constexpr uint32_t TEST_TAG = 42;
53constexpr int TEST_COUNTERSET0 = 0;
54constexpr int TEST_COUNTERSET1 = 1;
Chenbo Fengdc4e3252017-12-22 11:00:52 -080055constexpr uint64_t TEST_BYTES0 = 1000;
56constexpr uint64_t TEST_BYTES1 = 2000;
Chenbo Fengdc4e3252017-12-22 11:00:52 -080057constexpr uint64_t TEST_PACKET0 = 100;
58constexpr uint64_t TEST_PACKET1 = 200;
Chenbo Feng4f6c2372018-04-26 10:37:55 -070059constexpr const char IFACE_NAME1[] = "lo";
60constexpr const char IFACE_NAME2[] = "wlan0";
61constexpr const char IFACE_NAME3[] = "rmnet_data0";
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070062// A iface name that the size is bigger then IFNAMSIZ
63constexpr const char LONG_IFACE_NAME[] = "wlanWithALongName";
64constexpr const char TRUNCATED_IFACE_NAME[] = "wlanWithALongNa";
Chenbo Feng33a4de12018-03-16 18:10:07 -070065constexpr uint32_t IFACE_INDEX1 = 1;
66constexpr uint32_t IFACE_INDEX2 = 2;
67constexpr uint32_t IFACE_INDEX3 = 3;
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070068constexpr uint32_t IFACE_INDEX4 = 4;
Chenbo Feng7e974052018-02-28 22:57:21 -080069constexpr uint32_t UNKNOWN_IFACE = 0;
Chenbo Fengdc4e3252017-12-22 11:00:52 -080070
71class BpfNetworkStatsHelperTest : public testing::Test {
72 protected:
73 BpfNetworkStatsHelperTest() {}
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -080074 BpfMap<uint64_t, UidTagValue> mFakeCookieTagMap;
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070075 BpfMap<uint32_t, StatsValue> mFakeAppUidStatsMap;
Chenbo Fengf434e862018-06-27 14:08:39 -070076 BpfMap<StatsKey, StatsValue> mFakeStatsMap;
Chenbo Feng4f6c2372018-04-26 10:37:55 -070077 BpfMap<uint32_t, IfaceValue> mFakeIfaceIndexNameMap;
78 BpfMap<uint32_t, StatsValue> mFakeIfaceStatsMap;
Chenbo Fengdc4e3252017-12-22 11:00:52 -080079
80 void SetUp() {
Chenbo Fengdc4c37e2018-11-20 14:10:00 -080081 SKIP_IF_BPF_NOT_SUPPORTED;
Chenbo Fengef01d8d2019-04-09 11:53:45 -070082 ASSERT_EQ(0, setrlimitForTest());
Chenbo Fengdc4c37e2018-11-20 14:10:00 -080083
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -080084 mFakeCookieTagMap = BpfMap<uint64_t, UidTagValue>(createMap(
85 BPF_MAP_TYPE_HASH, sizeof(uint64_t), sizeof(UidTagValue), TEST_MAP_SIZE, 0));
Chenbo Feng4f6c2372018-04-26 10:37:55 -070086 ASSERT_LE(0, mFakeCookieTagMap.getMap());
Chenbo Fengdc4e3252017-12-22 11:00:52 -080087
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070088 mFakeAppUidStatsMap = BpfMap<uint32_t, StatsValue>(createMap(
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -080089 BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(StatsValue), TEST_MAP_SIZE, 0));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070090 ASSERT_LE(0, mFakeAppUidStatsMap.getMap());
91
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -080092 mFakeStatsMap = BpfMap<StatsKey, StatsValue>(createMap(
93 BPF_MAP_TYPE_HASH, sizeof(StatsKey), sizeof(StatsValue), TEST_MAP_SIZE, 0));
Chenbo Fengf434e862018-06-27 14:08:39 -070094 ASSERT_LE(0, mFakeStatsMap.getMap());
Chenbo Feng7e974052018-02-28 22:57:21 -080095
Chenbo Feng4f6c2372018-04-26 10:37:55 -070096 mFakeIfaceIndexNameMap = BpfMap<uint32_t, IfaceValue>(
97 createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(IfaceValue), TEST_MAP_SIZE, 0));
98 ASSERT_LE(0, mFakeIfaceIndexNameMap.getMap());
Chenbo Feng33a4de12018-03-16 18:10:07 -070099
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700100 mFakeIfaceStatsMap = BpfMap<uint32_t, StatsValue>(createMap(
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800101 BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(StatsValue), TEST_MAP_SIZE, 0));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700102 ASSERT_LE(0, mFakeIfaceStatsMap.getMap());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800103 }
104
105 void expectUidTag(uint64_t cookie, uid_t uid, uint32_t tag) {
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700106 auto tagResult = mFakeCookieTagMap.readValue(cookie);
Steven Morelanda3074542020-01-13 14:13:44 -0800107 EXPECT_TRUE(tagResult);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700108 EXPECT_EQ(uid, tagResult.value().uid);
109 EXPECT_EQ(tag, tagResult.value().tag);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800110 }
111
112 void populateFakeStats(uid_t uid, uint32_t tag, uint32_t ifaceIndex, uint32_t counterSet,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700113 StatsValue value, BpfMap<StatsKey, StatsValue>& map) {
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800114 StatsKey key = {
115 .uid = (uint32_t)uid, .tag = tag, .counterSet = counterSet, .ifaceIndex = ifaceIndex};
Steven Morelanda3074542020-01-13 14:13:44 -0800116 EXPECT_TRUE(map.writeValue(key, value, BPF_ANY));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800117 }
Chenbo Feng7e974052018-02-28 22:57:21 -0800118
Chenbo Feng33a4de12018-03-16 18:10:07 -0700119 void updateIfaceMap(const char* ifaceName, uint32_t ifaceIndex) {
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700120 IfaceValue iface;
121 strlcpy(iface.name, ifaceName, IFNAMSIZ);
Steven Morelanda3074542020-01-13 14:13:44 -0800122 EXPECT_TRUE(mFakeIfaceIndexNameMap.writeValue(ifaceIndex, iface, BPF_ANY));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700123 }
124
125 void expectStatsEqual(const StatsValue& target, const Stats& result) {
126 EXPECT_EQ(target.rxPackets, result.rxPackets);
127 EXPECT_EQ(target.rxBytes, result.rxBytes);
128 EXPECT_EQ(target.txPackets, result.txPackets);
129 EXPECT_EQ(target.txBytes, result.txBytes);
130 }
131
132 void expectStatsLineEqual(const StatsValue target, const char* iface, uint32_t uid,
133 int counterSet, uint32_t tag, const stats_line& result) {
134 EXPECT_EQ(0, strcmp(iface, result.iface));
135 EXPECT_EQ(uid, (uint32_t)result.uid);
junyulaia130ac22018-11-09 16:12:29 +0800136 EXPECT_EQ((uint32_t) counterSet, result.set);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700137 EXPECT_EQ(tag, (uint32_t)result.tag);
138 EXPECT_EQ(target.rxPackets, (uint64_t)result.rxPackets);
139 EXPECT_EQ(target.rxBytes, (uint64_t)result.rxBytes);
140 EXPECT_EQ(target.txPackets, (uint64_t)result.txPackets);
141 EXPECT_EQ(target.txBytes, (uint64_t)result.txBytes);
Chenbo Feng7e974052018-02-28 22:57:21 -0800142 }
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800143};
144
145// TEST to verify the behavior of bpf map when cocurrent deletion happens when
146// iterating the same map.
147TEST_F(BpfNetworkStatsHelperTest, TestIterateMapWithDeletion) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700148 SKIP_IF_BPF_NOT_SUPPORTED;
149
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800150 for (int i = 0; i < 5; i++) {
151 uint64_t cookie = i + 1;
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800152 UidTagValue tag = {.uid = TEST_UID1, .tag = TEST_TAG};
Steven Morelanda3074542020-01-13 14:13:44 -0800153 EXPECT_TRUE(mFakeCookieTagMap.writeValue(cookie, tag, BPF_ANY));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800154 }
155 uint64_t curCookie = 0;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700156 auto nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
Steven Morelanda3074542020-01-13 14:13:44 -0800157 EXPECT_TRUE(nextCookie);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700158 uint64_t headOfMap = nextCookie.value();
159 curCookie = nextCookie.value();
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800160 // Find the second entry in the map, then immediately delete it.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700161 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
Steven Morelanda3074542020-01-13 14:13:44 -0800162 EXPECT_TRUE(nextCookie);
163 EXPECT_TRUE(mFakeCookieTagMap.deleteValue((nextCookie.value())));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800164 // Find the entry that is now immediately after headOfMap, then delete that.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700165 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
Steven Morelanda3074542020-01-13 14:13:44 -0800166 EXPECT_TRUE(nextCookie);
167 EXPECT_TRUE(mFakeCookieTagMap.deleteValue((nextCookie.value())));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800168 // Attempting to read an entry that has been deleted fails with ENOENT.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700169 curCookie = nextCookie.value();
170 auto tagResult = mFakeCookieTagMap.readValue(curCookie);
Steven Morelanda3074542020-01-13 14:13:44 -0800171 EXPECT_EQ(ENOENT, tagResult.error().code());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800172 // Finding the entry after our deleted entry restarts iteration from the beginning of the map.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700173 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
Steven Morelanda3074542020-01-13 14:13:44 -0800174 EXPECT_TRUE(nextCookie);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700175 EXPECT_EQ(headOfMap, nextCookie.value());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800176}
177
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700178TEST_F(BpfNetworkStatsHelperTest, TestBpfIterateMap) {
179 SKIP_IF_BPF_NOT_SUPPORTED;
180
181 for (int i = 0; i < 5; i++) {
182 uint64_t cookie = i + 1;
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800183 UidTagValue tag = {.uid = TEST_UID1, .tag = TEST_TAG};
Steven Morelanda3074542020-01-13 14:13:44 -0800184 EXPECT_TRUE(mFakeCookieTagMap.writeValue(cookie, tag, BPF_ANY));
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700185 }
186 int totalCount = 0;
187 int totalSum = 0;
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800188 const auto iterateWithoutDeletion =
189 [&totalCount, &totalSum](const uint64_t& key, const BpfMap<uint64_t, UidTagValue>&) {
190 EXPECT_GE((uint64_t)5, key);
191 totalCount++;
192 totalSum += key;
Steven Morelanda3074542020-01-13 14:13:44 -0800193 return Result<void>();
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800194 };
Steven Morelanda3074542020-01-13 14:13:44 -0800195 EXPECT_TRUE(mFakeCookieTagMap.iterate(iterateWithoutDeletion));
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700196 EXPECT_EQ(5, totalCount);
197 EXPECT_EQ(1 + 2 + 3 + 4 + 5, totalSum);
198}
199
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700200TEST_F(BpfNetworkStatsHelperTest, TestUidStatsNoTraffic) {
201 SKIP_IF_BPF_NOT_SUPPORTED;
202
203 StatsValue value1 = {
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700204 .rxPackets = 0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700205 .rxBytes = 0,
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700206 .txPackets = 0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700207 .txBytes = 0,
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700208 };
209 Stats result1 = {};
210 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID1, &result1, mFakeAppUidStatsMap));
211 expectStatsEqual(value1, result1);
212}
213
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800214TEST_F(BpfNetworkStatsHelperTest, TestGetUidStatsTotal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700215 SKIP_IF_BPF_NOT_SUPPORTED;
216
Chenbo Feng33a4de12018-03-16 18:10:07 -0700217 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700218 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
219 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700220 StatsValue value1 = {
221 .rxPackets = TEST_PACKET0,
222 .rxBytes = TEST_BYTES0,
223 .txPackets = TEST_PACKET1,
224 .txBytes = TEST_BYTES1,
225 };
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700226 StatsValue value2 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700227 .rxPackets = TEST_PACKET0 * 2,
228 .rxBytes = TEST_BYTES0 * 2,
229 .txPackets = TEST_PACKET1 * 2,
230 .txBytes = TEST_BYTES1 * 2,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700231 };
Steven Morelanda3074542020-01-13 14:13:44 -0800232 ASSERT_TRUE(mFakeAppUidStatsMap.writeValue(TEST_UID1, value1, BPF_ANY));
233 ASSERT_TRUE(mFakeAppUidStatsMap.writeValue(TEST_UID2, value2, BPF_ANY));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700234 Stats result1 = {};
235 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID1, &result1, mFakeAppUidStatsMap));
236 expectStatsEqual(value1, result1);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700237
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800238 Stats result2 = {};
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700239 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID2, &result2, mFakeAppUidStatsMap));
240 expectStatsEqual(value2, result2);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800241 std::vector<stats_line> lines;
242 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700243 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
244 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET1, value1, mFakeStatsMap);
245 populateFakeStats(TEST_UID2, 0, IFACE_INDEX3, TEST_COUNTERSET1, value1, mFakeStatsMap);
Chenbo Feng16513482018-03-15 17:59:58 -0700246 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700247 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800248 ASSERT_EQ((unsigned long)2, lines.size());
249 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700250 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700251 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800252 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700253 expectStatsLineEqual(value1, IFACE_NAME3, TEST_UID2, TEST_COUNTERSET1, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800254}
255
256TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsInternal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700257 SKIP_IF_BPF_NOT_SUPPORTED;
258
Chenbo Feng33a4de12018-03-16 18:10:07 -0700259 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
260 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
261 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
262 StatsValue value1 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700263 .rxPackets = TEST_PACKET0,
264 .rxBytes = TEST_BYTES0,
265 .txPackets = TEST_PACKET1,
266 .txBytes = TEST_BYTES1,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700267 };
268 StatsValue value2 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700269 .rxPackets = TEST_PACKET1,
270 .rxBytes = TEST_BYTES1,
271 .txPackets = TEST_PACKET0,
272 .txBytes = TEST_BYTES0,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700273 };
274 uint32_t ifaceStatsKey = IFACE_INDEX1;
Steven Morelanda3074542020-01-13 14:13:44 -0800275 EXPECT_TRUE(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700276 ifaceStatsKey = IFACE_INDEX2;
Steven Morelanda3074542020-01-13 14:13:44 -0800277 EXPECT_TRUE(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700278 ifaceStatsKey = IFACE_INDEX3;
Steven Morelanda3074542020-01-13 14:13:44 -0800279 EXPECT_TRUE(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700280
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800281 Stats result1 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700282 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME1, &result1, mFakeIfaceStatsMap,
283 mFakeIfaceIndexNameMap));
284 expectStatsEqual(value1, result1);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800285 Stats result2 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700286 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME2, &result2, mFakeIfaceStatsMap,
287 mFakeIfaceIndexNameMap));
288 expectStatsEqual(value2, result2);
289 Stats totalResult = {};
290 ASSERT_EQ(0, bpfGetIfaceStatsInternal(NULL, &totalResult, mFakeIfaceStatsMap,
291 mFakeIfaceIndexNameMap));
292 StatsValue totalValue = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700293 .rxPackets = TEST_PACKET0 * 2 + TEST_PACKET1,
294 .rxBytes = TEST_BYTES0 * 2 + TEST_BYTES1,
295 .txPackets = TEST_PACKET1 * 2 + TEST_PACKET0,
296 .txBytes = TEST_BYTES1 * 2 + TEST_BYTES0,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700297 };
298 expectStatsEqual(totalValue, totalResult);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800299}
300
301TEST_F(BpfNetworkStatsHelperTest, TestGetStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700302 SKIP_IF_BPF_NOT_SUPPORTED;
303
Chenbo Feng33a4de12018-03-16 18:10:07 -0700304 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
305 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700306 StatsValue value1 = {
307 .rxPackets = TEST_PACKET0,
308 .rxBytes = TEST_BYTES0,
309 .txPackets = TEST_PACKET1,
310 .txBytes = TEST_BYTES1,
311 };
Chenbo Fengf434e862018-06-27 14:08:39 -0700312 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
313 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700314 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700315 mFakeStatsMap);
316 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800317 std::vector<stats_line> lines;
318 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700319 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
320 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700321 ASSERT_EQ((unsigned long)4, lines.size());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800322 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700323 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700324 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700325 ASSERT_EQ((unsigned long)3, lines.size());
326 lines.clear();
327 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700328 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800329 ASSERT_EQ((unsigned long)2, lines.size());
330 lines.clear();
Chenbo Feng33a4de12018-03-16 18:10:07 -0700331 ifaces.push_back(std::string(IFACE_NAME1));
Chenbo Feng16513482018-03-15 17:59:58 -0700332 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700333 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng7e974052018-02-28 22:57:21 -0800334 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng33a4de12018-03-16 18:10:07 -0700335 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800336}
337
338TEST_F(BpfNetworkStatsHelperTest, TestGetStatsWithSkippedIface) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700339 SKIP_IF_BPF_NOT_SUPPORTED;
340
Chenbo Feng33a4de12018-03-16 18:10:07 -0700341 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
342 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700343 StatsValue value1 = {
344 .rxPackets = TEST_PACKET0,
345 .rxBytes = TEST_BYTES0,
346 .txPackets = TEST_PACKET1,
347 .txBytes = TEST_BYTES1,
348 };
Chenbo Fengf434e862018-06-27 14:08:39 -0700349 populateFakeStats(0, 0, 0, OVERFLOW_COUNTERSET, value1, mFakeStatsMap);
350 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
351 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value1, mFakeStatsMap);
352 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET1, value1, mFakeStatsMap);
353 populateFakeStats(TEST_UID2, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800354 std::vector<stats_line> lines;
355 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700356 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
357 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700358 ASSERT_EQ((unsigned long)4, lines.size());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800359 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700360 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700361 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700362 ASSERT_EQ((unsigned long)3, lines.size());
Chenbo Feng7e974052018-02-28 22:57:21 -0800363 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700364 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700365 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800366 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng33a4de12018-03-16 18:10:07 -0700367 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800368 lines.clear();
Chenbo Feng33a4de12018-03-16 18:10:07 -0700369 ifaces.push_back(std::string(IFACE_NAME1));
Chenbo Feng16513482018-03-15 17:59:58 -0700370 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700371 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800372 ASSERT_EQ((unsigned long)2, lines.size());
373}
374
Chenbo Feng7e974052018-02-28 22:57:21 -0800375TEST_F(BpfNetworkStatsHelperTest, TestUnkownIfaceError) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700376 SKIP_IF_BPF_NOT_SUPPORTED;
377
Chenbo Feng33a4de12018-03-16 18:10:07 -0700378 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700379 StatsValue value1 = {
380 .rxPackets = TEST_PACKET0,
381 .rxBytes = TEST_BYTES0 * 20,
382 .txPackets = TEST_PACKET1,
383 .txBytes = TEST_BYTES1 * 20,
384 };
Chenbo Feng7e974052018-02-28 22:57:21 -0800385 uint32_t ifaceIndex = UNKNOWN_IFACE;
Chenbo Fengf434e862018-06-27 14:08:39 -0700386 populateFakeStats(TEST_UID1, 0, ifaceIndex, TEST_COUNTERSET0, value1, mFakeStatsMap);
387 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700388 StatsValue value2 = {
389 .rxPackets = TEST_PACKET0,
390 .rxBytes = TEST_BYTES0 * 40,
391 .txPackets = TEST_PACKET1,
392 .txBytes = TEST_BYTES1 * 40,
393 };
Chenbo Fengf434e862018-06-27 14:08:39 -0700394 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700395 StatsKey curKey = {
396 .uid = TEST_UID1,
397 .tag = 0,
398 .counterSet = TEST_COUNTERSET0,
399 .ifaceIndex = ifaceIndex,
400 };
Chenbo Feng7e974052018-02-28 22:57:21 -0800401 char ifname[IFNAMSIZ];
Chenbo Feng33a4de12018-03-16 18:10:07 -0700402 int64_t unknownIfaceBytesTotal = 0;
Chenbo Fengf434e862018-06-27 14:08:39 -0700403 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700404 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700405 ASSERT_EQ(((int64_t)(TEST_BYTES0 * 20 + TEST_BYTES1 * 20)), unknownIfaceBytesTotal);
406 curKey.ifaceIndex = IFACE_INDEX2;
Chenbo Fengf434e862018-06-27 14:08:39 -0700407 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700408 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700409 ASSERT_EQ(-1, unknownIfaceBytesTotal);
410 std::vector<stats_line> lines;
411 std::vector<std::string> ifaces;
412 // TODO: find a way to test the total of unknown Iface Bytes go above limit.
Chenbo Fengf434e862018-06-27 14:08:39 -0700413 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
414 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700415 ASSERT_EQ((unsigned long)1, lines.size());
416 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines.front());
Chenbo Feng7e974052018-02-28 22:57:21 -0800417}
418
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700419TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700420 SKIP_IF_BPF_NOT_SUPPORTED;
421
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700422 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
423 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
424 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700425 updateIfaceMap(LONG_IFACE_NAME, IFACE_INDEX4);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700426 StatsValue value1 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700427 .rxPackets = TEST_PACKET0,
428 .rxBytes = TEST_BYTES0,
429 .txPackets = TEST_PACKET1,
430 .txBytes = TEST_BYTES1,
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700431 };
432 StatsValue value2 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700433 .rxPackets = TEST_PACKET1,
434 .rxBytes = TEST_BYTES1,
435 .txPackets = TEST_PACKET0,
436 .txBytes = TEST_BYTES0,
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700437 };
438 uint32_t ifaceStatsKey = IFACE_INDEX1;
Steven Morelanda3074542020-01-13 14:13:44 -0800439 EXPECT_TRUE(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700440 ifaceStatsKey = IFACE_INDEX2;
Steven Morelanda3074542020-01-13 14:13:44 -0800441 EXPECT_TRUE(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700442 ifaceStatsKey = IFACE_INDEX3;
Steven Morelanda3074542020-01-13 14:13:44 -0800443 EXPECT_TRUE(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700444 ifaceStatsKey = IFACE_INDEX4;
Steven Morelanda3074542020-01-13 14:13:44 -0800445 EXPECT_TRUE(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700446 std::vector<stats_line> lines;
447 ASSERT_EQ(0,
448 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700449 ASSERT_EQ((unsigned long)4, lines.size());
junyulaia130ac22018-11-09 16:12:29 +0800450
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700451 expectStatsLineEqual(value1, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
452 expectStatsLineEqual(value1, IFACE_NAME3, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
453 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[2]);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700454 ASSERT_EQ(0, strcmp(TRUNCATED_IFACE_NAME, lines[3].iface));
455 expectStatsLineEqual(value2, TRUNCATED_IFACE_NAME, UID_ALL, SET_ALL, TAG_NONE, lines[3]);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700456}
junyulaia130ac22018-11-09 16:12:29 +0800457
458TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortedAndGrouped) {
459 SKIP_IF_BPF_NOT_SUPPORTED;
460
461 // Create iface indexes with duplicate iface name.
462 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
463 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
464 updateIfaceMap(IFACE_NAME1, IFACE_INDEX3); // Duplicate!
465
466 StatsValue value1 = {
junyulaia130ac22018-11-09 16:12:29 +0800467 .rxPackets = TEST_PACKET0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700468 .rxBytes = TEST_BYTES0,
junyulaia130ac22018-11-09 16:12:29 +0800469 .txPackets = TEST_PACKET1,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700470 .txBytes = TEST_BYTES1,
junyulaia130ac22018-11-09 16:12:29 +0800471 };
472 StatsValue value2 = {
junyulaia130ac22018-11-09 16:12:29 +0800473 .rxPackets = TEST_PACKET1,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700474 .rxBytes = TEST_BYTES1,
junyulaia130ac22018-11-09 16:12:29 +0800475 .txPackets = TEST_PACKET0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700476 .txBytes = TEST_BYTES0,
junyulaia130ac22018-11-09 16:12:29 +0800477 };
478 StatsValue value3 = {
junyulaia130ac22018-11-09 16:12:29 +0800479 .rxPackets = TEST_PACKET0 * 2,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700480 .rxBytes = TEST_BYTES0 * 2,
junyulaia130ac22018-11-09 16:12:29 +0800481 .txPackets = TEST_PACKET1 * 2,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700482 .txBytes = TEST_BYTES1 * 2,
junyulaia130ac22018-11-09 16:12:29 +0800483 };
484
485 std::vector<stats_line> lines;
486 std::vector<std::string> ifaces;
487
488 // Test empty stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700489 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
490 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800491 ASSERT_EQ((size_t) 0, lines.size());
492 lines.clear();
493
494 // Test 1 line stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700495 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
496 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
497 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800498 ASSERT_EQ((size_t) 1, lines.size());
499 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
500 lines.clear();
501
502 // These items should not be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700503 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
504 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET1, value2, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800505 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700506 mFakeStatsMap);
507 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
508 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
509 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800510 ASSERT_EQ((size_t) 5, lines.size());
511 lines.clear();
512
513 // These items should be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700514 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
515 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800516
Chenbo Fengf434e862018-06-27 14:08:39 -0700517 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
518 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800519 ASSERT_EQ((size_t) 5, lines.size());
520
521 // Verify Sorted & Grouped.
522 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
523 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET1, TEST_TAG, lines[1]);
524 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG + 1, lines[2]);
525 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, TEST_TAG, lines[3]);
526 expectStatsLineEqual(value2, IFACE_NAME2, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[4]);
527 lines.clear();
528
529 // Perform test on IfaceStats.
530 uint32_t ifaceStatsKey = IFACE_INDEX2;
Steven Morelanda3074542020-01-13 14:13:44 -0800531 EXPECT_TRUE(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY));
junyulaia130ac22018-11-09 16:12:29 +0800532 ifaceStatsKey = IFACE_INDEX1;
Steven Morelanda3074542020-01-13 14:13:44 -0800533 EXPECT_TRUE(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
junyulaia130ac22018-11-09 16:12:29 +0800534
535 // This should be grouped.
536 ifaceStatsKey = IFACE_INDEX3;
Steven Morelanda3074542020-01-13 14:13:44 -0800537 EXPECT_TRUE(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
junyulaia130ac22018-11-09 16:12:29 +0800538
539 ASSERT_EQ(0,
540 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
541 ASSERT_EQ((size_t) 2, lines.size());
542
543 expectStatsLineEqual(value3, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
544 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
545 lines.clear();
546}
547
548// Test to verify that subtract overflow will not be triggered by the compare function invoked from
549// sorting. See http:/b/119193941.
550TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortAndOverflow) {
Xiao Mae5317722018-12-12 17:49:34 +0900551 SKIP_IF_BPF_NOT_SUPPORTED;
552
junyulaia130ac22018-11-09 16:12:29 +0800553 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
554
555 StatsValue value1 = {
junyulaia130ac22018-11-09 16:12:29 +0800556 .rxPackets = TEST_PACKET0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700557 .rxBytes = TEST_BYTES0,
junyulaia130ac22018-11-09 16:12:29 +0800558 .txPackets = TEST_PACKET1,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700559 .txBytes = TEST_BYTES1,
junyulaia130ac22018-11-09 16:12:29 +0800560 };
561
562 // Mutate uid, 0 < TEST_UID1 < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700563 populateFakeStats(0, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
564 populateFakeStats(UINT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
565 populateFakeStats(INT_MIN, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
566 populateFakeStats(INT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800567
568 // Mutate tag, 0 < TEST_TAG < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700569 populateFakeStats(TEST_UID1, INT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
570 populateFakeStats(TEST_UID1, INT_MIN, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
571 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
572 populateFakeStats(TEST_UID1, UINT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800573
574 // TODO: Mutate counterSet and enlarge TEST_MAP_SIZE if overflow on counterSet is possible.
575
576 std::vector<stats_line> lines;
577 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700578 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
579 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800580 ASSERT_EQ((size_t) 8, lines.size());
581
582 // Uid 0 first
583 expectStatsLineEqual(value1, IFACE_NAME1, 0, TEST_COUNTERSET0, TEST_TAG, lines[0]);
584
585 // Test uid, mutate tag.
586 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines[1]);
587 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MAX, lines[2]);
588 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MIN, lines[3]);
589 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, UINT_MAX, lines[4]);
590
591 // Mutate uid.
592 expectStatsLineEqual(value1, IFACE_NAME1, INT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[5]);
593 expectStatsLineEqual(value1, IFACE_NAME1, INT_MIN, TEST_COUNTERSET0, TEST_TAG, lines[6]);
594 expectStatsLineEqual(value1, IFACE_NAME1, UINT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[7]);
595 lines.clear();
596}
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800597} // namespace bpf
598} // namespace android