Merge "Enhance recent sync log in dumpsys content" into oc-dr1-dev
diff --git a/core/java/android/content/SyncStatusInfo.java b/core/java/android/content/SyncStatusInfo.java
index bb24ccd..663e6e4 100644
--- a/core/java/android/content/SyncStatusInfo.java
+++ b/core/java/android/content/SyncStatusInfo.java
@@ -24,7 +24,11 @@
/** @hide */
public class SyncStatusInfo implements Parcelable {
- static final int VERSION = 2;
+ private static final String TAG = "Sync";
+
+ static final int VERSION = 3;
+
+ private static final int MAX_EVENT_COUNT = 10;
public final int authorityId;
public long totalElapsedTime;
@@ -47,7 +51,8 @@
// no race conditions when accessing this list
private ArrayList<Long> periodicSyncTimes;
- private static final String TAG = "Sync";
+ private final ArrayList<Long> mLastEventTimes = new ArrayList<>();
+ private final ArrayList<String> mLastEvents = new ArrayList<>();
public SyncStatusInfo(int authorityId) {
this.authorityId = authorityId;
@@ -92,6 +97,11 @@
} else {
parcel.writeInt(-1);
}
+ parcel.writeInt(mLastEventTimes.size());
+ for (int i = 0; i < mLastEventTimes.size(); i++) {
+ parcel.writeLong(mLastEventTimes.get(i));
+ parcel.writeString(mLastEvents.get(i));
+ }
}
public SyncStatusInfo(Parcel parcel) {
@@ -117,15 +127,24 @@
if (version == 1) {
periodicSyncTimes = null;
} else {
- int N = parcel.readInt();
- if (N < 0) {
+ final int count = parcel.readInt();
+ if (count < 0) {
periodicSyncTimes = null;
} else {
periodicSyncTimes = new ArrayList<Long>();
- for (int i=0; i<N; i++) {
+ for (int i = 0; i < count; i++) {
periodicSyncTimes.add(parcel.readLong());
}
}
+ if (version >= 3) {
+ mLastEventTimes.clear();
+ mLastEvents.clear();
+ final int nEvents = parcel.readInt();
+ for (int i = 0; i < nEvents; i++) {
+ mLastEventTimes.add(parcel.readLong());
+ mLastEvents.add(parcel.readString());
+ }
+ }
}
}
@@ -149,6 +168,8 @@
if (other.periodicSyncTimes != null) {
periodicSyncTimes = new ArrayList<Long>(other.periodicSyncTimes);
}
+ mLastEventTimes.addAll(other.mLastEventTimes);
+ mLastEvents.addAll(other.mLastEvents);
}
public void setPeriodicSyncTime(int index, long when) {
@@ -172,6 +193,31 @@
}
}
+ /** */
+ public void addEvent(String message) {
+ if (mLastEventTimes.size() >= MAX_EVENT_COUNT) {
+ mLastEventTimes.remove(MAX_EVENT_COUNT - 1);
+ mLastEvents.remove(MAX_EVENT_COUNT - 1);
+ }
+ mLastEventTimes.add(0, System.currentTimeMillis());
+ mLastEvents.add(0, message);
+ }
+
+ /** */
+ public int getEventCount() {
+ return mLastEventTimes.size();
+ }
+
+ /** */
+ public long getEventTime(int i) {
+ return mLastEventTimes.get(i);
+ }
+
+ /** */
+ public String getEvent(int i) {
+ return mLastEvents.get(i);
+ }
+
public static final Creator<SyncStatusInfo> CREATOR = new Creator<SyncStatusInfo>() {
public SyncStatusInfo createFromParcel(Parcel in) {
return new SyncStatusInfo(in);
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 3ca65cd..e3e2658 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -74,7 +74,6 @@
import android.os.UserManager;
import android.os.WorkSource;
import android.provider.Settings;
-import android.text.format.DateUtils;
import android.text.format.Time;
import android.util.EventLog;
import android.util.Log;
@@ -113,6 +112,7 @@
import java.util.Objects;
import java.util.Random;
import java.util.Set;
+import java.util.function.Predicate;
/**
* Implementation details:
@@ -1761,10 +1761,7 @@
protected void dump(FileDescriptor fd, PrintWriter pw) {
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
- dumpPendingSyncs(pw);
- dumpPeriodicSyncs(pw);
dumpSyncState(ipw);
- dumpSyncHistory(ipw);
dumpSyncAdapters(ipw);
}
@@ -1774,9 +1771,58 @@
return tobj.format("%Y-%m-%d %H:%M:%S");
}
+ private final static Comparator<SyncOperation> sOpDumpComparator = (op1, op2) -> {
+ int res = Integer.compare(op1.target.userId, op2.target.userId);
+ if (res != 0) return res;
+
+ final Comparator<String> stringComparator = String.CASE_INSENSITIVE_ORDER;
+
+ res = stringComparator.compare(op1.target.account.type, op2.target.account.type);
+ if (res != 0) return res;
+
+ res = stringComparator.compare(op1.target.account.name, op2.target.account.name);
+ if (res != 0) return res;
+
+ res = stringComparator.compare(op1.target.provider, op2.target.provider);
+ if (res != 0) return res;
+
+ res = Integer.compare(op1.reason, op2.reason);
+ if (res != 0) return res;
+
+ res = Long.compare(op1.periodMillis, op2.periodMillis);
+ if (res != 0) return res;
+
+ res = Long.compare(op1.expectedRuntime, op2.expectedRuntime);
+ if (res != 0) return res;
+
+ res = Long.compare(op1.jobId, op2.jobId);
+ if (res != 0) return res;
+
+ return 0;
+ };
+
+ private final static Comparator<SyncOperation> sOpRuntimeComparator = (op1, op2) -> {
+ int res = Long.compare(op1.expectedRuntime, op2.expectedRuntime);
+ if (res != 0) return res;
+
+ return sOpDumpComparator.compare(op1, op2);
+ };
+
+ private static <T> int countIf(Collection<T> col, Predicate<T> p) {
+ int ret = 0;
+ for (T item : col) {
+ if (p.test(item)) ret++;
+ }
+ return ret;
+ }
+
protected void dumpPendingSyncs(PrintWriter pw) {
- pw.println("Pending Syncs:");
List<SyncOperation> pendingSyncs = getAllPendingSyncs();
+
+ pw.print("Pending Syncs: ");
+ pw.println(countIf(pendingSyncs, op -> !op.isPeriodic));
+
+ Collections.sort(pendingSyncs, sOpRuntimeComparator);
int count = 0;
for (SyncOperation op: pendingSyncs) {
if (!op.isPeriodic) {
@@ -1784,13 +1830,16 @@
count++;
}
}
- pw.println("Total: " + count);
pw.println();
}
protected void dumpPeriodicSyncs(PrintWriter pw) {
- pw.println("Periodic Syncs:");
List<SyncOperation> pendingSyncs = getAllPendingSyncs();
+
+ pw.print("Periodic Syncs: ");
+ pw.println(countIf(pendingSyncs, op -> op.isPeriodic));
+
+ Collections.sort(pendingSyncs, sOpDumpComparator);
int count = 0;
for (SyncOperation op: pendingSyncs) {
if (op.isPeriodic) {
@@ -1798,11 +1847,62 @@
count++;
}
}
- pw.println("Total: " + count);
pw.println();
}
+ /**
+ * Similar to {@link android.util.TimeUtils#formatDuration}, but it's more suitable and concise
+ * for the sync manager dumpsys. (Don't add the leading + sign, don't show milliseconds.)
+ */
+ public static StringBuilder formatDurationHMS(StringBuilder sb, long duration) {
+ duration /= 1000;
+ if (duration < 0) {
+ sb.append('-');
+ duration = -duration;
+ }
+ final long seconds = duration % 60;
+ duration /= 60;
+
+ final long minutes = duration % 60;
+ duration /= 60;
+
+ final long hours = duration % 24;
+ duration /= 24;
+
+ final long days = duration;
+
+ boolean print = false;
+ if (days > 0) {
+ sb.append(days);
+ sb.append('d');
+ print = true;
+ }
+ print = printTwoDigitNumber(sb, hours, 'h', print);
+ print = printTwoDigitNumber(sb, minutes, 'm', print);
+ print = printTwoDigitNumber(sb, seconds, 's', print);
+ if (!print) {
+ sb.append("0s");
+ }
+
+ return sb;
+ }
+
+ private static boolean printTwoDigitNumber(StringBuilder sb, long value, char unit,
+ boolean always) {
+ if (!always && (value == 0)) {
+ return false;
+ }
+ if (always && (value < 10)) {
+ sb.append('0');
+ }
+ sb.append(value);
+ sb.append(unit);
+ return true;
+ }
+
protected void dumpSyncState(PrintWriter pw) {
+ final StringBuilder sb = new StringBuilder();
+
pw.print("data connected: "); pw.println(mDataConnectionIsConnected);
pw.print("auto sync: ");
List<UserInfo> users = getAllUsers();
@@ -1828,13 +1928,16 @@
final long now = SystemClock.elapsedRealtime();
pw.print("now: "); pw.print(now);
pw.println(" (" + formatTime(System.currentTimeMillis()) + ")");
- pw.println(" (HH:MM:SS)");
- pw.print("uptime: "); pw.print(DateUtils.formatElapsedTime(now / 1000));
- pw.println(" (HH:MM:SS)");
+
+ sb.setLength(0);
+ pw.print("uptime: "); pw.print(formatDurationHMS(sb, now));
+ pw.println();
pw.print("time spent syncing: ");
- pw.print(DateUtils.formatElapsedTime(
- mSyncHandler.mSyncTimeTracker.timeSpentSyncing() / 1000));
- pw.print(" (HH:MM:SS), sync ");
+
+ sb.setLength(0);
+ pw.print(formatDurationHMS(sb,
+ mSyncHandler.mSyncTimeTracker.timeSpentSyncing()));
+ pw.print(", sync ");
pw.print(mSyncHandler.mSyncTimeTracker.mLastWasSyncing ? "" : "not ");
pw.println("in progress");
@@ -1842,17 +1945,24 @@
pw.println("Active Syncs: " + mActiveSyncContexts.size());
final PackageManager pm = mContext.getPackageManager();
for (SyncManager.ActiveSyncContext activeSyncContext : mActiveSyncContexts) {
- final long durationInSeconds = (now - activeSyncContext.mStartTime) / 1000;
+ final long durationInSeconds = (now - activeSyncContext.mStartTime);
pw.print(" ");
- pw.print(DateUtils.formatElapsedTime(durationInSeconds));
+ sb.setLength(0);
+ pw.print(formatDurationHMS(sb, durationInSeconds));
pw.print(" - ");
pw.print(activeSyncContext.mSyncOperation.dump(pm, false));
pw.println();
}
+ pw.println();
+
+ dumpPendingSyncs(pw);
+ dumpPeriodicSyncs(pw);
// Join the installed sync adapter with the accounts list and emit for everything.
- pw.println();
pw.println("Sync Status");
+
+ final ArrayList<Pair<EndPoint, SyncStatusInfo>> statuses = new ArrayList<>();
+
for (AccountAndUser account : accounts) {
pw.printf("Account %s u%d %s\n",
account.account.name, account.userId, account.account.type);
@@ -1872,7 +1982,7 @@
"Tot", // 9
"Time", // 10
"Last Sync", // 11
- "Etc" // 12
+ "Backoff" // 12
);
final List<RegisteredServicesCache.ServiceInfo<SyncAdapterType>> sorted =
@@ -1899,11 +2009,14 @@
account.userId));
SyncStorageEngine.AuthorityInfo settings = syncAuthoritySyncStatus.first;
SyncStatusInfo status = syncAuthoritySyncStatus.second;
+ statuses.add(Pair.create(settings.target, status));
String authority = settings.target.provider;
if (authority.length() > 50) {
authority = authority.substring(authority.length() - 50);
}
table.set(row, 0, authority, settings.syncable, settings.enabled);
+
+ sb.setLength(0);
table.set(row, 4,
status.numSourceLocal,
status.numSourcePoll,
@@ -1911,7 +2024,7 @@
status.numSourceServer,
status.numSourceUser,
status.numSyncs,
- DateUtils.formatElapsedTime(status.totalElapsedTime / 1000));
+ formatDurationHMS(sb, status.totalElapsedTime));
int row1 = row;
if (settings.delayUntil > now) {
@@ -1938,6 +2051,34 @@
}
table.writeTo(pw);
}
+
+ dumpSyncHistory(pw);
+
+ pw.println();
+ pw.println("Per Adapter History");
+
+ for (int i = 0; i < statuses.size(); i++) {
+ final Pair<EndPoint, SyncStatusInfo> event = statuses.get(i);
+
+ pw.print(" ");
+ pw.print(event.first.account.name);
+ pw.print('/');
+ pw.print(event.first.account.type);
+ pw.print(" u");
+ pw.print(event.first.userId);
+ pw.print(" [");
+ pw.print(event.first.provider);
+ pw.print("]");
+ pw.println();
+
+ for (int j = 0; j < event.second.getEventCount(); j++) {
+ pw.print(" ");
+ pw.print(formatTime(event.second.getEventTime(j)));
+ pw.print(' ');
+ pw.print(event.second.getEvent(j));
+ pw.println();
+ }
+ }
}
private void dumpTimeSec(PrintWriter pw, long time) {
@@ -3403,7 +3544,7 @@
}
static class PrintTable {
- private ArrayList<Object[]> mTable = Lists.newArrayList();
+ private ArrayList<String[]> mTable = Lists.newArrayList();
private final int mCols;
PrintTable(int cols) {
@@ -3416,13 +3557,17 @@
" columns. can't set " + values.length + " at column " + col);
}
for (int i = mTable.size(); i <= row; i++) {
- final Object[] list = new Object[mCols];
+ final String[] list = new String[mCols];
mTable.add(list);
for (int j = 0; j < mCols; j++) {
list[j] = "";
}
}
- System.arraycopy(values, 0, mTable.get(row), col, values.length);
+ final String[] rowArray = mTable.get(row);
+ for (int i = 0; i < values.length; i++) {
+ final Object value = values[i];
+ rowArray[col + i] = (value == null) ? "" : value.toString();
+ }
}
void writeTo(PrintWriter out) {
diff --git a/services/core/java/com/android/server/content/SyncOperation.java b/services/core/java/com/android/server/content/SyncOperation.java
index c371f97..b46426c 100644
--- a/services/core/java/com/android/server/content/SyncOperation.java
+++ b/services/core/java/com/android/server/content/SyncOperation.java
@@ -18,10 +18,11 @@
import android.accounts.Account;
import android.app.job.JobInfo;
-import android.content.pm.PackageManager;
import android.content.ContentResolver;
+import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.PersistableBundle;
+import android.os.SystemClock;
import android.os.UserHandle;
import android.util.Slog;
@@ -350,37 +351,46 @@
return dump(null, true);
}
- String dump(PackageManager pm, boolean useOneLine) {
+ String dump(PackageManager pm, boolean shorter) {
StringBuilder sb = new StringBuilder();
- sb.append("JobId: ").append(jobId)
- .append(", ")
+ sb.append("JobId=").append(jobId)
+ .append(" ")
.append(target.account.name)
- .append(" u")
- .append(target.userId).append(" (")
+ .append("/")
.append(target.account.type)
- .append(")")
- .append(", ")
+ .append(" u")
+ .append(target.userId)
+ .append(" [")
.append(target.provider)
- .append(", ");
+ .append("] ");
sb.append(SyncStorageEngine.SOURCES[syncSource]);
- if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false)) {
- sb.append(", EXPEDITED");
+ if (expectedRuntime != 0) {
+ sb.append(" ExpectedIn=");
+ SyncManager.formatDurationHMS(sb,
+ (expectedRuntime - SystemClock.elapsedRealtime()));
}
- sb.append(", reason: ");
+ if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false)) {
+ sb.append(" EXPEDITED");
+ }
+ sb.append(" Reason=");
sb.append(reasonToString(pm, reason));
if (isPeriodic) {
- sb.append(", period: " + periodMillis).append(", flexMillis: " + flexMillis);
+ sb.append(" (period=");
+ SyncManager.formatDurationHMS(sb, periodMillis);
+ sb.append(" flex=");
+ SyncManager.formatDurationHMS(sb, flexMillis);
+ sb.append(")");
}
- if (!useOneLine) {
- sb.append("\n ");
- sb.append("owningUid=");
+ if (!shorter) {
+ sb.append(" Owner={");
UserHandle.formatUid(sb, owningUid);
- sb.append(" owningPackage=");
+ sb.append(" ");
sb.append(owningPackage);
- }
- if (!useOneLine && !extras.keySet().isEmpty()) {
- sb.append("\n ");
- extrasToStringBuilder(extras, sb);
+ sb.append("}");
+ if (!extras.keySet().isEmpty()) {
+ sb.append(" ");
+ extrasToStringBuilder(extras, sb);
+ }
}
return sb.toString();
}
@@ -434,7 +444,7 @@
return extras.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, false);
}
- private static void extrasToStringBuilder(Bundle bundle, StringBuilder sb) {
+ static void extrasToStringBuilder(Bundle bundle, StringBuilder sb) {
sb.append("[");
for (String key : bundle.keySet()) {
sb.append(key).append("=").append(bundle.get(key)).append(" ");
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index f804fa1..7b277c0 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -1183,6 +1183,16 @@
ds.failureCount++;
ds.failureTime += elapsedTime;
}
+ final StringBuilder event = new StringBuilder();
+ event.append("" + resultMessage + " Source=" + SyncStorageEngine.SOURCES[item.source]
+ + " Elapsed=");
+ SyncManager.formatDurationHMS(event, elapsedTime);
+ event.append(" Reason=");
+ event.append(SyncOperation.reasonToString(null, item.reason));
+ event.append(" Extras=");
+ SyncOperation.extrasToStringBuilder(item.extras, event);
+
+ status.addEvent(event.toString());
if (writeStatusNow) {
writeStatusLocked();
diff --git a/services/tests/servicestests/src/com/android/server/content/ObserverNodeTest.java b/services/tests/servicestests/src/com/android/server/content/ObserverNodeTest.java
index 07280bc..62b0ca8 100644
--- a/services/tests/servicestests/src/com/android/server/content/ObserverNodeTest.java
+++ b/services/tests/servicestests/src/com/android/server/content/ObserverNodeTest.java
@@ -21,16 +21,22 @@
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
+import android.os.Looper;
import android.os.UserHandle;
import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
import com.android.server.content.ContentService.ObserverCall;
import com.android.server.content.ContentService.ObserverNode;
+/**
+ * bit FrameworksServicesTests:com.android.server.content.ObserverNodeTest
+ */
+@SmallTest
public class ObserverNodeTest extends AndroidTestCase {
static class TestObserver extends ContentObserver {
public TestObserver() {
- super(new Handler());
+ super(new Handler(Looper.getMainLooper()));
}
}
diff --git a/services/tests/servicestests/src/com/android/server/content/SyncManagerTest.java b/services/tests/servicestests/src/com/android/server/content/SyncManagerTest.java
index be6861c..d093e79 100644
--- a/services/tests/servicestests/src/com/android/server/content/SyncManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/content/SyncManagerTest.java
@@ -1,9 +1,32 @@
+/*
+ * Copyright (C) 2017 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.content;
import android.os.Bundle;
+import android.test.suitebuilder.annotation.SmallTest;
import junit.framework.TestCase;
+/**
+ * Tests for SyncManager.
+ *
+ * bit FrameworksServicesTests:com.android.server.content.SyncManagerTest
+ */
+@SmallTest
public class SyncManagerTest extends TestCase {
final String KEY_1 = "key_1";
@@ -61,4 +84,42 @@
assertFalse("Extras considered equal when they are different.",
SyncManager.syncExtrasEquals(b1, b2, false /* don't care about system extras */));
}
+
+ public void testFormatDurationHMS() {
+ checkFormatDurationHMS("0s", 0, 0, 0, 0);
+ checkFormatDurationHMS("1s", 0, 0, 0, 1);
+ checkFormatDurationHMS("9s", 0, 0, 0, 9);
+ checkFormatDurationHMS("10s", 0, 0, 0, 10);
+ checkFormatDurationHMS("59s", 0, 0, 0, 59);
+ checkFormatDurationHMS("1m00s", 0, 0, 1, 0);
+ checkFormatDurationHMS("1m01s", 0, 0, 1, 1);
+ checkFormatDurationHMS("1m09s", 0, 0, 1, 9);
+ checkFormatDurationHMS("1m10s", 0, 0, 1, 10);
+ checkFormatDurationHMS("1m59s", 0, 0, 1, 59);
+ checkFormatDurationHMS("1h00m00s", 0, 1, 0, 0);
+ checkFormatDurationHMS("1h00m01s", 0, 1, 0, 1);
+ checkFormatDurationHMS("1h01m01s", 0, 1, 1, 1);
+ checkFormatDurationHMS("1h09m10s", 0, 1, 9, 10);
+ checkFormatDurationHMS("1h10m59s", 0, 1, 10, 59);
+ checkFormatDurationHMS("1h59m00s", 0, 1, 59, 0);
+
+ checkFormatDurationHMS("1d00h00m00s", 1, 0, 0, 0);
+ checkFormatDurationHMS("1d00h00m00s", 1, 0, 0, 0);
+ checkFormatDurationHMS("1d01h00m00s", 1, 1, 0, 0);
+ checkFormatDurationHMS("1d09h00m00s", 1, 9, 0, 0);
+ checkFormatDurationHMS("1d10h00m00s", 1, 10, 0, 0);
+ checkFormatDurationHMS("1d23h00m00s", 1, 23, 0, 0);
+ checkFormatDurationHMS("123d01h00m00s", 123, 1, 0, 0);
+
+ final StringBuilder sb = new StringBuilder();
+ assertEquals("-1m01s", SyncManager.formatDurationHMS(sb, -61000L).toString());
+ }
+
+ private void checkFormatDurationHMS(String expected,
+ int d, int h, int m, int s) {
+ final long time = (d * 24 * 3600) + (h * 3600) + (m * 60) + s;
+
+ final StringBuilder sb = new StringBuilder();
+ assertEquals(expected, SyncManager.formatDurationHMS(sb, time * 1000).toString());
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java b/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java
index e45b92a..deaa34c 100644
--- a/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java
+++ b/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java
@@ -17,24 +17,17 @@
package com.android.server.content;
import android.accounts.Account;
-import android.content.ContentResolver;
-import android.content.Context;
import android.os.Bundle;
import android.os.PersistableBundle;
-import android.os.SystemClock;
-import android.provider.Settings;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
/**
- * You can run those tests with:
+ * Test for SyncOperation.
*
- * adb shell am instrument
- * -e debug false
- * -w
- * -e class android.content.SyncOperationTest com.android.frameworks.coretests/android.test.InstrumentationTestRunner
+ * bit FrameworksServicesTests:com.android.server.content.SyncOperationTest
*/
-
+@SmallTest
public class SyncOperationTest extends AndroidTestCase {
Account mDummy;
diff --git a/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java b/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java
index 91c0de6..85de1f1 100644
--- a/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java
+++ b/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java
@@ -22,7 +22,6 @@
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
-import android.content.PeriodicSync;
import android.content.res.Resources;
import android.os.Bundle;
import android.test.AndroidTestCase;
@@ -33,14 +32,18 @@
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.server.content.SyncStorageEngine.EndPoint;
-
import com.android.internal.os.AtomicFile;
import java.io.File;
import java.io.FileOutputStream;
-import java.util.List;
+/**
+ * Test for SyncStorageEngine.
+ *
+ * bit FrameworksServicesTests:com.android.server.content.SyncStorageEngineTest
+ *
+ * TODO Broken. Fix it. b/62485315
+ */
public class SyncStorageEngineTest extends AndroidTestCase {
protected Account account1;