Merge "Remove CtsIncidentHostTestCases from the CTS-GSI execlude list"
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/suite/CompatibilityProtoResultReporter.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/suite/CompatibilityProtoResultReporter.java
index fe57e3a..6607c85 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/suite/CompatibilityProtoResultReporter.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/suite/CompatibilityProtoResultReporter.java
@@ -16,13 +16,18 @@
 package com.android.compatibility.common.tradefed.result.suite;
 
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
+import com.android.tradefed.config.Option;
 import com.android.tradefed.invoker.IInvocationContext;
+import com.android.tradefed.invoker.InvocationContext;
 import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.result.proto.FileProtoResultReporter;
+import com.android.tradefed.result.proto.ProtoResultParser;
 import com.android.tradefed.result.proto.TestRecordProto.TestRecord;
+import com.android.tradefed.util.FileUtil;
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.IOException;
 
 /** Proto reporter that will drop a {@link TestRecord} protobuf in the result directory. */
 public class CompatibilityProtoResultReporter extends FileProtoResultReporter {
@@ -30,23 +35,57 @@
     public static final String PROTO_FILE_NAME = "test-record.pb";
     public static final String PROTO_DIR = "proto";
 
+    @Option(
+            name = "skip-proto-compacting",
+            description = "Option to disable compacting the protos at the end")
+    private boolean mSkipProtoCompacting = false;
+
     private CompatibilityBuildHelper mBuildHelper;
 
     /** The directory containing the proto results */
     private File mResultDir = null;
 
+    private File mBaseProtoFile = null;
+
     @Override
     public void processStartInvocation(
             TestRecord invocationStartRecord, IInvocationContext invocationContext) {
         if (mBuildHelper == null) {
             mBuildHelper = new CompatibilityBuildHelper(invocationContext.getBuildInfos().get(0));
             mResultDir = getProtoResultDirectory();
-            File protoFile = new File(mResultDir, PROTO_FILE_NAME);
-            setFileOutput(protoFile);
+            mBaseProtoFile = new File(mResultDir, PROTO_FILE_NAME);
+            setFileOutput(mBaseProtoFile);
         }
         super.processStartInvocation(invocationStartRecord, invocationContext);
     }
 
+    @Override
+    public void processFinalProto(TestRecord invocationEndedProto) {
+        super.processFinalProto(invocationEndedProto);
+
+        if (!isPeriodicWriting()) {
+            return;
+        }
+        if (mSkipProtoCompacting) {
+            return;
+        }
+        // Compact all the protos
+        try {
+            compactAllProtos();
+        } catch (RuntimeException e) {
+            CLog.e("Failed to compact the protos");
+            CLog.e(e);
+            FileUtil.deleteFile(mBaseProtoFile);
+            return;
+        }
+        // Delete all the protos we compacted
+        int index = 0;
+        while (new File(mBaseProtoFile.getAbsolutePath() + index).exists()) {
+            FileUtil.deleteFile(new File(mBaseProtoFile.getAbsolutePath() + index));
+            index++;
+        }
+    }
+
     private File getProtoResultDirectory() {
         File protoDir = null;
         try {
@@ -66,4 +105,19 @@
         CLog.d("Proto Results Directory: %s", protoDir.getAbsolutePath());
         return protoDir;
     }
+
+    private void compactAllProtos() {
+        FileProtoResultReporter fprr = new FileProtoResultReporter();
+        fprr.setFileOutput(mBaseProtoFile);
+        ProtoResultParser parser = new ProtoResultParser(fprr, new InvocationContext(), true);
+        int index = 0;
+        while (new File(mBaseProtoFile.getAbsolutePath() + index).exists()) {
+            try {
+                parser.processFileProto(new File(mBaseProtoFile.getAbsolutePath() + index));
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            index++;
+        }
+    }
 }
\ No newline at end of file
diff --git a/tools/cts-tradefed/res/config/cts-on-gsi-sim.xml b/tools/cts-tradefed/res/config/cts-on-gsi-sim.xml
new file mode 100644
index 0000000..5150942
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-on-gsi-sim.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Runs cts-on-gsi on device with SIM card">
+
+    <include name="cts-on-gsi" />
+
+    <include name="cts-sim-include" />
+
+    <option name="plan" value="cts-on-gsi-sim" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-sim-include.xml b/tools/cts-tradefed/res/config/cts-sim-include.xml
new file mode 100644
index 0000000..161f5af
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-sim-include.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Include CTS test that require SIM card">
+
+    <!-- CTS tests that need SIM card-->
+    <option name="compatibility:include-filter" value="CtsCarrierApiTestCases" />
+    <option name="compatibility:include-filter" value="CtsJobSchedulerTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetTestCasesLegacyApi22" />
+    <option name="compatibility:include-filter" value="CtsOmapiTestCases" />
+    <option name="compatibility:include-filter" value="CtsPermissionTestCases" />
+    <option name="compatibility:include-filter" value="CtsPermission2TestCases" />
+    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases1" />
+    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases2" />
+    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases3" />
+    <option name="compatibility:include-filter" value="signed-CtsSecureElementAccessControlTestCases1" />
+    <option name="compatibility:include-filter" value="signed-CtsSecureElementAccessControlTestCases2" />
+    <option name="compatibility:include-filter" value="signed-CtsSecureElementAccessControlTestCases3" />
+    <option name="compatibility:include-filter" value="CtsSimRestrictedApisTestCases" />
+    <option name="compatibility:include-filter" value="CtsStatsdHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsTelecomTestCases" />
+    <option name="compatibility:include-filter" value="CtsTelecomTestCases2" />
+    <option name="compatibility:include-filter" value="CtsTelecomTestCases3" />
+    <option name="compatibility:include-filter" value="CtsTelephonyTestCases" />
+    <option name="compatibility:include-filter" value="CtsTelephony2TestCases" />
+    <option name="compatibility:include-filter" value="CtsTelephony3TestCases" />
+    <option name="compatibility:include-filter" value="CtsTelephonySdk28TestCases" />
+    <option name="compatibility:include-filter" value="CtsUsageStatsTestCases" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-sim.xml b/tools/cts-tradefed/res/config/cts-sim.xml
index bd536ba..234c33f 100644
--- a/tools/cts-tradefed/res/config/cts-sim.xml
+++ b/tools/cts-tradefed/res/config/cts-sim.xml
@@ -17,31 +17,8 @@
 
     <include name="cts" />
 
-    <option name="plan" value="cts-sim" />
+    <include name="cts-sim-include" />
 
-    <!-- CTS tests that need SIM card-->
-    <option name="compatibility:include-filter" value="CtsCarrierApiTestCases" />
-    <option name="compatibility:include-filter" value="CtsJobSchedulerTestCases" />
-    <option name="compatibility:include-filter" value="CtsNetTestCases" />
-    <option name="compatibility:include-filter" value="CtsNetTestCasesLegacyApi22" />
-    <option name="compatibility:include-filter" value="CtsOmapiTestCases" />
-    <option name="compatibility:include-filter" value="CtsPermissionTestCases" />
-    <option name="compatibility:include-filter" value="CtsPermission2TestCases" />
-    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases1" />
-    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases2" />
-    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases3" />
-    <option name="compatibility:include-filter" value="signed-CtsSecureElementAccessControlTestCases1" />
-    <option name="compatibility:include-filter" value="signed-CtsSecureElementAccessControlTestCases2" />
-    <option name="compatibility:include-filter" value="signed-CtsSecureElementAccessControlTestCases3" />
-    <option name="compatibility:include-filter" value="CtsSimRestrictedApisTestCases" />
-    <option name="compatibility:include-filter" value="CtsStatsdHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsTelecomTestCases" />
-    <option name="compatibility:include-filter" value="CtsTelecomTestCases2" />
-    <option name="compatibility:include-filter" value="CtsTelecomTestCases3" />
-    <option name="compatibility:include-filter" value="CtsTelephonyTestCases" />
-    <option name="compatibility:include-filter" value="CtsTelephony2TestCases" />
-    <option name="compatibility:include-filter" value="CtsTelephony3TestCases" />
-    <option name="compatibility:include-filter" value="CtsTelephonySdk28TestCases" />
-    <option name="compatibility:include-filter" value="CtsUsageStatsTestCases" />
+    <option name="plan" value="cts-sim" />
 
 </configuration>