synchronized (sSingletonLock) {
if (sSingleton == null) {
sSingleton = new JobStore(jobManagerService.getContext(),
- Environment.getDataDirectory(), jobManagerService);
+ Environment.getDataDirectory());
}
return sSingleton;
}
}
+ /**
+ * @return A freshly initialized job store object, with no loaded jobs.
+ */
@VisibleForTesting
- public static JobStore initAndGetForTesting(Context context, File dataDir,
- JobMapReadFinishedListener callback) {
- return new JobStore(context, dataDir, callback);
+ public static JobStore initAndGetForTesting(Context context, File dataDir) {
+ JobStore jobStoreUnderTest = new JobStore(context, dataDir);
+ jobStoreUnderTest.clear();
+ return jobStoreUnderTest;
}
- private JobStore(Context context, File dataDir, JobMapReadFinishedListener callback) {
+ /**
+ * Construct the instance of the job store. This results in a blocking read from disk.
+ */
+ private JobStore(Context context, File dataDir) {
mContext = context;
mDirtyOperations = 0;
mJobSet = new ArraySet<JobStatus>();
- readJobMapFromDiskAsync(callback);
+ readJobMapFromDisk(mJobSet);
}
/**
}
}
- private void readJobMapFromDiskAsync(JobMapReadFinishedListener callback) {
- mIoHandler.post(new ReadJobMapFromDiskRunnable(callback));
- }
-
- public void readJobMapFromDisk(JobMapReadFinishedListener callback) {
- new ReadJobMapFromDiskRunnable(callback).run();
+ @VisibleForTesting
+ public void readJobMapFromDisk(ArraySet<JobStatus> jobSet) {
+ new ReadJobMapFromDiskRunnable(jobSet).run();
}
/**
}
/**
- * Runnable that reads list of persisted job from xml.
- * NOTE: This Runnable locks on JobStore.this
+ * Runnable that reads list of persisted job from xml. This is run once at start up, so doesn't
+ * need to go through {@link JobStore#add(com.android.server.job.controllers.JobStatus)}.
*/
private class ReadJobMapFromDiskRunnable implements Runnable {
- private JobMapReadFinishedListener mCallback;
- public ReadJobMapFromDiskRunnable(JobMapReadFinishedListener callback) {
- mCallback = callback;
+ private final ArraySet<JobStatus> jobSet;
+
+ /**
+ * @param jobSet Reference to the (empty) set of JobStatus objects that back the JobStore,
+ * so that after disk read we can populate it directly.
+ */
+ ReadJobMapFromDiskRunnable(ArraySet<JobStatus> jobSet) {
+ this.jobSet = jobSet;
}
@Override
FileInputStream fis = mJobsFile.openRead();
synchronized (JobStore.this) {
jobs = readJobMapImpl(fis);
+ if (jobs != null) {
+ for (int i=0; i<jobs.size(); i++) {
+ this.jobSet.add(jobs.get(i));
+ }
+ }
}
fis.close();
- if (jobs != null) {
- mCallback.onJobMapReadFinished(jobs);
- }
} catch (FileNotFoundException e) {
if (JobSchedulerService.DEBUG) {
Slog.d(TAG, "Could not find jobs file, probably there was nothing to load.");
return Pair.create(earliestRunTimeElapsed, latestRunTimeElapsed);
}
}
-}
\ No newline at end of file
+}
-package com.android.server.task;
+package com.android.server.job;
import android.content.ComponentName;
import android.test.AndroidTestCase;
import android.test.RenamingDelegatingContext;
import android.util.Log;
+import android.util.ArraySet;
-import com.android.server.job.JobMapReadFinishedListener;
-import com.android.server.job.JobStore;
import com.android.server.job.controllers.JobStatus;
-import java.util.List;
+import java.util.Iterator;
/**
* Test reading and writing correctly from file.
*/
-public class TaskStoreTest extends AndroidTestCase {
+public class JobStoreTest extends AndroidTestCase {
private static final String TAG = "TaskStoreTest";
private static final String TEST_PREFIX = "_test_";
- // private static final int USER_NON_0 = 3;
+
private static final int SOME_UID = 34234;
private ComponentName mComponent;
- private static final long IO_WAIT = 600L;
+ private static final long IO_WAIT = 1000L;
JobStore mTaskStoreUnderTest;
Context mTestContext;
- JobMapReadFinishedListener mTaskMapReadFinishedListenerStub =
- new JobMapReadFinishedListener() {
- @Override
- public void onJobMapReadFinished(List<JobStatus> tasks) {
- // do nothing.
- }
- };
@Override
public void setUp() throws Exception {
mTestContext = new RenamingDelegatingContext(getContext(), TEST_PREFIX);
Log.d(TAG, "Saving tasks to '" + mTestContext.getFilesDir() + "'");
- mTaskStoreUnderTest = JobStore.initAndGetForTesting(mTestContext,
- mTestContext.getFilesDir(), mTaskMapReadFinishedListenerStub);
+ mTaskStoreUnderTest =
+ JobStore.initAndGetForTesting(mTestContext, mTestContext.getFilesDir());
mComponent = new ComponentName(getContext().getPackageName(), StubClass.class.getName());
}
mTaskStoreUnderTest.add(ts);
Thread.sleep(IO_WAIT);
// Manually load tasks from xml file.
- mTaskStoreUnderTest.readJobMapFromDisk(new JobMapReadFinishedListener() {
- @Override
- public void onJobMapReadFinished(List<JobStatus> tasks) {
- assertEquals("Didn't get expected number of persisted tasks.", 1, tasks.size());
- JobStatus loadedTaskStatus = tasks.get(0);
- assertTasksEqual(task, loadedTaskStatus.getJob());
- assertEquals("Different uids.", SOME_UID, tasks.get(0).getUid());
- compareTimestampsSubjectToIoLatency("Early run-times not the same after read.",
- ts.getEarliestRunTime(), loadedTaskStatus.getEarliestRunTime());
- compareTimestampsSubjectToIoLatency("Late run-times not the same after read.",
- ts.getLatestRunTimeElapsed(), loadedTaskStatus.getLatestRunTimeElapsed());
- }
- });
+ final ArraySet<JobStatus> jobStatusSet = new ArraySet<JobStatus>();
+ mTaskStoreUnderTest.readJobMapFromDisk(jobStatusSet);
+
+ assertEquals("Didn't get expected number of persisted tasks.", 1, jobStatusSet.size());
+ final JobStatus loadedTaskStatus = jobStatusSet.iterator().next();
+ assertTasksEqual(task, loadedTaskStatus.getJob());
+ assertEquals("Different uids.", SOME_UID, loadedTaskStatus.getUid());
+ compareTimestampsSubjectToIoLatency("Early run-times not the same after read.",
+ ts.getEarliestRunTime(), loadedTaskStatus.getEarliestRunTime());
+ compareTimestampsSubjectToIoLatency("Late run-times not the same after read.",
+ ts.getLatestRunTimeElapsed(), loadedTaskStatus.getLatestRunTimeElapsed());
}
mTaskStoreUnderTest.add(taskStatus1);
mTaskStoreUnderTest.add(taskStatus2);
Thread.sleep(IO_WAIT);
- mTaskStoreUnderTest.readJobMapFromDisk(new JobMapReadFinishedListener() {
- @Override
- public void onJobMapReadFinished(List<JobStatus> tasks) {
- assertEquals("Incorrect # of persisted tasks.", 2, tasks.size());
- JobStatus loaded1 = tasks.get(0);
- JobStatus loaded2 = tasks.get(1);
- assertTasksEqual(task1, loaded1.getJob());
- assertTasksEqual(task2, loaded2.getJob());
-
- // Check that the loaded task has the correct runtimes.
- compareTimestampsSubjectToIoLatency("Early run-times not the same after read.",
- taskStatus1.getEarliestRunTime(), loaded1.getEarliestRunTime());
- compareTimestampsSubjectToIoLatency("Late run-times not the same after read.",
- taskStatus1.getLatestRunTimeElapsed(), loaded1.getLatestRunTimeElapsed());
- compareTimestampsSubjectToIoLatency("Early run-times not the same after read.",
- taskStatus2.getEarliestRunTime(), loaded2.getEarliestRunTime());
- compareTimestampsSubjectToIoLatency("Late run-times not the same after read.",
- taskStatus2.getLatestRunTimeElapsed(), loaded2.getLatestRunTimeElapsed());
- }
- });
+
+ final ArraySet<JobStatus> jobStatusSet = new ArraySet<JobStatus>();
+ mTaskStoreUnderTest.readJobMapFromDisk(jobStatusSet);
+ assertEquals("Incorrect # of persisted tasks.", 2, jobStatusSet.size());
+ Iterator<JobStatus> it = jobStatusSet.iterator();
+ JobStatus loaded1 = it.next();
+ JobStatus loaded2 = it.next();
+ assertTasksEqual(task1, loaded1.getJob());
+ assertTasksEqual(task2, loaded2.getJob());
+
+ // Check that the loaded task has the correct runtimes.
+ compareTimestampsSubjectToIoLatency("Early run-times not the same after read.",
+ taskStatus1.getEarliestRunTime(), loaded1.getEarliestRunTime());
+ compareTimestampsSubjectToIoLatency("Late run-times not the same after read.",
+ taskStatus1.getLatestRunTimeElapsed(), loaded1.getLatestRunTimeElapsed());
+ compareTimestampsSubjectToIoLatency("Early run-times not the same after read.",
+ taskStatus2.getEarliestRunTime(), loaded2.getEarliestRunTime());
+ compareTimestampsSubjectToIoLatency("Late run-times not the same after read.",
+ taskStatus2.getLatestRunTimeElapsed(), loaded2.getLatestRunTimeElapsed());
}
mTaskStoreUnderTest.add(taskStatus);
Thread.sleep(IO_WAIT);
- mTaskStoreUnderTest.readJobMapFromDisk(new JobMapReadFinishedListener() {
- @Override
- public void onJobMapReadFinished(List<JobStatus> tasks) {
- assertEquals("Incorrect # of persisted tasks.", 1, tasks.size());
- JobStatus loaded = tasks.get(0);
- assertTasksEqual(task, loaded.getJob());
- }
- });
+ final ArraySet<JobStatus> jobStatusSet = new ArraySet<JobStatus>();
+ mTaskStoreUnderTest.readJobMapFromDisk(jobStatusSet);
+ assertEquals("Incorrect # of persisted tasks.", 1, jobStatusSet.size());
+ JobStatus loaded = jobStatusSet.iterator().next();
+ assertTasksEqual(task, loaded.getJob());
}
/**
private static class StubClass {}
-}
\ No newline at end of file
+}