blob: ee7d770ec53d98d82192db76f1ff74855108b726 [file] [log] [blame]
David Chende701692017-10-05 13:16:02 -07001// Copyright (C) 2017 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Joe Onorato9fc9edf2017-10-15 20:08:52 -070015#include "packages/UidMap.h"
David Chen21582962017-11-01 17:32:46 -070016#include "StatsLogProcessor.h"
David Chend6896892017-10-25 11:49:03 -070017#include "config/ConfigKey.h"
David Chenc136f45a2017-11-27 11:52:26 -080018#include "guardrail/StatsdStats.h"
David Chen21582962017-11-01 17:32:46 -070019#include "logd/LogEvent.h"
20#include "statslog.h"
Yangster-mac94e197c2018-01-02 16:03:03 -080021#include "statsd_test_util.h"
David Chende701692017-10-05 13:16:02 -070022
23#include <gtest/gtest.h>
Joe Onorato9fc9edf2017-10-15 20:08:52 -070024
David Chende701692017-10-05 13:16:02 -070025#include <stdio.h>
26
27using namespace android;
David Chend6896892017-10-25 11:49:03 -070028
29namespace android {
30namespace os {
31namespace statsd {
David Chende701692017-10-05 13:16:02 -070032
33#ifdef __ANDROID__
34const string kApp1 = "app1.sharing.1";
35const string kApp2 = "app2.sharing.1";
36
David Chen21582962017-11-01 17:32:46 -070037TEST(UidMapTest, TestIsolatedUID) {
38 sp<UidMap> m = new UidMap();
Yangster-mac932ecec2018-02-01 10:23:52 -080039 sp<AlarmMonitor> anomalyAlarmMonitor;
40 sp<AlarmMonitor> subscriberAlarmMonitor;
David Chenc136f45a2017-11-27 11:52:26 -080041 // Construct the processor with a dummy sendBroadcast function that does nothing.
Yangster-mac932ecec2018-02-01 10:23:52 -080042 StatsLogProcessor p(m, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
43 [](const ConfigKey& key) {});
David Chen21582962017-11-01 17:32:46 -070044 LogEvent addEvent(android::util::ISOLATED_UID_CHANGED, 1);
Yao Chen80235402017-11-13 20:42:25 -080045 addEvent.write(100); // parent UID
46 addEvent.write(101); // isolated UID
47 addEvent.write(1); // Indicates creation.
David Chen21582962017-11-01 17:32:46 -070048 addEvent.init();
49
Yangster-macd40053e2018-01-09 16:29:22 -080050 EXPECT_EQ(101, m->getHostUidOrSelf(101));
David Chen21582962017-11-01 17:32:46 -070051
Yangster-macd40053e2018-01-09 16:29:22 -080052 p.OnLogEvent(&addEvent);
53 EXPECT_EQ(100, m->getHostUidOrSelf(101));
David Chen21582962017-11-01 17:32:46 -070054
55 LogEvent removeEvent(android::util::ISOLATED_UID_CHANGED, 1);
Yao Chen80235402017-11-13 20:42:25 -080056 removeEvent.write(100); // parent UID
57 removeEvent.write(101); // isolated UID
58 removeEvent.write(0); // Indicates removal.
David Chen21582962017-11-01 17:32:46 -070059 removeEvent.init();
Yangster-macd40053e2018-01-09 16:29:22 -080060 p.OnLogEvent(&removeEvent);
61 EXPECT_EQ(101, m->getHostUidOrSelf(101));
David Chen21582962017-11-01 17:32:46 -070062}
63
David Chende701692017-10-05 13:16:02 -070064TEST(UidMapTest, TestMatching) {
65 UidMap m;
66 vector<int32_t> uids;
Dianne Hackborn3accca02013-09-20 09:32:11 -070067 vector<int64_t> versions;
David Chende701692017-10-05 13:16:02 -070068 vector<String16> apps;
69
70 uids.push_back(1000);
71 uids.push_back(1000);
72 apps.push_back(String16(kApp1.c_str()));
73 apps.push_back(String16(kApp2.c_str()));
74 versions.push_back(4);
75 versions.push_back(5);
76 m.updateMap(uids, versions, apps);
77 EXPECT_TRUE(m.hasApp(1000, kApp1));
78 EXPECT_TRUE(m.hasApp(1000, kApp2));
79 EXPECT_FALSE(m.hasApp(1000, "not.app"));
Yangster9df9a7f2017-12-18 13:33:05 -080080
81 std::set<string> name_set = m.getAppNamesFromUid(1000u, true /* returnNormalized */);
82 EXPECT_EQ(name_set.size(), 2u);
83 EXPECT_TRUE(name_set.find(kApp1) != name_set.end());
84 EXPECT_TRUE(name_set.find(kApp2) != name_set.end());
85
86 name_set = m.getAppNamesFromUid(12345, true /* returnNormalized */);
87 EXPECT_TRUE(name_set.empty());
David Chende701692017-10-05 13:16:02 -070088}
89
90TEST(UidMapTest, TestAddAndRemove) {
91 UidMap m;
92 vector<int32_t> uids;
Dianne Hackborn3accca02013-09-20 09:32:11 -070093 vector<int64_t> versions;
David Chende701692017-10-05 13:16:02 -070094 vector<String16> apps;
95
96 uids.push_back(1000);
97 uids.push_back(1000);
98 apps.push_back(String16(kApp1.c_str()));
99 apps.push_back(String16(kApp2.c_str()));
100 versions.push_back(4);
101 versions.push_back(5);
102 m.updateMap(uids, versions, apps);
103
Yangster9df9a7f2017-12-18 13:33:05 -0800104 std::set<string> name_set = m.getAppNamesFromUid(1000, true /* returnNormalized */);
105 EXPECT_EQ(name_set.size(), 2u);
106 EXPECT_TRUE(name_set.find(kApp1) != name_set.end());
107 EXPECT_TRUE(name_set.find(kApp2) != name_set.end());
108
109 // Update the app1 version.
David Chende701692017-10-05 13:16:02 -0700110 m.updateApp(String16(kApp1.c_str()), 1000, 40);
111 EXPECT_EQ(40, m.getAppVersion(1000, kApp1));
112
Yangster9df9a7f2017-12-18 13:33:05 -0800113 name_set = m.getAppNamesFromUid(1000, true /* returnNormalized */);
114 EXPECT_EQ(name_set.size(), 2u);
115 EXPECT_TRUE(name_set.find(kApp1) != name_set.end());
116 EXPECT_TRUE(name_set.find(kApp2) != name_set.end());
117
David Chende701692017-10-05 13:16:02 -0700118 m.removeApp(String16(kApp1.c_str()), 1000);
119 EXPECT_FALSE(m.hasApp(1000, kApp1));
120 EXPECT_TRUE(m.hasApp(1000, kApp2));
Yangster9df9a7f2017-12-18 13:33:05 -0800121 name_set = m.getAppNamesFromUid(1000, true /* returnNormalized */);
122 EXPECT_EQ(name_set.size(), 1u);
123 EXPECT_TRUE(name_set.find(kApp1) == name_set.end());
124 EXPECT_TRUE(name_set.find(kApp2) != name_set.end());
125
126 // Remove app2.
127 m.removeApp(String16(kApp2.c_str()), 1000);
128 EXPECT_FALSE(m.hasApp(1000, kApp1));
129 EXPECT_FALSE(m.hasApp(1000, kApp2));
130 name_set = m.getAppNamesFromUid(1000, true /* returnNormalized */);
131 EXPECT_TRUE(name_set.empty());
132}
133
134TEST(UidMapTest, TestUpdateApp) {
135 UidMap m;
136 m.updateMap({1000, 1000}, {4, 5}, {String16(kApp1.c_str()), String16(kApp2.c_str())});
137 std::set<string> name_set = m.getAppNamesFromUid(1000, true /* returnNormalized */);
138 EXPECT_EQ(name_set.size(), 2u);
139 EXPECT_TRUE(name_set.find(kApp1) != name_set.end());
140 EXPECT_TRUE(name_set.find(kApp2) != name_set.end());
141
142 // Adds a new name for uid 1000.
143 m.updateApp(String16("NeW_aPP1_NAmE"), 1000, 40);
144 name_set = m.getAppNamesFromUid(1000, true /* returnNormalized */);
145 EXPECT_EQ(name_set.size(), 3u);
146 EXPECT_TRUE(name_set.find(kApp1) != name_set.end());
147 EXPECT_TRUE(name_set.find(kApp2) != name_set.end());
148 EXPECT_TRUE(name_set.find("NeW_aPP1_NAmE") == name_set.end());
149 EXPECT_TRUE(name_set.find("new_app1_name") != name_set.end());
150
151 // This name is also reused by another uid 2000.
152 m.updateApp(String16("NeW_aPP1_NAmE"), 2000, 1);
153 name_set = m.getAppNamesFromUid(2000, true /* returnNormalized */);
154 EXPECT_EQ(name_set.size(), 1u);
155 EXPECT_TRUE(name_set.find("NeW_aPP1_NAmE") == name_set.end());
156 EXPECT_TRUE(name_set.find("new_app1_name") != name_set.end());
David Chende701692017-10-05 13:16:02 -0700157}
David Chend6896892017-10-25 11:49:03 -0700158
159TEST(UidMapTest, TestClearingOutput) {
160 UidMap m;
161
Yangster-mac94e197c2018-01-02 16:03:03 -0800162 ConfigKey config1(1, StringToId("config1"));
163 ConfigKey config2(1, StringToId("config2"));
David Chend6896892017-10-25 11:49:03 -0700164
165 m.OnConfigUpdated(config1);
166
167 vector<int32_t> uids;
Dianne Hackborn3accca02013-09-20 09:32:11 -0700168 vector<int64_t> versions;
David Chend6896892017-10-25 11:49:03 -0700169 vector<String16> apps;
170 uids.push_back(1000);
171 uids.push_back(1000);
172 apps.push_back(String16(kApp1.c_str()));
173 apps.push_back(String16(kApp2.c_str()));
174 versions.push_back(4);
175 versions.push_back(5);
176 m.updateMap(1, uids, versions, apps);
David Chenf384b902018-03-14 18:36:45 -0700177 EXPECT_EQ(1U, m.mSnapshots.size());
David Chend6896892017-10-25 11:49:03 -0700178
David Chenf384b902018-03-14 18:36:45 -0700179 vector<uint8_t> bytes;
180 m.getOutput(2, config1, &bytes);
181 UidMapping results;
182 results.ParseFromArray(bytes.data(), bytes.size());
David Chend6896892017-10-25 11:49:03 -0700183 EXPECT_EQ(1, results.snapshots_size());
184
185 // It should be cleared now
David Chenf384b902018-03-14 18:36:45 -0700186 EXPECT_EQ(1U, m.mSnapshots.size());
187 bytes.clear();
188 m.getOutput(2, config1, &bytes);
189 results.ParseFromArray(bytes.data(), bytes.size());
David Chencfc311d2018-01-23 17:55:54 -0800190 EXPECT_EQ(1, results.snapshots_size());
David Chend6896892017-10-25 11:49:03 -0700191
192 // Now add another configuration.
193 m.OnConfigUpdated(config2);
194 m.updateApp(5, String16(kApp1.c_str()), 1000, 40);
David Chenf384b902018-03-14 18:36:45 -0700195 EXPECT_EQ(1U, m.mChanges.size());
196 bytes.clear();
197 m.getOutput(6, config1, &bytes);
198 results.ParseFromArray(bytes.data(), bytes.size());
David Chencfc311d2018-01-23 17:55:54 -0800199 EXPECT_EQ(1, results.snapshots_size());
David Chend6896892017-10-25 11:49:03 -0700200 EXPECT_EQ(1, results.changes_size());
David Chenf384b902018-03-14 18:36:45 -0700201 EXPECT_EQ(1U, m.mChanges.size());
David Chend6896892017-10-25 11:49:03 -0700202
David Chenc136f45a2017-11-27 11:52:26 -0800203 // Add another delta update.
David Chend6896892017-10-25 11:49:03 -0700204 m.updateApp(7, String16(kApp2.c_str()), 1001, 41);
David Chenf384b902018-03-14 18:36:45 -0700205 EXPECT_EQ(2U, m.mChanges.size());
David Chenc136f45a2017-11-27 11:52:26 -0800206
207 // We still can't remove anything.
David Chenf384b902018-03-14 18:36:45 -0700208 bytes.clear();
209 m.getOutput(8, config1, &bytes);
210 results.ParseFromArray(bytes.data(), bytes.size());
David Chencfc311d2018-01-23 17:55:54 -0800211 EXPECT_EQ(1, results.snapshots_size());
David Chenf384b902018-03-14 18:36:45 -0700212 EXPECT_EQ(1, results.changes_size());
213 EXPECT_EQ(2U, m.mChanges.size());
David Chend6896892017-10-25 11:49:03 -0700214
David Chenf384b902018-03-14 18:36:45 -0700215 bytes.clear();
216 m.getOutput(9, config2, &bytes);
217 results.ParseFromArray(bytes.data(), bytes.size());
David Chencfc311d2018-01-23 17:55:54 -0800218 EXPECT_EQ(1, results.snapshots_size());
David Chend6896892017-10-25 11:49:03 -0700219 EXPECT_EQ(2, results.changes_size());
220 // At this point both should be cleared.
David Chenf384b902018-03-14 18:36:45 -0700221 EXPECT_EQ(1U, m.mSnapshots.size());
222 EXPECT_EQ(0U, m.mChanges.size());
David Chend6896892017-10-25 11:49:03 -0700223}
David Chenc136f45a2017-11-27 11:52:26 -0800224
225TEST(UidMapTest, TestMemoryComputed) {
226 UidMap m;
227
Yangster-mac94e197c2018-01-02 16:03:03 -0800228 ConfigKey config1(1, StringToId("config1"));
David Chenc136f45a2017-11-27 11:52:26 -0800229 m.OnConfigUpdated(config1);
230
231 size_t startBytes = m.mBytesUsed;
232 vector<int32_t> uids;
Dianne Hackborn3accca02013-09-20 09:32:11 -0700233 vector<int64_t> versions;
David Chenc136f45a2017-11-27 11:52:26 -0800234 vector<String16> apps;
235 uids.push_back(1000);
236 apps.push_back(String16(kApp1.c_str()));
237 versions.push_back(1);
238 m.updateMap(1, uids, versions, apps);
239 size_t snapshot_bytes = m.mBytesUsed;
240 EXPECT_TRUE(snapshot_bytes > startBytes);
241
242 m.updateApp(3, String16(kApp1.c_str()), 1000, 40);
243 EXPECT_TRUE(m.mBytesUsed > snapshot_bytes);
David Chenc136f45a2017-11-27 11:52:26 -0800244
David Chenf384b902018-03-14 18:36:45 -0700245 vector<uint8_t> bytes;
246 m.getOutput(2, config1, &bytes);
David Chenc136f45a2017-11-27 11:52:26 -0800247 size_t prevBytes = m.mBytesUsed;
248
David Chenf384b902018-03-14 18:36:45 -0700249 m.getOutput(4, config1, &bytes);
David Chenc136f45a2017-11-27 11:52:26 -0800250 EXPECT_TRUE(m.mBytesUsed < prevBytes);
251}
252
253TEST(UidMapTest, TestMemoryGuardrail) {
254 UidMap m;
255 string buf;
256
Yangster-mac94e197c2018-01-02 16:03:03 -0800257 ConfigKey config1(1, StringToId("config1"));
David Chenc136f45a2017-11-27 11:52:26 -0800258 m.OnConfigUpdated(config1);
259
260 size_t startBytes = m.mBytesUsed;
261 vector<int32_t> uids;
Dianne Hackborn3accca02013-09-20 09:32:11 -0700262 vector<int64_t> versions;
David Chenc136f45a2017-11-27 11:52:26 -0800263 vector<String16> apps;
264 for (int i = 0; i < 100; i++) {
265 uids.push_back(1);
266 buf = "EXTREMELY_LONG_STRING_FOR_APP_TO_WASTE_MEMORY." + to_string(i);
267 apps.push_back(String16(buf.c_str()));
268 versions.push_back(1);
269 }
270 m.updateMap(1, uids, versions, apps);
David Chenf384b902018-03-14 18:36:45 -0700271 EXPECT_EQ(1U, m.mSnapshots.size());
David Chenc136f45a2017-11-27 11:52:26 -0800272
273 m.updateApp(3, String16("EXTREMELY_LONG_STRING_FOR_APP_TO_WASTE_MEMORY.0"), 1000, 2);
David Chenf384b902018-03-14 18:36:45 -0700274 EXPECT_EQ(1U, m.mSnapshots.size());
275 EXPECT_EQ(1U, m.mChanges.size());
David Chenc136f45a2017-11-27 11:52:26 -0800276
277 // Now force deletion by limiting the memory to hold one delta change.
278 m.maxBytesOverride = 80; // Since the app string alone requires >45 characters.
279 m.updateApp(5, String16("EXTREMELY_LONG_STRING_FOR_APP_TO_WASTE_MEMORY.0"), 1000, 4);
David Chenf384b902018-03-14 18:36:45 -0700280 EXPECT_EQ(0U, m.mSnapshots.size());
281 EXPECT_EQ(1U, m.mChanges.size());
David Chenc136f45a2017-11-27 11:52:26 -0800282}
David Chende701692017-10-05 13:16:02 -0700283#else
284GTEST_LOG_(INFO) << "This test does nothing.\n";
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700285#endif
David Chend6896892017-10-25 11:49:03 -0700286
287} // namespace statsd
288} // namespace os
Yangster-mac20877162017-12-22 17:19:39 -0800289} // namespace android