blob: a354f839bc6d1a6bf5ff15b9a8b0d6e5199c8421 [file] [log] [blame]
Chenbo Fenged37fea2017-12-13 19:35:01 -08001/*
2 * Copyright 2017 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 * TrafficControllerTest.cpp - unit tests for TrafficController.cpp
17 */
18
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 <sys/socket.h>
27#include <sys/types.h>
28#include <unistd.h>
29
30#include <gtest/gtest.h>
31
32#include <android-base/stringprintf.h>
33#include <android-base/strings.h>
34
35#include <netdutils/MockSyscalls.h>
Chenbo Feng4f6c2372018-04-26 10:37:55 -070036#include "netdutils/Status.h"
37#include "netdutils/StatusOr.h"
38
Chenbo Feng89c12f12018-03-21 10:29:18 -070039#include "FirewallController.h"
Chenbo Fenged37fea2017-12-13 19:35:01 -080040#include "TrafficController.h"
41#include "bpf/BpfUtils.h"
42
43using namespace android::bpf;
44
45using ::testing::_;
46using ::testing::ByMove;
47using ::testing::Invoke;
48using ::testing::Return;
49using ::testing::StrictMock;
50using ::testing::Test;
51
52namespace android {
53namespace net {
54
55using base::unique_fd;
Chenbo Feng4f6c2372018-04-26 10:37:55 -070056using netdutils::isOk;
57using netdutils::Status;
Chenbo Fenged37fea2017-12-13 19:35:01 -080058using netdutils::status::ok;
Chenbo Feng4f6c2372018-04-26 10:37:55 -070059using netdutils::StatusOr;
Chenbo Fenged37fea2017-12-13 19:35:01 -080060
61constexpr int TEST_MAP_SIZE = 10;
62constexpr uid_t TEST_UID = 10086;
Chenbo Feng89c12f12018-03-21 10:29:18 -070063constexpr uid_t TEST_UID2 = 54321;
64constexpr uid_t TEST_UID3 = 98765;
Chenbo Fenged37fea2017-12-13 19:35:01 -080065constexpr uint32_t TEST_TAG = 42;
Chenbo Feng4f6c2372018-04-26 10:37:55 -070066constexpr uint32_t TEST_COUNTERSET = 1;
67constexpr uint32_t DEFAULT_COUNTERSET = 0;
Chenbo Fenged37fea2017-12-13 19:35:01 -080068
69class TrafficControllerTest : public ::testing::Test {
70 protected:
71 TrafficControllerTest() {}
72 TrafficController mTc;
Chenbo Feng4f6c2372018-04-26 10:37:55 -070073 BpfMap<uint64_t, UidTag> mFakeCookieTagMap;
74 BpfMap<uint32_t, uint8_t> mFakeUidCounterSetMap;
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070075 BpfMap<uint32_t, StatsValue> mFakeAppUidStatsMap;
Chenbo Feng4f6c2372018-04-26 10:37:55 -070076 BpfMap<StatsKey, StatsValue> mFakeUidStatsMap;
77 BpfMap<StatsKey, StatsValue> mFakeTagStatsMap;
78 BpfMap<uint32_t, uint8_t> mFakeDozableUidMap;
79 BpfMap<uint32_t, uint8_t> mFakeStandbyUidMap;
80 BpfMap<uint32_t, uint8_t> mFakePowerSaveUidMap;
Chenbo Fenged37fea2017-12-13 19:35:01 -080081
82 void SetUp() {
Chenbo Fengef1cab32018-04-13 19:50:49 -070083 std::lock_guard<std::mutex> ownerGuard(mTc.mOwnerMatchMutex);
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +090084 SKIP_IF_BPF_NOT_SUPPORTED;
85
Chenbo Feng4f6c2372018-04-26 10:37:55 -070086 mFakeCookieTagMap.reset(createMap(BPF_MAP_TYPE_HASH, sizeof(uint64_t),
87 sizeof(struct UidTag), TEST_MAP_SIZE, 0));
88 ASSERT_LE(0, mFakeCookieTagMap.getMap());
Chenbo Fenged37fea2017-12-13 19:35:01 -080089
Chenbo Feng4f6c2372018-04-26 10:37:55 -070090 mFakeUidCounterSetMap.reset(
91 createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(uint8_t), TEST_MAP_SIZE, 0));
92 ASSERT_LE(0, mFakeUidCounterSetMap.getMap());
Chenbo Fenged37fea2017-12-13 19:35:01 -080093
Chenbo Fengbc4a15f2018-05-11 19:15:15 -070094 mFakeAppUidStatsMap.reset(createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t),
95 sizeof(struct StatsValue), TEST_MAP_SIZE, 0));
96 ASSERT_LE(0, mFakeAppUidStatsMap.getMap());
97
Chenbo Feng4f6c2372018-04-26 10:37:55 -070098 mFakeUidStatsMap.reset(createMap(BPF_MAP_TYPE_HASH, sizeof(struct StatsKey),
99 sizeof(struct StatsValue), TEST_MAP_SIZE, 0));
100 ASSERT_LE(0, mFakeUidStatsMap.getMap());
Chenbo Fenged37fea2017-12-13 19:35:01 -0800101
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700102 mFakeTagStatsMap.reset(createMap(BPF_MAP_TYPE_HASH, sizeof(struct StatsKey),
103 sizeof(struct StatsValue), TEST_MAP_SIZE, 0));
104 ASSERT_LE(0, mFakeTagStatsMap.getMap());
Chenbo Fenged37fea2017-12-13 19:35:01 -0800105
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700106 mFakeDozableUidMap.reset(
107 createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(uint8_t), TEST_MAP_SIZE, 0));
108 ASSERT_LE(0, mFakeDozableUidMap.getMap());
Chenbo Feng89c12f12018-03-21 10:29:18 -0700109
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700110 mFakeStandbyUidMap.reset(
111 createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(uint8_t), TEST_MAP_SIZE, 0));
112 ASSERT_LE(0, mFakeStandbyUidMap.getMap());
Chenbo Feng89c12f12018-03-21 10:29:18 -0700113
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700114 mFakePowerSaveUidMap.reset(
115 createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(uint8_t), TEST_MAP_SIZE, 0));
116 ASSERT_LE(0, mFakePowerSaveUidMap.getMap());
Chenbo Fenged37fea2017-12-13 19:35:01 -0800117 // Make sure trafficController use the eBPF code path.
118 mTc.ebpfSupported = true;
119
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700120 mTc.mCookieTagMap.reset(mFakeCookieTagMap.getMap());
121 mTc.mUidCounterSetMap.reset(mFakeUidCounterSetMap.getMap());
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700122 mTc.mAppUidStatsMap.reset(mFakeAppUidStatsMap.getMap());
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700123 mTc.mUidStatsMap.reset(mFakeUidStatsMap.getMap());
124 mTc.mTagStatsMap.reset(mFakeTagStatsMap.getMap());
125 mTc.mDozableUidMap.reset(mFakeDozableUidMap.getMap());
126 mTc.mStandbyUidMap.reset(mFakeStandbyUidMap.getMap());
127 mTc.mPowerSaveUidMap.reset(mFakePowerSaveUidMap.getMap());
Chenbo Fenged37fea2017-12-13 19:35:01 -0800128 }
129
130 int setUpSocketAndTag(int protocol, uint64_t* cookie, uint32_t tag, uid_t uid) {
131 int sock = socket(protocol, SOCK_STREAM, 0);
132 EXPECT_LE(0, sock);
133 *cookie = getSocketCookie(sock);
Chenbo Fengef1cab32018-04-13 19:50:49 -0700134 EXPECT_NE(NONEXISTENT_COOKIE, *cookie);
Chenbo Fenged37fea2017-12-13 19:35:01 -0800135 EXPECT_EQ(0, mTc.tagSocket(sock, tag, uid));
136 return sock;
137 }
138
139 void expectUidTag(uint64_t cookie, uid_t uid, uint32_t tag) {
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700140 StatusOr<UidTag> tagResult = mFakeCookieTagMap.readValue(cookie);
141 EXPECT_TRUE(isOk(tagResult));
142 EXPECT_EQ(uid, tagResult.value().uid);
143 EXPECT_EQ(tag, tagResult.value().tag);
Chenbo Fenged37fea2017-12-13 19:35:01 -0800144 }
145
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700146 void expectNoTag(uint64_t cookie) { EXPECT_FALSE(isOk(mFakeCookieTagMap.readValue(cookie))); }
Chenbo Fenged37fea2017-12-13 19:35:01 -0800147
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700148 void expectTagMapEmpty() { EXPECT_FALSE(isOk(mFakeCookieTagMap.getFirstKey())); }
Chenbo Fenged37fea2017-12-13 19:35:01 -0800149
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700150 void populateFakeStats(uint64_t cookie, uint32_t uid, uint32_t tag, StatsKey* key) {
Chenbo Fenged37fea2017-12-13 19:35:01 -0800151 UidTag cookieMapkey = {.uid = (uint32_t)uid, .tag = tag};
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700152 EXPECT_TRUE(isOk(mFakeCookieTagMap.writeValue(cookie, cookieMapkey, BPF_ANY)));
Chenbo Fenged37fea2017-12-13 19:35:01 -0800153 *key = {.uid = uid, .tag = tag, .counterSet = TEST_COUNTERSET, .ifaceIndex = 1};
Chenbo Fengeac6c472018-02-05 15:06:23 -0800154 StatsValue statsMapValue = {.rxPackets = 1, .rxBytes = 100};
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700155 uint8_t counterSet = TEST_COUNTERSET;
156 EXPECT_TRUE(isOk(mFakeUidCounterSetMap.writeValue(uid, counterSet, BPF_ANY)));
157 EXPECT_TRUE(isOk(mFakeTagStatsMap.writeValue(*key, statsMapValue, BPF_ANY)));
Chenbo Fenged37fea2017-12-13 19:35:01 -0800158 key->tag = 0;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700159 EXPECT_TRUE(isOk(mFakeUidStatsMap.writeValue(*key, statsMapValue, BPF_ANY)));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700160 EXPECT_TRUE(isOk(mFakeAppUidStatsMap.writeValue(uid, statsMapValue, BPF_ANY)));
Chenbo Feng63ad5592018-01-22 23:14:12 -0800161 // put tag information back to statsKey
162 key->tag = tag;
Chenbo Fenged37fea2017-12-13 19:35:01 -0800163 }
164
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700165 void checkUidOwnerRuleForChain(ChildChain chain, BpfMap<uint32_t, uint8_t>& targetMap) {
Chenbo Feng89c12f12018-03-21 10:29:18 -0700166 uint32_t uid = TEST_UID;
167 EXPECT_EQ(0, mTc.changeUidOwnerRule(chain, uid, DENY, BLACKLIST));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700168 StatusOr<uint8_t> value = targetMap.readValue(uid);
169 EXPECT_TRUE(isOk(value));
170 EXPECT_EQ(BPF_DROP, value.value());
Chenbo Feng89c12f12018-03-21 10:29:18 -0700171
172 uid = TEST_UID2;
173 EXPECT_EQ(0, mTc.changeUidOwnerRule(chain, uid, ALLOW, WHITELIST));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700174 value = targetMap.readValue(uid);
175 EXPECT_TRUE(isOk(value));
176 EXPECT_EQ(BPF_PASS, value.value());
Chenbo Feng89c12f12018-03-21 10:29:18 -0700177
178 EXPECT_EQ(0, mTc.changeUidOwnerRule(chain, uid, DENY, WHITELIST));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700179 value = targetMap.readValue(uid);
180 EXPECT_FALSE(isOk(value));
181 EXPECT_EQ(ENOENT, value.status().code());
Chenbo Feng89c12f12018-03-21 10:29:18 -0700182
183 uid = TEST_UID;
184 EXPECT_EQ(0, mTc.changeUidOwnerRule(chain, uid, ALLOW, BLACKLIST));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700185 value = targetMap.readValue(uid);
186 EXPECT_FALSE(isOk(value));
187 EXPECT_EQ(ENOENT, value.status().code());
Chenbo Feng89c12f12018-03-21 10:29:18 -0700188
189 uid = TEST_UID3;
190 EXPECT_EQ(-ENOENT, mTc.changeUidOwnerRule(chain, uid, ALLOW, BLACKLIST));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700191 value = targetMap.readValue(uid);
192 EXPECT_FALSE(isOk(value));
193 EXPECT_EQ(ENOENT, value.status().code());
Chenbo Feng89c12f12018-03-21 10:29:18 -0700194 }
195
196 void checkEachUidValue(const std::vector<int32_t>& uids, const uint8_t expectValue,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700197 BpfMap<uint32_t, uint8_t>& targetMap) {
198 for (uint32_t uid : uids) {
199 StatusOr<uint8_t> value = targetMap.readValue(uid);
200 EXPECT_TRUE(isOk(value));
201 EXPECT_EQ(expectValue, value.value());
Chenbo Feng89c12f12018-03-21 10:29:18 -0700202 }
203 std::set<uint32_t> uidSet(uids.begin(), uids.end());
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700204 const auto checkNoOtherUid = [&uidSet](const int32_t& key,
205 const BpfMap<uint32_t, uint8_t>&) {
206 EXPECT_NE(uidSet.end(), uidSet.find(key));
207 return netdutils::status::ok;
Chenbo Feng89c12f12018-03-21 10:29:18 -0700208 };
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700209 EXPECT_TRUE(isOk(targetMap.iterate(checkNoOtherUid)));
Chenbo Feng89c12f12018-03-21 10:29:18 -0700210 }
211
212 void checkUidMapReplace(const std::string& name, const std::vector<int32_t>& uids,
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700213 BpfMap<uint32_t, uint8_t>& targetMap) {
Chenbo Feng89c12f12018-03-21 10:29:18 -0700214 bool isWhitelist = true;
215 EXPECT_EQ(0, mTc.replaceUidOwnerMap(name, isWhitelist, uids));
216 checkEachUidValue(uids, BPF_PASS, targetMap);
217
218 isWhitelist = false;
219 EXPECT_EQ(0, mTc.replaceUidOwnerMap(name, isWhitelist, uids));
220 checkEachUidValue(uids, BPF_DROP, targetMap);
221 }
222
Chenbo Fenged37fea2017-12-13 19:35:01 -0800223 void TearDown() {
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700224 std::lock_guard<std::mutex> ownerGuard(mTc.mOwnerMatchMutex);
Chenbo Fenged37fea2017-12-13 19:35:01 -0800225 mFakeCookieTagMap.reset();
226 mFakeUidCounterSetMap.reset();
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700227 mFakeAppUidStatsMap.reset();
Chenbo Fenged37fea2017-12-13 19:35:01 -0800228 mFakeUidStatsMap.reset();
229 mFakeTagStatsMap.reset();
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700230 mTc.mDozableUidMap.reset();
231 mTc.mStandbyUidMap.reset();
232 mTc.mPowerSaveUidMap.reset();
Chenbo Fenged37fea2017-12-13 19:35:01 -0800233 }
234};
235
236TEST_F(TrafficControllerTest, TestTagSocketV4) {
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +0900237 SKIP_IF_BPF_NOT_SUPPORTED;
238
Chenbo Fenged37fea2017-12-13 19:35:01 -0800239 uint64_t sockCookie;
240 int v4socket = setUpSocketAndTag(AF_INET, &sockCookie, TEST_TAG, TEST_UID);
241 expectUidTag(sockCookie, TEST_UID, TEST_TAG);
242 ASSERT_EQ(0, mTc.untagSocket(v4socket));
243 expectNoTag(sockCookie);
244 expectTagMapEmpty();
245}
246
247TEST_F(TrafficControllerTest, TestReTagSocket) {
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +0900248 SKIP_IF_BPF_NOT_SUPPORTED;
249
Chenbo Fenged37fea2017-12-13 19:35:01 -0800250 uint64_t sockCookie;
251 int v4socket = setUpSocketAndTag(AF_INET, &sockCookie, TEST_TAG, TEST_UID);
252 expectUidTag(sockCookie, TEST_UID, TEST_TAG);
253 ASSERT_EQ(0, mTc.tagSocket(v4socket, TEST_TAG + 1, TEST_UID + 1));
254 expectUidTag(sockCookie, TEST_UID + 1, TEST_TAG + 1);
255}
256
257TEST_F(TrafficControllerTest, TestTagTwoSockets) {
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +0900258 SKIP_IF_BPF_NOT_SUPPORTED;
259
Chenbo Fenged37fea2017-12-13 19:35:01 -0800260 uint64_t sockCookie1;
261 uint64_t sockCookie2;
262 int v4socket1 = setUpSocketAndTag(AF_INET, &sockCookie1, TEST_TAG, TEST_UID);
263 setUpSocketAndTag(AF_INET, &sockCookie2, TEST_TAG, TEST_UID);
264 expectUidTag(sockCookie1, TEST_UID, TEST_TAG);
265 expectUidTag(sockCookie2, TEST_UID, TEST_TAG);
266 ASSERT_EQ(0, mTc.untagSocket(v4socket1));
267 expectNoTag(sockCookie1);
268 expectUidTag(sockCookie2, TEST_UID, TEST_TAG);
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700269 ASSERT_FALSE(isOk(mFakeCookieTagMap.getNextKey(sockCookie2)));
Chenbo Fenged37fea2017-12-13 19:35:01 -0800270}
271
272TEST_F(TrafficControllerTest, TestTagSocketV6) {
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +0900273 SKIP_IF_BPF_NOT_SUPPORTED;
274
Chenbo Fenged37fea2017-12-13 19:35:01 -0800275 uint64_t sockCookie;
276 int v6socket = setUpSocketAndTag(AF_INET6, &sockCookie, TEST_TAG, TEST_UID);
277 expectUidTag(sockCookie, TEST_UID, TEST_TAG);
278 ASSERT_EQ(0, mTc.untagSocket(v6socket));
279 expectNoTag(sockCookie);
280 expectTagMapEmpty();
281}
282
283TEST_F(TrafficControllerTest, TestTagInvalidSocket) {
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +0900284 SKIP_IF_BPF_NOT_SUPPORTED;
285
Chenbo Fenged37fea2017-12-13 19:35:01 -0800286 int invalidSocket = -1;
287 ASSERT_GT(0, mTc.tagSocket(invalidSocket, TEST_TAG, TEST_UID));
288 expectTagMapEmpty();
289}
290
291TEST_F(TrafficControllerTest, TestUntagInvalidSocket) {
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +0900292 SKIP_IF_BPF_NOT_SUPPORTED;
293
Chenbo Fenged37fea2017-12-13 19:35:01 -0800294 int invalidSocket = -1;
295 ASSERT_GT(0, mTc.untagSocket(invalidSocket));
296 int v4socket = socket(AF_INET, SOCK_STREAM, 0);
297 ASSERT_GT(0, mTc.untagSocket(v4socket));
298 expectTagMapEmpty();
299}
300
301TEST_F(TrafficControllerTest, TestSetCounterSet) {
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +0900302 SKIP_IF_BPF_NOT_SUPPORTED;
303
Chenbo Fenged37fea2017-12-13 19:35:01 -0800304 ASSERT_EQ(0, mTc.setCounterSet(TEST_COUNTERSET, TEST_UID));
305 uid_t uid = TEST_UID;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700306 StatusOr<uint8_t> counterSetResult = mFakeUidCounterSetMap.readValue(uid);
307 ASSERT_TRUE(isOk(counterSetResult));
308 ASSERT_EQ(TEST_COUNTERSET, counterSetResult.value());
Chenbo Fenged37fea2017-12-13 19:35:01 -0800309 ASSERT_EQ(0, mTc.setCounterSet(DEFAULT_COUNTERSET, TEST_UID));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700310 ASSERT_FALSE(isOk(mFakeUidCounterSetMap.readValue(uid)));
311 ASSERT_FALSE(isOk(mFakeUidCounterSetMap.getFirstKey()));
Chenbo Fenged37fea2017-12-13 19:35:01 -0800312}
313
314TEST_F(TrafficControllerTest, TestSetInvalidCounterSet) {
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +0900315 SKIP_IF_BPF_NOT_SUPPORTED;
316
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700317 ASSERT_GT(0, mTc.setCounterSet(OVERFLOW_COUNTERSET, TEST_UID));
Chenbo Fenged37fea2017-12-13 19:35:01 -0800318 uid_t uid = TEST_UID;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700319 ASSERT_FALSE(isOk(mFakeUidCounterSetMap.readValue(uid)));
320 ASSERT_FALSE(isOk(mFakeUidCounterSetMap.getFirstKey()));
Chenbo Fenged37fea2017-12-13 19:35:01 -0800321}
322
323TEST_F(TrafficControllerTest, TestDeleteTagData) {
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +0900324 SKIP_IF_BPF_NOT_SUPPORTED;
325
Chenbo Fenged37fea2017-12-13 19:35:01 -0800326 uint64_t cookie = 1;
327 uid_t uid = TEST_UID;
328 uint32_t tag = TEST_TAG;
329 StatsKey tagStatsMapKey;
330 populateFakeStats(cookie, uid, tag, &tagStatsMapKey);
331 ASSERT_EQ(0, mTc.deleteTagData(TEST_TAG, TEST_UID));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700332 ASSERT_FALSE(isOk(mFakeCookieTagMap.readValue(cookie)));
333 StatusOr<uint8_t> counterSetResult = mFakeUidCounterSetMap.readValue(uid);
334 ASSERT_TRUE(isOk(counterSetResult));
335 ASSERT_EQ(TEST_COUNTERSET, counterSetResult.value());
336 ASSERT_FALSE(isOk(mFakeTagStatsMap.readValue(tagStatsMapKey)));
Chenbo Feng63ad5592018-01-22 23:14:12 -0800337 tagStatsMapKey.tag = 0;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700338 StatusOr<StatsValue> statsMapResult = mFakeUidStatsMap.readValue(tagStatsMapKey);
339 ASSERT_TRUE(isOk(statsMapResult));
340 ASSERT_EQ((uint64_t)1, statsMapResult.value().rxPackets);
341 ASSERT_EQ((uint64_t)100, statsMapResult.value().rxBytes);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700342 auto appStatsResult = mFakeAppUidStatsMap.readValue(TEST_UID);
343 ASSERT_TRUE(isOk(appStatsResult));
344 ASSERT_EQ((uint64_t)1, appStatsResult.value().rxPackets);
345 ASSERT_EQ((uint64_t)100, appStatsResult.value().rxBytes);
Chenbo Fenged37fea2017-12-13 19:35:01 -0800346}
347
348TEST_F(TrafficControllerTest, TestDeleteAllUidData) {
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +0900349 SKIP_IF_BPF_NOT_SUPPORTED;
350
Chenbo Fenged37fea2017-12-13 19:35:01 -0800351 uint64_t cookie = 1;
352 uid_t uid = TEST_UID;
353 uint32_t tag = TEST_TAG;
354 StatsKey tagStatsMapKey;
355 populateFakeStats(cookie, uid, tag, &tagStatsMapKey);
356 ASSERT_EQ(0, mTc.deleteTagData(0, TEST_UID));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700357 ASSERT_FALSE(isOk(mFakeCookieTagMap.readValue(cookie)));
358 ASSERT_FALSE(isOk(mFakeUidCounterSetMap.readValue(uid)));
359 ASSERT_FALSE(isOk(mFakeTagStatsMap.readValue(tagStatsMapKey)));
360 tagStatsMapKey.tag = 0;
361 ASSERT_FALSE(isOk(mFakeUidStatsMap.readValue(tagStatsMapKey)));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700362 ASSERT_FALSE(isOk(mFakeAppUidStatsMap.readValue(TEST_UID)));
Chenbo Fenged37fea2017-12-13 19:35:01 -0800363}
364
365TEST_F(TrafficControllerTest, TestDeleteDataWithTwoTags) {
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +0900366 SKIP_IF_BPF_NOT_SUPPORTED;
367
Chenbo Fenged37fea2017-12-13 19:35:01 -0800368 uint64_t cookie1 = 1;
369 uint64_t cookie2 = 2;
370 uid_t uid = TEST_UID;
371 uint32_t tag1 = TEST_TAG;
372 uint32_t tag2 = TEST_TAG + 1;
373 StatsKey tagStatsMapKey1;
374 StatsKey tagStatsMapKey2;
375 populateFakeStats(cookie1, uid, tag1, &tagStatsMapKey1);
376 populateFakeStats(cookie2, uid, tag2, &tagStatsMapKey2);
377 ASSERT_EQ(0, mTc.deleteTagData(TEST_TAG, TEST_UID));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700378 ASSERT_FALSE(isOk(mFakeCookieTagMap.readValue(cookie1)));
379 StatusOr<UidTag> cookieMapResult = mFakeCookieTagMap.readValue(cookie2);
380 ASSERT_TRUE(isOk(cookieMapResult));
381 ASSERT_EQ(TEST_UID, cookieMapResult.value().uid);
382 ASSERT_EQ(TEST_TAG + 1, cookieMapResult.value().tag);
383 StatusOr<uint8_t> counterSetResult = mFakeUidCounterSetMap.readValue(uid);
384 ASSERT_TRUE(isOk(counterSetResult));
385 ASSERT_EQ(TEST_COUNTERSET, counterSetResult.value());
386 ASSERT_FALSE(isOk(mFakeTagStatsMap.readValue(tagStatsMapKey1)));
387 StatusOr<StatsValue> statsMapResult = mFakeTagStatsMap.readValue(tagStatsMapKey2);
388 ASSERT_TRUE(isOk(statsMapResult));
389 ASSERT_EQ((uint64_t)1, statsMapResult.value().rxPackets);
390 ASSERT_EQ((uint64_t)100, statsMapResult.value().rxBytes);
Chenbo Fenged37fea2017-12-13 19:35:01 -0800391}
392
393TEST_F(TrafficControllerTest, TestDeleteDataWithTwoUids) {
Lorenzo Colitti23e5c7f2018-01-12 17:55:59 +0900394 SKIP_IF_BPF_NOT_SUPPORTED;
395
Chenbo Fenged37fea2017-12-13 19:35:01 -0800396 uint64_t cookie1 = 1;
397 uint64_t cookie2 = 2;
398 uid_t uid1 = TEST_UID;
399 uid_t uid2 = TEST_UID + 1;
400 uint32_t tag = TEST_TAG;
401 StatsKey tagStatsMapKey1;
402 StatsKey tagStatsMapKey2;
403 populateFakeStats(cookie1, uid1, tag, &tagStatsMapKey1);
404 populateFakeStats(cookie2, uid2, tag, &tagStatsMapKey2);
405
406 // Delete the stats of one of the uid. Check if it is properly collected by
407 // removedStats.
408 ASSERT_EQ(0, mTc.deleteTagData(0, uid2));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700409 ASSERT_FALSE(isOk(mFakeCookieTagMap.readValue(cookie2)));
410 StatusOr<uint8_t> counterSetResult = mFakeUidCounterSetMap.readValue(uid1);
411 ASSERT_TRUE(isOk(counterSetResult));
412 ASSERT_EQ(TEST_COUNTERSET, counterSetResult.value());
413 ASSERT_FALSE(isOk(mFakeUidCounterSetMap.readValue(uid2)));
414 ASSERT_FALSE(isOk(mFakeTagStatsMap.readValue(tagStatsMapKey2)));
Chenbo Feng63ad5592018-01-22 23:14:12 -0800415 tagStatsMapKey2.tag = 0;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700416 ASSERT_FALSE(isOk(mFakeUidStatsMap.readValue(tagStatsMapKey2)));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700417 ASSERT_FALSE(isOk(mFakeAppUidStatsMap.readValue(uid2)));
Chenbo Feng63ad5592018-01-22 23:14:12 -0800418 tagStatsMapKey1.tag = 0;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700419 StatusOr<StatsValue> statsMapResult = mFakeUidStatsMap.readValue(tagStatsMapKey1);
420 ASSERT_TRUE(isOk(statsMapResult));
421 ASSERT_EQ((uint64_t)1, statsMapResult.value().rxPackets);
422 ASSERT_EQ((uint64_t)100, statsMapResult.value().rxBytes);
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700423 auto appStatsResult = mFakeAppUidStatsMap.readValue(uid1);
424 ASSERT_TRUE(isOk(appStatsResult));
425 ASSERT_EQ((uint64_t)1, appStatsResult.value().rxPackets);
426 ASSERT_EQ((uint64_t)100, appStatsResult.value().rxBytes);
Chenbo Fenged37fea2017-12-13 19:35:01 -0800427
Chenbo Fengef1cab32018-04-13 19:50:49 -0700428 // Delete the stats of the other uid.
Chenbo Fenged37fea2017-12-13 19:35:01 -0800429 ASSERT_EQ(0, mTc.deleteTagData(0, uid1));
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700430 ASSERT_FALSE(isOk(mFakeUidStatsMap.readValue(tagStatsMapKey1)));
Chenbo Fengbc4a15f2018-05-11 19:15:15 -0700431 ASSERT_FALSE(isOk(mFakeAppUidStatsMap.readValue(uid1)));
Chenbo Fenged37fea2017-12-13 19:35:01 -0800432}
433
Chenbo Feng89c12f12018-03-21 10:29:18 -0700434TEST_F(TrafficControllerTest, TestUpdateOwnerMapEntry) {
435 SKIP_IF_BPF_NOT_SUPPORTED;
436
437 uint32_t uid = TEST_UID;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700438 ASSERT_TRUE(isOk(mTc.updateOwnerMapEntry(mFakeDozableUidMap, uid, DENY, BLACKLIST)));
439 StatusOr<uint8_t> value = mFakeDozableUidMap.readValue(uid);
440 ASSERT_TRUE(isOk(value));
441 ASSERT_EQ(BPF_DROP, value.value());
Chenbo Feng89c12f12018-03-21 10:29:18 -0700442
443 uid = TEST_UID2;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700444 ASSERT_TRUE(isOk(mTc.updateOwnerMapEntry(mFakeDozableUidMap, uid, ALLOW, WHITELIST)));
445 value = mFakeDozableUidMap.readValue(uid);
446 ASSERT_TRUE(isOk(value));
447 ASSERT_EQ(BPF_PASS, value.value());
Chenbo Feng89c12f12018-03-21 10:29:18 -0700448
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700449 ASSERT_TRUE(isOk(mTc.updateOwnerMapEntry(mFakeDozableUidMap, uid, DENY, WHITELIST)));
450 ASSERT_FALSE(isOk(mFakeDozableUidMap.readValue(uid)));
Chenbo Feng89c12f12018-03-21 10:29:18 -0700451
452 uid = TEST_UID;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700453 ASSERT_TRUE(isOk(mTc.updateOwnerMapEntry(mFakeDozableUidMap, uid, ALLOW, BLACKLIST)));
454 ASSERT_FALSE(isOk(mFakeDozableUidMap.readValue(uid)));
Chenbo Feng89c12f12018-03-21 10:29:18 -0700455
456 uid = TEST_UID3;
Chenbo Feng4f6c2372018-04-26 10:37:55 -0700457 ASSERT_FALSE(isOk(mTc.updateOwnerMapEntry(mFakeDozableUidMap, uid, ALLOW, BLACKLIST)));
458 ASSERT_FALSE(isOk(mFakeDozableUidMap.readValue(uid)));
Chenbo Feng89c12f12018-03-21 10:29:18 -0700459}
460
461TEST_F(TrafficControllerTest, TestChangeUidOwnerRule) {
462 SKIP_IF_BPF_NOT_SUPPORTED;
463
464 checkUidOwnerRuleForChain(DOZABLE, mFakeDozableUidMap);
465 checkUidOwnerRuleForChain(STANDBY, mFakeStandbyUidMap);
466 checkUidOwnerRuleForChain(POWERSAVE, mFakePowerSaveUidMap);
467 ASSERT_EQ(-EINVAL, mTc.changeUidOwnerRule(NONE, TEST_UID, ALLOW, WHITELIST));
468 ASSERT_EQ(-EINVAL, mTc.changeUidOwnerRule(INVALID_CHAIN, TEST_UID, ALLOW, WHITELIST));
469}
470
471TEST_F(TrafficControllerTest, TestReplaceUidOwnerMap) {
472 SKIP_IF_BPF_NOT_SUPPORTED;
473
474 std::vector<int32_t> uids = {TEST_UID, TEST_UID2, TEST_UID3};
475 checkUidMapReplace("fw_dozable", uids, mFakeDozableUidMap);
476 checkUidMapReplace("fw_standby", uids, mFakeStandbyUidMap);
477 checkUidMapReplace("fw_powersave", uids, mFakePowerSaveUidMap);
478 ASSERT_EQ(-EINVAL, mTc.replaceUidOwnerMap("unknow", true, uids));
479}
480
Chenbo Fenged37fea2017-12-13 19:35:01 -0800481} // namespace net
482} // namespace android