blob: 8f957873ecb0b5a789849c07660ee4ef4bbc8d9e [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 Fengdc4e3252017-12-22 11:00:52 -0800199TEST_F(BpfNetworkStatsHelperTest, TestGetUidStatsTotal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700200 SKIP_IF_BPF_NOT_SUPPORTED;
201
Chenbo Feng33a4de12018-03-16 18:10:07 -0700202 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700203 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
204 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Chenbo Fengeac6c472018-02-05 15:06:23 -0800205 StatsValue value1 = {.rxBytes = TEST_BYTES0,
206 .rxPackets = TEST_PACKET0,
207 .txBytes = TEST_BYTES1,
208 .txPackets = TEST_PACKET1,};
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700209 StatsValue value2 = {
Chenbo Feng33a4de12018-03-16 18:10:07 -0700210 .rxBytes = TEST_BYTES0 * 2,
211 .rxPackets = TEST_PACKET0 * 2,
212 .txBytes = TEST_BYTES1 * 2,
213 .txPackets = TEST_PACKET1 * 2,
214 };
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700215 ASSERT_TRUE(isOk(mFakeAppUidStatsMap.writeValue(TEST_UID1, value1, BPF_ANY)));
216 ASSERT_TRUE(isOk(mFakeAppUidStatsMap.writeValue(TEST_UID2, value2, BPF_ANY)));
217 Stats result1 = {};
218 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID1, &result1, mFakeAppUidStatsMap));
219 expectStatsEqual(value1, result1);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700220
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800221 Stats result2 = {};
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700222 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID2, &result2, mFakeAppUidStatsMap));
223 expectStatsEqual(value2, result2);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800224 std::vector<stats_line> lines;
225 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700226 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
227 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET1, value1, mFakeStatsMap);
228 populateFakeStats(TEST_UID2, 0, IFACE_INDEX3, TEST_COUNTERSET1, value1, mFakeStatsMap);
Chenbo Feng16513482018-03-15 17:59:58 -0700229 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700230 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800231 ASSERT_EQ((unsigned long)2, lines.size());
232 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700233 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700234 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800235 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700236 expectStatsLineEqual(value1, IFACE_NAME3, TEST_UID2, TEST_COUNTERSET1, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800237}
238
239TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsInternal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700240 SKIP_IF_BPF_NOT_SUPPORTED;
241
Chenbo Feng33a4de12018-03-16 18:10:07 -0700242 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
243 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
244 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
245 StatsValue value1 = {
246 .rxBytes = TEST_BYTES0,
247 .rxPackets = TEST_PACKET0,
248 .txBytes = TEST_BYTES1,
249 .txPackets = TEST_PACKET1,
250 };
251 StatsValue value2 = {
252 .rxBytes = TEST_BYTES1,
253 .rxPackets = TEST_PACKET1,
254 .txBytes = TEST_BYTES0,
255 .txPackets = TEST_PACKET0,
256 };
257 uint32_t ifaceStatsKey = IFACE_INDEX1;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700258 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700259 ifaceStatsKey = IFACE_INDEX2;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700260 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700261 ifaceStatsKey = IFACE_INDEX3;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700262 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700263
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800264 Stats result1 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700265 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME1, &result1, mFakeIfaceStatsMap,
266 mFakeIfaceIndexNameMap));
267 expectStatsEqual(value1, result1);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800268 Stats result2 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700269 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME2, &result2, mFakeIfaceStatsMap,
270 mFakeIfaceIndexNameMap));
271 expectStatsEqual(value2, result2);
272 Stats totalResult = {};
273 ASSERT_EQ(0, bpfGetIfaceStatsInternal(NULL, &totalResult, mFakeIfaceStatsMap,
274 mFakeIfaceIndexNameMap));
275 StatsValue totalValue = {
276 .rxBytes = TEST_BYTES0 * 2 + TEST_BYTES1,
277 .rxPackets = TEST_PACKET0 * 2 + TEST_PACKET1,
278 .txBytes = TEST_BYTES1 * 2 + TEST_BYTES0,
279 .txPackets = TEST_PACKET1 * 2 + TEST_PACKET0,
280 };
281 expectStatsEqual(totalValue, totalResult);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800282}
283
284TEST_F(BpfNetworkStatsHelperTest, TestGetStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700285 SKIP_IF_BPF_NOT_SUPPORTED;
286
Chenbo Feng33a4de12018-03-16 18:10:07 -0700287 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
288 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Chenbo Fengeac6c472018-02-05 15:06:23 -0800289 StatsValue value1 = {.rxBytes = TEST_BYTES0,
290 .rxPackets = TEST_PACKET0,
291 .txBytes = TEST_BYTES1,
292 .txPackets = TEST_PACKET1,};
Chenbo Fengf434e862018-06-27 14:08:39 -0700293 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
294 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700295 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700296 mFakeStatsMap);
297 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800298 std::vector<stats_line> lines;
299 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700300 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
301 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700302 ASSERT_EQ((unsigned long)4, lines.size());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800303 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700304 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700305 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700306 ASSERT_EQ((unsigned long)3, lines.size());
307 lines.clear();
308 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700309 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800310 ASSERT_EQ((unsigned long)2, lines.size());
311 lines.clear();
Chenbo Feng33a4de12018-03-16 18:10:07 -0700312 ifaces.push_back(std::string(IFACE_NAME1));
Chenbo Feng16513482018-03-15 17:59:58 -0700313 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700314 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng7e974052018-02-28 22:57:21 -0800315 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng33a4de12018-03-16 18:10:07 -0700316 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800317}
318
319TEST_F(BpfNetworkStatsHelperTest, TestGetStatsWithSkippedIface) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700320 SKIP_IF_BPF_NOT_SUPPORTED;
321
Chenbo Feng33a4de12018-03-16 18:10:07 -0700322 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
323 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Chenbo Fengeac6c472018-02-05 15:06:23 -0800324 StatsValue value1 = {.rxBytes = TEST_BYTES0,
325 .rxPackets = TEST_PACKET0,
326 .txBytes = TEST_BYTES1,
327 .txPackets = TEST_PACKET1,};
Chenbo Fengf434e862018-06-27 14:08:39 -0700328 populateFakeStats(0, 0, 0, OVERFLOW_COUNTERSET, value1, mFakeStatsMap);
329 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
330 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value1, mFakeStatsMap);
331 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET1, value1, mFakeStatsMap);
332 populateFakeStats(TEST_UID2, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800333 std::vector<stats_line> lines;
334 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700335 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
336 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700337 ASSERT_EQ((unsigned long)4, lines.size());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800338 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700339 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700340 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700341 ASSERT_EQ((unsigned long)3, lines.size());
Chenbo Feng7e974052018-02-28 22:57:21 -0800342 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700343 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700344 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800345 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng33a4de12018-03-16 18:10:07 -0700346 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800347 lines.clear();
Chenbo Feng33a4de12018-03-16 18:10:07 -0700348 ifaces.push_back(std::string(IFACE_NAME1));
Chenbo Feng16513482018-03-15 17:59:58 -0700349 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700350 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800351 ASSERT_EQ((unsigned long)2, lines.size());
352}
353
Chenbo Feng7e974052018-02-28 22:57:21 -0800354TEST_F(BpfNetworkStatsHelperTest, TestUnkownIfaceError) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700355 SKIP_IF_BPF_NOT_SUPPORTED;
356
Chenbo Feng33a4de12018-03-16 18:10:07 -0700357 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
Chenbo Feng7e974052018-02-28 22:57:21 -0800358 StatsValue value1 = {.rxBytes = TEST_BYTES0 * 20,
359 .rxPackets = TEST_PACKET0,
360 .txBytes = TEST_BYTES1 * 20,
361 .txPackets = TEST_PACKET1,};
362 uint32_t ifaceIndex = UNKNOWN_IFACE;
Chenbo Fengf434e862018-06-27 14:08:39 -0700363 populateFakeStats(TEST_UID1, 0, ifaceIndex, TEST_COUNTERSET0, value1, mFakeStatsMap);
364 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700365 StatsValue value2 = {.rxBytes = TEST_BYTES0 * 40,
366 .rxPackets = TEST_PACKET0,
367 .txBytes = TEST_BYTES1 * 40,
368 .txPackets = TEST_PACKET1,};
Chenbo Fengf434e862018-06-27 14:08:39 -0700369 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
Chenbo Feng7e974052018-02-28 22:57:21 -0800370 StatsKey curKey = {.uid = TEST_UID1,
371 .tag = 0,
372 .ifaceIndex = ifaceIndex,
373 .counterSet = TEST_COUNTERSET0};
374 char ifname[IFNAMSIZ];
Chenbo Feng33a4de12018-03-16 18:10:07 -0700375 int64_t unknownIfaceBytesTotal = 0;
Chenbo Fengf434e862018-06-27 14:08:39 -0700376 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700377 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700378 ASSERT_EQ(((int64_t)(TEST_BYTES0 * 20 + TEST_BYTES1 * 20)), unknownIfaceBytesTotal);
379 curKey.ifaceIndex = IFACE_INDEX2;
Chenbo Fengf434e862018-06-27 14:08:39 -0700380 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700381 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700382 ASSERT_EQ(-1, unknownIfaceBytesTotal);
383 std::vector<stats_line> lines;
384 std::vector<std::string> ifaces;
385 // TODO: find a way to test the total of unknown Iface Bytes go above limit.
Chenbo Fengf434e862018-06-27 14:08:39 -0700386 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
387 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700388 ASSERT_EQ((unsigned long)1, lines.size());
389 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines.front());
Chenbo Feng7e974052018-02-28 22:57:21 -0800390}
391
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700392TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700393 SKIP_IF_BPF_NOT_SUPPORTED;
394
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700395 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
396 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
397 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700398 updateIfaceMap(LONG_IFACE_NAME, IFACE_INDEX4);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700399 StatsValue value1 = {
400 .rxBytes = TEST_BYTES0,
401 .rxPackets = TEST_PACKET0,
402 .txBytes = TEST_BYTES1,
403 .txPackets = TEST_PACKET1,
404 };
405 StatsValue value2 = {
406 .rxBytes = TEST_BYTES1,
407 .rxPackets = TEST_PACKET1,
408 .txBytes = TEST_BYTES0,
409 .txPackets = TEST_PACKET0,
410 };
411 uint32_t ifaceStatsKey = IFACE_INDEX1;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700412 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700413 ifaceStatsKey = IFACE_INDEX2;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700414 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700415 ifaceStatsKey = IFACE_INDEX3;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700416 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700417 ifaceStatsKey = IFACE_INDEX4;
418 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700419 std::vector<stats_line> lines;
420 ASSERT_EQ(0,
421 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700422 ASSERT_EQ((unsigned long)4, lines.size());
junyulaia130ac22018-11-09 16:12:29 +0800423
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700424 expectStatsLineEqual(value1, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
425 expectStatsLineEqual(value1, IFACE_NAME3, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
426 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[2]);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700427 ASSERT_EQ(0, strcmp(TRUNCATED_IFACE_NAME, lines[3].iface));
428 expectStatsLineEqual(value2, TRUNCATED_IFACE_NAME, UID_ALL, SET_ALL, TAG_NONE, lines[3]);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700429}
junyulaia130ac22018-11-09 16:12:29 +0800430
431TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortedAndGrouped) {
432 SKIP_IF_BPF_NOT_SUPPORTED;
433
434 // Create iface indexes with duplicate iface name.
435 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
436 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
437 updateIfaceMap(IFACE_NAME1, IFACE_INDEX3); // Duplicate!
438
439 StatsValue value1 = {
440 .rxBytes = TEST_BYTES0,
441 .rxPackets = TEST_PACKET0,
442 .txBytes = TEST_BYTES1,
443 .txPackets = TEST_PACKET1,
444 };
445 StatsValue value2 = {
446 .rxBytes = TEST_BYTES1,
447 .rxPackets = TEST_PACKET1,
448 .txBytes = TEST_BYTES0,
449 .txPackets = TEST_PACKET0,
450 };
451 StatsValue value3 = {
452 .rxBytes = TEST_BYTES0 * 2,
453 .rxPackets = TEST_PACKET0 * 2,
454 .txBytes = TEST_BYTES1 * 2,
455 .txPackets = TEST_PACKET1 * 2,
456 };
457
458 std::vector<stats_line> lines;
459 std::vector<std::string> ifaces;
460
461 // Test empty stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700462 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
463 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800464 ASSERT_EQ((size_t) 0, lines.size());
465 lines.clear();
466
467 // Test 1 line stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700468 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
469 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
470 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800471 ASSERT_EQ((size_t) 1, lines.size());
472 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
473 lines.clear();
474
475 // These items should not be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700476 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
477 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET1, value2, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800478 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700479 mFakeStatsMap);
480 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
481 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
482 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800483 ASSERT_EQ((size_t) 5, lines.size());
484 lines.clear();
485
486 // These items should be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700487 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
488 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800489
Chenbo Fengf434e862018-06-27 14:08:39 -0700490 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
491 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800492 ASSERT_EQ((size_t) 5, lines.size());
493
494 // Verify Sorted & Grouped.
495 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
496 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET1, TEST_TAG, lines[1]);
497 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG + 1, lines[2]);
498 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, TEST_TAG, lines[3]);
499 expectStatsLineEqual(value2, IFACE_NAME2, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[4]);
500 lines.clear();
501
502 // Perform test on IfaceStats.
503 uint32_t ifaceStatsKey = IFACE_INDEX2;
504 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
505 ifaceStatsKey = IFACE_INDEX1;
506 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
507
508 // This should be grouped.
509 ifaceStatsKey = IFACE_INDEX3;
510 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
511
512 ASSERT_EQ(0,
513 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
514 ASSERT_EQ((size_t) 2, lines.size());
515
516 expectStatsLineEqual(value3, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
517 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
518 lines.clear();
519}
520
521// Test to verify that subtract overflow will not be triggered by the compare function invoked from
522// sorting. See http:/b/119193941.
523TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortAndOverflow) {
Xiao Mae5317722018-12-12 17:49:34 +0900524 SKIP_IF_BPF_NOT_SUPPORTED;
525
junyulaia130ac22018-11-09 16:12:29 +0800526 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
527
528 StatsValue value1 = {
529 .rxBytes = TEST_BYTES0,
530 .rxPackets = TEST_PACKET0,
531 .txBytes = TEST_BYTES1,
532 .txPackets = TEST_PACKET1,
533 };
534
535 // Mutate uid, 0 < TEST_UID1 < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700536 populateFakeStats(0, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
537 populateFakeStats(UINT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
538 populateFakeStats(INT_MIN, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
539 populateFakeStats(INT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800540
541 // Mutate tag, 0 < TEST_TAG < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700542 populateFakeStats(TEST_UID1, INT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
543 populateFakeStats(TEST_UID1, INT_MIN, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
544 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
545 populateFakeStats(TEST_UID1, UINT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800546
547 // TODO: Mutate counterSet and enlarge TEST_MAP_SIZE if overflow on counterSet is possible.
548
549 std::vector<stats_line> lines;
550 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700551 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
552 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800553 ASSERT_EQ((size_t) 8, lines.size());
554
555 // Uid 0 first
556 expectStatsLineEqual(value1, IFACE_NAME1, 0, TEST_COUNTERSET0, TEST_TAG, lines[0]);
557
558 // Test uid, mutate tag.
559 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines[1]);
560 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MAX, lines[2]);
561 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MIN, lines[3]);
562 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, UINT_MAX, lines[4]);
563
564 // Mutate uid.
565 expectStatsLineEqual(value1, IFACE_NAME1, INT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[5]);
566 expectStatsLineEqual(value1, IFACE_NAME1, INT_MIN, TEST_COUNTERSET0, TEST_TAG, lines[6]);
567 expectStatsLineEqual(value1, IFACE_NAME1, UINT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[7]);
568 lines.clear();
569}
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800570} // namespace bpf
571} // namespace android