blob: 9ebe11f649b14089a5269831922521ff0fc1c5fd [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() {}
Chenbo Feng4f6c2372018-04-26 10:37:55 -070073 BpfMap<uint64_t, UidTag> 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;
81
Chenbo Feng4f6c2372018-04-26 10:37:55 -070082 mFakeCookieTagMap = BpfMap<uint64_t, UidTag>(createMap(
83 BPF_MAP_TYPE_HASH, sizeof(uint64_t), sizeof(struct UidTag), TEST_MAP_SIZE, 0));
84 ASSERT_LE(0, mFakeCookieTagMap.getMap());
Chenbo Fengdc4e3252017-12-22 11:00:52 -080085
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070086 mFakeAppUidStatsMap = BpfMap<uint32_t, StatsValue>(createMap(
87 BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(struct StatsValue), TEST_MAP_SIZE, 0));
88 ASSERT_LE(0, mFakeAppUidStatsMap.getMap());
89
Chenbo Fengf434e862018-06-27 14:08:39 -070090 mFakeStatsMap = BpfMap<StatsKey, StatsValue>(
91 createMap(BPF_MAP_TYPE_HASH, sizeof(struct StatsKey), sizeof(struct StatsValue),
92 TEST_MAP_SIZE, 0));
93 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(
100 BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(struct StatsValue), TEST_MAP_SIZE, 0));
101 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;
151 struct UidTag 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;
182 struct UidTag 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;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700187 const auto iterateWithoutDeletion = [&totalCount, &totalSum](const uint64_t& key,
188 const BpfMap<uint64_t, UidTag>&) {
189 EXPECT_GE((uint64_t)5, key);
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700190 totalCount++;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700191 totalSum += key;
192 return netdutils::status::ok;
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700193 };
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 = {
203 .rxBytes = 0,
204 .rxPackets = 0,
205 .txBytes = 0,
206 .txPackets = 0,
207 };
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);
Chenbo Fengeac6c472018-02-05 15:06:23 -0800219 StatsValue value1 = {.rxBytes = TEST_BYTES0,
220 .rxPackets = TEST_PACKET0,
221 .txBytes = TEST_BYTES1,
222 .txPackets = TEST_PACKET1,};
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700223 StatsValue value2 = {
Chenbo Feng33a4de12018-03-16 18:10:07 -0700224 .rxBytes = TEST_BYTES0 * 2,
225 .rxPackets = TEST_PACKET0 * 2,
226 .txBytes = TEST_BYTES1 * 2,
227 .txPackets = TEST_PACKET1 * 2,
228 };
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700229 ASSERT_TRUE(isOk(mFakeAppUidStatsMap.writeValue(TEST_UID1, value1, BPF_ANY)));
230 ASSERT_TRUE(isOk(mFakeAppUidStatsMap.writeValue(TEST_UID2, value2, BPF_ANY)));
231 Stats result1 = {};
232 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID1, &result1, mFakeAppUidStatsMap));
233 expectStatsEqual(value1, result1);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700234
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800235 Stats result2 = {};
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700236 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID2, &result2, mFakeAppUidStatsMap));
237 expectStatsEqual(value2, result2);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800238 std::vector<stats_line> lines;
239 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700240 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
241 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET1, value1, mFakeStatsMap);
242 populateFakeStats(TEST_UID2, 0, IFACE_INDEX3, TEST_COUNTERSET1, value1, mFakeStatsMap);
Chenbo Feng16513482018-03-15 17:59:58 -0700243 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700244 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800245 ASSERT_EQ((unsigned long)2, lines.size());
246 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700247 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700248 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800249 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700250 expectStatsLineEqual(value1, IFACE_NAME3, TEST_UID2, TEST_COUNTERSET1, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800251}
252
253TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsInternal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700254 SKIP_IF_BPF_NOT_SUPPORTED;
255
Chenbo Feng33a4de12018-03-16 18:10:07 -0700256 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
257 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
258 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
259 StatsValue value1 = {
260 .rxBytes = TEST_BYTES0,
261 .rxPackets = TEST_PACKET0,
262 .txBytes = TEST_BYTES1,
263 .txPackets = TEST_PACKET1,
264 };
265 StatsValue value2 = {
266 .rxBytes = TEST_BYTES1,
267 .rxPackets = TEST_PACKET1,
268 .txBytes = TEST_BYTES0,
269 .txPackets = TEST_PACKET0,
270 };
271 uint32_t ifaceStatsKey = IFACE_INDEX1;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700272 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700273 ifaceStatsKey = IFACE_INDEX2;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700274 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700275 ifaceStatsKey = IFACE_INDEX3;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700276 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700277
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800278 Stats result1 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700279 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME1, &result1, mFakeIfaceStatsMap,
280 mFakeIfaceIndexNameMap));
281 expectStatsEqual(value1, result1);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800282 Stats result2 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700283 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME2, &result2, mFakeIfaceStatsMap,
284 mFakeIfaceIndexNameMap));
285 expectStatsEqual(value2, result2);
286 Stats totalResult = {};
287 ASSERT_EQ(0, bpfGetIfaceStatsInternal(NULL, &totalResult, mFakeIfaceStatsMap,
288 mFakeIfaceIndexNameMap));
289 StatsValue totalValue = {
290 .rxBytes = TEST_BYTES0 * 2 + TEST_BYTES1,
291 .rxPackets = TEST_PACKET0 * 2 + TEST_PACKET1,
292 .txBytes = TEST_BYTES1 * 2 + TEST_BYTES0,
293 .txPackets = TEST_PACKET1 * 2 + TEST_PACKET0,
294 };
295 expectStatsEqual(totalValue, totalResult);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800296}
297
298TEST_F(BpfNetworkStatsHelperTest, TestGetStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700299 SKIP_IF_BPF_NOT_SUPPORTED;
300
Chenbo Feng33a4de12018-03-16 18:10:07 -0700301 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
302 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Chenbo Fengeac6c472018-02-05 15:06:23 -0800303 StatsValue value1 = {.rxBytes = TEST_BYTES0,
304 .rxPackets = TEST_PACKET0,
305 .txBytes = TEST_BYTES1,
306 .txPackets = TEST_PACKET1,};
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);
Chenbo Fengeac6c472018-02-05 15:06:23 -0800338 StatsValue value1 = {.rxBytes = TEST_BYTES0,
339 .rxPackets = TEST_PACKET0,
340 .txBytes = TEST_BYTES1,
341 .txPackets = TEST_PACKET1,};
Chenbo Fengf434e862018-06-27 14:08:39 -0700342 populateFakeStats(0, 0, 0, OVERFLOW_COUNTERSET, value1, mFakeStatsMap);
343 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
344 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value1, mFakeStatsMap);
345 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET1, value1, mFakeStatsMap);
346 populateFakeStats(TEST_UID2, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800347 std::vector<stats_line> lines;
348 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700349 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
350 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700351 ASSERT_EQ((unsigned long)4, lines.size());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800352 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700353 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700354 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700355 ASSERT_EQ((unsigned long)3, lines.size());
Chenbo Feng7e974052018-02-28 22:57:21 -0800356 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700357 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700358 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800359 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng33a4de12018-03-16 18:10:07 -0700360 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800361 lines.clear();
Chenbo Feng33a4de12018-03-16 18:10:07 -0700362 ifaces.push_back(std::string(IFACE_NAME1));
Chenbo Feng16513482018-03-15 17:59:58 -0700363 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700364 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800365 ASSERT_EQ((unsigned long)2, lines.size());
366}
367
Chenbo Feng7e974052018-02-28 22:57:21 -0800368TEST_F(BpfNetworkStatsHelperTest, TestUnkownIfaceError) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700369 SKIP_IF_BPF_NOT_SUPPORTED;
370
Chenbo Feng33a4de12018-03-16 18:10:07 -0700371 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
Chenbo Feng7e974052018-02-28 22:57:21 -0800372 StatsValue value1 = {.rxBytes = TEST_BYTES0 * 20,
373 .rxPackets = TEST_PACKET0,
374 .txBytes = TEST_BYTES1 * 20,
375 .txPackets = TEST_PACKET1,};
376 uint32_t ifaceIndex = UNKNOWN_IFACE;
Chenbo Fengf434e862018-06-27 14:08:39 -0700377 populateFakeStats(TEST_UID1, 0, ifaceIndex, TEST_COUNTERSET0, value1, mFakeStatsMap);
378 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700379 StatsValue value2 = {.rxBytes = TEST_BYTES0 * 40,
380 .rxPackets = TEST_PACKET0,
381 .txBytes = TEST_BYTES1 * 40,
382 .txPackets = TEST_PACKET1,};
Chenbo Fengf434e862018-06-27 14:08:39 -0700383 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
Chenbo Feng7e974052018-02-28 22:57:21 -0800384 StatsKey curKey = {.uid = TEST_UID1,
385 .tag = 0,
386 .ifaceIndex = ifaceIndex,
387 .counterSet = TEST_COUNTERSET0};
388 char ifname[IFNAMSIZ];
Chenbo Feng33a4de12018-03-16 18:10:07 -0700389 int64_t unknownIfaceBytesTotal = 0;
Chenbo Fengf434e862018-06-27 14:08:39 -0700390 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700391 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700392 ASSERT_EQ(((int64_t)(TEST_BYTES0 * 20 + TEST_BYTES1 * 20)), unknownIfaceBytesTotal);
393 curKey.ifaceIndex = IFACE_INDEX2;
Chenbo Fengf434e862018-06-27 14:08:39 -0700394 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700395 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700396 ASSERT_EQ(-1, unknownIfaceBytesTotal);
397 std::vector<stats_line> lines;
398 std::vector<std::string> ifaces;
399 // TODO: find a way to test the total of unknown Iface Bytes go above limit.
Chenbo Fengf434e862018-06-27 14:08:39 -0700400 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
401 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700402 ASSERT_EQ((unsigned long)1, lines.size());
403 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines.front());
Chenbo Feng7e974052018-02-28 22:57:21 -0800404}
405
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700406TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700407 SKIP_IF_BPF_NOT_SUPPORTED;
408
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700409 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
410 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
411 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700412 updateIfaceMap(LONG_IFACE_NAME, IFACE_INDEX4);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700413 StatsValue value1 = {
414 .rxBytes = TEST_BYTES0,
415 .rxPackets = TEST_PACKET0,
416 .txBytes = TEST_BYTES1,
417 .txPackets = TEST_PACKET1,
418 };
419 StatsValue value2 = {
420 .rxBytes = TEST_BYTES1,
421 .rxPackets = TEST_PACKET1,
422 .txBytes = TEST_BYTES0,
423 .txPackets = TEST_PACKET0,
424 };
425 uint32_t ifaceStatsKey = IFACE_INDEX1;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700426 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700427 ifaceStatsKey = IFACE_INDEX2;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700428 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700429 ifaceStatsKey = IFACE_INDEX3;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700430 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700431 ifaceStatsKey = IFACE_INDEX4;
432 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700433 std::vector<stats_line> lines;
434 ASSERT_EQ(0,
435 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700436 ASSERT_EQ((unsigned long)4, lines.size());
junyulaia130ac22018-11-09 16:12:29 +0800437
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700438 expectStatsLineEqual(value1, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
439 expectStatsLineEqual(value1, IFACE_NAME3, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
440 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[2]);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700441 ASSERT_EQ(0, strcmp(TRUNCATED_IFACE_NAME, lines[3].iface));
442 expectStatsLineEqual(value2, TRUNCATED_IFACE_NAME, UID_ALL, SET_ALL, TAG_NONE, lines[3]);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700443}
junyulaia130ac22018-11-09 16:12:29 +0800444
445TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortedAndGrouped) {
446 SKIP_IF_BPF_NOT_SUPPORTED;
447
448 // Create iface indexes with duplicate iface name.
449 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
450 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
451 updateIfaceMap(IFACE_NAME1, IFACE_INDEX3); // Duplicate!
452
453 StatsValue value1 = {
454 .rxBytes = TEST_BYTES0,
455 .rxPackets = TEST_PACKET0,
456 .txBytes = TEST_BYTES1,
457 .txPackets = TEST_PACKET1,
458 };
459 StatsValue value2 = {
460 .rxBytes = TEST_BYTES1,
461 .rxPackets = TEST_PACKET1,
462 .txBytes = TEST_BYTES0,
463 .txPackets = TEST_PACKET0,
464 };
465 StatsValue value3 = {
466 .rxBytes = TEST_BYTES0 * 2,
467 .rxPackets = TEST_PACKET0 * 2,
468 .txBytes = TEST_BYTES1 * 2,
469 .txPackets = TEST_PACKET1 * 2,
470 };
471
472 std::vector<stats_line> lines;
473 std::vector<std::string> ifaces;
474
475 // Test empty stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700476 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
477 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800478 ASSERT_EQ((size_t) 0, lines.size());
479 lines.clear();
480
481 // Test 1 line stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700482 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
483 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
484 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800485 ASSERT_EQ((size_t) 1, lines.size());
486 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
487 lines.clear();
488
489 // These items should not be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700490 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
491 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET1, value2, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800492 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700493 mFakeStatsMap);
494 populateFakeStats(TEST_UID2, 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) 5, lines.size());
498 lines.clear();
499
500 // These items should be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700501 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
502 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800503
Chenbo Fengf434e862018-06-27 14:08:39 -0700504 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
505 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800506 ASSERT_EQ((size_t) 5, lines.size());
507
508 // Verify Sorted & Grouped.
509 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
510 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET1, TEST_TAG, lines[1]);
511 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG + 1, lines[2]);
512 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, TEST_TAG, lines[3]);
513 expectStatsLineEqual(value2, IFACE_NAME2, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[4]);
514 lines.clear();
515
516 // Perform test on IfaceStats.
517 uint32_t ifaceStatsKey = IFACE_INDEX2;
518 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
519 ifaceStatsKey = IFACE_INDEX1;
520 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
521
522 // This should be grouped.
523 ifaceStatsKey = IFACE_INDEX3;
524 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
525
526 ASSERT_EQ(0,
527 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
528 ASSERT_EQ((size_t) 2, lines.size());
529
530 expectStatsLineEqual(value3, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
531 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
532 lines.clear();
533}
534
535// Test to verify that subtract overflow will not be triggered by the compare function invoked from
536// sorting. See http:/b/119193941.
537TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortAndOverflow) {
Xiao Mae5317722018-12-12 17:49:34 +0900538 SKIP_IF_BPF_NOT_SUPPORTED;
539
junyulaia130ac22018-11-09 16:12:29 +0800540 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
541
542 StatsValue value1 = {
543 .rxBytes = TEST_BYTES0,
544 .rxPackets = TEST_PACKET0,
545 .txBytes = TEST_BYTES1,
546 .txPackets = TEST_PACKET1,
547 };
548
549 // Mutate uid, 0 < TEST_UID1 < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700550 populateFakeStats(0, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
551 populateFakeStats(UINT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
552 populateFakeStats(INT_MIN, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
553 populateFakeStats(INT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800554
555 // Mutate tag, 0 < TEST_TAG < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700556 populateFakeStats(TEST_UID1, INT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
557 populateFakeStats(TEST_UID1, INT_MIN, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
558 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
559 populateFakeStats(TEST_UID1, UINT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800560
561 // TODO: Mutate counterSet and enlarge TEST_MAP_SIZE if overflow on counterSet is possible.
562
563 std::vector<stats_line> lines;
564 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700565 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
566 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800567 ASSERT_EQ((size_t) 8, lines.size());
568
569 // Uid 0 first
570 expectStatsLineEqual(value1, IFACE_NAME1, 0, TEST_COUNTERSET0, TEST_TAG, lines[0]);
571
572 // Test uid, mutate tag.
573 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines[1]);
574 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MAX, lines[2]);
575 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MIN, lines[3]);
576 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, UINT_MAX, lines[4]);
577
578 // Mutate uid.
579 expectStatsLineEqual(value1, IFACE_NAME1, INT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[5]);
580 expectStatsLineEqual(value1, IFACE_NAME1, INT_MIN, TEST_COUNTERSET0, TEST_TAG, lines[6]);
581 expectStatsLineEqual(value1, IFACE_NAME1, UINT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[7]);
582 lines.clear();
583}
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800584} // namespace bpf
585} // namespace android