sort xml and plan to guarantee the same execution order

- up to now, it was more like depending on file system scanning order,
  which can change any time.
- This may reveal new issues, but should be better in the long run.

Change-Id: Ib810c166c9be8207caf09df0b489c3013a279e23
diff --git a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/Test.java b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/Test.java
index a9dd5e0..93b838b 100644
--- a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/Test.java
+++ b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/Test.java
@@ -16,7 +16,7 @@
 
 package com.android.cts.xmlgenerator;
 
-public class Test {
+public class Test implements Comparable<Test> {
     private String mName;
     private int mTimeout;
 
@@ -32,4 +32,9 @@
     public int getTimeout() {
         return mTimeout;
     }
+
+    @Override
+    public int compareTo(Test another) {
+        return getName().compareTo(another.getName());
+    }
 }
diff --git a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestCase.java b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestCase.java
index a9ea6e1..ed09b8e 100644
--- a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestCase.java
+++ b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestCase.java
@@ -20,7 +20,7 @@
 import java.util.Collections;
 import java.util.List;
 
-class TestCase {
+class TestCase implements Comparable<TestCase> {
 
     private final String mName;
 
@@ -41,4 +41,9 @@
     public Collection<Test> getTests() {
         return Collections.unmodifiableCollection(mTests);
     }
+
+    @Override
+    public int compareTo(TestCase another) {
+        return getName().compareTo(another.getName());
+    }
 }
diff --git a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestSuite.java b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestSuite.java
index 3c29603..466f8d7 100644
--- a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestSuite.java
+++ b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestSuite.java
@@ -22,7 +22,7 @@
 import java.util.List;
 import java.util.Map;
 
-class TestSuite {
+class TestSuite implements Comparable<TestSuite> {
 
     private final String mName;
 
@@ -61,4 +61,9 @@
     public Collection<TestCase> getCases() {
         return Collections.unmodifiableCollection(mCases);
     }
+
+    @Override
+    public int compareTo(TestSuite another) {
+        return getName().compareTo(another.getName());
+    }
 }
diff --git a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java
index 8a49cf3..7b1996d 100644
--- a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java
+++ b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java
@@ -24,7 +24,10 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PrintWriter;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
 
 /**
  * Generator of TestPackage XML files for native tests.
@@ -141,7 +144,8 @@
 
     private void writeTestSuites(PrintWriter writer, Collection<TestSuite> suites,
             StringBuilder nameCollector) {
-        for (TestSuite suite : suites) {
+        Collection<TestSuite> sorted = sortCollection(suites);
+        for (TestSuite suite : sorted) {
             writer.append("<TestSuite name=\"").append(suite.getName()).println("\">");
 
             String namePart = suite.getName();
@@ -161,7 +165,8 @@
 
     private void writeTestCases(PrintWriter writer, Collection<TestCase> cases,
             StringBuilder nameCollector) {
-        for (TestCase testCase : cases) {
+        Collection<TestCase> sorted = sortCollection(cases);
+        for (TestCase testCase : sorted) {
             String name = testCase.getName();
             writer.append("<TestCase name=\"").append(name).println("\">");
             nameCollector.append('.').append(name);
@@ -176,7 +181,8 @@
 
     private void writeTests(PrintWriter writer, Collection<Test> tests,
             StringBuilder nameCollector) {
-        for (Test test : tests) {
+        Collection<Test> sorted = sortCollection(tests);
+        for (Test test : sorted) {
             nameCollector.append('#').append(test.getName());
             writer.append("<Test name=\"").append(test.getName()).append("\"");
             if (isKnownFailure(mExpectations, nameCollector.toString())) {
@@ -192,6 +198,12 @@
         }
     }
 
+    private <E extends Comparable<E>> Collection<E> sortCollection(Collection<E> col) {
+        List<E> list = new ArrayList<E>(col);
+        Collections.sort(list);
+        return list;
+    }
+
     public static boolean isKnownFailure(ExpectationStore expectationStore, String testName) {
         return expectationStore != null && expectationStore.get(testName) != Expectation.SUCCESS;
     }
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index 6dc1c70e..2eda363 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -98,6 +98,8 @@
     for description in descriptions:
       doc = tools.XmlFile(description)
       packages.append(doc.GetAttr('TestPackage', 'appPackageName'))
+    # sort the list to give the same sequence based on name
+    packages.sort()
 
     ptsPattern = r'com\.android\.pts\..*'
     plan = tools.TestPlan(packages)