blob: d1e10e8764f78c491fa006c4bdb7996e2fe4d220 [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 Żenczykowski7e1ee772020-01-17 18:46:39 -080083 mFakeCookieTagMap = BpfMap<uint64_t, UidTagValue>(BPF_MAP_TYPE_HASH, TEST_MAP_SIZE, 0);
Chenbo Feng4f6c2372018-04-26 10:37:55 -070084 ASSERT_LE(0, mFakeCookieTagMap.getMap());
Chenbo Fengdc4e3252017-12-22 11:00:52 -080085
Maciej Żenczykowski7e1ee772020-01-17 18:46:39 -080086 mFakeAppUidStatsMap = BpfMap<uint32_t, StatsValue>(BPF_MAP_TYPE_HASH, TEST_MAP_SIZE, 0);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070087 ASSERT_LE(0, mFakeAppUidStatsMap.getMap());
88
Maciej Żenczykowski7e1ee772020-01-17 18:46:39 -080089 mFakeStatsMap = BpfMap<StatsKey, StatsValue>(BPF_MAP_TYPE_HASH, TEST_MAP_SIZE, 0);
Chenbo Fengf434e862018-06-27 14:08:39 -070090 ASSERT_LE(0, mFakeStatsMap.getMap());
Chenbo Feng7e974052018-02-28 22:57:21 -080091
Maciej Żenczykowski7e1ee772020-01-17 18:46:39 -080092 mFakeIfaceIndexNameMap = BpfMap<uint32_t, IfaceValue>(BPF_MAP_TYPE_HASH, TEST_MAP_SIZE, 0);
Chenbo Feng4f6c2372018-04-26 10:37:55 -070093 ASSERT_LE(0, mFakeIfaceIndexNameMap.getMap());
Chenbo Feng33a4de12018-03-16 18:10:07 -070094
Maciej Żenczykowski7e1ee772020-01-17 18:46:39 -080095 mFakeIfaceStatsMap = BpfMap<uint32_t, StatsValue>(BPF_MAP_TYPE_HASH, TEST_MAP_SIZE, 0);
Chenbo Feng4f6c2372018-04-26 10:37:55 -070096 ASSERT_LE(0, mFakeIfaceStatsMap.getMap());
Chenbo Fengdc4e3252017-12-22 11:00:52 -080097 }
98
99 void expectUidTag(uint64_t cookie, uid_t uid, uint32_t tag) {
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700100 auto tagResult = mFakeCookieTagMap.readValue(cookie);
101 EXPECT_TRUE(isOk(tagResult));
102 EXPECT_EQ(uid, tagResult.value().uid);
103 EXPECT_EQ(tag, tagResult.value().tag);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800104 }
105
106 void populateFakeStats(uid_t uid, uint32_t tag, uint32_t ifaceIndex, uint32_t counterSet,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700107 StatsValue value, BpfMap<StatsKey, StatsValue>& map) {
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800108 StatsKey key = {
109 .uid = (uint32_t)uid, .tag = tag, .counterSet = counterSet, .ifaceIndex = ifaceIndex};
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700110 EXPECT_TRUE(isOk(map.writeValue(key, value, BPF_ANY)));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800111 }
Chenbo Feng7e974052018-02-28 22:57:21 -0800112
Chenbo Feng33a4de12018-03-16 18:10:07 -0700113 void updateIfaceMap(const char* ifaceName, uint32_t ifaceIndex) {
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700114 IfaceValue iface;
115 strlcpy(iface.name, ifaceName, IFNAMSIZ);
116 EXPECT_TRUE(isOk(mFakeIfaceIndexNameMap.writeValue(ifaceIndex, iface, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700117 }
118
119 void expectStatsEqual(const StatsValue& target, const Stats& result) {
120 EXPECT_EQ(target.rxPackets, result.rxPackets);
121 EXPECT_EQ(target.rxBytes, result.rxBytes);
122 EXPECT_EQ(target.txPackets, result.txPackets);
123 EXPECT_EQ(target.txBytes, result.txBytes);
124 }
125
126 void expectStatsLineEqual(const StatsValue target, const char* iface, uint32_t uid,
127 int counterSet, uint32_t tag, const stats_line& result) {
128 EXPECT_EQ(0, strcmp(iface, result.iface));
129 EXPECT_EQ(uid, (uint32_t)result.uid);
junyulaia130ac22018-11-09 16:12:29 +0800130 EXPECT_EQ((uint32_t) counterSet, result.set);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700131 EXPECT_EQ(tag, (uint32_t)result.tag);
132 EXPECT_EQ(target.rxPackets, (uint64_t)result.rxPackets);
133 EXPECT_EQ(target.rxBytes, (uint64_t)result.rxBytes);
134 EXPECT_EQ(target.txPackets, (uint64_t)result.txPackets);
135 EXPECT_EQ(target.txBytes, (uint64_t)result.txBytes);
Chenbo Feng7e974052018-02-28 22:57:21 -0800136 }
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800137};
138
139// TEST to verify the behavior of bpf map when cocurrent deletion happens when
140// iterating the same map.
141TEST_F(BpfNetworkStatsHelperTest, TestIterateMapWithDeletion) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700142 SKIP_IF_BPF_NOT_SUPPORTED;
143
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800144 for (int i = 0; i < 5; i++) {
145 uint64_t cookie = i + 1;
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800146 UidTagValue tag = {.uid = TEST_UID1, .tag = TEST_TAG};
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700147 EXPECT_TRUE(isOk(mFakeCookieTagMap.writeValue(cookie, tag, BPF_ANY)));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800148 }
149 uint64_t curCookie = 0;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700150 auto nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
151 EXPECT_TRUE(isOk(nextCookie));
152 uint64_t headOfMap = nextCookie.value();
153 curCookie = nextCookie.value();
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800154 // Find the second entry in the map, then immediately delete it.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700155 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
156 EXPECT_TRUE(isOk(nextCookie));
157 EXPECT_TRUE(isOk(mFakeCookieTagMap.deleteValue((nextCookie.value()))));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800158 // Find the entry that is now immediately after headOfMap, then delete that.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700159 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
160 EXPECT_TRUE(isOk(nextCookie));
161 EXPECT_TRUE(isOk(mFakeCookieTagMap.deleteValue((nextCookie.value()))));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800162 // Attempting to read an entry that has been deleted fails with ENOENT.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700163 curCookie = nextCookie.value();
164 auto tagResult = mFakeCookieTagMap.readValue(curCookie);
165 EXPECT_EQ(ENOENT, tagResult.status().code());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800166 // Finding the entry after our deleted entry restarts iteration from the beginning of the map.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700167 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
168 EXPECT_TRUE(isOk(nextCookie));
169 EXPECT_EQ(headOfMap, nextCookie.value());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800170}
171
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700172TEST_F(BpfNetworkStatsHelperTest, TestBpfIterateMap) {
173 SKIP_IF_BPF_NOT_SUPPORTED;
174
175 for (int i = 0; i < 5; i++) {
176 uint64_t cookie = i + 1;
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800177 UidTagValue tag = {.uid = TEST_UID1, .tag = TEST_TAG};
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700178 EXPECT_TRUE(isOk(mFakeCookieTagMap.writeValue(cookie, tag, BPF_ANY)));
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700179 }
180 int totalCount = 0;
181 int totalSum = 0;
Maciej Żenczykowski11ec78b2019-12-30 06:39:32 -0800182 const auto iterateWithoutDeletion =
183 [&totalCount, &totalSum](const uint64_t& key, const BpfMap<uint64_t, UidTagValue>&) {
184 EXPECT_GE((uint64_t)5, key);
185 totalCount++;
186 totalSum += key;
187 return netdutils::status::ok;
188 };
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700189 EXPECT_TRUE(isOk(mFakeCookieTagMap.iterate(iterateWithoutDeletion)));
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700190 EXPECT_EQ(5, totalCount);
191 EXPECT_EQ(1 + 2 + 3 + 4 + 5, totalSum);
192}
193
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700194TEST_F(BpfNetworkStatsHelperTest, TestUidStatsNoTraffic) {
195 SKIP_IF_BPF_NOT_SUPPORTED;
196
197 StatsValue value1 = {
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700198 .rxPackets = 0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700199 .rxBytes = 0,
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700200 .txPackets = 0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700201 .txBytes = 0,
Chenbo Feng1002c2c2019-04-04 15:53:59 -0700202 };
203 Stats result1 = {};
204 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID1, &result1, mFakeAppUidStatsMap));
205 expectStatsEqual(value1, result1);
206}
207
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800208TEST_F(BpfNetworkStatsHelperTest, TestGetUidStatsTotal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700209 SKIP_IF_BPF_NOT_SUPPORTED;
210
Chenbo Feng33a4de12018-03-16 18:10:07 -0700211 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700212 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
213 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700214 StatsValue value1 = {
215 .rxPackets = TEST_PACKET0,
216 .rxBytes = TEST_BYTES0,
217 .txPackets = TEST_PACKET1,
218 .txBytes = TEST_BYTES1,
219 };
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700220 StatsValue value2 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700221 .rxPackets = TEST_PACKET0 * 2,
222 .rxBytes = TEST_BYTES0 * 2,
223 .txPackets = TEST_PACKET1 * 2,
224 .txBytes = TEST_BYTES1 * 2,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700225 };
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700226 ASSERT_TRUE(isOk(mFakeAppUidStatsMap.writeValue(TEST_UID1, value1, BPF_ANY)));
227 ASSERT_TRUE(isOk(mFakeAppUidStatsMap.writeValue(TEST_UID2, value2, BPF_ANY)));
228 Stats result1 = {};
229 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID1, &result1, mFakeAppUidStatsMap));
230 expectStatsEqual(value1, result1);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700231
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800232 Stats result2 = {};
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700233 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID2, &result2, mFakeAppUidStatsMap));
234 expectStatsEqual(value2, result2);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800235 std::vector<stats_line> lines;
236 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700237 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
238 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET1, value1, mFakeStatsMap);
239 populateFakeStats(TEST_UID2, 0, IFACE_INDEX3, TEST_COUNTERSET1, value1, mFakeStatsMap);
Chenbo Feng16513482018-03-15 17:59:58 -0700240 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700241 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800242 ASSERT_EQ((unsigned long)2, lines.size());
243 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700244 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700245 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800246 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700247 expectStatsLineEqual(value1, IFACE_NAME3, TEST_UID2, TEST_COUNTERSET1, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800248}
249
250TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsInternal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700251 SKIP_IF_BPF_NOT_SUPPORTED;
252
Chenbo Feng33a4de12018-03-16 18:10:07 -0700253 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
254 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
255 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
256 StatsValue value1 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700257 .rxPackets = TEST_PACKET0,
258 .rxBytes = TEST_BYTES0,
259 .txPackets = TEST_PACKET1,
260 .txBytes = TEST_BYTES1,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700261 };
262 StatsValue value2 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700263 .rxPackets = TEST_PACKET1,
264 .rxBytes = TEST_BYTES1,
265 .txPackets = TEST_PACKET0,
266 .txBytes = TEST_BYTES0,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700267 };
268 uint32_t ifaceStatsKey = IFACE_INDEX1;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700269 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700270 ifaceStatsKey = IFACE_INDEX2;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700271 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700272 ifaceStatsKey = IFACE_INDEX3;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700273 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700274
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800275 Stats result1 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700276 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME1, &result1, mFakeIfaceStatsMap,
277 mFakeIfaceIndexNameMap));
278 expectStatsEqual(value1, result1);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800279 Stats result2 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700280 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME2, &result2, mFakeIfaceStatsMap,
281 mFakeIfaceIndexNameMap));
282 expectStatsEqual(value2, result2);
283 Stats totalResult = {};
284 ASSERT_EQ(0, bpfGetIfaceStatsInternal(NULL, &totalResult, mFakeIfaceStatsMap,
285 mFakeIfaceIndexNameMap));
286 StatsValue totalValue = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700287 .rxPackets = TEST_PACKET0 * 2 + TEST_PACKET1,
288 .rxBytes = TEST_BYTES0 * 2 + TEST_BYTES1,
289 .txPackets = TEST_PACKET1 * 2 + TEST_PACKET0,
290 .txBytes = TEST_BYTES1 * 2 + TEST_BYTES0,
Chenbo Feng33a4de12018-03-16 18:10:07 -0700291 };
292 expectStatsEqual(totalValue, totalResult);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800293}
294
295TEST_F(BpfNetworkStatsHelperTest, TestGetStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700296 SKIP_IF_BPF_NOT_SUPPORTED;
297
Chenbo Feng33a4de12018-03-16 18:10:07 -0700298 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
299 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700300 StatsValue value1 = {
301 .rxPackets = TEST_PACKET0,
302 .rxBytes = TEST_BYTES0,
303 .txPackets = TEST_PACKET1,
304 .txBytes = TEST_BYTES1,
305 };
Chenbo Fengf434e862018-06-27 14:08:39 -0700306 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
307 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700308 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700309 mFakeStatsMap);
310 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800311 std::vector<stats_line> lines;
312 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700313 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
314 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700315 ASSERT_EQ((unsigned long)4, lines.size());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800316 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700317 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700318 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700319 ASSERT_EQ((unsigned long)3, lines.size());
320 lines.clear();
321 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700322 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800323 ASSERT_EQ((unsigned long)2, lines.size());
324 lines.clear();
Chenbo Feng33a4de12018-03-16 18:10:07 -0700325 ifaces.push_back(std::string(IFACE_NAME1));
Chenbo Feng16513482018-03-15 17:59:58 -0700326 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700327 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng7e974052018-02-28 22:57:21 -0800328 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng33a4de12018-03-16 18:10:07 -0700329 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800330}
331
332TEST_F(BpfNetworkStatsHelperTest, TestGetStatsWithSkippedIface) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700333 SKIP_IF_BPF_NOT_SUPPORTED;
334
Chenbo Feng33a4de12018-03-16 18:10:07 -0700335 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
336 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700337 StatsValue value1 = {
338 .rxPackets = TEST_PACKET0,
339 .rxBytes = TEST_BYTES0,
340 .txPackets = TEST_PACKET1,
341 .txBytes = TEST_BYTES1,
342 };
Chenbo Fengf434e862018-06-27 14:08:39 -0700343 populateFakeStats(0, 0, 0, OVERFLOW_COUNTERSET, value1, mFakeStatsMap);
344 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
345 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value1, mFakeStatsMap);
346 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET1, value1, mFakeStatsMap);
347 populateFakeStats(TEST_UID2, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800348 std::vector<stats_line> lines;
349 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700350 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
351 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700352 ASSERT_EQ((unsigned long)4, lines.size());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800353 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700354 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700355 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700356 ASSERT_EQ((unsigned long)3, lines.size());
Chenbo Feng7e974052018-02-28 22:57:21 -0800357 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700358 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700359 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800360 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng33a4de12018-03-16 18:10:07 -0700361 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800362 lines.clear();
Chenbo Feng33a4de12018-03-16 18:10:07 -0700363 ifaces.push_back(std::string(IFACE_NAME1));
Chenbo Feng16513482018-03-15 17:59:58 -0700364 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700365 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800366 ASSERT_EQ((unsigned long)2, lines.size());
367}
368
Chenbo Feng7e974052018-02-28 22:57:21 -0800369TEST_F(BpfNetworkStatsHelperTest, TestUnkownIfaceError) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700370 SKIP_IF_BPF_NOT_SUPPORTED;
371
Chenbo Feng33a4de12018-03-16 18:10:07 -0700372 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700373 StatsValue value1 = {
374 .rxPackets = TEST_PACKET0,
375 .rxBytes = TEST_BYTES0 * 20,
376 .txPackets = TEST_PACKET1,
377 .txBytes = TEST_BYTES1 * 20,
378 };
Chenbo Feng7e974052018-02-28 22:57:21 -0800379 uint32_t ifaceIndex = UNKNOWN_IFACE;
Chenbo Fengf434e862018-06-27 14:08:39 -0700380 populateFakeStats(TEST_UID1, 0, ifaceIndex, TEST_COUNTERSET0, value1, mFakeStatsMap);
381 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700382 StatsValue value2 = {
383 .rxPackets = TEST_PACKET0,
384 .rxBytes = TEST_BYTES0 * 40,
385 .txPackets = TEST_PACKET1,
386 .txBytes = TEST_BYTES1 * 40,
387 };
Chenbo Fengf434e862018-06-27 14:08:39 -0700388 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700389 StatsKey curKey = {
390 .uid = TEST_UID1,
391 .tag = 0,
392 .counterSet = TEST_COUNTERSET0,
393 .ifaceIndex = ifaceIndex,
394 };
Chenbo Feng7e974052018-02-28 22:57:21 -0800395 char ifname[IFNAMSIZ];
Chenbo Feng33a4de12018-03-16 18:10:07 -0700396 int64_t unknownIfaceBytesTotal = 0;
Chenbo Fengf434e862018-06-27 14:08:39 -0700397 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700398 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700399 ASSERT_EQ(((int64_t)(TEST_BYTES0 * 20 + TEST_BYTES1 * 20)), unknownIfaceBytesTotal);
400 curKey.ifaceIndex = IFACE_INDEX2;
Chenbo Fengf434e862018-06-27 14:08:39 -0700401 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700402 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700403 ASSERT_EQ(-1, unknownIfaceBytesTotal);
404 std::vector<stats_line> lines;
405 std::vector<std::string> ifaces;
406 // TODO: find a way to test the total of unknown Iface Bytes go above limit.
Chenbo Fengf434e862018-06-27 14:08:39 -0700407 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
408 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700409 ASSERT_EQ((unsigned long)1, lines.size());
410 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines.front());
Chenbo Feng7e974052018-02-28 22:57:21 -0800411}
412
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700413TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700414 SKIP_IF_BPF_NOT_SUPPORTED;
415
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700416 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
417 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
418 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700419 updateIfaceMap(LONG_IFACE_NAME, IFACE_INDEX4);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700420 StatsValue value1 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700421 .rxPackets = TEST_PACKET0,
422 .rxBytes = TEST_BYTES0,
423 .txPackets = TEST_PACKET1,
424 .txBytes = TEST_BYTES1,
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700425 };
426 StatsValue value2 = {
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700427 .rxPackets = TEST_PACKET1,
428 .rxBytes = TEST_BYTES1,
429 .txPackets = TEST_PACKET0,
430 .txBytes = TEST_BYTES0,
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700431 };
432 uint32_t ifaceStatsKey = IFACE_INDEX1;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700433 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700434 ifaceStatsKey = IFACE_INDEX2;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700435 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700436 ifaceStatsKey = IFACE_INDEX3;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700437 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700438 ifaceStatsKey = IFACE_INDEX4;
439 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700440 std::vector<stats_line> lines;
441 ASSERT_EQ(0,
442 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700443 ASSERT_EQ((unsigned long)4, lines.size());
junyulaia130ac22018-11-09 16:12:29 +0800444
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700445 expectStatsLineEqual(value1, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
446 expectStatsLineEqual(value1, IFACE_NAME3, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
447 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[2]);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700448 ASSERT_EQ(0, strcmp(TRUNCATED_IFACE_NAME, lines[3].iface));
449 expectStatsLineEqual(value2, TRUNCATED_IFACE_NAME, UID_ALL, SET_ALL, TAG_NONE, lines[3]);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700450}
junyulaia130ac22018-11-09 16:12:29 +0800451
452TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortedAndGrouped) {
453 SKIP_IF_BPF_NOT_SUPPORTED;
454
455 // Create iface indexes with duplicate iface name.
456 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
457 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
458 updateIfaceMap(IFACE_NAME1, IFACE_INDEX3); // Duplicate!
459
460 StatsValue value1 = {
junyulaia130ac22018-11-09 16:12:29 +0800461 .rxPackets = TEST_PACKET0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700462 .rxBytes = TEST_BYTES0,
junyulaia130ac22018-11-09 16:12:29 +0800463 .txPackets = TEST_PACKET1,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700464 .txBytes = TEST_BYTES1,
junyulaia130ac22018-11-09 16:12:29 +0800465 };
466 StatsValue value2 = {
junyulaia130ac22018-11-09 16:12:29 +0800467 .rxPackets = TEST_PACKET1,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700468 .rxBytes = TEST_BYTES1,
junyulaia130ac22018-11-09 16:12:29 +0800469 .txPackets = TEST_PACKET0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700470 .txBytes = TEST_BYTES0,
junyulaia130ac22018-11-09 16:12:29 +0800471 };
472 StatsValue value3 = {
junyulaia130ac22018-11-09 16:12:29 +0800473 .rxPackets = TEST_PACKET0 * 2,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700474 .rxBytes = TEST_BYTES0 * 2,
junyulaia130ac22018-11-09 16:12:29 +0800475 .txPackets = TEST_PACKET1 * 2,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700476 .txBytes = TEST_BYTES1 * 2,
junyulaia130ac22018-11-09 16:12:29 +0800477 };
478
479 std::vector<stats_line> lines;
480 std::vector<std::string> ifaces;
481
482 // Test empty stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700483 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
484 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800485 ASSERT_EQ((size_t) 0, lines.size());
486 lines.clear();
487
488 // Test 1 line stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700489 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
490 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
491 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800492 ASSERT_EQ((size_t) 1, lines.size());
493 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
494 lines.clear();
495
496 // These items should not be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700497 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
498 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET1, value2, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800499 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700500 mFakeStatsMap);
501 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
502 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
503 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800504 ASSERT_EQ((size_t) 5, lines.size());
505 lines.clear();
506
507 // These items should be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700508 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
509 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800510
Chenbo Fengf434e862018-06-27 14:08:39 -0700511 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
512 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800513 ASSERT_EQ((size_t) 5, lines.size());
514
515 // Verify Sorted & Grouped.
516 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
517 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET1, TEST_TAG, lines[1]);
518 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG + 1, lines[2]);
519 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, TEST_TAG, lines[3]);
520 expectStatsLineEqual(value2, IFACE_NAME2, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[4]);
521 lines.clear();
522
523 // Perform test on IfaceStats.
524 uint32_t ifaceStatsKey = IFACE_INDEX2;
525 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
526 ifaceStatsKey = IFACE_INDEX1;
527 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
528
529 // This should be grouped.
530 ifaceStatsKey = IFACE_INDEX3;
531 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
532
533 ASSERT_EQ(0,
534 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
535 ASSERT_EQ((size_t) 2, lines.size());
536
537 expectStatsLineEqual(value3, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
538 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
539 lines.clear();
540}
541
542// Test to verify that subtract overflow will not be triggered by the compare function invoked from
543// sorting. See http:/b/119193941.
544TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortAndOverflow) {
Xiao Mae5317722018-12-12 17:49:34 +0900545 SKIP_IF_BPF_NOT_SUPPORTED;
546
junyulaia130ac22018-11-09 16:12:29 +0800547 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
548
549 StatsValue value1 = {
junyulaia130ac22018-11-09 16:12:29 +0800550 .rxPackets = TEST_PACKET0,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700551 .rxBytes = TEST_BYTES0,
junyulaia130ac22018-11-09 16:12:29 +0800552 .txPackets = TEST_PACKET1,
Nick Desaulniersa1aae6c2019-10-07 17:43:50 -0700553 .txBytes = TEST_BYTES1,
junyulaia130ac22018-11-09 16:12:29 +0800554 };
555
556 // Mutate uid, 0 < TEST_UID1 < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700557 populateFakeStats(0, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
558 populateFakeStats(UINT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
559 populateFakeStats(INT_MIN, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
560 populateFakeStats(INT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800561
562 // Mutate tag, 0 < TEST_TAG < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700563 populateFakeStats(TEST_UID1, INT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
564 populateFakeStats(TEST_UID1, INT_MIN, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
565 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
566 populateFakeStats(TEST_UID1, UINT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800567
568 // TODO: Mutate counterSet and enlarge TEST_MAP_SIZE if overflow on counterSet is possible.
569
570 std::vector<stats_line> lines;
571 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700572 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
573 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800574 ASSERT_EQ((size_t) 8, lines.size());
575
576 // Uid 0 first
577 expectStatsLineEqual(value1, IFACE_NAME1, 0, TEST_COUNTERSET0, TEST_TAG, lines[0]);
578
579 // Test uid, mutate tag.
580 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines[1]);
581 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MAX, lines[2]);
582 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MIN, lines[3]);
583 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, UINT_MAX, lines[4]);
584
585 // Mutate uid.
586 expectStatsLineEqual(value1, IFACE_NAME1, INT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[5]);
587 expectStatsLineEqual(value1, IFACE_NAME1, INT_MIN, TEST_COUNTERSET0, TEST_TAG, lines[6]);
588 expectStatsLineEqual(value1, IFACE_NAME1, UINT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[7]);
589 lines.clear();
590}
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800591} // namespace bpf
592} // namespace android