blob: e100d162813b24245d0860c31bce8677bf5cabbd [file] [log] [blame]
Linus Tufvesson9d501752019-02-12 11:33:22 +00001/*
2 * Copyright (C) 2019 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
17package com.android.server.am;
18
Linus Tufvesson9d501752019-02-12 11:33:22 +000019import static com.android.server.am.ActivityManagerService.Injector;
20import static com.android.server.am.AppCompactor.compactActionIntToString;
21
22import static com.google.common.truth.Truth.assertThat;
23
24import android.os.Handler;
25import android.os.HandlerThread;
26import android.provider.DeviceConfig;
27
28import com.android.server.appop.AppOpsService;
29import com.android.server.testables.TestableDeviceConfig;
30
31import org.junit.After;
32import org.junit.Before;
33import org.junit.Rule;
34import org.junit.Test;
35import org.junit.runner.RunWith;
36import org.mockito.Mock;
37import org.mockito.junit.MockitoJUnitRunner;
38
39import java.io.File;
40import java.util.concurrent.CountDownLatch;
41import java.util.concurrent.TimeUnit;
42
43/**
44 * Tests for {@link AppCompactor}.
45 *
46 * Build/Install/Run:
47 * atest FrameworksServicesTests:AppCompactorTest
48 */
49@RunWith(MockitoJUnitRunner.class)
50public final class AppCompactorTest {
51
52 @Mock
53 private AppOpsService mAppOpsService;
54 private AppCompactor mCompactorUnderTest;
55 private HandlerThread mHandlerThread;
56 private Handler mHandler;
57 private CountDownLatch mCountDown;
58
59 @Rule
60 public TestableDeviceConfig mDeviceConfig = new TestableDeviceConfig();
61
62 @Before
63 public void setUp() {
64 mHandlerThread = new HandlerThread("");
65 mHandlerThread.start();
66 mHandler = new Handler(mHandlerThread.getLooper());
67 ActivityManagerService ams = new ActivityManagerService(new TestInjector());
68 mCompactorUnderTest = new AppCompactor(ams,
69 new AppCompactor.PropertyChangedCallbackForTest() {
70 @Override
71 public void onPropertyChanged() {
72 if (mCountDown != null) {
73 mCountDown.countDown();
74 }
75 }
76 });
77 }
78
79 @After
80 public void tearDown() {
81 mHandlerThread.quit();
82 mCountDown = null;
83 }
84
85 @Test
86 public void init_setsDefaults() {
87 mCompactorUnderTest.init();
88 assertThat(mCompactorUnderTest.useCompaction()).isEqualTo(
89 AppCompactor.DEFAULT_USE_COMPACTION);
90 assertThat(mCompactorUnderTest.mCompactActionSome).isEqualTo(
91 compactActionIntToString(AppCompactor.DEFAULT_COMPACT_ACTION_1));
92 assertThat(mCompactorUnderTest.mCompactActionFull).isEqualTo(
93 compactActionIntToString(AppCompactor.DEFAULT_COMPACT_ACTION_2));
94 assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
95 AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
96 assertThat(mCompactorUnderTest.mCompactThrottleSomeFull).isEqualTo(
97 AppCompactor.DEFAULT_COMPACT_THROTTLE_2);
98 assertThat(mCompactorUnderTest.mCompactThrottleFullSome).isEqualTo(
99 AppCompactor.DEFAULT_COMPACT_THROTTLE_3);
100 assertThat(mCompactorUnderTest.mCompactThrottleFullFull).isEqualTo(
101 AppCompactor.DEFAULT_COMPACT_THROTTLE_4);
102 assertThat(mCompactorUnderTest.mStatsdSampleRate).isEqualTo(
103 AppCompactor.DEFAULT_STATSD_SAMPLE_RATE);
104 }
105
106 @Test
107 public void init_withDeviceConfigSetsParameters() {
108 // When the DeviceConfig already has a flag value stored (note this test will need to
109 // change if the default value changes from false).
110 assertThat(AppCompactor.DEFAULT_USE_COMPACTION).isFalse();
Matt Pape40074da2019-02-12 13:53:26 -0800111 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
112 AppCompactor.KEY_USE_COMPACTION, "true", false);
113 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
114 AppCompactor.KEY_COMPACT_ACTION_1,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000115 Integer.toString((AppCompactor.DEFAULT_COMPACT_ACTION_1 + 1 % 4) + 1), false);
Matt Pape40074da2019-02-12 13:53:26 -0800116 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
117 AppCompactor.KEY_COMPACT_ACTION_2,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000118 Integer.toString((AppCompactor.DEFAULT_COMPACT_ACTION_2 + 1 % 4) + 1), false);
Matt Pape40074da2019-02-12 13:53:26 -0800119 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
120 AppCompactor.KEY_COMPACT_THROTTLE_1,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000121 Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1), false);
Matt Pape40074da2019-02-12 13:53:26 -0800122 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
123 AppCompactor.KEY_COMPACT_THROTTLE_2,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000124 Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_2 + 1), false);
Matt Pape40074da2019-02-12 13:53:26 -0800125 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
126 AppCompactor.KEY_COMPACT_THROTTLE_3,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000127 Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1), false);
Matt Pape40074da2019-02-12 13:53:26 -0800128 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
129 AppCompactor.KEY_COMPACT_THROTTLE_4,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000130 Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false);
Matt Pape40074da2019-02-12 13:53:26 -0800131 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
132 AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000133 Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);
134
135 // Then calling init will read and set that flag.
136 mCompactorUnderTest.init();
137 assertThat(mCompactorUnderTest.useCompaction()).isTrue();
138 assertThat(mCompactorUnderTest.mCompactionThread.isAlive()).isTrue();
139
140 assertThat(mCompactorUnderTest.mCompactActionSome).isEqualTo(
141 compactActionIntToString((AppCompactor.DEFAULT_COMPACT_ACTION_1 + 1 % 4) + 1));
142 assertThat(mCompactorUnderTest.mCompactActionFull).isEqualTo(
143 compactActionIntToString((AppCompactor.DEFAULT_COMPACT_ACTION_2 + 1 % 4) + 1));
144 assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
145 AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1);
146 assertThat(mCompactorUnderTest.mCompactThrottleSomeFull).isEqualTo(
147 AppCompactor.DEFAULT_COMPACT_THROTTLE_2 + 1);
148 assertThat(mCompactorUnderTest.mCompactThrottleFullSome).isEqualTo(
149 AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1);
150 assertThat(mCompactorUnderTest.mCompactThrottleFullFull).isEqualTo(
151 AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1);
152 assertThat(mCompactorUnderTest.mStatsdSampleRate).isEqualTo(
153 AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f);
154 }
155
156 @Test
157 public void useCompaction_listensToDeviceConfigChanges() throws InterruptedException {
158 assertThat(mCompactorUnderTest.useCompaction()).isEqualTo(
159 AppCompactor.DEFAULT_USE_COMPACTION);
160 // When we call init and change some the flag value...
161 mCompactorUnderTest.init();
162 mCountDown = new CountDownLatch(1);
Matt Pape40074da2019-02-12 13:53:26 -0800163 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
164 AppCompactor.KEY_USE_COMPACTION, "true", false);
Linus Tufvesson9d501752019-02-12 11:33:22 +0000165 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
166
167 // Then that new flag value is updated in the implementation.
168 assertThat(mCompactorUnderTest.useCompaction()).isTrue();
169 assertThat(mCompactorUnderTest.mCompactionThread.isAlive()).isTrue();
170
171 // And again, setting the flag the other way.
172 mCountDown = new CountDownLatch(1);
Matt Pape40074da2019-02-12 13:53:26 -0800173 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
174 AppCompactor.KEY_USE_COMPACTION, "false", false);
Linus Tufvesson9d501752019-02-12 11:33:22 +0000175 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
176 assertThat(mCompactorUnderTest.useCompaction()).isFalse();
177 }
178
179 @Test
180 public void useCompaction_listensToDeviceConfigChangesBadValues() throws InterruptedException {
181 assertThat(mCompactorUnderTest.useCompaction()).isEqualTo(
182 AppCompactor.DEFAULT_USE_COMPACTION);
183 mCompactorUnderTest.init();
184
185 // When we push an invalid flag value...
186 mCountDown = new CountDownLatch(1);
Matt Pape40074da2019-02-12 13:53:26 -0800187 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
188 AppCompactor.KEY_USE_COMPACTION, "foobar", false);
Linus Tufvesson9d501752019-02-12 11:33:22 +0000189 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
190
191 // Then we set the default.
192 assertThat(mCompactorUnderTest.useCompaction()).isEqualTo(
193 AppCompactor.DEFAULT_USE_COMPACTION);
194 }
195
196 @Test
197 public void compactAction_listensToDeviceConfigChanges() throws InterruptedException {
198 mCompactorUnderTest.init();
199
200 // When we override new values for the compaction action with reasonable values...
201
202 // There are four possible values for compactAction[Some|Full].
203 for (int i = 1; i < 5; i++) {
204 mCountDown = new CountDownLatch(2);
205 int expectedSome = (AppCompactor.DEFAULT_COMPACT_ACTION_1 + i) % 4 + 1;
Matt Pape40074da2019-02-12 13:53:26 -0800206 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
207 AppCompactor.KEY_COMPACT_ACTION_1, Integer.toString(expectedSome), false);
Linus Tufvesson9d501752019-02-12 11:33:22 +0000208 int expectedFull = (AppCompactor.DEFAULT_COMPACT_ACTION_2 + i) % 4 + 1;
Matt Pape40074da2019-02-12 13:53:26 -0800209 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
210 AppCompactor.KEY_COMPACT_ACTION_2, Integer.toString(expectedFull), false);
Linus Tufvesson9d501752019-02-12 11:33:22 +0000211 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
212
213 // Then the updates are reflected in the flags.
214 assertThat(mCompactorUnderTest.mCompactActionSome).isEqualTo(
215 compactActionIntToString(expectedSome));
216 assertThat(mCompactorUnderTest.mCompactActionFull).isEqualTo(
217 compactActionIntToString(expectedFull));
218 }
219 }
220
221 @Test
222 public void compactAction_listensToDeviceConfigChangesBadValues() throws InterruptedException {
223 mCompactorUnderTest.init();
224
225 // When we override new values for the compaction action with bad values ...
226 mCountDown = new CountDownLatch(2);
Matt Pape40074da2019-02-12 13:53:26 -0800227 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
228 AppCompactor.KEY_COMPACT_ACTION_1, "foo", false);
229 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
230 AppCompactor.KEY_COMPACT_ACTION_2, "foo", false);
Linus Tufvesson9d501752019-02-12 11:33:22 +0000231 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
232
233 // Then the default values are reflected in the flag
234 assertThat(mCompactorUnderTest.mCompactActionSome).isEqualTo(
235 compactActionIntToString(AppCompactor.DEFAULT_COMPACT_ACTION_1));
236 assertThat(mCompactorUnderTest.mCompactActionFull).isEqualTo(
237 compactActionIntToString(AppCompactor.DEFAULT_COMPACT_ACTION_2));
238
239 mCountDown = new CountDownLatch(2);
Matt Pape40074da2019-02-12 13:53:26 -0800240 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
241 AppCompactor.KEY_COMPACT_ACTION_1, "", false);
242 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
243 AppCompactor.KEY_COMPACT_ACTION_2, "", false);
Linus Tufvesson9d501752019-02-12 11:33:22 +0000244 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
245
246 assertThat(mCompactorUnderTest.mCompactActionSome).isEqualTo(
247 compactActionIntToString(AppCompactor.DEFAULT_COMPACT_ACTION_1));
248 assertThat(mCompactorUnderTest.mCompactActionFull).isEqualTo(
249 compactActionIntToString(AppCompactor.DEFAULT_COMPACT_ACTION_2));
250 }
251
252 @Test
253 public void compactThrottle_listensToDeviceConfigChanges() throws InterruptedException {
254 mCompactorUnderTest.init();
255
256 // When we override new reasonable throttle values after init...
257 mCountDown = new CountDownLatch(4);
Matt Pape40074da2019-02-12 13:53:26 -0800258 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
259 AppCompactor.KEY_COMPACT_THROTTLE_1,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000260 Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1), false);
Matt Pape40074da2019-02-12 13:53:26 -0800261 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
262 AppCompactor.KEY_COMPACT_THROTTLE_2,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000263 Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_2 + 1), false);
Matt Pape40074da2019-02-12 13:53:26 -0800264 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
265 AppCompactor.KEY_COMPACT_THROTTLE_3,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000266 Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1), false);
Matt Pape40074da2019-02-12 13:53:26 -0800267 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
268 AppCompactor.KEY_COMPACT_THROTTLE_4,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000269 Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false);
270 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
271
272 // Then those flags values are reflected in the compactor.
273 assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
274 AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1);
275 assertThat(mCompactorUnderTest.mCompactThrottleSomeFull).isEqualTo(
276 AppCompactor.DEFAULT_COMPACT_THROTTLE_2 + 1);
277 assertThat(mCompactorUnderTest.mCompactThrottleFullSome).isEqualTo(
278 AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1);
279 assertThat(mCompactorUnderTest.mCompactThrottleFullFull).isEqualTo(
280 AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1);
281 }
282
283 @Test
284 public void compactThrottle_listensToDeviceConfigChangesBadValues()
285 throws InterruptedException {
286 mCompactorUnderTest.init();
287
288 // When one of the throttles is overridden with a bad value...
289 mCountDown = new CountDownLatch(1);
Matt Pape40074da2019-02-12 13:53:26 -0800290 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
291 AppCompactor.KEY_COMPACT_THROTTLE_1, "foo", false);
Linus Tufvesson9d501752019-02-12 11:33:22 +0000292 // Then all the throttles have the defaults set.
293 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
294 assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
295 AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
296 assertThat(mCompactorUnderTest.mCompactThrottleSomeFull).isEqualTo(
297 AppCompactor.DEFAULT_COMPACT_THROTTLE_2);
298 assertThat(mCompactorUnderTest.mCompactThrottleFullSome).isEqualTo(
299 AppCompactor.DEFAULT_COMPACT_THROTTLE_3);
300 assertThat(mCompactorUnderTest.mCompactThrottleFullFull).isEqualTo(
301 AppCompactor.DEFAULT_COMPACT_THROTTLE_4);
302
303 // Repeat for each of the throttle keys.
304 mCountDown = new CountDownLatch(1);
Matt Pape40074da2019-02-12 13:53:26 -0800305 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
306 AppCompactor.KEY_COMPACT_THROTTLE_2, "foo", false);
Linus Tufvesson9d501752019-02-12 11:33:22 +0000307 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
308 assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
309 AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
310 assertThat(mCompactorUnderTest.mCompactThrottleSomeFull).isEqualTo(
311 AppCompactor.DEFAULT_COMPACT_THROTTLE_2);
312 assertThat(mCompactorUnderTest.mCompactThrottleFullSome).isEqualTo(
313 AppCompactor.DEFAULT_COMPACT_THROTTLE_3);
314 assertThat(mCompactorUnderTest.mCompactThrottleFullFull).isEqualTo(
315 AppCompactor.DEFAULT_COMPACT_THROTTLE_4);
316
317 mCountDown = new CountDownLatch(1);
Matt Pape40074da2019-02-12 13:53:26 -0800318 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
319 AppCompactor.KEY_COMPACT_THROTTLE_3, "foo", false);
Linus Tufvesson9d501752019-02-12 11:33:22 +0000320 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
321 assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
322 AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
323 assertThat(mCompactorUnderTest.mCompactThrottleSomeFull).isEqualTo(
324 AppCompactor.DEFAULT_COMPACT_THROTTLE_2);
325 assertThat(mCompactorUnderTest.mCompactThrottleFullSome).isEqualTo(
326 AppCompactor.DEFAULT_COMPACT_THROTTLE_3);
327 assertThat(mCompactorUnderTest.mCompactThrottleFullFull).isEqualTo(
328 AppCompactor.DEFAULT_COMPACT_THROTTLE_4);
329
330 mCountDown = new CountDownLatch(1);
Matt Pape40074da2019-02-12 13:53:26 -0800331 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
332 AppCompactor.KEY_COMPACT_THROTTLE_4, "foo", false);
Linus Tufvesson9d501752019-02-12 11:33:22 +0000333 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
334 assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
335 AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
336 assertThat(mCompactorUnderTest.mCompactThrottleSomeFull).isEqualTo(
337 AppCompactor.DEFAULT_COMPACT_THROTTLE_2);
338 assertThat(mCompactorUnderTest.mCompactThrottleFullSome).isEqualTo(
339 AppCompactor.DEFAULT_COMPACT_THROTTLE_3);
340 assertThat(mCompactorUnderTest.mCompactThrottleFullFull).isEqualTo(
341 AppCompactor.DEFAULT_COMPACT_THROTTLE_4);
342 }
343
344 @Test
345 public void statsdSampleRate_listensToDeviceConfigChanges() throws InterruptedException {
346 mCompactorUnderTest.init();
347
348 // When we override mStatsdSampleRate with a reasonable values ...
349 mCountDown = new CountDownLatch(1);
Matt Pape40074da2019-02-12 13:53:26 -0800350 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
351 AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000352 Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);
353 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
354
355 // Then that override is reflected in the compactor.
356 assertThat(mCompactorUnderTest.mStatsdSampleRate).isEqualTo(
357 AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f);
358 }
359
360 @Test
361 public void statsdSanokeRate_listensToDeviceConfigChangesBadValues()
362 throws InterruptedException {
363 mCompactorUnderTest.init();
364
365 // When we override mStatsdSampleRate with a reasonable values ...
366 mCountDown = new CountDownLatch(1);
Matt Pape40074da2019-02-12 13:53:26 -0800367 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
368 AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE, "foo", false);
Linus Tufvesson9d501752019-02-12 11:33:22 +0000369 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
370
371 // Then that override is reflected in the compactor.
372 assertThat(mCompactorUnderTest.mStatsdSampleRate).isEqualTo(
373 AppCompactor.DEFAULT_STATSD_SAMPLE_RATE);
374 }
375
376 @Test
377 public void statsdSanokeRate_listensToDeviceConfigChangesOutOfRangeValues()
378 throws InterruptedException {
379 mCompactorUnderTest.init();
380
381 // When we override mStatsdSampleRate with an value outside of [0..1]...
382 mCountDown = new CountDownLatch(1);
Matt Pape40074da2019-02-12 13:53:26 -0800383 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
384 AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000385 Float.toString(-1.0f), false);
386 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
387
388 // Then the values is capped in the range.
389 assertThat(mCompactorUnderTest.mStatsdSampleRate).isEqualTo(0.0f);
390
391 mCountDown = new CountDownLatch(1);
Matt Pape40074da2019-02-12 13:53:26 -0800392 DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
393 AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
Linus Tufvesson9d501752019-02-12 11:33:22 +0000394 Float.toString(1.01f), false);
395 assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
396
397 // Then the values is capped in the range.
398 assertThat(mCompactorUnderTest.mStatsdSampleRate).isEqualTo(1.0f);
399 }
400
401 private class TestInjector extends Injector {
402 @Override
403 public AppOpsService getAppOpsService(File file, Handler handler) {
404 return mAppOpsService;
405 }
406
407 @Override
408 public Handler getUiHandler(ActivityManagerService service) {
409 return mHandler;
410 }
411 }
412}