blob: 469ba21630b0d4a042b30b14b2be8678feb5032f [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
46using base::unique_fd;
Chenbo Fengdc4e3252017-12-22 11:00:52 -080047
48constexpr int TEST_MAP_SIZE = 10;
49constexpr uid_t TEST_UID1 = 10086;
50constexpr uid_t TEST_UID2 = 12345;
51constexpr uint32_t TEST_TAG = 42;
52constexpr int TEST_COUNTERSET0 = 0;
53constexpr int TEST_COUNTERSET1 = 1;
Chenbo Fengdc4e3252017-12-22 11:00:52 -080054constexpr uint64_t TEST_BYTES0 = 1000;
55constexpr uint64_t TEST_BYTES1 = 2000;
Chenbo Fengdc4e3252017-12-22 11:00:52 -080056constexpr uint64_t TEST_PACKET0 = 100;
57constexpr uint64_t TEST_PACKET1 = 200;
Chenbo Feng4f6c2372018-04-26 10:37:55 -070058constexpr const char IFACE_NAME1[] = "lo";
59constexpr const char IFACE_NAME2[] = "wlan0";
60constexpr const char IFACE_NAME3[] = "rmnet_data0";
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070061// A iface name that the size is bigger then IFNAMSIZ
62constexpr const char LONG_IFACE_NAME[] = "wlanWithALongName";
63constexpr const char TRUNCATED_IFACE_NAME[] = "wlanWithALongNa";
Chenbo Feng33a4de12018-03-16 18:10:07 -070064constexpr uint32_t IFACE_INDEX1 = 1;
65constexpr uint32_t IFACE_INDEX2 = 2;
66constexpr uint32_t IFACE_INDEX3 = 3;
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070067constexpr uint32_t IFACE_INDEX4 = 4;
Chenbo Feng7e974052018-02-28 22:57:21 -080068constexpr uint32_t UNKNOWN_IFACE = 0;
Chenbo Fengdc4e3252017-12-22 11:00:52 -080069
70class BpfNetworkStatsHelperTest : public testing::Test {
71 protected:
72 BpfNetworkStatsHelperTest() {}
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -080073 BpfMap<uint64_t, UidTagValue> mFakeCookieTagMap;
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070074 BpfMap<uint32_t, StatsValue> mFakeAppUidStatsMap;
Chenbo Fengf434e862018-06-27 14:08:39 -070075 BpfMap<StatsKey, StatsValue> mFakeStatsMap;
Chenbo Feng4f6c2372018-04-26 10:37:55 -070076 BpfMap<uint32_t, IfaceValue> mFakeIfaceIndexNameMap;
77 BpfMap<uint32_t, StatsValue> mFakeIfaceStatsMap;
Chenbo Fengdc4e3252017-12-22 11:00:52 -080078
79 void SetUp() {
Chenbo Fengdc4c37e2018-11-20 14:10:00 -080080 SKIP_IF_BPF_NOT_SUPPORTED;
Chenbo Fengef01d8d2019-04-09 11:53:45 -070081 ASSERT_EQ(0, setrlimitForTest());
Chenbo Fengdc4c37e2018-11-20 14:10:00 -080082
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -080083 mFakeCookieTagMap = BpfMap<uint64_t, UidTagValue>(createMap(
84 BPF_MAP_TYPE_HASH, sizeof(uint64_t), sizeof(UidTagValue), 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
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070087 mFakeAppUidStatsMap = BpfMap<uint32_t, StatsValue>(createMap(
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -080088 BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(StatsValue), TEST_MAP_SIZE, 0));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070089 ASSERT_LE(0, mFakeAppUidStatsMap.getMap());
90
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -080091 mFakeStatsMap = BpfMap<StatsKey, StatsValue>(createMap(
92 BPF_MAP_TYPE_HASH, sizeof(StatsKey), sizeof(StatsValue), TEST_MAP_SIZE, 0));
Chenbo Fengf434e862018-06-27 14:08:39 -070093 ASSERT_LE(0, mFakeStatsMap.getMap());
Chenbo Feng7e974052018-02-28 22:57:21 -080094
Chenbo Feng4f6c2372018-04-26 10:37:55 -070095 mFakeIfaceIndexNameMap = BpfMap<uint32_t, IfaceValue>(
96 createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(IfaceValue), TEST_MAP_SIZE, 0));
97 ASSERT_LE(0, mFakeIfaceIndexNameMap.getMap());
Chenbo Feng33a4de12018-03-16 18:10:07 -070098
Chenbo Feng4f6c2372018-04-26 10:37:55 -070099 mFakeIfaceStatsMap = BpfMap<uint32_t, StatsValue>(createMap(
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800100 BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(StatsValue), TEST_MAP_SIZE, 0));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700101 ASSERT_LE(0, mFakeIfaceStatsMap.getMap());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800102 }
103
104 void expectUidTag(uint64_t cookie, uid_t uid, uint32_t tag) {
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700105 auto tagResult = mFakeCookieTagMap.readValue(cookie);
106 EXPECT_TRUE(isOk(tagResult));
107 EXPECT_EQ(uid, tagResult.value().uid);
108 EXPECT_EQ(tag, tagResult.value().tag);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800109 }
110
111 void populateFakeStats(uid_t uid, uint32_t tag, uint32_t ifaceIndex, uint32_t counterSet,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700112 StatsValue value, BpfMap<StatsKey, StatsValue>& map) {
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800113 StatsKey key = {
114 .uid = (uint32_t)uid, .tag = tag, .counterSet = counterSet, .ifaceIndex = ifaceIndex};
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700115 EXPECT_TRUE(isOk(map.writeValue(key, value, BPF_ANY)));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800116 }
Chenbo Feng7e974052018-02-28 22:57:21 -0800117
Chenbo Feng33a4de12018-03-16 18:10:07 -0700118 void updateIfaceMap(const char* ifaceName, uint32_t ifaceIndex) {
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700119 IfaceValue iface;
120 strlcpy(iface.name, ifaceName, IFNAMSIZ);
121 EXPECT_TRUE(isOk(mFakeIfaceIndexNameMap.writeValue(ifaceIndex, iface, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700122 }
123
124 void expectStatsEqual(const StatsValue& target, const Stats& result) {
125 EXPECT_EQ(target.rxPackets, result.rxPackets);
126 EXPECT_EQ(target.rxBytes, result.rxBytes);
127 EXPECT_EQ(target.txPackets, result.txPackets);
128 EXPECT_EQ(target.txBytes, result.txBytes);
129 }
130
131 void expectStatsLineEqual(const StatsValue target, const char* iface, uint32_t uid,
132 int counterSet, uint32_t tag, const stats_line& result) {
133 EXPECT_EQ(0, strcmp(iface, result.iface));
134 EXPECT_EQ(uid, (uint32_t)result.uid);
junyulaia130ac22018-11-09 16:12:29 +0800135 EXPECT_EQ((uint32_t) counterSet, result.set);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700136 EXPECT_EQ(tag, (uint32_t)result.tag);
137 EXPECT_EQ(target.rxPackets, (uint64_t)result.rxPackets);
138 EXPECT_EQ(target.rxBytes, (uint64_t)result.rxBytes);
139 EXPECT_EQ(target.txPackets, (uint64_t)result.txPackets);
140 EXPECT_EQ(target.txBytes, (uint64_t)result.txBytes);
Chenbo Feng7e974052018-02-28 22:57:21 -0800141 }
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800142};
143
144// TEST to verify the behavior of bpf map when cocurrent deletion happens when
145// iterating the same map.
146TEST_F(BpfNetworkStatsHelperTest, TestIterateMapWithDeletion) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700147 SKIP_IF_BPF_NOT_SUPPORTED;
148
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800149 for (int i = 0; i < 5; i++) {
150 uint64_t cookie = i + 1;
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800151 UidTagValue tag = {.uid = TEST_UID1, .tag = TEST_TAG};
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700152 EXPECT_TRUE(isOk(mFakeCookieTagMap.writeValue(cookie, tag, BPF_ANY)));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800153 }
154 uint64_t curCookie = 0;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700155 auto nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
156 EXPECT_TRUE(isOk(nextCookie));
157 uint64_t headOfMap = nextCookie.value();
158 curCookie = nextCookie.value();
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800159 // Find the second entry in the map, then immediately delete it.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700160 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
161 EXPECT_TRUE(isOk(nextCookie));
162 EXPECT_TRUE(isOk(mFakeCookieTagMap.deleteValue((nextCookie.value()))));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800163 // Find the entry that is now immediately after headOfMap, then delete that.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700164 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
165 EXPECT_TRUE(isOk(nextCookie));
166 EXPECT_TRUE(isOk(mFakeCookieTagMap.deleteValue((nextCookie.value()))));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800167 // Attempting to read an entry that has been deleted fails with ENOENT.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700168 curCookie = nextCookie.value();
169 auto tagResult = mFakeCookieTagMap.readValue(curCookie);
170 EXPECT_EQ(ENOENT, tagResult.status().code());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800171 // Finding the entry after our deleted entry restarts iteration from the beginning of the map.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700172 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
173 EXPECT_TRUE(isOk(nextCookie));
174 EXPECT_EQ(headOfMap, nextCookie.value());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800175}
176
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700177TEST_F(BpfNetworkStatsHelperTest, TestBpfIterateMap) {
178 SKIP_IF_BPF_NOT_SUPPORTED;
179
180 for (int i = 0; i < 5; i++) {
181 uint64_t cookie = i + 1;
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800182 UidTagValue tag = {.uid = TEST_UID1, .tag = TEST_TAG};
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700183 EXPECT_TRUE(isOk(mFakeCookieTagMap.writeValue(cookie, tag, BPF_ANY)));
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700184 }
185 int totalCount = 0;
186 int totalSum = 0;
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800187 const auto iterateWithoutDeletion =
188 [&totalCount, &totalSum](const uint64_t& key, const BpfMap<uint64_t, UidTagValue>&) {
189 EXPECT_GE((uint64_t)5, key);
190 totalCount++;
191 totalSum += key;
192 return netdutils::status::ok;
193 };
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700194 EXPECT_TRUE(isOk(mFakeCookieTagMap.iterate(iterateWithoutDeletion)));
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700195 EXPECT_EQ(5, totalCount);
196 EXPECT_EQ(1 + 2 + 3 + 4 + 5, totalSum);
197}
198
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700199TEST_F(BpfNetworkStatsHelperTest, TestUidStatsNoTraffic) {
200 SKIP_IF_BPF_NOT_SUPPORTED;
201
202 StatsValue value1 = {
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700203 .rxPackets = 0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700204 .rxBytes = 0,
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700205 .txPackets = 0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700206 .txBytes = 0,
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700207 };
208 Stats result1 = {};
209 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID1, &result1, mFakeAppUidStatsMap));
210 expectStatsEqual(value1, result1);
211}
212
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800213TEST_F(BpfNetworkStatsHelperTest, TestGetUidStatsTotal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700214 SKIP_IF_BPF_NOT_SUPPORTED;
215
Chenbo Feng33a4de12018-03-16 18:10:07 -0700216 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700217 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
218 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700219 StatsValue value1 = {
220 .rxPackets = TEST_PACKET0,
221 .rxBytes = TEST_BYTES0,
222 .txPackets = TEST_PACKET1,
223 .txBytes = TEST_BYTES1,
224 };
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700225 StatsValue value2 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700226 .rxPackets = TEST_PACKET0 * 2,
227 .rxBytes = TEST_BYTES0 * 2,
228 .txPackets = TEST_PACKET1 * 2,
229 .txBytes = TEST_BYTES1 * 2,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700230 };
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700231 ASSERT_TRUE(isOk(mFakeAppUidStatsMap.writeValue(TEST_UID1, value1, BPF_ANY)));
232 ASSERT_TRUE(isOk(mFakeAppUidStatsMap.writeValue(TEST_UID2, value2, BPF_ANY)));
233 Stats result1 = {};
234 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID1, &result1, mFakeAppUidStatsMap));
235 expectStatsEqual(value1, result1);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700236
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800237 Stats result2 = {};
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700238 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID2, &result2, mFakeAppUidStatsMap));
239 expectStatsEqual(value2, result2);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800240 std::vector<stats_line> lines;
241 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700242 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
243 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET1, value1, mFakeStatsMap);
244 populateFakeStats(TEST_UID2, 0, IFACE_INDEX3, TEST_COUNTERSET1, value1, mFakeStatsMap);
Chenbo Feng16513482018-03-15 17:59:58 -0700245 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700246 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800247 ASSERT_EQ((unsigned long)2, lines.size());
248 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700249 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700250 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800251 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700252 expectStatsLineEqual(value1, IFACE_NAME3, TEST_UID2, TEST_COUNTERSET1, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800253}
254
255TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsInternal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700256 SKIP_IF_BPF_NOT_SUPPORTED;
257
Chenbo Feng33a4de12018-03-16 18:10:07 -0700258 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
259 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
260 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
261 StatsValue value1 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700262 .rxPackets = TEST_PACKET0,
263 .rxBytes = TEST_BYTES0,
264 .txPackets = TEST_PACKET1,
265 .txBytes = TEST_BYTES1,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700266 };
267 StatsValue value2 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700268 .rxPackets = TEST_PACKET1,
269 .rxBytes = TEST_BYTES1,
270 .txPackets = TEST_PACKET0,
271 .txBytes = TEST_BYTES0,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700272 };
273 uint32_t ifaceStatsKey = IFACE_INDEX1;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700274 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700275 ifaceStatsKey = IFACE_INDEX2;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700276 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700277 ifaceStatsKey = IFACE_INDEX3;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700278 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700279
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800280 Stats result1 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700281 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME1, &result1, mFakeIfaceStatsMap,
282 mFakeIfaceIndexNameMap));
283 expectStatsEqual(value1, result1);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800284 Stats result2 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700285 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME2, &result2, mFakeIfaceStatsMap,
286 mFakeIfaceIndexNameMap));
287 expectStatsEqual(value2, result2);
288 Stats totalResult = {};
289 ASSERT_EQ(0, bpfGetIfaceStatsInternal(NULL, &totalResult, mFakeIfaceStatsMap,
290 mFakeIfaceIndexNameMap));
291 StatsValue totalValue = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700292 .rxPackets = TEST_PACKET0 * 2 + TEST_PACKET1,
293 .rxBytes = TEST_BYTES0 * 2 + TEST_BYTES1,
294 .txPackets = TEST_PACKET1 * 2 + TEST_PACKET0,
295 .txBytes = TEST_BYTES1 * 2 + TEST_BYTES0,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700296 };
297 expectStatsEqual(totalValue, totalResult);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800298}
299
300TEST_F(BpfNetworkStatsHelperTest, TestGetStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700301 SKIP_IF_BPF_NOT_SUPPORTED;
302
Chenbo Feng33a4de12018-03-16 18:10:07 -0700303 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
304 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700305 StatsValue value1 = {
306 .rxPackets = TEST_PACKET0,
307 .rxBytes = TEST_BYTES0,
308 .txPackets = TEST_PACKET1,
309 .txBytes = TEST_BYTES1,
310 };
Chenbo Fengf434e862018-06-27 14:08:39 -0700311 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
312 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700313 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700314 mFakeStatsMap);
315 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800316 std::vector<stats_line> lines;
317 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700318 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
319 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700320 ASSERT_EQ((unsigned long)4, lines.size());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800321 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700322 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700323 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700324 ASSERT_EQ((unsigned long)3, lines.size());
325 lines.clear();
326 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700327 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800328 ASSERT_EQ((unsigned long)2, lines.size());
329 lines.clear();
Chenbo Feng33a4de12018-03-16 18:10:07 -0700330 ifaces.push_back(std::string(IFACE_NAME1));
Chenbo Feng16513482018-03-15 17:59:58 -0700331 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700332 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng7e974052018-02-28 22:57:21 -0800333 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng33a4de12018-03-16 18:10:07 -0700334 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800335}
336
337TEST_F(BpfNetworkStatsHelperTest, TestGetStatsWithSkippedIface) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700338 SKIP_IF_BPF_NOT_SUPPORTED;
339
Chenbo Feng33a4de12018-03-16 18:10:07 -0700340 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
341 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700342 StatsValue value1 = {
343 .rxPackets = TEST_PACKET0,
344 .rxBytes = TEST_BYTES0,
345 .txPackets = TEST_PACKET1,
346 .txBytes = TEST_BYTES1,
347 };
Chenbo Fengf434e862018-06-27 14:08:39 -0700348 populateFakeStats(0, 0, 0, OVERFLOW_COUNTERSET, value1, mFakeStatsMap);
349 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
350 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value1, mFakeStatsMap);
351 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET1, value1, mFakeStatsMap);
352 populateFakeStats(TEST_UID2, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800353 std::vector<stats_line> lines;
354 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700355 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
356 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700357 ASSERT_EQ((unsigned long)4, lines.size());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800358 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700359 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700360 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700361 ASSERT_EQ((unsigned long)3, lines.size());
Chenbo Feng7e974052018-02-28 22:57:21 -0800362 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700363 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700364 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800365 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng33a4de12018-03-16 18:10:07 -0700366 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800367 lines.clear();
Chenbo Feng33a4de12018-03-16 18:10:07 -0700368 ifaces.push_back(std::string(IFACE_NAME1));
Chenbo Feng16513482018-03-15 17:59:58 -0700369 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700370 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800371 ASSERT_EQ((unsigned long)2, lines.size());
372}
373
Chenbo Feng7e974052018-02-28 22:57:21 -0800374TEST_F(BpfNetworkStatsHelperTest, TestUnkownIfaceError) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700375 SKIP_IF_BPF_NOT_SUPPORTED;
376
Chenbo Feng33a4de12018-03-16 18:10:07 -0700377 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700378 StatsValue value1 = {
379 .rxPackets = TEST_PACKET0,
380 .rxBytes = TEST_BYTES0 * 20,
381 .txPackets = TEST_PACKET1,
382 .txBytes = TEST_BYTES1 * 20,
383 };
Chenbo Feng7e974052018-02-28 22:57:21 -0800384 uint32_t ifaceIndex = UNKNOWN_IFACE;
Chenbo Fengf434e862018-06-27 14:08:39 -0700385 populateFakeStats(TEST_UID1, 0, ifaceIndex, TEST_COUNTERSET0, value1, mFakeStatsMap);
386 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700387 StatsValue value2 = {
388 .rxPackets = TEST_PACKET0,
389 .rxBytes = TEST_BYTES0 * 40,
390 .txPackets = TEST_PACKET1,
391 .txBytes = TEST_BYTES1 * 40,
392 };
Chenbo Fengf434e862018-06-27 14:08:39 -0700393 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700394 StatsKey curKey = {
395 .uid = TEST_UID1,
396 .tag = 0,
397 .counterSet = TEST_COUNTERSET0,
398 .ifaceIndex = ifaceIndex,
399 };
Chenbo Feng7e974052018-02-28 22:57:21 -0800400 char ifname[IFNAMSIZ];
Chenbo Feng33a4de12018-03-16 18:10:07 -0700401 int64_t unknownIfaceBytesTotal = 0;
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(((int64_t)(TEST_BYTES0 * 20 + TEST_BYTES1 * 20)), unknownIfaceBytesTotal);
405 curKey.ifaceIndex = IFACE_INDEX2;
Chenbo Fengf434e862018-06-27 14:08:39 -0700406 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700407 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700408 ASSERT_EQ(-1, unknownIfaceBytesTotal);
409 std::vector<stats_line> lines;
410 std::vector<std::string> ifaces;
411 // TODO: find a way to test the total of unknown Iface Bytes go above limit.
Chenbo Fengf434e862018-06-27 14:08:39 -0700412 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
413 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700414 ASSERT_EQ((unsigned long)1, lines.size());
415 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines.front());
Chenbo Feng7e974052018-02-28 22:57:21 -0800416}
417
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700418TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700419 SKIP_IF_BPF_NOT_SUPPORTED;
420
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700421 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
422 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
423 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700424 updateIfaceMap(LONG_IFACE_NAME, IFACE_INDEX4);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700425 StatsValue value1 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700426 .rxPackets = TEST_PACKET0,
427 .rxBytes = TEST_BYTES0,
428 .txPackets = TEST_PACKET1,
429 .txBytes = TEST_BYTES1,
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700430 };
431 StatsValue value2 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700432 .rxPackets = TEST_PACKET1,
433 .rxBytes = TEST_BYTES1,
434 .txPackets = TEST_PACKET0,
435 .txBytes = TEST_BYTES0,
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700436 };
437 uint32_t ifaceStatsKey = IFACE_INDEX1;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700438 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700439 ifaceStatsKey = IFACE_INDEX2;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700440 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700441 ifaceStatsKey = IFACE_INDEX3;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700442 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700443 ifaceStatsKey = IFACE_INDEX4;
444 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700445 std::vector<stats_line> lines;
446 ASSERT_EQ(0,
447 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700448 ASSERT_EQ((unsigned long)4, lines.size());
junyulaia130ac22018-11-09 16:12:29 +0800449
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700450 expectStatsLineEqual(value1, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
451 expectStatsLineEqual(value1, IFACE_NAME3, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
452 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[2]);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700453 ASSERT_EQ(0, strcmp(TRUNCATED_IFACE_NAME, lines[3].iface));
454 expectStatsLineEqual(value2, TRUNCATED_IFACE_NAME, UID_ALL, SET_ALL, TAG_NONE, lines[3]);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700455}
junyulaia130ac22018-11-09 16:12:29 +0800456
457TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortedAndGrouped) {
458 SKIP_IF_BPF_NOT_SUPPORTED;
459
460 // Create iface indexes with duplicate iface name.
461 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
462 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
463 updateIfaceMap(IFACE_NAME1, IFACE_INDEX3); // Duplicate!
464
465 StatsValue value1 = {
junyulaia130ac22018-11-09 16:12:29 +0800466 .rxPackets = TEST_PACKET0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700467 .rxBytes = TEST_BYTES0,
junyulaia130ac22018-11-09 16:12:29 +0800468 .txPackets = TEST_PACKET1,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700469 .txBytes = TEST_BYTES1,
junyulaia130ac22018-11-09 16:12:29 +0800470 };
471 StatsValue value2 = {
junyulaia130ac22018-11-09 16:12:29 +0800472 .rxPackets = TEST_PACKET1,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700473 .rxBytes = TEST_BYTES1,
junyulaia130ac22018-11-09 16:12:29 +0800474 .txPackets = TEST_PACKET0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700475 .txBytes = TEST_BYTES0,
junyulaia130ac22018-11-09 16:12:29 +0800476 };
477 StatsValue value3 = {
junyulaia130ac22018-11-09 16:12:29 +0800478 .rxPackets = TEST_PACKET0 * 2,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700479 .rxBytes = TEST_BYTES0 * 2,
junyulaia130ac22018-11-09 16:12:29 +0800480 .txPackets = TEST_PACKET1 * 2,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700481 .txBytes = TEST_BYTES1 * 2,
junyulaia130ac22018-11-09 16:12:29 +0800482 };
483
484 std::vector<stats_line> lines;
485 std::vector<std::string> ifaces;
486
487 // Test empty stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700488 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
489 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800490 ASSERT_EQ((size_t) 0, lines.size());
491 lines.clear();
492
493 // Test 1 line stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700494 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
495 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
496 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800497 ASSERT_EQ((size_t) 1, lines.size());
498 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
499 lines.clear();
500
501 // These items should not be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700502 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
503 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET1, value2, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800504 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700505 mFakeStatsMap);
506 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
507 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
508 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800509 ASSERT_EQ((size_t) 5, lines.size());
510 lines.clear();
511
512 // These items should be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700513 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
514 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800515
Chenbo Fengf434e862018-06-27 14:08:39 -0700516 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
517 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800518 ASSERT_EQ((size_t) 5, lines.size());
519
520 // Verify Sorted & Grouped.
521 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
522 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET1, TEST_TAG, lines[1]);
523 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG + 1, lines[2]);
524 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, TEST_TAG, lines[3]);
525 expectStatsLineEqual(value2, IFACE_NAME2, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[4]);
526 lines.clear();
527
528 // Perform test on IfaceStats.
529 uint32_t ifaceStatsKey = IFACE_INDEX2;
530 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
531 ifaceStatsKey = IFACE_INDEX1;
532 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
533
534 // This should be grouped.
535 ifaceStatsKey = IFACE_INDEX3;
536 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
537
538 ASSERT_EQ(0,
539 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
540 ASSERT_EQ((size_t) 2, lines.size());
541
542 expectStatsLineEqual(value3, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
543 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
544 lines.clear();
545}
546
547// Test to verify that subtract overflow will not be triggered by the compare function invoked from
548// sorting. See http:/b/119193941.
549TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortAndOverflow) {
Xiao Mae5317722018-12-12 17:49:34 +0900550 SKIP_IF_BPF_NOT_SUPPORTED;
551
junyulaia130ac22018-11-09 16:12:29 +0800552 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
553
554 StatsValue value1 = {
junyulaia130ac22018-11-09 16:12:29 +0800555 .rxPackets = TEST_PACKET0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700556 .rxBytes = TEST_BYTES0,
junyulaia130ac22018-11-09 16:12:29 +0800557 .txPackets = TEST_PACKET1,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700558 .txBytes = TEST_BYTES1,
junyulaia130ac22018-11-09 16:12:29 +0800559 };
560
561 // Mutate uid, 0 < TEST_UID1 < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700562 populateFakeStats(0, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
563 populateFakeStats(UINT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
564 populateFakeStats(INT_MIN, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
565 populateFakeStats(INT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800566
567 // Mutate tag, 0 < TEST_TAG < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700568 populateFakeStats(TEST_UID1, INT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
569 populateFakeStats(TEST_UID1, INT_MIN, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
570 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
571 populateFakeStats(TEST_UID1, UINT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800572
573 // TODO: Mutate counterSet and enlarge TEST_MAP_SIZE if overflow on counterSet is possible.
574
575 std::vector<stats_line> lines;
576 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700577 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
578 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800579 ASSERT_EQ((size_t) 8, lines.size());
580
581 // Uid 0 first
582 expectStatsLineEqual(value1, IFACE_NAME1, 0, TEST_COUNTERSET0, TEST_TAG, lines[0]);
583
584 // Test uid, mutate tag.
585 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines[1]);
586 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MAX, lines[2]);
587 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MIN, lines[3]);
588 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, UINT_MAX, lines[4]);
589
590 // Mutate uid.
591 expectStatsLineEqual(value1, IFACE_NAME1, INT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[5]);
592 expectStatsLineEqual(value1, IFACE_NAME1, INT_MIN, TEST_COUNTERSET0, TEST_TAG, lines[6]);
593 expectStatsLineEqual(value1, IFACE_NAME1, UINT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[7]);
594 lines.clear();
595}
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800596} // namespace bpf
597} // namespace android