blob: ca656ed9ab354502ea8095ac73de342d5f0bb7cd [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 Chenc136f45a2017-11-27 11:52:26 -0800177 EXPECT_EQ(1, m.mOutput.snapshots_size());
David Chend6896892017-10-25 11:49:03 -0700178
179 UidMapping results = m.getOutput(2, config1);
180 EXPECT_EQ(1, results.snapshots_size());
181
182 // It should be cleared now
David Chencfc311d2018-01-23 17:55:54 -0800183 EXPECT_EQ(1, m.mOutput.snapshots_size());
David Chend6896892017-10-25 11:49:03 -0700184 results = m.getOutput(3, config1);
David Chencfc311d2018-01-23 17:55:54 -0800185 EXPECT_EQ(1, results.snapshots_size());
David Chend6896892017-10-25 11:49:03 -0700186
187 // Now add another configuration.
188 m.OnConfigUpdated(config2);
189 m.updateApp(5, String16(kApp1.c_str()), 1000, 40);
David Chenc136f45a2017-11-27 11:52:26 -0800190 EXPECT_EQ(1, m.mOutput.changes_size());
David Chend6896892017-10-25 11:49:03 -0700191 results = m.getOutput(6, config1);
David Chencfc311d2018-01-23 17:55:54 -0800192 EXPECT_EQ(1, results.snapshots_size());
David Chend6896892017-10-25 11:49:03 -0700193 EXPECT_EQ(1, results.changes_size());
David Chenc136f45a2017-11-27 11:52:26 -0800194 EXPECT_EQ(1, m.mOutput.changes_size());
David Chend6896892017-10-25 11:49:03 -0700195
David Chenc136f45a2017-11-27 11:52:26 -0800196 // Add another delta update.
David Chend6896892017-10-25 11:49:03 -0700197 m.updateApp(7, String16(kApp2.c_str()), 1001, 41);
David Chenc136f45a2017-11-27 11:52:26 -0800198 EXPECT_EQ(2, m.mOutput.changes_size());
199
200 // We still can't remove anything.
David Chend6896892017-10-25 11:49:03 -0700201 results = m.getOutput(8, config1);
David Chencfc311d2018-01-23 17:55:54 -0800202 EXPECT_EQ(1, results.snapshots_size());
David Chend6896892017-10-25 11:49:03 -0700203 EXPECT_EQ(2, results.changes_size());
David Chenc136f45a2017-11-27 11:52:26 -0800204 EXPECT_EQ(2, m.mOutput.changes_size());
David Chend6896892017-10-25 11:49:03 -0700205
206 results = m.getOutput(9, config2);
David Chencfc311d2018-01-23 17:55:54 -0800207 EXPECT_EQ(1, results.snapshots_size());
David Chend6896892017-10-25 11:49:03 -0700208 EXPECT_EQ(2, results.changes_size());
209 // At this point both should be cleared.
David Chencfc311d2018-01-23 17:55:54 -0800210 EXPECT_EQ(1, m.mOutput.snapshots_size());
David Chend6896892017-10-25 11:49:03 -0700211 EXPECT_EQ(0, m.mOutput.changes_size());
212}
David Chenc136f45a2017-11-27 11:52:26 -0800213
214TEST(UidMapTest, TestMemoryComputed) {
215 UidMap m;
216
Yangster-mac94e197c2018-01-02 16:03:03 -0800217 ConfigKey config1(1, StringToId("config1"));
David Chenc136f45a2017-11-27 11:52:26 -0800218 m.OnConfigUpdated(config1);
219
220 size_t startBytes = m.mBytesUsed;
221 vector<int32_t> uids;
Dianne Hackborn3accca02013-09-20 09:32:11 -0700222 vector<int64_t> versions;
David Chenc136f45a2017-11-27 11:52:26 -0800223 vector<String16> apps;
224 uids.push_back(1000);
225 apps.push_back(String16(kApp1.c_str()));
226 versions.push_back(1);
227 m.updateMap(1, uids, versions, apps);
228 size_t snapshot_bytes = m.mBytesUsed;
229 EXPECT_TRUE(snapshot_bytes > startBytes);
230
231 m.updateApp(3, String16(kApp1.c_str()), 1000, 40);
232 EXPECT_TRUE(m.mBytesUsed > snapshot_bytes);
David Chenc136f45a2017-11-27 11:52:26 -0800233
234 m.getOutput(2, config1);
David Chenc136f45a2017-11-27 11:52:26 -0800235 size_t prevBytes = m.mBytesUsed;
236
237 m.getOutput(4, config1);
238 EXPECT_TRUE(m.mBytesUsed < prevBytes);
239}
240
241TEST(UidMapTest, TestMemoryGuardrail) {
242 UidMap m;
243 string buf;
244
Yangster-mac94e197c2018-01-02 16:03:03 -0800245 ConfigKey config1(1, StringToId("config1"));
David Chenc136f45a2017-11-27 11:52:26 -0800246 m.OnConfigUpdated(config1);
247
248 size_t startBytes = m.mBytesUsed;
249 vector<int32_t> uids;
Dianne Hackborn3accca02013-09-20 09:32:11 -0700250 vector<int64_t> versions;
David Chenc136f45a2017-11-27 11:52:26 -0800251 vector<String16> apps;
252 for (int i = 0; i < 100; i++) {
253 uids.push_back(1);
254 buf = "EXTREMELY_LONG_STRING_FOR_APP_TO_WASTE_MEMORY." + to_string(i);
255 apps.push_back(String16(buf.c_str()));
256 versions.push_back(1);
257 }
258 m.updateMap(1, uids, versions, apps);
259 EXPECT_EQ(1, m.mOutput.snapshots_size());
260
261 m.updateApp(3, String16("EXTREMELY_LONG_STRING_FOR_APP_TO_WASTE_MEMORY.0"), 1000, 2);
262 EXPECT_EQ(1, m.mOutput.snapshots_size());
263 EXPECT_EQ(1, m.mOutput.changes_size());
264
265 // Now force deletion by limiting the memory to hold one delta change.
266 m.maxBytesOverride = 80; // Since the app string alone requires >45 characters.
267 m.updateApp(5, String16("EXTREMELY_LONG_STRING_FOR_APP_TO_WASTE_MEMORY.0"), 1000, 4);
268 EXPECT_EQ(0, m.mOutput.snapshots_size());
269 EXPECT_EQ(1, m.mOutput.changes_size());
270}
David Chende701692017-10-05 13:16:02 -0700271#else
272GTEST_LOG_(INFO) << "This test does nothing.\n";
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700273#endif
David Chend6896892017-10-25 11:49:03 -0700274
275} // namespace statsd
276} // namespace os
Yangster-mac20877162017-12-22 17:19:39 -0800277} // namespace android