blob: a9581ce7fbd6fd3da8c4debc0ff81170c9c78926 [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 Żenczykowski7e1ee772020-01-17 18:46:39 -080084 mFakeCookieTagMap = BpfMap<uint64_t, UidTagValue>(BPF_MAP_TYPE_HASH, TEST_MAP_SIZE, 0);
Chenbo Feng4f6c2372018-04-26 10:37:55 -070085 ASSERT_LE(0, mFakeCookieTagMap.getMap());
Chenbo Fengdc4e3252017-12-22 11:00:52 -080086
Maciej Żenczykowski7e1ee772020-01-17 18:46:39 -080087 mFakeAppUidStatsMap = BpfMap<uint32_t, StatsValue>(BPF_MAP_TYPE_HASH, TEST_MAP_SIZE, 0);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070088 ASSERT_LE(0, mFakeAppUidStatsMap.getMap());
89
Maciej Żenczykowski7e1ee772020-01-17 18:46:39 -080090 mFakeStatsMap = BpfMap<StatsKey, StatsValue>(BPF_MAP_TYPE_HASH, TEST_MAP_SIZE, 0);
Chenbo Fengf434e862018-06-27 14:08:39 -070091 ASSERT_LE(0, mFakeStatsMap.getMap());
Chenbo Feng7e974052018-02-28 22:57:21 -080092
Maciej Żenczykowski7e1ee772020-01-17 18:46:39 -080093 mFakeIfaceIndexNameMap = BpfMap<uint32_t, IfaceValue>(BPF_MAP_TYPE_HASH, TEST_MAP_SIZE, 0);
Chenbo Feng4f6c2372018-04-26 10:37:55 -070094 ASSERT_LE(0, mFakeIfaceIndexNameMap.getMap());
Chenbo Feng33a4de12018-03-16 18:10:07 -070095
Maciej Żenczykowski7e1ee772020-01-17 18:46:39 -080096 mFakeIfaceStatsMap = BpfMap<uint32_t, StatsValue>(BPF_MAP_TYPE_HASH, TEST_MAP_SIZE, 0);
Chenbo Feng4f6c2372018-04-26 10:37:55 -070097 ASSERT_LE(0, mFakeIfaceStatsMap.getMap());
Chenbo Fengdc4e3252017-12-22 11:00:52 -080098 }
99
100 void expectUidTag(uint64_t cookie, uid_t uid, uint32_t tag) {
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700101 auto tagResult = mFakeCookieTagMap.readValue(cookie);
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900102 EXPECT_RESULT_OK(tagResult);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700103 EXPECT_EQ(uid, tagResult.value().uid);
104 EXPECT_EQ(tag, tagResult.value().tag);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800105 }
106
107 void populateFakeStats(uid_t uid, uint32_t tag, uint32_t ifaceIndex, uint32_t counterSet,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700108 StatsValue value, BpfMap<StatsKey, StatsValue>& map) {
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800109 StatsKey key = {
110 .uid = (uint32_t)uid, .tag = tag, .counterSet = counterSet, .ifaceIndex = ifaceIndex};
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900111 EXPECT_RESULT_OK(map.writeValue(key, value, BPF_ANY));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800112 }
Chenbo Feng7e974052018-02-28 22:57:21 -0800113
Chenbo Feng33a4de12018-03-16 18:10:07 -0700114 void updateIfaceMap(const char* ifaceName, uint32_t ifaceIndex) {
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700115 IfaceValue iface;
116 strlcpy(iface.name, ifaceName, IFNAMSIZ);
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900117 EXPECT_RESULT_OK(mFakeIfaceIndexNameMap.writeValue(ifaceIndex, iface, BPF_ANY));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700118 }
119
120 void expectStatsEqual(const StatsValue& target, const Stats& result) {
121 EXPECT_EQ(target.rxPackets, result.rxPackets);
122 EXPECT_EQ(target.rxBytes, result.rxBytes);
123 EXPECT_EQ(target.txPackets, result.txPackets);
124 EXPECT_EQ(target.txBytes, result.txBytes);
125 }
126
127 void expectStatsLineEqual(const StatsValue target, const char* iface, uint32_t uid,
128 int counterSet, uint32_t tag, const stats_line& result) {
129 EXPECT_EQ(0, strcmp(iface, result.iface));
130 EXPECT_EQ(uid, (uint32_t)result.uid);
junyulaia130ac22018-11-09 16:12:29 +0800131 EXPECT_EQ((uint32_t) counterSet, result.set);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700132 EXPECT_EQ(tag, (uint32_t)result.tag);
133 EXPECT_EQ(target.rxPackets, (uint64_t)result.rxPackets);
134 EXPECT_EQ(target.rxBytes, (uint64_t)result.rxBytes);
135 EXPECT_EQ(target.txPackets, (uint64_t)result.txPackets);
136 EXPECT_EQ(target.txBytes, (uint64_t)result.txBytes);
Chenbo Feng7e974052018-02-28 22:57:21 -0800137 }
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800138};
139
140// TEST to verify the behavior of bpf map when cocurrent deletion happens when
141// iterating the same map.
142TEST_F(BpfNetworkStatsHelperTest, TestIterateMapWithDeletion) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700143 SKIP_IF_BPF_NOT_SUPPORTED;
144
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800145 for (int i = 0; i < 5; i++) {
146 uint64_t cookie = i + 1;
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800147 UidTagValue tag = {.uid = TEST_UID1, .tag = TEST_TAG};
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900148 EXPECT_RESULT_OK(mFakeCookieTagMap.writeValue(cookie, tag, BPF_ANY));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800149 }
150 uint64_t curCookie = 0;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700151 auto nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900152 EXPECT_RESULT_OK(nextCookie);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700153 uint64_t headOfMap = nextCookie.value();
154 curCookie = nextCookie.value();
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800155 // Find the second entry in the map, then immediately delete it.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700156 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900157 EXPECT_RESULT_OK(nextCookie);
158 EXPECT_RESULT_OK(mFakeCookieTagMap.deleteValue((nextCookie.value())));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800159 // Find the entry that is now immediately after headOfMap, then delete that.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700160 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900161 EXPECT_RESULT_OK(nextCookie);
162 EXPECT_RESULT_OK(mFakeCookieTagMap.deleteValue((nextCookie.value())));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800163 // Attempting to read an entry that has been deleted fails with ENOENT.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700164 curCookie = nextCookie.value();
165 auto tagResult = mFakeCookieTagMap.readValue(curCookie);
Steven Morelanda3074542020-01-13 14:13:44 -0800166 EXPECT_EQ(ENOENT, tagResult.error().code());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800167 // Finding the entry after our deleted entry restarts iteration from the beginning of the map.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700168 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900169 EXPECT_RESULT_OK(nextCookie);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700170 EXPECT_EQ(headOfMap, nextCookie.value());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800171}
172
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700173TEST_F(BpfNetworkStatsHelperTest, TestBpfIterateMap) {
174 SKIP_IF_BPF_NOT_SUPPORTED;
175
176 for (int i = 0; i < 5; i++) {
177 uint64_t cookie = i + 1;
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800178 UidTagValue tag = {.uid = TEST_UID1, .tag = TEST_TAG};
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900179 EXPECT_RESULT_OK(mFakeCookieTagMap.writeValue(cookie, tag, BPF_ANY));
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700180 }
181 int totalCount = 0;
182 int totalSum = 0;
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800183 const auto iterateWithoutDeletion =
184 [&totalCount, &totalSum](const uint64_t& key, const BpfMap<uint64_t, UidTagValue>&) {
185 EXPECT_GE((uint64_t)5, key);
186 totalCount++;
187 totalSum += key;
Steven Morelanda3074542020-01-13 14:13:44 -0800188 return Result<void>();
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800189 };
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900190 EXPECT_RESULT_OK(mFakeCookieTagMap.iterate(iterateWithoutDeletion));
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700191 EXPECT_EQ(5, totalCount);
192 EXPECT_EQ(1 + 2 + 3 + 4 + 5, totalSum);
193}
194
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700195TEST_F(BpfNetworkStatsHelperTest, TestUidStatsNoTraffic) {
196 SKIP_IF_BPF_NOT_SUPPORTED;
197
198 StatsValue value1 = {
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700199 .rxPackets = 0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700200 .rxBytes = 0,
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700201 .txPackets = 0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700202 .txBytes = 0,
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700203 };
204 Stats result1 = {};
205 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID1, &result1, mFakeAppUidStatsMap));
206 expectStatsEqual(value1, result1);
207}
208
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800209TEST_F(BpfNetworkStatsHelperTest, TestGetUidStatsTotal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700210 SKIP_IF_BPF_NOT_SUPPORTED;
211
Chenbo Feng33a4de12018-03-16 18:10:07 -0700212 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700213 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
214 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700215 StatsValue value1 = {
216 .rxPackets = TEST_PACKET0,
217 .rxBytes = TEST_BYTES0,
218 .txPackets = TEST_PACKET1,
219 .txBytes = TEST_BYTES1,
220 };
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700221 StatsValue value2 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700222 .rxPackets = TEST_PACKET0 * 2,
223 .rxBytes = TEST_BYTES0 * 2,
224 .txPackets = TEST_PACKET1 * 2,
225 .txBytes = TEST_BYTES1 * 2,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700226 };
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900227 ASSERT_RESULT_OK(mFakeAppUidStatsMap.writeValue(TEST_UID1, value1, BPF_ANY));
228 ASSERT_RESULT_OK(mFakeAppUidStatsMap.writeValue(TEST_UID2, value2, BPF_ANY));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700229 Stats result1 = {};
230 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID1, &result1, mFakeAppUidStatsMap));
231 expectStatsEqual(value1, result1);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700232
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800233 Stats result2 = {};
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700234 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID2, &result2, mFakeAppUidStatsMap));
235 expectStatsEqual(value2, result2);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800236 std::vector<stats_line> lines;
237 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700238 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
239 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET1, value1, mFakeStatsMap);
240 populateFakeStats(TEST_UID2, 0, IFACE_INDEX3, TEST_COUNTERSET1, value1, mFakeStatsMap);
Chenbo Feng16513482018-03-15 17:59:58 -0700241 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700242 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800243 ASSERT_EQ((unsigned long)2, lines.size());
244 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700245 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700246 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800247 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700248 expectStatsLineEqual(value1, IFACE_NAME3, TEST_UID2, TEST_COUNTERSET1, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800249}
250
251TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsInternal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700252 SKIP_IF_BPF_NOT_SUPPORTED;
253
Chenbo Feng33a4de12018-03-16 18:10:07 -0700254 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
255 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
256 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
257 StatsValue value1 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700258 .rxPackets = TEST_PACKET0,
259 .rxBytes = TEST_BYTES0,
260 .txPackets = TEST_PACKET1,
261 .txBytes = TEST_BYTES1,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700262 };
263 StatsValue value2 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700264 .rxPackets = TEST_PACKET1,
265 .rxBytes = TEST_BYTES1,
266 .txPackets = TEST_PACKET0,
267 .txBytes = TEST_BYTES0,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700268 };
269 uint32_t ifaceStatsKey = IFACE_INDEX1;
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900270 EXPECT_RESULT_OK(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700271 ifaceStatsKey = IFACE_INDEX2;
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900272 EXPECT_RESULT_OK(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700273 ifaceStatsKey = IFACE_INDEX3;
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900274 EXPECT_RESULT_OK(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700275
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800276 Stats result1 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700277 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME1, &result1, mFakeIfaceStatsMap,
278 mFakeIfaceIndexNameMap));
279 expectStatsEqual(value1, result1);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800280 Stats result2 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700281 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME2, &result2, mFakeIfaceStatsMap,
282 mFakeIfaceIndexNameMap));
283 expectStatsEqual(value2, result2);
284 Stats totalResult = {};
285 ASSERT_EQ(0, bpfGetIfaceStatsInternal(NULL, &totalResult, mFakeIfaceStatsMap,
286 mFakeIfaceIndexNameMap));
287 StatsValue totalValue = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700288 .rxPackets = TEST_PACKET0 * 2 + TEST_PACKET1,
289 .rxBytes = TEST_BYTES0 * 2 + TEST_BYTES1,
290 .txPackets = TEST_PACKET1 * 2 + TEST_PACKET0,
291 .txBytes = TEST_BYTES1 * 2 + TEST_BYTES0,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700292 };
293 expectStatsEqual(totalValue, totalResult);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800294}
295
296TEST_F(BpfNetworkStatsHelperTest, TestGetStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700297 SKIP_IF_BPF_NOT_SUPPORTED;
298
Chenbo Feng33a4de12018-03-16 18:10:07 -0700299 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
300 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700301 StatsValue value1 = {
302 .rxPackets = TEST_PACKET0,
303 .rxBytes = TEST_BYTES0,
304 .txPackets = TEST_PACKET1,
305 .txBytes = TEST_BYTES1,
306 };
Chenbo Fengf434e862018-06-27 14:08:39 -0700307 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
308 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700309 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700310 mFakeStatsMap);
311 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800312 std::vector<stats_line> lines;
313 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700314 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
315 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700316 ASSERT_EQ((unsigned long)4, lines.size());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800317 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700318 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700319 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700320 ASSERT_EQ((unsigned long)3, lines.size());
321 lines.clear();
322 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700323 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800324 ASSERT_EQ((unsigned long)2, lines.size());
325 lines.clear();
Chenbo Feng33a4de12018-03-16 18:10:07 -0700326 ifaces.push_back(std::string(IFACE_NAME1));
Chenbo Feng16513482018-03-15 17:59:58 -0700327 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700328 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng7e974052018-02-28 22:57:21 -0800329 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng33a4de12018-03-16 18:10:07 -0700330 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800331}
332
333TEST_F(BpfNetworkStatsHelperTest, TestGetStatsWithSkippedIface) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700334 SKIP_IF_BPF_NOT_SUPPORTED;
335
Chenbo Feng33a4de12018-03-16 18:10:07 -0700336 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
337 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700338 StatsValue value1 = {
339 .rxPackets = TEST_PACKET0,
340 .rxBytes = TEST_BYTES0,
341 .txPackets = TEST_PACKET1,
342 .txBytes = TEST_BYTES1,
343 };
Chenbo Fengf434e862018-06-27 14:08:39 -0700344 populateFakeStats(0, 0, 0, OVERFLOW_COUNTERSET, value1, mFakeStatsMap);
345 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
346 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value1, mFakeStatsMap);
347 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET1, value1, mFakeStatsMap);
348 populateFakeStats(TEST_UID2, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800349 std::vector<stats_line> lines;
350 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700351 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
352 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700353 ASSERT_EQ((unsigned long)4, lines.size());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800354 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700355 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700356 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700357 ASSERT_EQ((unsigned long)3, lines.size());
Chenbo Feng7e974052018-02-28 22:57:21 -0800358 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700359 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700360 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800361 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng33a4de12018-03-16 18:10:07 -0700362 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800363 lines.clear();
Chenbo Feng33a4de12018-03-16 18:10:07 -0700364 ifaces.push_back(std::string(IFACE_NAME1));
Chenbo Feng16513482018-03-15 17:59:58 -0700365 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700366 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800367 ASSERT_EQ((unsigned long)2, lines.size());
368}
369
Chenbo Feng7e974052018-02-28 22:57:21 -0800370TEST_F(BpfNetworkStatsHelperTest, TestUnkownIfaceError) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700371 SKIP_IF_BPF_NOT_SUPPORTED;
372
Chenbo Feng33a4de12018-03-16 18:10:07 -0700373 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700374 StatsValue value1 = {
375 .rxPackets = TEST_PACKET0,
376 .rxBytes = TEST_BYTES0 * 20,
377 .txPackets = TEST_PACKET1,
378 .txBytes = TEST_BYTES1 * 20,
379 };
Chenbo Feng7e974052018-02-28 22:57:21 -0800380 uint32_t ifaceIndex = UNKNOWN_IFACE;
Chenbo Fengf434e862018-06-27 14:08:39 -0700381 populateFakeStats(TEST_UID1, 0, ifaceIndex, TEST_COUNTERSET0, value1, mFakeStatsMap);
382 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700383 StatsValue value2 = {
384 .rxPackets = TEST_PACKET0,
385 .rxBytes = TEST_BYTES0 * 40,
386 .txPackets = TEST_PACKET1,
387 .txBytes = TEST_BYTES1 * 40,
388 };
Chenbo Fengf434e862018-06-27 14:08:39 -0700389 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700390 StatsKey curKey = {
391 .uid = TEST_UID1,
392 .tag = 0,
393 .counterSet = TEST_COUNTERSET0,
394 .ifaceIndex = ifaceIndex,
395 };
Chenbo Feng7e974052018-02-28 22:57:21 -0800396 char ifname[IFNAMSIZ];
Chenbo Feng33a4de12018-03-16 18:10:07 -0700397 int64_t unknownIfaceBytesTotal = 0;
Chenbo Fengf434e862018-06-27 14:08:39 -0700398 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700399 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700400 ASSERT_EQ(((int64_t)(TEST_BYTES0 * 20 + TEST_BYTES1 * 20)), unknownIfaceBytesTotal);
401 curKey.ifaceIndex = IFACE_INDEX2;
Chenbo Fengf434e862018-06-27 14:08:39 -0700402 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700403 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700404 ASSERT_EQ(-1, unknownIfaceBytesTotal);
405 std::vector<stats_line> lines;
406 std::vector<std::string> ifaces;
407 // TODO: find a way to test the total of unknown Iface Bytes go above limit.
Chenbo Fengf434e862018-06-27 14:08:39 -0700408 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
409 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700410 ASSERT_EQ((unsigned long)1, lines.size());
411 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines.front());
Chenbo Feng7e974052018-02-28 22:57:21 -0800412}
413
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700414TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700415 SKIP_IF_BPF_NOT_SUPPORTED;
416
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700417 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
418 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
419 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700420 updateIfaceMap(LONG_IFACE_NAME, IFACE_INDEX4);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700421 StatsValue value1 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700422 .rxPackets = TEST_PACKET0,
423 .rxBytes = TEST_BYTES0,
424 .txPackets = TEST_PACKET1,
425 .txBytes = TEST_BYTES1,
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700426 };
427 StatsValue value2 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700428 .rxPackets = TEST_PACKET1,
429 .rxBytes = TEST_BYTES1,
430 .txPackets = TEST_PACKET0,
431 .txBytes = TEST_BYTES0,
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700432 };
433 uint32_t ifaceStatsKey = IFACE_INDEX1;
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900434 EXPECT_RESULT_OK(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700435 ifaceStatsKey = IFACE_INDEX2;
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900436 EXPECT_RESULT_OK(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700437 ifaceStatsKey = IFACE_INDEX3;
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900438 EXPECT_RESULT_OK(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700439 ifaceStatsKey = IFACE_INDEX4;
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900440 EXPECT_RESULT_OK(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700441 std::vector<stats_line> lines;
442 ASSERT_EQ(0,
443 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700444 ASSERT_EQ((unsigned long)4, lines.size());
junyulaia130ac22018-11-09 16:12:29 +0800445
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700446 expectStatsLineEqual(value1, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
447 expectStatsLineEqual(value1, IFACE_NAME3, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
448 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[2]);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700449 ASSERT_EQ(0, strcmp(TRUNCATED_IFACE_NAME, lines[3].iface));
450 expectStatsLineEqual(value2, TRUNCATED_IFACE_NAME, UID_ALL, SET_ALL, TAG_NONE, lines[3]);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700451}
junyulaia130ac22018-11-09 16:12:29 +0800452
453TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortedAndGrouped) {
454 SKIP_IF_BPF_NOT_SUPPORTED;
455
456 // Create iface indexes with duplicate iface name.
457 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
458 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
459 updateIfaceMap(IFACE_NAME1, IFACE_INDEX3); // Duplicate!
460
461 StatsValue value1 = {
junyulaia130ac22018-11-09 16:12:29 +0800462 .rxPackets = TEST_PACKET0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700463 .rxBytes = TEST_BYTES0,
junyulaia130ac22018-11-09 16:12:29 +0800464 .txPackets = TEST_PACKET1,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700465 .txBytes = TEST_BYTES1,
junyulaia130ac22018-11-09 16:12:29 +0800466 };
467 StatsValue value2 = {
junyulaia130ac22018-11-09 16:12:29 +0800468 .rxPackets = TEST_PACKET1,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700469 .rxBytes = TEST_BYTES1,
junyulaia130ac22018-11-09 16:12:29 +0800470 .txPackets = TEST_PACKET0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700471 .txBytes = TEST_BYTES0,
junyulaia130ac22018-11-09 16:12:29 +0800472 };
473 StatsValue value3 = {
junyulaia130ac22018-11-09 16:12:29 +0800474 .rxPackets = TEST_PACKET0 * 2,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700475 .rxBytes = TEST_BYTES0 * 2,
junyulaia130ac22018-11-09 16:12:29 +0800476 .txPackets = TEST_PACKET1 * 2,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700477 .txBytes = TEST_BYTES1 * 2,
junyulaia130ac22018-11-09 16:12:29 +0800478 };
479
480 std::vector<stats_line> lines;
481 std::vector<std::string> ifaces;
482
483 // Test empty stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700484 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
485 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800486 ASSERT_EQ((size_t) 0, lines.size());
487 lines.clear();
488
489 // Test 1 line stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700490 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
491 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
492 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800493 ASSERT_EQ((size_t) 1, lines.size());
494 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
495 lines.clear();
496
497 // These items should not be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700498 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
499 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET1, value2, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800500 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700501 mFakeStatsMap);
502 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
503 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
504 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800505 ASSERT_EQ((size_t) 5, lines.size());
506 lines.clear();
507
508 // These items should be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700509 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
510 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800511
Chenbo Fengf434e862018-06-27 14:08:39 -0700512 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
513 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800514 ASSERT_EQ((size_t) 5, lines.size());
515
516 // Verify Sorted & Grouped.
517 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
518 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET1, TEST_TAG, lines[1]);
519 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG + 1, lines[2]);
520 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, TEST_TAG, lines[3]);
521 expectStatsLineEqual(value2, IFACE_NAME2, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[4]);
522 lines.clear();
523
524 // Perform test on IfaceStats.
525 uint32_t ifaceStatsKey = IFACE_INDEX2;
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900526 EXPECT_RESULT_OK(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY));
junyulaia130ac22018-11-09 16:12:29 +0800527 ifaceStatsKey = IFACE_INDEX1;
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900528 EXPECT_RESULT_OK(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
junyulaia130ac22018-11-09 16:12:29 +0800529
530 // This should be grouped.
531 ifaceStatsKey = IFACE_INDEX3;
Bernie Innocentidfd5a432020-02-12 09:21:56 +0900532 EXPECT_RESULT_OK(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY));
junyulaia130ac22018-11-09 16:12:29 +0800533
534 ASSERT_EQ(0,
535 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
536 ASSERT_EQ((size_t) 2, lines.size());
537
538 expectStatsLineEqual(value3, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
539 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
540 lines.clear();
541}
542
543// Test to verify that subtract overflow will not be triggered by the compare function invoked from
544// sorting. See http:/b/119193941.
545TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortAndOverflow) {
Xiao Mae5317722018-12-12 17:49:34 +0900546 SKIP_IF_BPF_NOT_SUPPORTED;
547
junyulaia130ac22018-11-09 16:12:29 +0800548 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
549
550 StatsValue value1 = {
junyulaia130ac22018-11-09 16:12:29 +0800551 .rxPackets = TEST_PACKET0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700552 .rxBytes = TEST_BYTES0,
junyulaia130ac22018-11-09 16:12:29 +0800553 .txPackets = TEST_PACKET1,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700554 .txBytes = TEST_BYTES1,
junyulaia130ac22018-11-09 16:12:29 +0800555 };
556
557 // Mutate uid, 0 < TEST_UID1 < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700558 populateFakeStats(0, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
559 populateFakeStats(UINT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
560 populateFakeStats(INT_MIN, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
561 populateFakeStats(INT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800562
563 // Mutate tag, 0 < TEST_TAG < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700564 populateFakeStats(TEST_UID1, INT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
565 populateFakeStats(TEST_UID1, INT_MIN, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
566 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
567 populateFakeStats(TEST_UID1, UINT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800568
569 // TODO: Mutate counterSet and enlarge TEST_MAP_SIZE if overflow on counterSet is possible.
570
571 std::vector<stats_line> lines;
572 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700573 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
574 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800575 ASSERT_EQ((size_t) 8, lines.size());
576
577 // Uid 0 first
578 expectStatsLineEqual(value1, IFACE_NAME1, 0, TEST_COUNTERSET0, TEST_TAG, lines[0]);
579
580 // Test uid, mutate tag.
581 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines[1]);
582 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MAX, lines[2]);
583 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MIN, lines[3]);
584 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, UINT_MAX, lines[4]);
585
586 // Mutate uid.
587 expectStatsLineEqual(value1, IFACE_NAME1, INT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[5]);
588 expectStatsLineEqual(value1, IFACE_NAME1, INT_MIN, TEST_COUNTERSET0, TEST_TAG, lines[6]);
589 expectStatsLineEqual(value1, IFACE_NAME1, UINT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[7]);
590 lines.clear();
591}
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800592} // namespace bpf
593} // namespace android