Merge "Bypass car tests for non-auto devices"
diff --git a/src/com/android/tradefed/testtype/suite/retry/RetryRescheduler.java b/src/com/android/tradefed/testtype/suite/retry/RetryRescheduler.java
index 24d6c07..bec86e0 100644
--- a/src/com/android/tradefed/testtype/suite/retry/RetryRescheduler.java
+++ b/src/com/android/tradefed/testtype/suite/retry/RetryRescheduler.java
@@ -26,6 +26,7 @@
 import com.android.tradefed.config.Option;
 import com.android.tradefed.config.Option.Importance;
 import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.IDeviceSelection;
 import com.android.tradefed.invoker.IRescheduler;
 import com.android.tradefed.invoker.TestInformation;
 import com.android.tradefed.log.FileLogger;
@@ -58,9 +59,6 @@
 /**
  * A special runner that allows to reschedule a previous run tests that failed or where not
  * executed.
- *
- * <p>TODO: Ensure a configuration should not have several of that runner. Consider having this
- * configuration built-in TF.
  */
 public final class RetryRescheduler implements IRemoteTest, IConfigurationReceiver {
 
@@ -153,9 +151,10 @@
             originalConfig
                     .getCommandOptions()
                     .setShardIndex(mConfiguration.getCommandOptions().getShardIndex());
-            // TODO: Use serial from parent config
-            List<String> serials = mConfiguration.getDeviceRequirements().getSerials();
-            originalConfig.getDeviceRequirements().setSerial(serials.toArray(new String[0]));
+            IDeviceSelection requirements = mConfiguration.getDeviceRequirements();
+            // It should be safe to use the current requirements against the old config because
+            // There will be more checks like fingerprint if it was supposed to run.
+            originalConfig.setDeviceRequirements(requirements);
 
             // Transfer log level from retry to subconfig
             ILeveledLogOutput originalLogger = originalConfig.getLogOutput();
diff --git a/src/com/android/tradefed/util/SubprocessTestResultsParser.java b/src/com/android/tradefed/util/SubprocessTestResultsParser.java
index bc9d88f..56f6452 100644
--- a/src/com/android/tradefed/util/SubprocessTestResultsParser.java
+++ b/src/com/android/tradefed/util/SubprocessTestResultsParser.java
@@ -18,8 +18,8 @@
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.invoker.IInvocationContext;
 import com.android.tradefed.invoker.logger.InvocationMetricLogger;
-import com.android.tradefed.invoker.logger.TfObjectTracker;
 import com.android.tradefed.invoker.logger.InvocationMetricLogger.InvocationMetricKey;
+import com.android.tradefed.invoker.logger.TfObjectTracker;
 import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.result.FileInputStreamSource;
 import com.android.tradefed.result.ILogSaverListener;
@@ -86,6 +86,8 @@
     private EventReceiverThread mEventReceiver = null;
     private IInvocationContext mContext = null;
     private Long mStartTime = null;
+    // Ignore the testLog events, rely only on logAssociation
+    private boolean mIgnoreTestLog = true;
     // Keep track of which files we received TEST_LOG event from.
     private Set<String> mTestLogged = new HashSet<>();
 
@@ -228,6 +230,11 @@
         return -1;
     }
 
+    /** Whether or not to ignore testLog events and only rely on logAssociation. */
+    public void setIgnoreTestLog(boolean ignoreTestLog) {
+        mIgnoreTestLog = ignoreTestLog;
+    }
+
     @Override
     public void close() throws IOException {
         if (mEventReceiver != null) {
@@ -497,6 +504,9 @@
     private class TestLogEventHandler implements EventHandler {
         @Override
         public void handleEvent(String eventJson) throws JSONException {
+            if (mIgnoreTestLog) {
+                return;
+            }
             TestLogEventInfo logInfo = new TestLogEventInfo(new JSONObject(eventJson));
             String name = String.format("subprocess-%s", logInfo.mDataName);
             try (InputStreamSource data = new FileInputStreamSource(logInfo.mDataFile, true)) {
diff --git a/tests/src/com/android/tradefed/result/SubprocessResultsReporterTest.java b/tests/src/com/android/tradefed/result/SubprocessResultsReporterTest.java
index 1c2ea0d..61f2726 100644
--- a/tests/src/com/android/tradefed/result/SubprocessResultsReporterTest.java
+++ b/tests/src/com/android/tradefed/result/SubprocessResultsReporterTest.java
@@ -151,6 +151,7 @@
                 };
         try (SubprocessTestResultsParser receiver =
                 new SubprocessTestResultsParser(mMockListener, true, new InvocationContext())) {
+            receiver.setIgnoreTestLog(false);
             OptionSetter setter = new OptionSetter(mReporter);
             setter.setOptionValue(
                     "subprocess-report-port", Integer.toString(receiver.getSocketServerPort()));
diff --git a/tests/src/com/android/tradefed/testtype/suite/retry/RetryReschedulerTest.java b/tests/src/com/android/tradefed/testtype/suite/retry/RetryReschedulerTest.java
index 245b2ed..cfe9b3e 100644
--- a/tests/src/com/android/tradefed/testtype/suite/retry/RetryReschedulerTest.java
+++ b/tests/src/com/android/tradefed/testtype/suite/retry/RetryReschedulerTest.java
@@ -79,6 +79,8 @@
                 .andStubReturn(mMockCommandOptions);
         EasyMock.expect(mRescheduledConfiguration.getDeviceRequirements())
                 .andStubReturn(mMockRequirements);
+        mRescheduledConfiguration.setDeviceRequirements(EasyMock.anyObject());
+        EasyMock.expectLastCall();
         EasyMock.expect(mRescheduledConfiguration.getLogOutput()).andStubReturn(new FileLogger());
         mMockLoader = EasyMock.createMock(ITestSuiteResultLoader.class);
         mMockRescheduler = EasyMock.createMock(IRescheduler.class);
@@ -111,7 +113,6 @@
         EasyMock.expect(mMockFactory.createConfigurationFromArgs(EasyMock.anyObject()))
                 .andReturn(mRescheduledConfiguration);
         EasyMock.expect(mMockLoader.loadPreviousResults()).andReturn(mFakeRecord);
-        mMockRequirements.setSerial();
 
         mRescheduledConfiguration.setTests(EasyMock.anyObject());
         EasyMock.expectLastCall().times(1);
@@ -156,7 +157,6 @@
         EasyMock.reset(mMockCommandOptions);
         mMockCommandOptions.setShardCount(2);
         mMockCommandOptions.setShardIndex(null);
-        mMockRequirements.setSerial("serial1", "serial2");
 
         mRescheduledConfiguration.setTests(EasyMock.anyObject());
         EasyMock.expectLastCall().times(1);
diff --git a/tests/src/com/android/tradefed/util/SubprocessTestResultsParserTest.java b/tests/src/com/android/tradefed/util/SubprocessTestResultsParserTest.java
index fc08f9a..6353ab8 100644
--- a/tests/src/com/android/tradefed/util/SubprocessTestResultsParserTest.java
+++ b/tests/src/com/android/tradefed/util/SubprocessTestResultsParserTest.java
@@ -553,6 +553,7 @@
             serializedLogFile = SerializationUtil.serialize(logFile);
             resultParser =
                     new SubprocessTestResultsParser(mockRunListener, new InvocationContext());
+            resultParser.setIgnoreTestLog(false);
             String logAssocation =
                     String.format(
                             "TEST_LOG {\"dataType\":\"TEXT\",\"dataName\":\"dataname\","