Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a5ea337a authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add tests to WallpaperBackupAgent"

parents a3d7e44e 196d2752
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -24,3 +24,27 @@ android_app {
    certificate: "platform",
    privileged: false,
}

android_test {
    name: "WallpaperBackupAgentTests",
    manifest: "test/AndroidManifest.xml",
    test_config: "test/AndroidTest.xml",
    srcs: [
        // Include the app source code because the app runs as the system user on-device.
        "src/**/*.java",
        "test/src/**/*.java"
    ],
    libs: [
        "android.test.base",
        "android.test.runner",
    ],
    static_libs: [
        "androidx.test.core",
        "androidx.test.rules",
        "mockito-target-minus-junit4",
        "truth-prebuilt",
    ],
    certificate: "platform",
    platform_apis: true,
    test_suites: ["device-tests"]
}
+18 −5
Original line number Diff line number Diff line
@@ -39,6 +39,8 @@ import android.os.UserHandle;
import android.util.Slog;
import android.util.Xml;

import com.android.internal.annotations.VisibleForTesting;

import libcore.io.IoUtils;

import org.xmlpull.v1.XmlPullParser;
@@ -89,7 +91,7 @@ public class WallpaperBackupAgent extends BackupAgent {
            Slog.v(TAG, "onCreate()");
        }

        File wallpaperDir = Environment.getUserSystemDirectory(UserHandle.USER_SYSTEM);
        File wallpaperDir = getWallpaperDir();
        mWallpaperInfo = new File(wallpaperDir, WALLPAPER_INFO);
        mWallpaperFile = new File(wallpaperDir, WALLPAPER);
        mLockWallpaperFile = new File(wallpaperDir, WALLPAPER_LOCK);
@@ -102,6 +104,11 @@ public class WallpaperBackupAgent extends BackupAgent {
        }
    }

    @VisibleForTesting
    protected File getWallpaperDir() {
        return Environment.getUserSystemDirectory(UserHandle.USER_SYSTEM);
    }

    @Override
    public void onFullBackup(FullBackupDataOutput data) throws IOException {
        // To avoid data duplication and disk churn, use links as the stage.
@@ -119,7 +126,7 @@ public class WallpaperBackupAgent extends BackupAgent {
                FileOutputStream touch = new FileOutputStream(empty);
                touch.close();
            }
            fullBackupFile(empty, data);
            backupFile(empty, data);

            SharedPreferences prefs = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
            final int lastSysGeneration = prefs.getInt(SYSTEM_GENERATION, -1);
@@ -155,7 +162,7 @@ public class WallpaperBackupAgent extends BackupAgent {
                    FileUtils.copyFileOrThrow(mWallpaperInfo, infoStage);
                }
                if (DEBUG) Slog.v(TAG, "Storing wallpaper metadata");
                fullBackupFile(infoStage, data);
                backupFile(infoStage, data);
            }
            if (sysEligible && mWallpaperFile.exists()) {
                if (sysChanged || !imageStage.exists()) {
@@ -163,7 +170,7 @@ public class WallpaperBackupAgent extends BackupAgent {
                    FileUtils.copyFileOrThrow(mWallpaperFile, imageStage);
                }
                if (DEBUG) Slog.v(TAG, "Storing system wallpaper image");
                fullBackupFile(imageStage, data);
                backupFile(imageStage, data);
                prefs.edit().putInt(SYSTEM_GENERATION, sysGeneration).apply();
            }

@@ -174,7 +181,7 @@ public class WallpaperBackupAgent extends BackupAgent {
                    FileUtils.copyFileOrThrow(mLockWallpaperFile, lockImageStage);
                }
                if (DEBUG) Slog.v(TAG, "Storing lock wallpaper image");
                fullBackupFile(lockImageStage, data);
                backupFile(lockImageStage, data);
                prefs.edit().putInt(LOCK_GENERATION, lockGeneration).apply();
            }
        } catch (Exception e) {
@@ -189,6 +196,12 @@ public class WallpaperBackupAgent extends BackupAgent {
        }
    }

    @VisibleForTesting
    // fullBackupFile is final, so we intercept backups here in tests.
    protected void backupFile(File file, FullBackupDataOutput data) {
        fullBackupFile(file, data);
    }

    @Override
    public void onQuotaExceeded(long backupDataBytes, long quotaBytes) {
        if (DEBUG) {
+13 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.android.wallpaperbackup.tests">

    <application android:label="WallpaperBackup Tests">
        <uses-library android:name="android.test.runner" />
    </application>

    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
                     android:targetPackage="com.android.wallpaperbackup.tests"
                     android:label="WallpaperBackup Tests"/>
</manifest>
+27 −0
Original line number Diff line number Diff line
<!-- Copyright (C) 2019 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<configuration description="Runs sample instrumentation test.">
    <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
        <option name="test-file-name" value="WallpaperBackupAgentTests.apk" />
    </target_preparer>

    <option name="test-suite-tag" value="apct" />
    <option name="test-tag" value="WallpaperBackupAgentTests" />
    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
        <option name="package" value="com.android.wallpaperbackup.tests" />
        <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
        <option name="hidden-api-checks" value="false"/>
    </test>
</configuration>
+143 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.wallpaperbackup.tests;

import static android.app.WallpaperManager.FLAG_LOCK;
import static android.app.WallpaperManager.FLAG_SYSTEM;

import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.app.WallpaperManager;
import android.app.backup.FullBackupDataOutput;
import android.content.SharedPreferences;
import android.os.UserHandle;

import androidx.test.core.app.ApplicationProvider;
import androidx.test.runner.AndroidJUnit4;

import com.android.wallpaperbackup.WallpaperBackupAgent;
import com.android.wallpaperbackup.utils.ContextWithServiceOverrides;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@RunWith(AndroidJUnit4.class)
public class WallpaperBackupAgentTest {
    private static final String SYSTEM_GENERATION = "system_gen";
    private static final String LOCK_GENERATION = "lock_gen";

    @Mock private FullBackupDataOutput mOutput;
    @Mock private WallpaperManager mWallpaperManager;
    @Mock private SharedPreferences mSharedPreferences;

    @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder();

    private ContextWithServiceOverrides mContext;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);

        mContext = new ContextWithServiceOverrides(ApplicationProvider.getApplicationContext());
        mContext.injectSystemService(WallpaperManager.class, mWallpaperManager);
        mContext.setSharedPreferencesOverride(mSharedPreferences);
    }

    @Test
    public void testOnFullBackup_withNoChanges_onlyBacksUpEmptyFile() throws IOException {
        WallpaperBackupAgent wallpaperBackupAgent = new WallpaperBackupAgent();
        initialiseAgent(wallpaperBackupAgent);

        when(mWallpaperManager.getWallpaperIdForUser(eq(FLAG_SYSTEM), eq(UserHandle.USER_SYSTEM)))
                .thenReturn(1);
        when(mWallpaperManager.getWallpaperIdForUser(eq(FLAG_LOCK), eq(UserHandle.USER_SYSTEM)))
                .thenReturn(1);
        when(mSharedPreferences.getInt(eq(SYSTEM_GENERATION), eq(-1))).thenReturn(1);
        when(mSharedPreferences.getInt(eq(LOCK_GENERATION), eq(-1))).thenReturn(1);

        wallpaperBackupAgent.onFullBackup(mOutput);

        verify(mOutput); // Backup of empty file only
    }

    @Test
    public void testOnFullBackup_withOnlyChangedSystem_updatesTheSharedPreferences()
            throws IOException {
        // Create a system wallpaper file
        mTemporaryFolder.newFile("wallpaper_orig");
        // Create stageing file to simulate he wallpaper being ready to back up
        new File(mContext.getFilesDir(), "wallpaper-stage").createNewFile();

        WallpaperBackupAgent wallpaperBackupAgent =
                new IsolatedWallpaperBackupAgent(mTemporaryFolder.getRoot());
        initialiseAgent(wallpaperBackupAgent);

        SharedPreferences.Editor preferenceEditor = mock(SharedPreferences.Editor.class);

        when(mWallpaperManager.getWallpaperIdForUser(eq(FLAG_SYSTEM), eq(UserHandle.USER_SYSTEM)))
                .thenReturn(2);
        when(mWallpaperManager.getWallpaperIdForUser(eq(FLAG_LOCK), eq(UserHandle.USER_SYSTEM)))
                .thenReturn(1);
        when(mWallpaperManager.isWallpaperBackupEligible(eq(FLAG_SYSTEM))).thenReturn(true);
        when(mWallpaperManager.isWallpaperBackupEligible(eq(FLAG_LOCK))).thenReturn(true);
        when(mSharedPreferences.getInt(eq(SYSTEM_GENERATION), eq(-1))).thenReturn(1);
        when(mSharedPreferences.getInt(eq(LOCK_GENERATION), eq(-1))).thenReturn(1);
        when(mSharedPreferences.edit()).thenReturn(preferenceEditor);
        when(preferenceEditor.putInt(eq(SYSTEM_GENERATION), eq(2))).thenReturn(preferenceEditor);

        wallpaperBackupAgent.onFullBackup(mOutput);

        verify(preferenceEditor).putInt(eq(SYSTEM_GENERATION), eq(2));
    }

    private void initialiseAgent(WallpaperBackupAgent agent) {
        agent.attach(mContext);
        agent.onCreate();
    }

    private static class IsolatedWallpaperBackupAgent extends WallpaperBackupAgent {
        File mWallpaperBaseDirectory;
        List<File> mBackedUpFiles = new ArrayList();

        IsolatedWallpaperBackupAgent(File wallpaperBaseDirectory) {
            mWallpaperBaseDirectory = wallpaperBaseDirectory;
        }

        @Override
        protected File getWallpaperDir() {
            return mWallpaperBaseDirectory;
        }

        @Override
        protected void backupFile(File file, FullBackupDataOutput data) {
            mBackedUpFiles.add(file);
        }
    }
}
Loading