Merge "Update PerformInitializeTask error message"
diff --git a/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java b/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java
index 88e0b7fc..1ef740d 100644
--- a/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java
+++ b/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java
@@ -130,9 +130,13 @@
 
                 IBackupTransport transport = transportClient.connectOrThrow(callerLogString);
                 int status = transport.initializeDevice();
-
-                if (status == BackupTransport.TRANSPORT_OK) {
+                if (status != BackupTransport.TRANSPORT_OK) {
+                    Slog.e(TAG, "Transport error in initializeDevice()");
+                } else {
                     status = transport.finishBackup();
+                    if (status != BackupTransport.TRANSPORT_OK) {
+                        Slog.e(TAG, "Transport error in finishBackup()");
+                    }
                 }
 
                 // Okay, the wipe really happened.  Clean up our local bookkeeping.
@@ -148,7 +152,6 @@
                 } else {
                     // If this didn't work, requeue this one and try again
                     // after a suitable interval
-                    Slog.e(TAG, "Transport error in initializeDevice()");
                     EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, "(initialize)");
                     mBackupManagerService.recordInitPending(true, transportName, transportDirName);
                     notifyResult(transportName, status);
diff --git a/services/robotests/src/com/android/server/backup/internal/PerformInitializeTaskTest.java b/services/robotests/src/com/android/server/backup/internal/PerformInitializeTaskTest.java
index 5810c30..646367e 100644
--- a/services/robotests/src/com/android/server/backup/internal/PerformInitializeTaskTest.java
+++ b/services/robotests/src/com/android/server/backup/internal/PerformInitializeTaskTest.java
@@ -19,6 +19,7 @@
 import static android.app.backup.BackupTransport.TRANSPORT_ERROR;
 import static android.app.backup.BackupTransport.TRANSPORT_OK;
 
+import static com.android.server.backup.testing.TestUtils.assertLogcatContains;
 import static com.android.server.backup.testing.TransportData.backupTransport;
 import static com.android.server.backup.testing.TransportData.d2dTransport;
 import static com.android.server.backup.testing.TransportData.localTransport;
@@ -40,6 +41,7 @@
 import android.app.backup.IBackupObserver;
 import android.os.DeadObjectException;
 import android.platform.test.annotations.Presubmit;
+import android.util.Log;
 
 import com.android.internal.backup.IBackupTransport;
 import com.android.server.backup.BackupManagerService;
@@ -50,6 +52,8 @@
 import com.android.server.backup.transport.TransportClient;
 import com.android.server.testing.FrameworkRobolectricTestRunner;
 import com.android.server.testing.SystemLoaderPackages;
+import com.android.server.testing.shadows.ShadowSlog;
+
 
 import org.junit.Before;
 import org.junit.Test;
@@ -66,7 +70,7 @@
 import java.util.stream.Stream;
 
 @RunWith(FrameworkRobolectricTestRunner.class)
-@Config(manifest = Config.NONE, sdk = 26)
+@Config(manifest = Config.NONE, sdk = 26, shadows = ShadowSlog.class)
 @SystemLoaderPackages({"com.android.server.backup"})
 @Presubmit
 public class PerformInitializeTaskTest {
@@ -202,6 +206,32 @@
     }
 
     @Test
+    public void testRun_whenFinishBackupFails_logs() throws Exception {
+        setUpTransport(mTransport);
+        configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_ERROR);
+        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
+
+        performInitializeTask.run();
+
+        assertLogcatContains(
+                BackupManagerService.TAG,
+                log -> log.msg.contains("finishBackup()") && log.type >= Log.ERROR);
+    }
+
+    @Test
+    public void testRun_whenInitializeDeviceFails_logs() throws Exception {
+        setUpTransport(mTransport);
+        configureTransport(mTransportBinder, TRANSPORT_ERROR, 0);
+        PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
+
+        performInitializeTask.run();
+
+        assertLogcatContains(
+                BackupManagerService.TAG,
+                log -> log.msg.contains("initializeDevice()") && log.type >= Log.ERROR);
+    }
+
+    @Test
     public void testRun_whenFinishBackupFails_schedulesAlarm() throws Exception {
         setUpTransport(mTransport);
         configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_ERROR);
diff --git a/services/robotests/src/com/android/server/backup/testing/TestUtils.java b/services/robotests/src/com/android/server/backup/testing/TestUtils.java
index 3db4162..3c84424 100644
--- a/services/robotests/src/com/android/server/backup/testing/TestUtils.java
+++ b/services/robotests/src/com/android/server/backup/testing/TestUtils.java
@@ -21,6 +21,7 @@
 import org.robolectric.shadows.ShadowLog;
 
 import java.util.concurrent.Callable;
+import java.util.function.Predicate;
 
 public class TestUtils {
     /** Reset logcat with {@link ShadowLog#reset()} before the test case */
@@ -35,6 +36,10 @@
                 .isTrue();
     }
 
+    public static void assertLogcatContains(String tag, Predicate<ShadowLog.LogItem> predicate) {
+        assertThat(ShadowLog.getLogsForTag(tag).stream().anyMatch(predicate)).isTrue();
+    }
+
     /**
      * Calls {@link Runnable#run()} and returns if no exception is thrown. Otherwise, if the
      * exception is unchecked, rethrow it; if it's checked wrap in a {@link RuntimeException} and
diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowSlog.java b/services/robotests/src/com/android/server/testing/shadows/ShadowSlog.java
index bf4b61e..737b0c8 100644
--- a/services/robotests/src/com/android/server/testing/shadows/ShadowSlog.java
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowSlog.java
@@ -26,6 +26,86 @@
 @Implements(Slog.class)
 public class ShadowSlog {
     @Implementation
+    public static int v(String tag, String msg) {
+        return Log.v(tag, msg);
+    }
+
+    @Implementation
+    public static int v(String tag, String msg, Throwable tr) {
+        return Log.v(tag, msg, tr);
+    }
+
+    @Implementation
+    public static int d(String tag, String msg) {
+        return Log.d(tag, msg);
+    }
+
+    @Implementation
+    public static int d(String tag, String msg, Throwable tr) {
+        return Log.d(tag, msg, tr);
+    }
+
+    @Implementation
+    public static int i(String tag, String msg) {
+        return Log.i(tag, msg);
+    }
+
+    @Implementation
+    public static int i(String tag, String msg, Throwable tr) {
+        return Log.i(tag, msg, tr);
+    }
+
+    @Implementation
+    public static int w(String tag, String msg) {
+        return Log.w(tag, msg);
+    }
+
+    @Implementation
+    public static int w(String tag, String msg, Throwable tr) {
+        return Log.w(tag, msg, tr);
+    }
+
+    @Implementation
+    public static int w(String tag, Throwable tr) {
+        return Log.w(tag, tr);
+    }
+
+    @Implementation
+    public static int e(String tag, String msg) {
+        return Log.e(tag, msg);
+    }
+
+    @Implementation
+    public static int e(String tag, String msg, Throwable tr) {
+        return Log.e(tag, msg, tr);
+    }
+
+    @Implementation
+    public static int wtf(String tag, String msg) {
+        return Log.wtf(tag, msg);
+    }
+
+    @Implementation
+    public static void wtfQuiet(String tag, String msg) {
+        Log.wtf(tag, msg);
+    }
+
+    @Implementation
+    public static int wtfStack(String tag, String msg) {
+        return Log.wtf(tag, msg);
+    }
+
+    @Implementation
+    public static int wtf(String tag, Throwable tr) {
+        return Log.wtf(tag, tr);
+    }
+
+    @Implementation
+    public static int wtf(String tag, String msg, Throwable tr) {
+        return Log.wtf(tag, msg, tr);
+    }
+
+    @Implementation
     public static int println(int priority, String tag, String msg) {
         return Log.println(priority, tag, msg);
     }