blob: 77cd62e4cbd37e84613b16bd0bf23614e807069e [file] [log] [blame]
Zimuzo3eee4382019-01-08 20:42:39 +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;
18
19import static com.android.server.PackageWatchdog.TRIGGER_FAILURE_COUNT;
20
21import static org.junit.Assert.assertEquals;
22import static org.junit.Assert.assertNull;
23import static org.junit.Assert.assertTrue;
24
Zimuzo972e1cd2019-01-28 16:30:01 +000025import android.content.pm.VersionedPackage;
Zimuzo3eee4382019-01-08 20:42:39 +000026import android.os.test.TestLooper;
27import android.support.test.InstrumentationRegistry;
28
29import com.android.server.PackageWatchdog.PackageHealthObserver;
Zimuzoe5009cd2019-01-23 18:11:58 +000030import com.android.server.PackageWatchdog.PackageHealthObserverImpact;
Zimuzo3eee4382019-01-08 20:42:39 +000031
Zimuzo3eee4382019-01-08 20:42:39 +000032import org.junit.Before;
33import org.junit.Test;
34
35import java.io.File;
36import java.util.ArrayList;
37import java.util.Arrays;
38import java.util.List;
39import java.util.concurrent.TimeUnit;
40
41// TODO(zezeozue): Write test without using PackageWatchdog#getPackages. Just rely on
42// behavior of observers receiving crash notifications or not to determine if it's registered
43/**
44 * Test PackageWatchdog.
45 */
46public class PackageWatchdogTest {
47 private static final String APP_A = "com.package.a";
48 private static final String APP_B = "com.package.b";
Zimuzoe5009cd2019-01-23 18:11:58 +000049 private static final String APP_C = "com.package.c";
50 private static final String APP_D = "com.package.d";
Zimuzo972e1cd2019-01-28 16:30:01 +000051 private static final long VERSION_CODE = 1L;
Zimuzo3eee4382019-01-08 20:42:39 +000052 private static final String OBSERVER_NAME_1 = "observer1";
53 private static final String OBSERVER_NAME_2 = "observer2";
54 private static final String OBSERVER_NAME_3 = "observer3";
Zimuzoe5009cd2019-01-23 18:11:58 +000055 private static final String OBSERVER_NAME_4 = "observer4";
Zimuzo3eee4382019-01-08 20:42:39 +000056 private static final long SHORT_DURATION = TimeUnit.SECONDS.toMillis(1);
57 private static final long LONG_DURATION = TimeUnit.SECONDS.toMillis(5);
58 private TestLooper mTestLooper;
59
60 @Before
61 public void setUp() throws Exception {
Zimuzo3eee4382019-01-08 20:42:39 +000062 new File(InstrumentationRegistry.getContext().getFilesDir(),
63 "package-watchdog.xml").delete();
Zimuzoe5009cd2019-01-23 18:11:58 +000064 mTestLooper = new TestLooper();
65 mTestLooper.startAutoDispatch();
Zimuzo3eee4382019-01-08 20:42:39 +000066 }
67
68 /**
69 * Test registration, unregistration, package expiry and duration reduction
70 */
71 @Test
72 public void testRegistration() throws Exception {
73 PackageWatchdog watchdog = createWatchdog();
74 TestObserver observer1 = new TestObserver(OBSERVER_NAME_1);
75 TestObserver observer2 = new TestObserver(OBSERVER_NAME_2);
76 TestObserver observer3 = new TestObserver(OBSERVER_NAME_3);
77
78 // Start observing for observer1 which will be unregistered
79 watchdog.startObservingHealth(observer1, Arrays.asList(APP_A), SHORT_DURATION);
80 // Start observing for observer2 which will expire
81 watchdog.startObservingHealth(observer2, Arrays.asList(APP_A, APP_B), SHORT_DURATION);
82 // Start observing for observer3 which will have expiry duration reduced
83 watchdog.startObservingHealth(observer3, Arrays.asList(APP_A), LONG_DURATION);
84
85 // Verify packages observed at start
86 // 1
87 assertEquals(1, watchdog.getPackages(observer1).size());
88 assertTrue(watchdog.getPackages(observer1).contains(APP_A));
89 // 2
90 assertEquals(2, watchdog.getPackages(observer2).size());
91 assertTrue(watchdog.getPackages(observer2).contains(APP_A));
92 assertTrue(watchdog.getPackages(observer2).contains(APP_B));
93 // 3
94 assertEquals(1, watchdog.getPackages(observer3).size());
95 assertTrue(watchdog.getPackages(observer3).contains(APP_A));
96
97 // Then unregister observer1
98 watchdog.unregisterHealthObserver(observer1);
99
100 // Verify observer2 and observer3 left
101 // 1
102 assertNull(watchdog.getPackages(observer1));
103 // 2
104 assertEquals(2, watchdog.getPackages(observer2).size());
105 assertTrue(watchdog.getPackages(observer2).contains(APP_A));
106 assertTrue(watchdog.getPackages(observer2).contains(APP_B));
107 // 3
108 assertEquals(1, watchdog.getPackages(observer3).size());
109 assertTrue(watchdog.getPackages(observer3).contains(APP_A));
110
111 // Then advance time a little and run messages in Handlers so observer2 expires
112 Thread.sleep(SHORT_DURATION);
113 mTestLooper.dispatchAll();
114
115 // Verify observer3 left with reduced expiry duration
116 // 1
117 assertNull(watchdog.getPackages(observer1));
118 // 2
119 assertNull(watchdog.getPackages(observer2));
120 // 3
121 assertEquals(1, watchdog.getPackages(observer3).size());
122 assertTrue(watchdog.getPackages(observer3).contains(APP_A));
123
124 // Then advance time some more and run messages in Handlers so observer3 expires
125 Thread.sleep(LONG_DURATION);
126 mTestLooper.dispatchAll();
127
128 // Verify observer3 expired
129 // 1
130 assertNull(watchdog.getPackages(observer1));
131 // 2
132 assertNull(watchdog.getPackages(observer2));
133 // 3
134 assertNull(watchdog.getPackages(observer3));
135 }
136
137 /**
138 * Test package observers are persisted and loaded on startup
139 */
140 @Test
141 public void testPersistence() throws Exception {
142 PackageWatchdog watchdog1 = createWatchdog();
143 TestObserver observer1 = new TestObserver(OBSERVER_NAME_1);
144 TestObserver observer2 = new TestObserver(OBSERVER_NAME_2);
145
146 watchdog1.startObservingHealth(observer1, Arrays.asList(APP_A), SHORT_DURATION);
147 watchdog1.startObservingHealth(observer2, Arrays.asList(APP_A, APP_B), SHORT_DURATION);
148
149 // Verify 2 observers are registered and saved internally
150 // 1
151 assertEquals(1, watchdog1.getPackages(observer1).size());
152 assertTrue(watchdog1.getPackages(observer1).contains(APP_A));
153 // 2
154 assertEquals(2, watchdog1.getPackages(observer2).size());
155 assertTrue(watchdog1.getPackages(observer2).contains(APP_A));
156 assertTrue(watchdog1.getPackages(observer2).contains(APP_B));
157
Zimuzo3eee4382019-01-08 20:42:39 +0000158 // Then advance time and run IO Handler so file is saved
159 mTestLooper.dispatchAll();
160
161 // Then start a new watchdog
162 PackageWatchdog watchdog2 = createWatchdog();
163
164 // Verify the new watchdog loads observers on startup but nothing registered
165 assertEquals(0, watchdog2.getPackages(observer1).size());
166 assertEquals(0, watchdog2.getPackages(observer2).size());
167 // Verify random observer not saved returns null
168 assertNull(watchdog2.getPackages(new TestObserver(OBSERVER_NAME_3)));
169
170 // Then regiser observer1
171 watchdog2.registerHealthObserver(observer1);
172 watchdog2.registerHealthObserver(observer2);
173
174 // Verify 2 observers are registered after reload
175 // 1
176 assertEquals(1, watchdog1.getPackages(observer1).size());
177 assertTrue(watchdog1.getPackages(observer1).contains(APP_A));
178 // 2
179 assertEquals(2, watchdog1.getPackages(observer2).size());
180 assertTrue(watchdog1.getPackages(observer2).contains(APP_A));
181 assertTrue(watchdog1.getPackages(observer2).contains(APP_B));
182 }
183
184 /**
185 * Test package failure under threshold does not notify observers
186 */
187 @Test
188 public void testNoPackageFailureBeforeThreshold() throws Exception {
189 PackageWatchdog watchdog = createWatchdog();
190 TestObserver observer1 = new TestObserver(OBSERVER_NAME_1);
191 TestObserver observer2 = new TestObserver(OBSERVER_NAME_2);
192
193 watchdog.startObservingHealth(observer2, Arrays.asList(APP_A), SHORT_DURATION);
194 watchdog.startObservingHealth(observer1, Arrays.asList(APP_A), SHORT_DURATION);
195
196 // Then fail APP_A below the threshold
197 for (int i = 0; i < TRIGGER_FAILURE_COUNT - 1; i++) {
Zimuzo972e1cd2019-01-28 16:30:01 +0000198 watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
Zimuzo3eee4382019-01-08 20:42:39 +0000199 }
200
Zimuzoe5009cd2019-01-23 18:11:58 +0000201 // Run handler so package failures are dispatched to observers
202 mTestLooper.dispatchAll();
203
Zimuzo3eee4382019-01-08 20:42:39 +0000204 // Verify that observers are not notified
205 assertEquals(0, observer1.mFailedPackages.size());
206 assertEquals(0, observer2.mFailedPackages.size());
207 }
208
209 /**
Zimuzoe5009cd2019-01-23 18:11:58 +0000210 * Test package failure and does not notify any observer because they are not observing
211 * the failed packages.
Zimuzo3eee4382019-01-08 20:42:39 +0000212 */
213 @Test
Zimuzo972e1cd2019-01-28 16:30:01 +0000214 public void testPackageFailureDifferentPackageNotifyNone() throws Exception {
Zimuzo3eee4382019-01-08 20:42:39 +0000215 PackageWatchdog watchdog = createWatchdog();
Zimuzo972e1cd2019-01-28 16:30:01 +0000216 TestObserver observer1 = new TestObserver(OBSERVER_NAME_1);
217 TestObserver observer2 = new TestObserver(OBSERVER_NAME_2);
Zimuzo3eee4382019-01-08 20:42:39 +0000218
Zimuzoe5009cd2019-01-23 18:11:58 +0000219
Zimuzo3eee4382019-01-08 20:42:39 +0000220 watchdog.startObservingHealth(observer2, Arrays.asList(APP_A), SHORT_DURATION);
Zimuzoe5009cd2019-01-23 18:11:58 +0000221 watchdog.startObservingHealth(observer1, Arrays.asList(APP_B), SHORT_DURATION);
Zimuzo3eee4382019-01-08 20:42:39 +0000222
Zimuzoe5009cd2019-01-23 18:11:58 +0000223 // Then fail APP_C (not observed) above the threshold
Zimuzo3eee4382019-01-08 20:42:39 +0000224 for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
Zimuzo972e1cd2019-01-28 16:30:01 +0000225 watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_C, VERSION_CODE)));
Zimuzo3eee4382019-01-08 20:42:39 +0000226 }
227
Zimuzoe5009cd2019-01-23 18:11:58 +0000228 // Run handler so package failures are dispatched to observers
229 mTestLooper.dispatchAll();
230
231 // Verify that observers are not notified
232 assertEquals(0, observer1.mFailedPackages.size());
233 assertEquals(0, observer2.mFailedPackages.size());
Zimuzo3eee4382019-01-08 20:42:39 +0000234 }
235
236 /**
Zimuzo972e1cd2019-01-28 16:30:01 +0000237 * Test package failure and does not notify any observer because the failed package version
238 * does not match the available rollback-from-version.
239 */
240 @Test
241 public void testPackageFailureDifferentVersionNotifyNone() throws Exception {
242 PackageWatchdog watchdog = createWatchdog();
243 long differentVersionCode = 2L;
244 TestObserver observer = new TestObserver(OBSERVER_NAME_1) {
Zimuzo71d931e2019-02-01 13:08:16 +0000245 @Override
246 public int onHealthCheckFailed(VersionedPackage versionedPackage) {
247 if (versionedPackage.getVersionCode() == VERSION_CODE) {
Zimuzo972e1cd2019-01-28 16:30:01 +0000248 // Only rollback for specific versionCode
249 return PackageHealthObserverImpact.USER_IMPACT_MEDIUM;
250 }
251 return PackageHealthObserverImpact.USER_IMPACT_NONE;
252 }
253 };
254
255 watchdog.startObservingHealth(observer, Arrays.asList(APP_A), SHORT_DURATION);
256
257 // Then fail APP_A (different version) above the threshold
258 for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
259 watchdog.onPackageFailure(Arrays.asList(
260 new VersionedPackage(APP_A, differentVersionCode)));
261 }
262
263 // Run handler so package failures are dispatched to observers
264 mTestLooper.dispatchAll();
265
266 // Verify that observers are not notified
267 assertEquals(0, observer.mFailedPackages.size());
268 }
269
270
271 /**
Zimuzoe5009cd2019-01-23 18:11:58 +0000272 * Test package failure and notifies only least impact observers.
Zimuzo3eee4382019-01-08 20:42:39 +0000273 */
274 @Test
Zimuzoe5009cd2019-01-23 18:11:58 +0000275 public void testPackageFailureNotifyAllDifferentImpacts() throws Exception {
Zimuzo3eee4382019-01-08 20:42:39 +0000276 PackageWatchdog watchdog = createWatchdog();
Zimuzoe5009cd2019-01-23 18:11:58 +0000277 TestObserver observerNone = new TestObserver(OBSERVER_NAME_1,
278 PackageHealthObserverImpact.USER_IMPACT_NONE);
279 TestObserver observerHigh = new TestObserver(OBSERVER_NAME_2,
280 PackageHealthObserverImpact.USER_IMPACT_HIGH);
281 TestObserver observerMid = new TestObserver(OBSERVER_NAME_3,
282 PackageHealthObserverImpact.USER_IMPACT_MEDIUM);
283 TestObserver observerLow = new TestObserver(OBSERVER_NAME_4,
284 PackageHealthObserverImpact.USER_IMPACT_LOW);
285
286 // Start observing for all impact observers
287 watchdog.startObservingHealth(observerNone, Arrays.asList(APP_A, APP_B, APP_C, APP_D),
288 SHORT_DURATION);
289 watchdog.startObservingHealth(observerHigh, Arrays.asList(APP_A, APP_B, APP_C),
290 SHORT_DURATION);
291 watchdog.startObservingHealth(observerMid, Arrays.asList(APP_A, APP_B),
292 SHORT_DURATION);
293 watchdog.startObservingHealth(observerLow, Arrays.asList(APP_A),
294 SHORT_DURATION);
295
296 // Then fail all apps above the threshold
297 for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
Zimuzo972e1cd2019-01-28 16:30:01 +0000298 watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE),
299 new VersionedPackage(APP_B, VERSION_CODE),
300 new VersionedPackage(APP_C, VERSION_CODE),
301 new VersionedPackage(APP_D, VERSION_CODE)));
Zimuzoe5009cd2019-01-23 18:11:58 +0000302 }
303
304 // Run handler so package failures are dispatched to observers
305 mTestLooper.dispatchAll();
306
307 // Verify least impact observers are notifed of package failures
308 List<String> observerNonePackages = observerNone.mFailedPackages;
309 List<String> observerHighPackages = observerHigh.mFailedPackages;
310 List<String> observerMidPackages = observerMid.mFailedPackages;
311 List<String> observerLowPackages = observerLow.mFailedPackages;
312
313 // APP_D failure observed by only observerNone is not caught cos its impact is none
314 assertEquals(0, observerNonePackages.size());
315 // APP_C failure is caught by observerHigh cos it's the lowest impact observer
316 assertEquals(1, observerHighPackages.size());
317 assertEquals(APP_C, observerHighPackages.get(0));
318 // APP_B failure is caught by observerMid cos it's the lowest impact observer
319 assertEquals(1, observerMidPackages.size());
320 assertEquals(APP_B, observerMidPackages.get(0));
321 // APP_A failure is caught by observerLow cos it's the lowest impact observer
322 assertEquals(1, observerLowPackages.size());
323 assertEquals(APP_A, observerLowPackages.get(0));
324 }
325
326 /**
327 * Test package failure and least impact observers are notified successively.
328 * State transistions:
329 *
330 * <ul>
331 * <li>(observer1:low, observer2:mid) -> {observer1}
332 * <li>(observer1:high, observer2:mid) -> {observer2}
333 * <li>(observer1:high, observer2:none) -> {observer1}
334 * <li>(observer1:none, observer2:none) -> {}
335 * <ul>
336 */
337 @Test
Zimuzo972e1cd2019-01-28 16:30:01 +0000338 public void testPackageFailureNotifyLeastImpactSuccessively() throws Exception {
Zimuzoe5009cd2019-01-23 18:11:58 +0000339 PackageWatchdog watchdog = createWatchdog();
340 TestObserver observerFirst = new TestObserver(OBSERVER_NAME_1,
341 PackageHealthObserverImpact.USER_IMPACT_LOW);
342 TestObserver observerSecond = new TestObserver(OBSERVER_NAME_2,
343 PackageHealthObserverImpact.USER_IMPACT_MEDIUM);
344
345 // Start observing for observerFirst and observerSecond with failure handling
346 watchdog.startObservingHealth(observerFirst, Arrays.asList(APP_A), LONG_DURATION);
347 watchdog.startObservingHealth(observerSecond, Arrays.asList(APP_A), LONG_DURATION);
348
349 // Then fail APP_A above the threshold
350 for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
Zimuzo972e1cd2019-01-28 16:30:01 +0000351 watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
Zimuzoe5009cd2019-01-23 18:11:58 +0000352 }
353 // Run handler so package failures are dispatched to observers
354 mTestLooper.dispatchAll();
355
356 // Verify only observerFirst is notifed
357 assertEquals(1, observerFirst.mFailedPackages.size());
358 assertEquals(APP_A, observerFirst.mFailedPackages.get(0));
359 assertEquals(0, observerSecond.mFailedPackages.size());
360
361 // After observerFirst handles failure, next action it has is high impact
362 observerFirst.mImpact = PackageHealthObserverImpact.USER_IMPACT_HIGH;
363 observerFirst.mFailedPackages.clear();
364 observerSecond.mFailedPackages.clear();
365
366 // Then fail APP_A again above the threshold
367 for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
Zimuzo972e1cd2019-01-28 16:30:01 +0000368 watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
Zimuzoe5009cd2019-01-23 18:11:58 +0000369 }
370 // Run handler so package failures are dispatched to observers
371 mTestLooper.dispatchAll();
372
373 // Verify only observerSecond is notifed cos it has least impact
374 assertEquals(1, observerSecond.mFailedPackages.size());
375 assertEquals(APP_A, observerSecond.mFailedPackages.get(0));
376 assertEquals(0, observerFirst.mFailedPackages.size());
377
378 // After observerSecond handles failure, it has no further actions
379 observerSecond.mImpact = PackageHealthObserverImpact.USER_IMPACT_NONE;
380 observerFirst.mFailedPackages.clear();
381 observerSecond.mFailedPackages.clear();
382
383 // Then fail APP_A again above the threshold
384 for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
Zimuzo972e1cd2019-01-28 16:30:01 +0000385 watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
Zimuzoe5009cd2019-01-23 18:11:58 +0000386 }
387 // Run handler so package failures are dispatched to observers
388 mTestLooper.dispatchAll();
389
390 // Verify only observerFirst is notifed cos it has the only action
391 assertEquals(1, observerFirst.mFailedPackages.size());
392 assertEquals(APP_A, observerFirst.mFailedPackages.get(0));
393 assertEquals(0, observerSecond.mFailedPackages.size());
394
395 // After observerFirst handles failure, it too has no further actions
396 observerFirst.mImpact = PackageHealthObserverImpact.USER_IMPACT_NONE;
397 observerFirst.mFailedPackages.clear();
398 observerSecond.mFailedPackages.clear();
399
400 // Then fail APP_A again above the threshold
401 for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
Zimuzo972e1cd2019-01-28 16:30:01 +0000402 watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
Zimuzoe5009cd2019-01-23 18:11:58 +0000403 }
404 // Run handler so package failures are dispatched to observers
405 mTestLooper.dispatchAll();
406
407 // Verify no observer is notified cos no actions left
408 assertEquals(0, observerFirst.mFailedPackages.size());
409 assertEquals(0, observerSecond.mFailedPackages.size());
410 }
411
412 /**
413 * Test package failure and notifies only one observer even with observer impact tie.
414 */
415 @Test
416 public void testPackageFailureNotifyOneSameImpact() throws Exception {
417 PackageWatchdog watchdog = createWatchdog();
418 TestObserver observer1 = new TestObserver(OBSERVER_NAME_1,
419 PackageHealthObserverImpact.USER_IMPACT_HIGH);
420 TestObserver observer2 = new TestObserver(OBSERVER_NAME_2,
421 PackageHealthObserverImpact.USER_IMPACT_HIGH);
Zimuzo3eee4382019-01-08 20:42:39 +0000422
423 // Start observing for observer1 and observer2 with failure handling
424 watchdog.startObservingHealth(observer2, Arrays.asList(APP_A), SHORT_DURATION);
425 watchdog.startObservingHealth(observer1, Arrays.asList(APP_A), SHORT_DURATION);
426
427 // Then fail APP_A above the threshold
428 for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
Zimuzo972e1cd2019-01-28 16:30:01 +0000429 watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
Zimuzo3eee4382019-01-08 20:42:39 +0000430 }
431
Zimuzoe5009cd2019-01-23 18:11:58 +0000432 // Run handler so package failures are dispatched to observers
433 mTestLooper.dispatchAll();
434
Zimuzo3eee4382019-01-08 20:42:39 +0000435 // Verify only one observer is notifed
436 assertEquals(1, observer1.mFailedPackages.size());
437 assertEquals(APP_A, observer1.mFailedPackages.get(0));
438 assertEquals(0, observer2.mFailedPackages.size());
439 }
440
441 private PackageWatchdog createWatchdog() {
442 return new PackageWatchdog(InstrumentationRegistry.getContext(),
443 mTestLooper.getLooper());
444 }
445
446 private static class TestObserver implements PackageHealthObserver {
447 private final String mName;
Zimuzoe5009cd2019-01-23 18:11:58 +0000448 private int mImpact;
Zimuzo3eee4382019-01-08 20:42:39 +0000449 final List<String> mFailedPackages = new ArrayList<>();
450
451 TestObserver(String name) {
452 mName = name;
Zimuzoe5009cd2019-01-23 18:11:58 +0000453 mImpact = PackageHealthObserverImpact.USER_IMPACT_MEDIUM;
Zimuzo3eee4382019-01-08 20:42:39 +0000454 }
455
Zimuzoe5009cd2019-01-23 18:11:58 +0000456 TestObserver(String name, int impact) {
Zimuzo3eee4382019-01-08 20:42:39 +0000457 mName = name;
Zimuzoe5009cd2019-01-23 18:11:58 +0000458 mImpact = impact;
Zimuzo3eee4382019-01-08 20:42:39 +0000459 }
460
Zimuzo71d931e2019-02-01 13:08:16 +0000461 public int onHealthCheckFailed(VersionedPackage versionedPackage) {
Zimuzoe5009cd2019-01-23 18:11:58 +0000462 return mImpact;
463 }
464
Zimuzo71d931e2019-02-01 13:08:16 +0000465 public boolean execute(VersionedPackage versionedPackage) {
466 mFailedPackages.add(versionedPackage.getPackageName());
Zimuzoe5009cd2019-01-23 18:11:58 +0000467 return true;
Zimuzo3eee4382019-01-08 20:42:39 +0000468 }
469
470 public String getName() {
471 return mName;
472 }
473 }
474}