1 /*
2  * Copyright (C) 2023 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 
17 package com.android.wallpaperbackup;
18 
19 import static com.android.wallpaperbackup.WallpaperEventLogger.WALLPAPER_IMG_LOCK;
20 import static com.android.wallpaperbackup.WallpaperEventLogger.WALLPAPER_IMG_SYSTEM;
21 import static com.android.wallpaperbackup.WallpaperEventLogger.WALLPAPER_LIVE_LOCK;
22 import static com.android.wallpaperbackup.WallpaperEventLogger.WALLPAPER_LIVE_SYSTEM;
23 
24 import static com.google.common.truth.Truth.assertThat;
25 
26 import static org.junit.Assert.assertEquals;
27 import static org.mockito.ArgumentMatchers.any;
28 import static org.mockito.Mockito.when;
29 
30 import android.app.WallpaperInfo;
31 import android.app.backup.BackupAnnotations;
32 import android.app.backup.BackupManager;
33 import android.app.backup.BackupRestoreEventLogger;
34 import android.content.Context;
35 import android.content.Intent;
36 import android.content.pm.PackageManager;
37 import android.content.pm.ResolveInfo;
38 import android.service.wallpaper.WallpaperService;
39 
40 import androidx.test.InstrumentationRegistry;
41 import androidx.test.runner.AndroidJUnit4;
42 
43 import org.junit.Before;
44 import org.junit.Test;
45 import org.junit.runner.RunWith;
46 import org.mockito.Mock;
47 import org.mockito.MockitoAnnotations;
48 
49 import java.util.List;
50 
51 @RunWith(AndroidJUnit4.class)
52 public class WallpaperEventLoggerTest {
53 
54     private BackupRestoreEventLogger mEventLogger;
55 
56     @Mock
57     private BackupManager mMockBackupManager;
58 
59     @Mock
60     private WallpaperBackupAgent mMockBackupAgent;
61 
62     private static final String WALLPAPER_ERROR = "some_error";
63 
64     private WallpaperEventLogger mWallpaperEventLogger;
65     private WallpaperInfo mWallpaperInfo;
66 
67     @Before
setUp()68     public void setUp() throws Exception {
69         MockitoAnnotations.initMocks(this);
70 
71         when(mMockBackupAgent.getBackupRestoreEventLogger()).thenReturn(mEventLogger);
72         when(mMockBackupManager.getBackupRestoreEventLogger(any())).thenReturn(mEventLogger);
73 
74         mWallpaperInfo = getWallpaperInfo();
75         mWallpaperEventLogger = new WallpaperEventLogger(mMockBackupManager, mMockBackupAgent);
76     }
77 
78     @Test
onSystemImgWallpaperBackedUp_logsSuccess()79     public void onSystemImgWallpaperBackedUp_logsSuccess() {
80         setUpLoggerForBackup();
81 
82         mWallpaperEventLogger.onSystemImageWallpaperBackedUp();
83         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM);
84 
85         assertThat(result).isNotNull();
86         assertThat(result.getSuccessCount()).isEqualTo(1);
87     }
88 
89     @Test
onLockImgWallpaperBackedUp_logsSuccess()90     public void onLockImgWallpaperBackedUp_logsSuccess() {
91         setUpLoggerForBackup();
92 
93         mWallpaperEventLogger.onLockImageWallpaperBackedUp();
94         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_LOCK);
95 
96         assertThat(result).isNotNull();
97         assertThat(result.getSuccessCount()).isEqualTo(1);
98     }
99 
100     @Test
onSystemLiveWallpaperBackedUp_logsSuccess()101     public void onSystemLiveWallpaperBackedUp_logsSuccess() {
102         setUpLoggerForBackup();
103 
104         mWallpaperEventLogger.onSystemLiveWallpaperBackedUp(mWallpaperInfo);
105         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_SYSTEM);
106 
107         assertThat(result).isNotNull();
108         assertThat(result.getSuccessCount()).isEqualTo(1);
109     }
110 
111     @Test
onLockLiveWallpaperBackedUp_logsSuccess()112     public void onLockLiveWallpaperBackedUp_logsSuccess() {
113         setUpLoggerForBackup();
114 
115         mWallpaperEventLogger.onLockLiveWallpaperBackedUp(mWallpaperInfo);
116         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_LOCK);
117 
118         assertThat(result).isNotNull();
119         assertThat(result.getSuccessCount()).isEqualTo(1);
120     }
121 
122     @Test
onImgWallpaperBackedUp_nullInfo_doesNotLogMetadata()123     public void onImgWallpaperBackedUp_nullInfo_doesNotLogMetadata() {
124         setUpLoggerForBackup();
125 
126         mWallpaperEventLogger.onSystemImageWallpaperBackedUp();
127         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM);
128 
129         assertThat(result).isNotNull();
130         assertThat(result.getMetadataHash()).isNull();
131     }
132 
133 
134     @Test
onLiveWallpaperBackedUp_logsMetadata()135     public void onLiveWallpaperBackedUp_logsMetadata() {
136         setUpLoggerForBackup();
137 
138         mWallpaperEventLogger.onSystemLiveWallpaperBackedUp(mWallpaperInfo);
139         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_SYSTEM);
140 
141         assertThat(result).isNotNull();
142         assertThat(result.getMetadataHash()).isNotNull();
143     }
144 
145 
146     @Test
onSystemImgWallpaperBackupFailed_logsFail()147     public void onSystemImgWallpaperBackupFailed_logsFail() {
148         setUpLoggerForBackup();
149 
150         mWallpaperEventLogger.onSystemImageWallpaperBackupFailed(WALLPAPER_ERROR);
151         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM);
152 
153         assertThat(result).isNotNull();
154         assertThat(result.getFailCount()).isEqualTo(1);
155         assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR);
156     }
157 
158     @Test
onLockImgWallpaperBackupFailed_logsFail()159     public void onLockImgWallpaperBackupFailed_logsFail() {
160         setUpLoggerForBackup();
161 
162         mWallpaperEventLogger.onLockImageWallpaperBackupFailed(WALLPAPER_ERROR);
163         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_LOCK);
164 
165         assertThat(result).isNotNull();
166         assertThat(result.getFailCount()).isEqualTo(1);
167         assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR);
168     }
169 
170 
171     @Test
onSystemLiveWallpaperBackupFailed_logsFail()172     public void onSystemLiveWallpaperBackupFailed_logsFail() {
173         setUpLoggerForBackup();
174 
175         mWallpaperEventLogger.onSystemLiveWallpaperBackupFailed(WALLPAPER_ERROR);
176         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_SYSTEM);
177 
178         assertThat(result).isNotNull();
179         assertThat(result.getFailCount()).isEqualTo(1);
180         assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR);
181     }
182 
183     @Test
onLockLiveWallpaperBackupFailed_logsFail()184     public void onLockLiveWallpaperBackupFailed_logsFail() {
185         setUpLoggerForBackup();
186 
187         mWallpaperEventLogger.onLockLiveWallpaperBackupFailed(WALLPAPER_ERROR);
188         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_LOCK);
189 
190         assertThat(result).isNotNull();
191         assertThat(result.getFailCount()).isEqualTo(1);
192         assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR);
193     }
194 
195 
196     @Test
onWallpaperBackupException_someProcessed_doesNotLogErrorForProcessedType()197     public void onWallpaperBackupException_someProcessed_doesNotLogErrorForProcessedType() {
198         setUpLoggerForBackup();
199         mWallpaperEventLogger.onSystemImageWallpaperBackedUp();
200 
201         mWallpaperEventLogger.onBackupException(new Exception());
202         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM);
203 
204         assertThat(result).isNotNull();
205         assertThat(result.getFailCount()).isEqualTo(0);
206     }
207 
208 
209     @Test
onWallpaperBackupException_someProcessed_logsErrorForUnprocessedType()210     public void onWallpaperBackupException_someProcessed_logsErrorForUnprocessedType() {
211         setUpLoggerForBackup();
212         mWallpaperEventLogger.onSystemImageWallpaperBackedUp();
213 
214         mWallpaperEventLogger.onBackupException(new Exception());
215         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_LOCK);
216 
217         assertThat(result).isNotNull();
218         assertThat(result.getFailCount()).isEqualTo(1);
219     }
220 
221     @Test
onWallpaperBackupException_liveTypeProcessed_doesNotLogForSameImgType()222     public void onWallpaperBackupException_liveTypeProcessed_doesNotLogForSameImgType() {
223         setUpLoggerForBackup();
224         mWallpaperEventLogger.onSystemLiveWallpaperBackedUp(mWallpaperInfo);
225 
226         mWallpaperEventLogger.onBackupException(new Exception());
227         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM);
228 
229         assertThat(result).isNull();
230     }
231 
232     @Test
onSystemImgWallpaperRestored_logsSuccess()233     public void onSystemImgWallpaperRestored_logsSuccess() {
234         setUpLoggerForRestore();
235 
236         mWallpaperEventLogger.onSystemImageWallpaperRestored();
237         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM);
238 
239         assertThat(result).isNotNull();
240         assertThat(result.getSuccessCount()).isEqualTo(1);
241     }
242 
243     @Test
onLockImgWallpaperRestored_logsSuccess()244     public void onLockImgWallpaperRestored_logsSuccess() {
245         setUpLoggerForRestore();
246 
247         mWallpaperEventLogger.onLockImageWallpaperRestored();
248         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_LOCK);
249 
250         assertThat(result).isNotNull();
251         assertThat(result.getSuccessCount()).isEqualTo(1);
252     }
253 
254     @Test
onSystemLiveWallpaperRestored_logsSuccess()255     public void onSystemLiveWallpaperRestored_logsSuccess() {
256         setUpLoggerForRestore();
257 
258         mWallpaperEventLogger.onSystemLiveWallpaperRestored(mWallpaperInfo.getComponent());
259         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_SYSTEM);
260 
261         assertThat(result).isNotNull();
262         assertThat(result.getSuccessCount()).isEqualTo(1);
263     }
264 
265     @Test
onLockLiveWallpaperRestored_logsSuccess()266     public void onLockLiveWallpaperRestored_logsSuccess() {
267         setUpLoggerForRestore();
268 
269         mWallpaperEventLogger.onLockLiveWallpaperRestored(mWallpaperInfo.getComponent());
270         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_LOCK);
271 
272         assertThat(result).isNotNull();
273         assertThat(result.getSuccessCount()).isEqualTo(1);
274     }
275 
276     @Test
onImgWallpaperRestored_nullInfo_doesNotLogMetadata()277     public void onImgWallpaperRestored_nullInfo_doesNotLogMetadata() {
278         setUpLoggerForRestore();
279 
280         mWallpaperEventLogger.onSystemImageWallpaperRestored();
281         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM);
282 
283         assertThat(result).isNotNull();
284         assertThat(result.getMetadataHash()).isNull();
285     }
286 
287 
288     @Test
onLiveWallpaperRestored_logsMetadata()289     public void onLiveWallpaperRestored_logsMetadata() {
290         setUpLoggerForRestore();
291 
292         mWallpaperEventLogger.onSystemLiveWallpaperRestored(mWallpaperInfo.getComponent());
293         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_SYSTEM);
294 
295         assertThat(result).isNotNull();
296         assertThat(result.getMetadataHash()).isNotNull();
297     }
298 
299 
300     @Test
onSystemImgWallpaperRestoreFailed_logsFail()301     public void onSystemImgWallpaperRestoreFailed_logsFail() {
302         setUpLoggerForRestore();
303 
304         mWallpaperEventLogger.onSystemImageWallpaperRestoreFailed(WALLPAPER_ERROR);
305         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM);
306 
307         assertThat(result).isNotNull();
308         assertThat(result.getFailCount()).isEqualTo(1);
309         assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR);
310     }
311 
312     @Test
onLockImgWallpaperRestoreFailed_logsFail()313     public void onLockImgWallpaperRestoreFailed_logsFail() {
314         setUpLoggerForRestore();
315 
316         mWallpaperEventLogger.onLockImageWallpaperRestoreFailed(WALLPAPER_ERROR);
317         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_LOCK);
318 
319         assertThat(result).isNotNull();
320         assertThat(result.getFailCount()).isEqualTo(1);
321         assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR);
322     }
323 
324 
325     @Test
onSystemLiveWallpaperRestoreFailed_logsFail()326     public void onSystemLiveWallpaperRestoreFailed_logsFail() {
327         setUpLoggerForRestore();
328 
329         mWallpaperEventLogger.onSystemLiveWallpaperRestoreFailed(WALLPAPER_ERROR);
330         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_SYSTEM);
331 
332         assertThat(result).isNotNull();
333         assertThat(result.getFailCount()).isEqualTo(1);
334         assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR);
335     }
336 
337     @Test
onLockLiveWallpaperRestoreFailed_logsFail()338     public void onLockLiveWallpaperRestoreFailed_logsFail() {
339         setUpLoggerForRestore();
340 
341         mWallpaperEventLogger.onLockLiveWallpaperRestoreFailed(WALLPAPER_ERROR);
342         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_LIVE_LOCK);
343 
344         assertThat(result).isNotNull();
345         assertThat(result.getFailCount()).isEqualTo(1);
346         assertThat(result.getErrors()).containsKey(WALLPAPER_ERROR);
347     }
348 
349 
350     @Test
onWallpaperRestoreException_someProcessed_doesNotLogErrorForProcessedType()351     public void onWallpaperRestoreException_someProcessed_doesNotLogErrorForProcessedType() {
352         setUpLoggerForRestore();
353         mWallpaperEventLogger.onSystemImageWallpaperRestored();
354 
355         mWallpaperEventLogger.onRestoreException(new Exception());
356         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM);
357 
358         assertThat(result).isNotNull();
359         assertThat(result.getFailCount()).isEqualTo(0);
360     }
361 
362 
363     @Test
onWallpaperRestoreException_someProcessed_logsErrorForUnprocessedType()364     public void onWallpaperRestoreException_someProcessed_logsErrorForUnprocessedType() {
365         setUpLoggerForRestore();
366         mWallpaperEventLogger.onSystemImageWallpaperRestored();
367 
368         mWallpaperEventLogger.onRestoreException(new Exception());
369         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_LOCK);
370 
371         assertThat(result).isNotNull();
372         assertThat(result.getFailCount()).isEqualTo(1);
373     }
374 
375     @Test
onWallpaperRestoreException_liveTypeProcessed_doesNotLogForSameImgType()376     public void onWallpaperRestoreException_liveTypeProcessed_doesNotLogForSameImgType() {
377         setUpLoggerForRestore();
378         mWallpaperEventLogger.onSystemLiveWallpaperRestored(mWallpaperInfo.getComponent());
379 
380         mWallpaperEventLogger.onRestoreException(new Exception());
381         BackupRestoreEventLogger.DataTypeResult result = getLogsForType(WALLPAPER_IMG_SYSTEM);
382 
383         assertThat(result).isNull();
384     }
385 
getLogsForType(String dataType)386     private BackupRestoreEventLogger.DataTypeResult getLogsForType(String dataType) {
387         for (BackupRestoreEventLogger.DataTypeResult result :  mEventLogger.getLoggingResults()) {
388             if ((result.getDataType()).equals(dataType)) {
389                 return result;
390             }
391         }
392         return null;
393     }
394 
setUpLoggerForBackup()395     private void setUpLoggerForBackup() {
396         mEventLogger = new BackupRestoreEventLogger(BackupAnnotations.OperationType.BACKUP);
397         createEventLogger();
398     }
399 
setUpLoggerForRestore()400     private void setUpLoggerForRestore() {
401         mEventLogger = new BackupRestoreEventLogger(BackupAnnotations.OperationType.RESTORE);
402         createEventLogger();
403     }
404 
createEventLogger()405     private void createEventLogger() {
406         when(mMockBackupAgent.getBackupRestoreEventLogger()).thenReturn(mEventLogger);
407         when(mMockBackupManager.getBackupRestoreEventLogger(any())).thenReturn(mEventLogger);
408 
409         mWallpaperEventLogger = new WallpaperEventLogger(mMockBackupManager, mMockBackupAgent);
410     }
411 
412 
getWallpaperInfo()413     private WallpaperInfo getWallpaperInfo() throws Exception {
414         Context context = InstrumentationRegistry.getTargetContext();
415         Intent intent = new Intent(WallpaperService.SERVICE_INTERFACE);
416         intent.setPackage("com.android.wallpaperbackup.tests");
417         PackageManager pm = context.getPackageManager();
418         List<ResolveInfo> result = pm.queryIntentServices(intent, PackageManager.GET_META_DATA);
419         assertEquals(1, result.size());
420         ResolveInfo info = result.get(0);
421         return new WallpaperInfo(context, info);
422     }
423 }
424