From f50b458e7107d23483d8c6ba1121d921773e45c6 Mon Sep 17 00:00:00 2001 From: Suprabh Shukla Date: Tue, 23 Feb 2016 17:44:22 -0800 Subject: [PATCH] Added a unit test for TaskPersister Added a simple unit test which checks the methods used to save and load the set of taskids to file. The test creates a user, adds some task ids to the set of taskids for that user, saves it and loads it to see whether the set loaded is the same as the one that was saved. Change-Id: If92be8abf9a7e3ef90630a3786867f0e1ba12f3e --- .../com/android/server/am/RecentTasks.java | 3 - .../com/android/server/am/TaskPersister.java | 23 ++++- .../android/server/am/TaskPersisterTest.java | 85 +++++++++++++++++++ 3 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java index 7209814312af8..d41e3d8108c0a 100644 --- a/services/core/java/com/android/server/am/RecentTasks.java +++ b/services/core/java/com/android/server/am/RecentTasks.java @@ -37,10 +37,7 @@ import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.os.Environment; import android.os.RemoteException; -import android.os.SystemClock; import android.os.UserHandle; -import android.provider.Settings.System; -import android.util.ArraySet; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; diff --git a/services/core/java/com/android/server/am/TaskPersister.java b/services/core/java/com/android/server/am/TaskPersister.java index 11fd3bc61ca67..ceb7db6b85235 100644 --- a/services/core/java/com/android/server/am/TaskPersister.java +++ b/services/core/java/com/android/server/am/TaskPersister.java @@ -88,6 +88,7 @@ public class TaskPersister { private final ActivityStackSupervisor mStackSupervisor; private final RecentTasks mRecentTasks; private final SparseArray mTaskIdsInFile = new SparseArray<>(); + private final File mTaskIdsDir; /** * Value determines write delay mode as follows: < 0 We are Flushing. No delays between writes @@ -139,12 +140,22 @@ public class TaskPersister { } } + mTaskIdsDir = new File(Environment.getDataDirectory(), "system_de"); mStackSupervisor = stackSupervisor; mService = service; mRecentTasks = recentTasks; mLazyTaskWriterThread = new LazyTaskWriterThread("LazyTaskWriterThread"); } + @VisibleForTesting + TaskPersister(File workingDir) { + mTaskIdsDir = workingDir; + mStackSupervisor = null; + mService = null; + mRecentTasks = null; + mLazyTaskWriterThread = new LazyTaskWriterThread("LazyTaskWriterThreadTest"); + } + void startPersisting() { if (!mLazyTaskWriterThread.isAlive()) { mLazyTaskWriterThread.start(); @@ -207,8 +218,8 @@ public class TaskPersister { return persistedTaskIds.clone(); } - private void maybeWritePersistedTaskIdsForUser(@NonNull SparseBooleanArray taskIds, - int userId) { + @VisibleForTesting + void maybeWritePersistedTaskIdsForUser(@NonNull SparseBooleanArray taskIds, int userId) { if (userId < 0) { return; } @@ -565,8 +576,12 @@ public class TaskPersister { return BitmapFactory.decodeFile(filename); } - static File getUserPersistedTaskIdsFile(int userId) { - return new File(Environment.getDataSystemDeDirectory(userId), PERSISTED_TASK_IDS_FILENAME); + private File getUserPersistedTaskIdsFile(int userId) { + File userTaskIdsDir = new File(mTaskIdsDir, String.valueOf(userId)); + if (!userTaskIdsDir.exists() && !userTaskIdsDir.mkdirs()) { + Slog.e(TAG, "Error while creating user directory: " + userTaskIdsDir); + } + return new File(userTaskIdsDir, PERSISTED_TASK_IDS_FILENAME); } static File getUserTasksDir(int userId) { diff --git a/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java b/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java new file mode 100644 index 0000000000000..e440a0d603d22 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2016 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.server.am; + +import android.content.pm.UserInfo; +import android.os.Environment; +import android.os.UserHandle; +import android.os.UserManager; +import android.test.AndroidTestCase; +import android.util.Log; +import android.util.SparseBooleanArray; + +import com.android.server.am.TaskPersister; + +import java.io.File; +import java.util.Random; + +public class TaskPersisterTest extends AndroidTestCase { + private static final String TEST_USER_NAME = "AM-Test-User"; + + private TaskPersister mTaskPersister; + private int testUserId; + private UserManager mUserManager; + + @Override + public void setUp() throws Exception { + super.setUp(); + mUserManager = UserManager.get(getContext()); + mTaskPersister = new TaskPersister(getContext().getFilesDir()); + testUserId = createUser(TEST_USER_NAME, 0); + } + + @Override + public void tearDown() throws Exception { + super.tearDown(); + mTaskPersister.unloadUserDataFromMemory(testUserId); + removeUser(testUserId); + } + + private int getRandomTaskIdForUser(int userId) { + int taskId = (int) (Math.random() * UserHandle.PER_USER_RANGE); + taskId += UserHandle.PER_USER_RANGE * userId; + return taskId; + } + + public void testTaskIdsPersistence() { + SparseBooleanArray taskIdsOnFile = mTaskPersister.loadPersistedTaskIdsForUser(testUserId); + for (int i = 0; i < 100; i++) { + taskIdsOnFile.put(getRandomTaskIdForUser(testUserId), true); + } + mTaskPersister.maybeWritePersistedTaskIdsForUser(taskIdsOnFile, testUserId); + SparseBooleanArray newTaskIdsOnFile = mTaskPersister + .loadPersistedTaskIdsForUser(testUserId); + assertTrue("TaskIds written differ from TaskIds read back from file", + taskIdsOnFile.equals(newTaskIdsOnFile)); + } + + private int createUser(String name, int flags) { + UserInfo user = mUserManager.createUser(name, flags); + if (user == null) { + fail("Error while creating the test user: " + TEST_USER_NAME); + } + return user.id; + } + + private void removeUser(int userId) { + if (!mUserManager.removeUser(userId)) { + fail("Error while removing the test user: " + TEST_USER_NAME); + } + } +} \ No newline at end of file