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