blob: 5b2ceddc6858635a5b45706fb95eda2a6f1fbcf1 [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"
David Chende701692017-10-05 13:16:02 -070021
22#include <gtest/gtest.h>
Joe Onorato9fc9edf2017-10-15 20:08:52 -070023
David Chende701692017-10-05 13:16:02 -070024#include <stdio.h>
25
26using namespace android;
David Chend6896892017-10-25 11:49:03 -070027
28namespace android {
29namespace os {
30namespace statsd {
David Chende701692017-10-05 13:16:02 -070031
32#ifdef __ANDROID__
33const string kApp1 = "app1.sharing.1";
34const string kApp2 = "app2.sharing.1";
35
David Chen21582962017-11-01 17:32:46 -070036TEST(UidMapTest, TestIsolatedUID) {
37 sp<UidMap> m = new UidMap();
Yangster-mace2cd6d52017-11-09 20:38:30 -080038 sp<AnomalyMonitor> anomalyMonitor;
David Chenc136f45a2017-11-27 11:52:26 -080039 // Construct the processor with a dummy sendBroadcast function that does nothing.
40 StatsLogProcessor p(m, anomalyMonitor, [](const ConfigKey& key) {});
David Chen21582962017-11-01 17:32:46 -070041 LogEvent addEvent(android::util::ISOLATED_UID_CHANGED, 1);
Yao Chen80235402017-11-13 20:42:25 -080042 addEvent.write(100); // parent UID
43 addEvent.write(101); // isolated UID
44 addEvent.write(1); // Indicates creation.
David Chen21582962017-11-01 17:32:46 -070045 addEvent.init();
46
47 EXPECT_EQ(101, m->getParentUidOrSelf(101));
48
49 p.OnLogEvent(addEvent);
50 EXPECT_EQ(100, m->getParentUidOrSelf(101));
51
52 LogEvent removeEvent(android::util::ISOLATED_UID_CHANGED, 1);
Yao Chen80235402017-11-13 20:42:25 -080053 removeEvent.write(100); // parent UID
54 removeEvent.write(101); // isolated UID
55 removeEvent.write(0); // Indicates removal.
David Chen21582962017-11-01 17:32:46 -070056 removeEvent.init();
57 p.OnLogEvent(removeEvent);
58 EXPECT_EQ(101, m->getParentUidOrSelf(101));
59}
60
David Chende701692017-10-05 13:16:02 -070061TEST(UidMapTest, TestMatching) {
62 UidMap m;
63 vector<int32_t> uids;
Dianne Hackborn3accca02013-09-20 09:32:11 -070064 vector<int64_t> versions;
David Chende701692017-10-05 13:16:02 -070065 vector<String16> apps;
66
67 uids.push_back(1000);
68 uids.push_back(1000);
69 apps.push_back(String16(kApp1.c_str()));
70 apps.push_back(String16(kApp2.c_str()));
71 versions.push_back(4);
72 versions.push_back(5);
73 m.updateMap(uids, versions, apps);
74 EXPECT_TRUE(m.hasApp(1000, kApp1));
75 EXPECT_TRUE(m.hasApp(1000, kApp2));
76 EXPECT_FALSE(m.hasApp(1000, "not.app"));
77}
78
79TEST(UidMapTest, TestAddAndRemove) {
80 UidMap m;
81 vector<int32_t> uids;
Dianne Hackborn3accca02013-09-20 09:32:11 -070082 vector<int64_t> versions;
David Chende701692017-10-05 13:16:02 -070083 vector<String16> apps;
84
85 uids.push_back(1000);
86 uids.push_back(1000);
87 apps.push_back(String16(kApp1.c_str()));
88 apps.push_back(String16(kApp2.c_str()));
89 versions.push_back(4);
90 versions.push_back(5);
91 m.updateMap(uids, versions, apps);
92
93 m.updateApp(String16(kApp1.c_str()), 1000, 40);
94 EXPECT_EQ(40, m.getAppVersion(1000, kApp1));
95
96 m.removeApp(String16(kApp1.c_str()), 1000);
97 EXPECT_FALSE(m.hasApp(1000, kApp1));
98 EXPECT_TRUE(m.hasApp(1000, kApp2));
99}
David Chend6896892017-10-25 11:49:03 -0700100
101TEST(UidMapTest, TestClearingOutput) {
102 UidMap m;
103
104 ConfigKey config1(1, "config1");
105 ConfigKey config2(1, "config2");
106
107 m.OnConfigUpdated(config1);
108
109 vector<int32_t> uids;
Dianne Hackborn3accca02013-09-20 09:32:11 -0700110 vector<int64_t> versions;
David Chend6896892017-10-25 11:49:03 -0700111 vector<String16> apps;
112 uids.push_back(1000);
113 uids.push_back(1000);
114 apps.push_back(String16(kApp1.c_str()));
115 apps.push_back(String16(kApp2.c_str()));
116 versions.push_back(4);
117 versions.push_back(5);
118 m.updateMap(1, uids, versions, apps);
David Chenc136f45a2017-11-27 11:52:26 -0800119 EXPECT_EQ(1, m.mOutput.snapshots_size());
David Chend6896892017-10-25 11:49:03 -0700120
121 UidMapping results = m.getOutput(2, config1);
122 EXPECT_EQ(1, results.snapshots_size());
123
124 // It should be cleared now
David Chenc136f45a2017-11-27 11:52:26 -0800125 EXPECT_EQ(0, m.mOutput.snapshots_size());
David Chend6896892017-10-25 11:49:03 -0700126 results = m.getOutput(3, config1);
127 EXPECT_EQ(0, results.snapshots_size());
128
129 // Now add another configuration.
130 m.OnConfigUpdated(config2);
131 m.updateApp(5, String16(kApp1.c_str()), 1000, 40);
David Chenc136f45a2017-11-27 11:52:26 -0800132 EXPECT_EQ(1, m.mOutput.changes_size());
David Chend6896892017-10-25 11:49:03 -0700133 results = m.getOutput(6, config1);
134 EXPECT_EQ(0, results.snapshots_size());
135 EXPECT_EQ(1, results.changes_size());
David Chenc136f45a2017-11-27 11:52:26 -0800136 EXPECT_EQ(1, m.mOutput.changes_size());
David Chend6896892017-10-25 11:49:03 -0700137
David Chenc136f45a2017-11-27 11:52:26 -0800138 // Add another delta update.
David Chend6896892017-10-25 11:49:03 -0700139 m.updateApp(7, String16(kApp2.c_str()), 1001, 41);
David Chenc136f45a2017-11-27 11:52:26 -0800140 EXPECT_EQ(2, m.mOutput.changes_size());
141
142 // We still can't remove anything.
David Chend6896892017-10-25 11:49:03 -0700143 results = m.getOutput(8, config1);
144 EXPECT_EQ(0, results.snapshots_size());
145 EXPECT_EQ(2, results.changes_size());
David Chenc136f45a2017-11-27 11:52:26 -0800146 EXPECT_EQ(2, m.mOutput.changes_size());
David Chend6896892017-10-25 11:49:03 -0700147
148 results = m.getOutput(9, config2);
149 EXPECT_EQ(0, results.snapshots_size());
150 EXPECT_EQ(2, results.changes_size());
151 // At this point both should be cleared.
152 EXPECT_EQ(0, m.mOutput.snapshots_size());
153 EXPECT_EQ(0, m.mOutput.changes_size());
154}
David Chenc136f45a2017-11-27 11:52:26 -0800155
156TEST(UidMapTest, TestMemoryComputed) {
157 UidMap m;
158
159 ConfigKey config1(1, "config1");
160 m.OnConfigUpdated(config1);
161
162 size_t startBytes = m.mBytesUsed;
163 vector<int32_t> uids;
Dianne Hackborn3accca02013-09-20 09:32:11 -0700164 vector<int64_t> versions;
David Chenc136f45a2017-11-27 11:52:26 -0800165 vector<String16> apps;
166 uids.push_back(1000);
167 apps.push_back(String16(kApp1.c_str()));
168 versions.push_back(1);
169 m.updateMap(1, uids, versions, apps);
170 size_t snapshot_bytes = m.mBytesUsed;
171 EXPECT_TRUE(snapshot_bytes > startBytes);
172
173 m.updateApp(3, String16(kApp1.c_str()), 1000, 40);
174 EXPECT_TRUE(m.mBytesUsed > snapshot_bytes);
175 size_t bytesWithSnapshotChange = m.mBytesUsed;
176
177 m.getOutput(2, config1);
178 EXPECT_TRUE(m.mBytesUsed < bytesWithSnapshotChange);
179 size_t prevBytes = m.mBytesUsed;
180
181 m.getOutput(4, config1);
182 EXPECT_TRUE(m.mBytesUsed < prevBytes);
183}
184
185TEST(UidMapTest, TestMemoryGuardrail) {
186 UidMap m;
187 string buf;
188
189 ConfigKey config1(1, "config1");
190 m.OnConfigUpdated(config1);
191
192 size_t startBytes = m.mBytesUsed;
193 vector<int32_t> uids;
Dianne Hackborn3accca02013-09-20 09:32:11 -0700194 vector<int64_t> versions;
David Chenc136f45a2017-11-27 11:52:26 -0800195 vector<String16> apps;
196 for (int i = 0; i < 100; i++) {
197 uids.push_back(1);
198 buf = "EXTREMELY_LONG_STRING_FOR_APP_TO_WASTE_MEMORY." + to_string(i);
199 apps.push_back(String16(buf.c_str()));
200 versions.push_back(1);
201 }
202 m.updateMap(1, uids, versions, apps);
203 EXPECT_EQ(1, m.mOutput.snapshots_size());
204
205 m.updateApp(3, String16("EXTREMELY_LONG_STRING_FOR_APP_TO_WASTE_MEMORY.0"), 1000, 2);
206 EXPECT_EQ(1, m.mOutput.snapshots_size());
207 EXPECT_EQ(1, m.mOutput.changes_size());
208
209 // Now force deletion by limiting the memory to hold one delta change.
210 m.maxBytesOverride = 80; // Since the app string alone requires >45 characters.
211 m.updateApp(5, String16("EXTREMELY_LONG_STRING_FOR_APP_TO_WASTE_MEMORY.0"), 1000, 4);
212 EXPECT_EQ(0, m.mOutput.snapshots_size());
213 EXPECT_EQ(1, m.mOutput.changes_size());
214}
David Chende701692017-10-05 13:16:02 -0700215#else
216GTEST_LOG_(INFO) << "This test does nothing.\n";
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700217#endif
David Chend6896892017-10-25 11:49:03 -0700218
219} // namespace statsd
220} // namespace os
221} // namespace android