18553d277459f57e623aac27c145c0c9895454395Bernardo Rufino/* 28553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * Copyright (C) 2018 The Android Open Source Project 38553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * 48553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * Licensed under the Apache License, Version 2.0 (the "License"); 58553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * you may not use this file except in compliance with the License. 68553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * You may obtain a copy of the License at 78553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * 88553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * http://www.apache.org/licenses/LICENSE-2.0 98553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * 108553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * Unless required by applicable law or agreed to in writing, software 118553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * distributed under the License is distributed on an "AS IS" BASIS, 128553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * See the License for the specific language governing permissions and 148553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * limitations under the License 158553d277459f57e623aac27c145c0c9895454395Bernardo Rufino */ 168553d277459f57e623aac27c145c0c9895454395Bernardo Rufino 178553d277459f57e623aac27c145c0c9895454395Bernardo Rufinopackage com.android.server.backup.testing; 188553d277459f57e623aac27c145c0c9895454395Bernardo Rufino 198553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport static org.mockito.Mockito.mock; 208553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport static org.mockito.Mockito.when; 218553d277459f57e623aac27c145c0c9895454395Bernardo Rufino 228553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport android.app.Application; 238553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport android.app.IActivityManager; 248553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport android.content.Context; 258553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport android.content.pm.PackageManager; 268553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport android.os.HandlerThread; 278553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport android.os.Looper; 288553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport android.os.PowerManager; 298553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport android.util.SparseArray; 308553d277459f57e623aac27c145c0c9895454395Bernardo Rufino 3192892163d58b580056d38f6ca2c93fb714b9e4b8Annie Mengimport com.android.server.backup.BackupAgentTimeoutParameters; 328553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport com.android.server.backup.BackupManagerService; 338553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport com.android.server.backup.TransportManager; 348553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport com.android.server.backup.internal.BackupHandler; 358553d277459f57e623aac27c145c0c9895454395Bernardo Rufino 368553d277459f57e623aac27c145c0c9895454395Bernardo Rufinoimport java.lang.Thread.UncaughtExceptionHandler; 378553d277459f57e623aac27c145c0c9895454395Bernardo Rufino 38cea93536bc47a76d4e8ea420990e39f4e54d712bBernardo Rufino/** Test utils for {@link BackupManagerService} and friends. */ 398553d277459f57e623aac27c145c0c9895454395Bernardo Rufinopublic class BackupManagerServiceTestUtils { 40cea93536bc47a76d4e8ea420990e39f4e54d712bBernardo Rufino /** Sets up basic mocks for {@link BackupManagerService}. */ 418553d277459f57e623aac27c145c0c9895454395Bernardo Rufino public static void setUpBackupManagerServiceBasics( 428553d277459f57e623aac27c145c0c9895454395Bernardo Rufino BackupManagerService backupManagerService, 438553d277459f57e623aac27c145c0c9895454395Bernardo Rufino Context context, 448553d277459f57e623aac27c145c0c9895454395Bernardo Rufino TransportManager transportManager, 458553d277459f57e623aac27c145c0c9895454395Bernardo Rufino PackageManager packageManager, 468553d277459f57e623aac27c145c0c9895454395Bernardo Rufino BackupHandler backupHandler, 4792892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng PowerManager.WakeLock wakeLock, 4892892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng BackupAgentTimeoutParameters agentTimeoutParameters) { 498553d277459f57e623aac27c145c0c9895454395Bernardo Rufino when(backupManagerService.getContext()).thenReturn(context); 508553d277459f57e623aac27c145c0c9895454395Bernardo Rufino when(backupManagerService.getTransportManager()).thenReturn(transportManager); 518553d277459f57e623aac27c145c0c9895454395Bernardo Rufino when(backupManagerService.getPackageManager()).thenReturn(packageManager); 528553d277459f57e623aac27c145c0c9895454395Bernardo Rufino when(backupManagerService.getBackupHandler()).thenReturn(backupHandler); 538553d277459f57e623aac27c145c0c9895454395Bernardo Rufino when(backupManagerService.getCurrentOpLock()).thenReturn(new Object()); 548553d277459f57e623aac27c145c0c9895454395Bernardo Rufino when(backupManagerService.getQueueLock()).thenReturn(new Object()); 558553d277459f57e623aac27c145c0c9895454395Bernardo Rufino when(backupManagerService.getCurrentOperations()).thenReturn(new SparseArray<>()); 568553d277459f57e623aac27c145c0c9895454395Bernardo Rufino when(backupManagerService.getActivityManager()).thenReturn(mock(IActivityManager.class)); 578553d277459f57e623aac27c145c0c9895454395Bernardo Rufino when(backupManagerService.getWakelock()).thenReturn(wakeLock); 5892892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng when(backupManagerService.getAgentTimeoutParameters()).thenReturn(agentTimeoutParameters); 598553d277459f57e623aac27c145c0c9895454395Bernardo Rufino } 608553d277459f57e623aac27c145c0c9895454395Bernardo Rufino 618553d277459f57e623aac27c145c0c9895454395Bernardo Rufino public static PowerManager.WakeLock createBackupWakeLock(Application application) { 628553d277459f57e623aac27c145c0c9895454395Bernardo Rufino PowerManager powerManager = 638553d277459f57e623aac27c145c0c9895454395Bernardo Rufino (PowerManager) application.getSystemService(Context.POWER_SERVICE); 648553d277459f57e623aac27c145c0c9895454395Bernardo Rufino return powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*"); 658553d277459f57e623aac27c145c0c9895454395Bernardo Rufino } 668553d277459f57e623aac27c145c0c9895454395Bernardo Rufino 678553d277459f57e623aac27c145c0c9895454395Bernardo Rufino /** 688553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * Creates a backup thread associated with a looper, starts it and returns its looper for 698553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * shadowing and creation of the backup handler. 708553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * 718553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * <p>Note that Robolectric simulates multi-thread in a single-thread to avoid flakiness, so 728553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * even though we started the thread, you should control its execution via the shadow of the 738553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * looper returned. 748553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * 758553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * @return The {@link Looper} for the backup thread. 768553d277459f57e623aac27c145c0c9895454395Bernardo Rufino */ 778553d277459f57e623aac27c145c0c9895454395Bernardo Rufino public static Looper startBackupThreadAndGetLooper() { 788553d277459f57e623aac27c145c0c9895454395Bernardo Rufino HandlerThread backupThread = new HandlerThread("backup"); 798553d277459f57e623aac27c145c0c9895454395Bernardo Rufino backupThread.start(); 808553d277459f57e623aac27c145c0c9895454395Bernardo Rufino return backupThread.getLooper(); 818553d277459f57e623aac27c145c0c9895454395Bernardo Rufino } 828553d277459f57e623aac27c145c0c9895454395Bernardo Rufino 838553d277459f57e623aac27c145c0c9895454395Bernardo Rufino /** 848553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * Similar to {@link #startBackupThreadAndGetLooper()} but with a custom exception handler and 858553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * returning the thread instead of the looper associated with it. 868553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * 878553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * @param exceptionHandler Uncaught exception handler for backup thread. 888553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * @return The backup thread. 898553d277459f57e623aac27c145c0c9895454395Bernardo Rufino * @see #startBackupThreadAndGetLooper() 908553d277459f57e623aac27c145c0c9895454395Bernardo Rufino */ 918553d277459f57e623aac27c145c0c9895454395Bernardo Rufino public static HandlerThread startBackupThread(UncaughtExceptionHandler exceptionHandler) { 928553d277459f57e623aac27c145c0c9895454395Bernardo Rufino HandlerThread backupThread = new HandlerThread("backup"); 938553d277459f57e623aac27c145c0c9895454395Bernardo Rufino backupThread.setUncaughtExceptionHandler(exceptionHandler); 948553d277459f57e623aac27c145c0c9895454395Bernardo Rufino backupThread.start(); 958553d277459f57e623aac27c145c0c9895454395Bernardo Rufino return backupThread; 968553d277459f57e623aac27c145c0c9895454395Bernardo Rufino } 978553d277459f57e623aac27c145c0c9895454395Bernardo Rufino 988553d277459f57e623aac27c145c0c9895454395Bernardo Rufino private BackupManagerServiceTestUtils() {} 998553d277459f57e623aac27c145c0c9895454395Bernardo Rufino} 100