blob: 8153127a2782ea3fd98089ca50684ab85ed6c9f0 [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;
Chenbo Feng0084f002019-04-09 11:53:45 -070081 ASSERT_EQ(0, setrlimitForTest());
Chenbo Fengdc4c37e2018-11-20 14:10:00 -080082
Chenbo Feng4f6c2372018-04-26 10:37:55 -070083 mFakeCookieTagMap = BpfMap<uint64_t, UidTag>(createMap(
84 BPF_MAP_TYPE_HASH, sizeof(uint64_t), sizeof(struct UidTag), TEST_MAP_SIZE, 0));
85 ASSERT_LE(0, mFakeCookieTagMap.getMap());
Chenbo Fengdc4e3252017-12-22 11:00:52 -080086
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070087 mFakeAppUidStatsMap = BpfMap<uint32_t, StatsValue>(createMap(
88 BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(struct StatsValue), TEST_MAP_SIZE, 0));
89 ASSERT_LE(0, mFakeAppUidStatsMap.getMap());
90
Chenbo Fengf434e862018-06-27 14:08:39 -070091 mFakeStatsMap = BpfMap<StatsKey, StatsValue>(
92 createMap(BPF_MAP_TYPE_HASH, sizeof(struct StatsKey), sizeof(struct StatsValue),
93 TEST_MAP_SIZE, 0));
94 ASSERT_LE(0, mFakeStatsMap.getMap());
Chenbo Feng7e974052018-02-28 22:57:21 -080095
Chenbo Feng4f6c2372018-04-26 10:37:55 -070096 mFakeIfaceIndexNameMap = BpfMap<uint32_t, IfaceValue>(
97 createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(IfaceValue), TEST_MAP_SIZE, 0));
98 ASSERT_LE(0, mFakeIfaceIndexNameMap.getMap());
Chenbo Feng33a4de12018-03-16 18:10:07 -070099
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700100 mFakeIfaceStatsMap = BpfMap<uint32_t, StatsValue>(createMap(
101 BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(struct StatsValue), TEST_MAP_SIZE, 0));
102 ASSERT_LE(0, mFakeIfaceStatsMap.getMap());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800103 }
104
105 void expectUidTag(uint64_t cookie, uid_t uid, uint32_t tag) {
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700106 auto tagResult = mFakeCookieTagMap.readValue(cookie);
107 EXPECT_TRUE(isOk(tagResult));
108 EXPECT_EQ(uid, tagResult.value().uid);
109 EXPECT_EQ(tag, tagResult.value().tag);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800110 }
111
112 void populateFakeStats(uid_t uid, uint32_t tag, uint32_t ifaceIndex, uint32_t counterSet,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700113 StatsValue value, BpfMap<StatsKey, StatsValue>& map) {
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800114 StatsKey key = {
115 .uid = (uint32_t)uid, .tag = tag, .counterSet = counterSet, .ifaceIndex = ifaceIndex};
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700116 EXPECT_TRUE(isOk(map.writeValue(key, value, BPF_ANY)));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800117 }
Chenbo Feng7e974052018-02-28 22:57:21 -0800118
Chenbo Feng33a4de12018-03-16 18:10:07 -0700119 void updateIfaceMap(const char* ifaceName, uint32_t ifaceIndex) {
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700120 IfaceValue iface;
121 strlcpy(iface.name, ifaceName, IFNAMSIZ);
122 EXPECT_TRUE(isOk(mFakeIfaceIndexNameMap.writeValue(ifaceIndex, iface, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700123 }
124
125 void expectStatsEqual(const StatsValue& target, const Stats& result) {
126 EXPECT_EQ(target.rxPackets, result.rxPackets);
127 EXPECT_EQ(target.rxBytes, result.rxBytes);
128 EXPECT_EQ(target.txPackets, result.txPackets);
129 EXPECT_EQ(target.txBytes, result.txBytes);
130 }
131
132 void expectStatsLineEqual(const StatsValue target, const char* iface, uint32_t uid,
133 int counterSet, uint32_t tag, const stats_line& result) {
134 EXPECT_EQ(0, strcmp(iface, result.iface));
135 EXPECT_EQ(uid, (uint32_t)result.uid);
junyulaia130ac22018-11-09 16:12:29 +0800136 EXPECT_EQ((uint32_t) counterSet, result.set);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700137 EXPECT_EQ(tag, (uint32_t)result.tag);
138 EXPECT_EQ(target.rxPackets, (uint64_t)result.rxPackets);
139 EXPECT_EQ(target.rxBytes, (uint64_t)result.rxBytes);
140 EXPECT_EQ(target.txPackets, (uint64_t)result.txPackets);
141 EXPECT_EQ(target.txBytes, (uint64_t)result.txBytes);
Chenbo Feng7e974052018-02-28 22:57:21 -0800142 }
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800143};
144
145// TEST to verify the behavior of bpf map when cocurrent deletion happens when
146// iterating the same map.
147TEST_F(BpfNetworkStatsHelperTest, TestIterateMapWithDeletion) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700148 SKIP_IF_BPF_NOT_SUPPORTED;
149
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800150 for (int i = 0; i < 5; i++) {
151 uint64_t cookie = i + 1;
152 struct UidTag tag = {.uid = TEST_UID1, .tag = TEST_TAG};
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700153 EXPECT_TRUE(isOk(mFakeCookieTagMap.writeValue(cookie, tag, BPF_ANY)));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800154 }
155 uint64_t curCookie = 0;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700156 auto nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
157 EXPECT_TRUE(isOk(nextCookie));
158 uint64_t headOfMap = nextCookie.value();
159 curCookie = nextCookie.value();
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800160 // Find the second entry in the map, then immediately delete it.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700161 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
162 EXPECT_TRUE(isOk(nextCookie));
163 EXPECT_TRUE(isOk(mFakeCookieTagMap.deleteValue((nextCookie.value()))));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800164 // Find the entry that is now immediately after headOfMap, then delete that.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700165 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
166 EXPECT_TRUE(isOk(nextCookie));
167 EXPECT_TRUE(isOk(mFakeCookieTagMap.deleteValue((nextCookie.value()))));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800168 // Attempting to read an entry that has been deleted fails with ENOENT.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700169 curCookie = nextCookie.value();
170 auto tagResult = mFakeCookieTagMap.readValue(curCookie);
171 EXPECT_EQ(ENOENT, tagResult.status().code());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800172 // Finding the entry after our deleted entry restarts iteration from the beginning of the map.
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700173 nextCookie = mFakeCookieTagMap.getNextKey(curCookie);
174 EXPECT_TRUE(isOk(nextCookie));
175 EXPECT_EQ(headOfMap, nextCookie.value());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800176}
177
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700178TEST_F(BpfNetworkStatsHelperTest, TestBpfIterateMap) {
179 SKIP_IF_BPF_NOT_SUPPORTED;
180
181 for (int i = 0; i < 5; i++) {
182 uint64_t cookie = i + 1;
183 struct UidTag tag = {.uid = TEST_UID1, .tag = TEST_TAG};
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700184 EXPECT_TRUE(isOk(mFakeCookieTagMap.writeValue(cookie, tag, BPF_ANY)));
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700185 }
186 int totalCount = 0;
187 int totalSum = 0;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700188 const auto iterateWithoutDeletion = [&totalCount, &totalSum](const uint64_t& key,
189 const BpfMap<uint64_t, UidTag>&) {
190 EXPECT_GE((uint64_t)5, key);
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700191 totalCount++;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700192 totalSum += key;
193 return netdutils::status::ok;
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700194 };
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700195 EXPECT_TRUE(isOk(mFakeCookieTagMap.iterate(iterateWithoutDeletion)));
Chenbo Fengc3bfd3e2018-04-24 11:50:02 -0700196 EXPECT_EQ(5, totalCount);
197 EXPECT_EQ(1 + 2 + 3 + 4 + 5, totalSum);
198}
199
Chenbo Fengfa90dd42019-04-04 19:03:49 -0700200TEST_F(BpfNetworkStatsHelperTest, TestUidStatsNoTraffic) {
201 SKIP_IF_BPF_NOT_SUPPORTED;
202
203 StatsValue value1 = {
204 .rxBytes = 0,
205 .rxPackets = 0,
206 .txBytes = 0,
207 .txPackets = 0,
208 };
209 Stats result1 = {};
210 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID1, &result1, mFakeAppUidStatsMap));
211 expectStatsEqual(value1, result1);
212}
213
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800214TEST_F(BpfNetworkStatsHelperTest, TestGetUidStatsTotal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700215 SKIP_IF_BPF_NOT_SUPPORTED;
216
Chenbo Feng33a4de12018-03-16 18:10:07 -0700217 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700218 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
219 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Chenbo Fengeac6c472018-02-05 15:06:23 -0800220 StatsValue value1 = {.rxBytes = TEST_BYTES0,
221 .rxPackets = TEST_PACKET0,
222 .txBytes = TEST_BYTES1,
223 .txPackets = TEST_PACKET1,};
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700224 StatsValue value2 = {
Chenbo Feng33a4de12018-03-16 18:10:07 -0700225 .rxBytes = TEST_BYTES0 * 2,
226 .rxPackets = TEST_PACKET0 * 2,
227 .txBytes = TEST_BYTES1 * 2,
228 .txPackets = TEST_PACKET1 * 2,
229 };
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700230 ASSERT_TRUE(isOk(mFakeAppUidStatsMap.writeValue(TEST_UID1, value1, BPF_ANY)));
231 ASSERT_TRUE(isOk(mFakeAppUidStatsMap.writeValue(TEST_UID2, value2, BPF_ANY)));
232 Stats result1 = {};
233 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID1, &result1, mFakeAppUidStatsMap));
234 expectStatsEqual(value1, result1);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700235
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800236 Stats result2 = {};
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700237 ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID2, &result2, mFakeAppUidStatsMap));
238 expectStatsEqual(value2, result2);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800239 std::vector<stats_line> lines;
240 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700241 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
242 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET1, value1, mFakeStatsMap);
243 populateFakeStats(TEST_UID2, 0, IFACE_INDEX3, TEST_COUNTERSET1, value1, mFakeStatsMap);
Chenbo Feng16513482018-03-15 17:59:58 -0700244 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700245 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800246 ASSERT_EQ((unsigned long)2, lines.size());
247 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700248 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700249 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800250 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700251 expectStatsLineEqual(value1, IFACE_NAME3, TEST_UID2, TEST_COUNTERSET1, 0, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800252}
253
254TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsInternal) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700255 SKIP_IF_BPF_NOT_SUPPORTED;
256
Chenbo Feng33a4de12018-03-16 18:10:07 -0700257 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
258 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
259 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
260 StatsValue value1 = {
261 .rxBytes = TEST_BYTES0,
262 .rxPackets = TEST_PACKET0,
263 .txBytes = TEST_BYTES1,
264 .txPackets = TEST_PACKET1,
265 };
266 StatsValue value2 = {
267 .rxBytes = TEST_BYTES1,
268 .rxPackets = TEST_PACKET1,
269 .txBytes = TEST_BYTES0,
270 .txPackets = TEST_PACKET0,
271 };
272 uint32_t ifaceStatsKey = IFACE_INDEX1;
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 ifaceStatsKey = IFACE_INDEX2;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700275 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700276 ifaceStatsKey = IFACE_INDEX3;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700277 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700278
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800279 Stats result1 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700280 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME1, &result1, mFakeIfaceStatsMap,
281 mFakeIfaceIndexNameMap));
282 expectStatsEqual(value1, result1);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800283 Stats result2 = {};
Chenbo Feng33a4de12018-03-16 18:10:07 -0700284 ASSERT_EQ(0, bpfGetIfaceStatsInternal(IFACE_NAME2, &result2, mFakeIfaceStatsMap,
285 mFakeIfaceIndexNameMap));
286 expectStatsEqual(value2, result2);
287 Stats totalResult = {};
288 ASSERT_EQ(0, bpfGetIfaceStatsInternal(NULL, &totalResult, mFakeIfaceStatsMap,
289 mFakeIfaceIndexNameMap));
290 StatsValue totalValue = {
291 .rxBytes = TEST_BYTES0 * 2 + TEST_BYTES1,
292 .rxPackets = TEST_PACKET0 * 2 + TEST_PACKET1,
293 .txBytes = TEST_BYTES1 * 2 + TEST_BYTES0,
294 .txPackets = TEST_PACKET1 * 2 + TEST_PACKET0,
295 };
296 expectStatsEqual(totalValue, totalResult);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800297}
298
299TEST_F(BpfNetworkStatsHelperTest, TestGetStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700300 SKIP_IF_BPF_NOT_SUPPORTED;
301
Chenbo Feng33a4de12018-03-16 18:10:07 -0700302 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
303 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Chenbo Fengeac6c472018-02-05 15:06:23 -0800304 StatsValue value1 = {.rxBytes = TEST_BYTES0,
305 .rxPackets = TEST_PACKET0,
306 .txBytes = TEST_BYTES1,
307 .txPackets = TEST_PACKET1,};
Chenbo Fengf434e862018-06-27 14:08:39 -0700308 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
309 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700310 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700311 mFakeStatsMap);
312 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800313 std::vector<stats_line> lines;
314 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700315 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
316 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700317 ASSERT_EQ((unsigned long)4, lines.size());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800318 lines.clear();
Chenbo Feng16513482018-03-15 17:59:58 -0700319 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700320 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700321 ASSERT_EQ((unsigned long)3, lines.size());
322 lines.clear();
323 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700324 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800325 ASSERT_EQ((unsigned long)2, lines.size());
326 lines.clear();
Chenbo Feng33a4de12018-03-16 18:10:07 -0700327 ifaces.push_back(std::string(IFACE_NAME1));
Chenbo Feng16513482018-03-15 17:59:58 -0700328 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1,
Chenbo Fengf434e862018-06-27 14:08:39 -0700329 mFakeStatsMap, mFakeIfaceIndexNameMap));
Chenbo Feng7e974052018-02-28 22:57:21 -0800330 ASSERT_EQ((unsigned long)1, lines.size());
Chenbo Feng33a4de12018-03-16 18:10:07 -0700331 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines.front());
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800332}
333
334TEST_F(BpfNetworkStatsHelperTest, TestGetStatsWithSkippedIface) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700335 SKIP_IF_BPF_NOT_SUPPORTED;
336
Chenbo Feng33a4de12018-03-16 18:10:07 -0700337 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
338 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
Chenbo Fengeac6c472018-02-05 15:06:23 -0800339 StatsValue value1 = {.rxBytes = TEST_BYTES0,
340 .rxPackets = TEST_PACKET0,
341 .txBytes = TEST_BYTES1,
342 .txPackets = TEST_PACKET1,};
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);
Chenbo Feng7e974052018-02-28 22:57:21 -0800373 StatsValue value1 = {.rxBytes = TEST_BYTES0 * 20,
374 .rxPackets = TEST_PACKET0,
375 .txBytes = TEST_BYTES1 * 20,
376 .txPackets = TEST_PACKET1,};
377 uint32_t ifaceIndex = UNKNOWN_IFACE;
Chenbo Fengf434e862018-06-27 14:08:39 -0700378 populateFakeStats(TEST_UID1, 0, ifaceIndex, TEST_COUNTERSET0, value1, mFakeStatsMap);
379 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
Chenbo Feng33a4de12018-03-16 18:10:07 -0700380 StatsValue value2 = {.rxBytes = TEST_BYTES0 * 40,
381 .rxPackets = TEST_PACKET0,
382 .txBytes = TEST_BYTES1 * 40,
383 .txPackets = TEST_PACKET1,};
Chenbo Fengf434e862018-06-27 14:08:39 -0700384 populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
Chenbo Feng7e974052018-02-28 22:57:21 -0800385 StatsKey curKey = {.uid = TEST_UID1,
386 .tag = 0,
387 .ifaceIndex = ifaceIndex,
388 .counterSet = TEST_COUNTERSET0};
389 char ifname[IFNAMSIZ];
Chenbo Feng33a4de12018-03-16 18:10:07 -0700390 int64_t unknownIfaceBytesTotal = 0;
Chenbo Fengf434e862018-06-27 14:08:39 -0700391 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700392 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700393 ASSERT_EQ(((int64_t)(TEST_BYTES0 * 20 + TEST_BYTES1 * 20)), unknownIfaceBytesTotal);
394 curKey.ifaceIndex = IFACE_INDEX2;
Chenbo Fengf434e862018-06-27 14:08:39 -0700395 ASSERT_EQ(-ENODEV, getIfaceNameFromMap(mFakeIfaceIndexNameMap, mFakeStatsMap, ifaceIndex,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700396 ifname, curKey, &unknownIfaceBytesTotal));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700397 ASSERT_EQ(-1, unknownIfaceBytesTotal);
398 std::vector<stats_line> lines;
399 std::vector<std::string> ifaces;
400 // TODO: find a way to test the total of unknown Iface Bytes go above limit.
Chenbo Fengf434e862018-06-27 14:08:39 -0700401 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
402 mFakeIfaceIndexNameMap));
Chenbo Feng33a4de12018-03-16 18:10:07 -0700403 ASSERT_EQ((unsigned long)1, lines.size());
404 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines.front());
Chenbo Feng7e974052018-02-28 22:57:21 -0800405}
406
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700407TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsDetail) {
Chenbo Feng837ddfc2018-05-08 13:45:08 -0700408 SKIP_IF_BPF_NOT_SUPPORTED;
409
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700410 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
411 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
412 updateIfaceMap(IFACE_NAME3, IFACE_INDEX3);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700413 updateIfaceMap(LONG_IFACE_NAME, IFACE_INDEX4);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700414 StatsValue value1 = {
415 .rxBytes = TEST_BYTES0,
416 .rxPackets = TEST_PACKET0,
417 .txBytes = TEST_BYTES1,
418 .txPackets = TEST_PACKET1,
419 };
420 StatsValue value2 = {
421 .rxBytes = TEST_BYTES1,
422 .rxPackets = TEST_PACKET1,
423 .txBytes = TEST_BYTES0,
424 .txPackets = TEST_PACKET0,
425 };
426 uint32_t ifaceStatsKey = IFACE_INDEX1;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700427 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700428 ifaceStatsKey = IFACE_INDEX2;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700429 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700430 ifaceStatsKey = IFACE_INDEX3;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700431 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700432 ifaceStatsKey = IFACE_INDEX4;
433 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700434 std::vector<stats_line> lines;
435 ASSERT_EQ(0,
436 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700437 ASSERT_EQ((unsigned long)4, lines.size());
junyulaia130ac22018-11-09 16:12:29 +0800438
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700439 expectStatsLineEqual(value1, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
440 expectStatsLineEqual(value1, IFACE_NAME3, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
441 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[2]);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700442 ASSERT_EQ(0, strcmp(TRUNCATED_IFACE_NAME, lines[3].iface));
443 expectStatsLineEqual(value2, TRUNCATED_IFACE_NAME, UID_ALL, SET_ALL, TAG_NONE, lines[3]);
Chenbo Fengf4b812d2018-04-18 15:27:19 -0700444}
junyulaia130ac22018-11-09 16:12:29 +0800445
446TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortedAndGrouped) {
447 SKIP_IF_BPF_NOT_SUPPORTED;
448
449 // Create iface indexes with duplicate iface name.
450 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
451 updateIfaceMap(IFACE_NAME2, IFACE_INDEX2);
452 updateIfaceMap(IFACE_NAME1, IFACE_INDEX3); // Duplicate!
453
454 StatsValue value1 = {
455 .rxBytes = TEST_BYTES0,
456 .rxPackets = TEST_PACKET0,
457 .txBytes = TEST_BYTES1,
458 .txPackets = TEST_PACKET1,
459 };
460 StatsValue value2 = {
461 .rxBytes = TEST_BYTES1,
462 .rxPackets = TEST_PACKET1,
463 .txBytes = TEST_BYTES0,
464 .txPackets = TEST_PACKET0,
465 };
466 StatsValue value3 = {
467 .rxBytes = TEST_BYTES0 * 2,
468 .rxPackets = TEST_PACKET0 * 2,
469 .txBytes = TEST_BYTES1 * 2,
470 .txPackets = TEST_PACKET1 * 2,
471 };
472
473 std::vector<stats_line> lines;
474 std::vector<std::string> ifaces;
475
476 // Test empty stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700477 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
478 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800479 ASSERT_EQ((size_t) 0, lines.size());
480 lines.clear();
481
482 // Test 1 line stats.
Chenbo Fengf434e862018-06-27 14:08:39 -0700483 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
484 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
485 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800486 ASSERT_EQ((size_t) 1, lines.size());
487 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
488 lines.clear();
489
490 // These items should not be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700491 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX2, TEST_COUNTERSET0, value2, mFakeStatsMap);
492 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET1, value2, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800493 populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value2,
Chenbo Fengf434e862018-06-27 14:08:39 -0700494 mFakeStatsMap);
495 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
496 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
497 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800498 ASSERT_EQ((size_t) 5, lines.size());
499 lines.clear();
500
501 // These items should be grouped.
Chenbo Fengf434e862018-06-27 14:08:39 -0700502 populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
503 populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800504
Chenbo Fengf434e862018-06-27 14:08:39 -0700505 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
506 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800507 ASSERT_EQ((size_t) 5, lines.size());
508
509 // Verify Sorted & Grouped.
510 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]);
511 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET1, TEST_TAG, lines[1]);
512 expectStatsLineEqual(value2, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG + 1, lines[2]);
513 expectStatsLineEqual(value3, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, TEST_TAG, lines[3]);
514 expectStatsLineEqual(value2, IFACE_NAME2, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[4]);
515 lines.clear();
516
517 // Perform test on IfaceStats.
518 uint32_t ifaceStatsKey = IFACE_INDEX2;
519 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value2, BPF_ANY)));
520 ifaceStatsKey = IFACE_INDEX1;
521 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
522
523 // This should be grouped.
524 ifaceStatsKey = IFACE_INDEX3;
525 EXPECT_TRUE(isOk(mFakeIfaceStatsMap.writeValue(ifaceStatsKey, value1, BPF_ANY)));
526
527 ASSERT_EQ(0,
528 parseBpfNetworkStatsDevInternal(&lines, mFakeIfaceStatsMap, mFakeIfaceIndexNameMap));
529 ASSERT_EQ((size_t) 2, lines.size());
530
531 expectStatsLineEqual(value3, IFACE_NAME1, UID_ALL, SET_ALL, TAG_NONE, lines[0]);
532 expectStatsLineEqual(value2, IFACE_NAME2, UID_ALL, SET_ALL, TAG_NONE, lines[1]);
533 lines.clear();
534}
535
536// Test to verify that subtract overflow will not be triggered by the compare function invoked from
537// sorting. See http:/b/119193941.
538TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortAndOverflow) {
Xiao Mae5317722018-12-12 17:49:34 +0900539 SKIP_IF_BPF_NOT_SUPPORTED;
540
junyulaia130ac22018-11-09 16:12:29 +0800541 updateIfaceMap(IFACE_NAME1, IFACE_INDEX1);
542
543 StatsValue value1 = {
544 .rxBytes = TEST_BYTES0,
545 .rxPackets = TEST_PACKET0,
546 .txBytes = TEST_BYTES1,
547 .txPackets = TEST_PACKET1,
548 };
549
550 // Mutate uid, 0 < TEST_UID1 < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700551 populateFakeStats(0, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
552 populateFakeStats(UINT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
553 populateFakeStats(INT_MIN, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
554 populateFakeStats(INT_MAX, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800555
556 // Mutate tag, 0 < TEST_TAG < INT_MAX < INT_MIN < UINT_MAX.
Chenbo Fengf434e862018-06-27 14:08:39 -0700557 populateFakeStats(TEST_UID1, INT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
558 populateFakeStats(TEST_UID1, INT_MIN, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
559 populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
560 populateFakeStats(TEST_UID1, UINT_MAX, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap);
junyulaia130ac22018-11-09 16:12:29 +0800561
562 // TODO: Mutate counterSet and enlarge TEST_MAP_SIZE if overflow on counterSet is possible.
563
564 std::vector<stats_line> lines;
565 std::vector<std::string> ifaces;
Chenbo Fengf434e862018-06-27 14:08:39 -0700566 ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap,
567 mFakeIfaceIndexNameMap));
junyulaia130ac22018-11-09 16:12:29 +0800568 ASSERT_EQ((size_t) 8, lines.size());
569
570 // Uid 0 first
571 expectStatsLineEqual(value1, IFACE_NAME1, 0, TEST_COUNTERSET0, TEST_TAG, lines[0]);
572
573 // Test uid, mutate tag.
574 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines[1]);
575 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MAX, lines[2]);
576 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, INT_MIN, lines[3]);
577 expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, UINT_MAX, lines[4]);
578
579 // Mutate uid.
580 expectStatsLineEqual(value1, IFACE_NAME1, INT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[5]);
581 expectStatsLineEqual(value1, IFACE_NAME1, INT_MIN, TEST_COUNTERSET0, TEST_TAG, lines[6]);
582 expectStatsLineEqual(value1, IFACE_NAME1, UINT_MAX, TEST_COUNTERSET0, TEST_TAG, lines[7]);
583 lines.clear();
584}
Chenbo Fengdc4e3252017-12-22 11:00:52 -0800585} // namespace bpf
586} // namespace android