Instrument execution with start time and end time
- Add start time and end time of each execution
- Show execution time of leaf in each test
Bug: 140677693
Test: manual test
Change-Id: Ib2bb30add4f3a22f19562f9b02f6ec7d689af901
(cherry picked from commit 40650d38d5d75cc4d06e5e37b8d6611b5bc8791e)
Merged-In: Ib2bb30add4f3a22f19562f9b02f6ec7d689af901
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/AbstractTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/AbstractTestListActivity.java
index 3132219..9378596 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/AbstractTestListActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/AbstractTestListActivity.java
@@ -31,6 +31,8 @@
private static final int LAUNCH_TEST_REQUEST_CODE = 9001;
protected TestListAdapter mAdapter;
+ // Start time of test item.
+ protected long mStartTime;
protected void setTestListAdapter(TestListAdapter adapter) {
mAdapter = adapter;
@@ -74,6 +76,8 @@
protected void handleLaunchTestResult(int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
TestResult testResult = TestResult.fromActivityResult(resultCode, data);
+ testResult.getHistoryCollection().add(
+ testResult.getName(), mStartTime, System.currentTimeMillis());
mAdapter.setTestResult(testResult);
}
}
@@ -82,6 +86,7 @@
@Override
protected final void onListItemClick(ListView listView, View view, int position, long id) {
super.onListItemClick(listView, view, position, id);
+ mStartTime = System.currentTimeMillis();
handleItemClick(listView, view, position, id);
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/DialogTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/DialogTestListActivity.java
index aa6eaba..bed5a77 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/DialogTestListActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/DialogTestListActivity.java
@@ -224,7 +224,7 @@
// Bundle result in an intent to feed into handleLaunchTestResult
Intent resultIntent = new Intent();
TestResult.addResultData(resultIntent, result, test.testName, /* testDetails */ null,
- /* reportLog */ null);
+ /* reportLog */ null, null);
handleLaunchTestResult(RESULT_OK, resultIntent);
getListView().smoothScrollToPosition(mCurrentTestPosition + 1);
}
@@ -233,7 +233,7 @@
// Bundle result in an intent to feed into handleLaunchTestResult
Intent resultIntent = new Intent();
TestResult.addResultData(resultIntent, result, testName, /* testDetails */ null,
- /* reportLog */ null);
+ /* reportLog */ null, null);
handleLaunchTestResult(RESULT_OK, resultIntent);
getListView().smoothScrollToPosition(mCurrentTestPosition + 1);
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java b/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
index 4a8004a..7776d27 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
@@ -36,6 +36,10 @@
import android.widget.ImageButton;
import android.widget.Toast;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
/**
* {@link Activity}s to handle clicks to the pass and fail buttons of the pass fail buttons layout.
*
@@ -99,14 +103,21 @@
/** @return A {@link ReportLog} that is used to record test metric data. */
ReportLog getReportLog();
+
+ /**
+ * @return A {@link TestResultHistoryCollection} that is used to record test execution time.
+ */
+ TestResultHistoryCollection getHistoryCollection();
}
public static class Activity extends android.app.Activity implements PassFailActivity {
private WakeLock mWakeLock;
private final ReportLog reportLog;
+ private final TestResultHistoryCollection mHistoryCollection;
public Activity() {
this.reportLog = new CtsVerifierReportLog();
+ this.mHistoryCollection = new TestResultHistoryCollection();
}
@Override
@@ -160,19 +171,25 @@
@Override
public void setTestResultAndFinish(boolean passed) {
PassFailButtons.setTestResultAndFinishHelper(
- this, getTestId(), getTestDetails(), passed, getReportLog());
+ this, getTestId(), getTestDetails(), passed, getReportLog(),
+ getHistoryCollection());
}
@Override
public ReportLog getReportLog() { return reportLog; }
+
+ @Override
+ public TestResultHistoryCollection getHistoryCollection() { return mHistoryCollection; }
}
public static class ListActivity extends android.app.ListActivity implements PassFailActivity {
private final ReportLog reportLog;
+ private final TestResultHistoryCollection mHistoryCollection;
public ListActivity() {
this.reportLog = new CtsVerifierReportLog();
+ this.mHistoryCollection = new TestResultHistoryCollection();
}
@Override
@@ -208,11 +225,15 @@
@Override
public void setTestResultAndFinish(boolean passed) {
PassFailButtons.setTestResultAndFinishHelper(
- this, getTestId(), getTestDetails(), passed, getReportLog());
+ this, getTestId(), getTestDetails(), passed, getReportLog(),
+ getHistoryCollection());
}
@Override
public ReportLog getReportLog() { return reportLog; }
+
+ @Override
+ public TestResultHistoryCollection getHistoryCollection() { return mHistoryCollection; }
}
public static class TestListActivity extends AbstractTestListActivity
@@ -257,12 +278,27 @@
@Override
public void setTestResultAndFinish(boolean passed) {
PassFailButtons.setTestResultAndFinishHelper(
- this, getTestId(), getTestDetails(), passed, getReportLog());
+ this, getTestId(), getTestDetails(), passed, getReportLog(),
+ getHistoryCollection());
}
@Override
public ReportLog getReportLog() { return reportLog; }
+ /**
+ * Get existing test history to aggregate.
+ */
+ @Override
+ public TestResultHistoryCollection getHistoryCollection() {
+ List<TestResultHistoryCollection> histories =
+ IntStream.range(0, mAdapter.getCount())
+ .mapToObj(mAdapter::getHistoryCollection)
+ .collect(Collectors.toList());
+ TestResultHistoryCollection historyCollection = new TestResultHistoryCollection();
+ historyCollection.merge(getTestId(), histories);
+ return historyCollection;
+ }
+
public void updatePassButton() {
getPassButton().setEnabled(mAdapter.allTestsPassed());
}
@@ -274,7 +310,7 @@
@Override
public void onClick(View target) {
setTestResultAndFinish(activity, activity.getTestId(), activity.getTestDetails(),
- activity.getReportLog(), target);
+ activity.getReportLog(), activity.getHistoryCollection(), target);
}
};
@@ -399,7 +435,8 @@
/** Set the test result corresponding to the button clicked and finish the activity. */
protected static void setTestResultAndFinish(android.app.Activity activity, String testId,
- String testDetails, ReportLog reportLog, View target) {
+ String testDetails, ReportLog reportLog, TestResultHistoryCollection historyCollection,
+ View target) {
boolean passed;
if (target.getId() == R.id.pass_button) {
passed = true;
@@ -409,16 +446,17 @@
throw new IllegalArgumentException("Unknown id: " + target.getId());
}
- setTestResultAndFinishHelper(activity, testId, testDetails, passed, reportLog);
+ setTestResultAndFinishHelper(activity, testId, testDetails, passed, reportLog, historyCollection);
}
/** Set the test result and finish the activity. */
protected static void setTestResultAndFinishHelper(android.app.Activity activity, String testId,
- String testDetails, boolean passed, ReportLog reportLog) {
+ String testDetails, boolean passed, ReportLog reportLog,
+ TestResultHistoryCollection historyCollection) {
if (passed) {
- TestResult.setPassedResult(activity, testId, testDetails, reportLog);
+ TestResult.setPassedResult(activity, testId, testDetails, reportLog, historyCollection);
} else {
- TestResult.setFailedResult(activity, testId, testDetails, reportLog);
+ TestResult.setFailedResult(activity, testId, testDetails, reportLog, historyCollection);
}
activity.finish();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java
index d9ea84f..17efb22 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java
@@ -17,6 +17,7 @@
package com.android.cts.verifier;
import com.android.compatibility.common.util.ReportLog;
+import com.android.compatibility.common.util.TestResultHistory;
import android.content.ContentResolver;
import android.content.Context;
@@ -74,6 +75,9 @@
/** Map from test name to {@link ReportLog}. */
private final Map<String, ReportLog> mReportLogs = new HashMap<String, ReportLog>();
+ /** Map from test name to {@link TestResultHistory}. */
+ private final Map<String, TestResultHistoryCollection> mHistories = new HashMap<>();
+
private final LayoutInflater mLayoutInflater;
/** {@link ListView} row that is either a test category header or a test. */
@@ -192,8 +196,14 @@
}
public void setTestResult(TestResult testResult) {
- new SetTestResultTask(testResult.getName(), testResult.getResult(),
- testResult.getDetails(), testResult.getReportLog()).execute();
+ String name = testResult.getName();
+
+ // Append existing history
+ TestResultHistoryCollection histories = testResult.getHistoryCollection();
+ histories.merge(null, mHistories.get(name));
+
+ new SetTestResultTask(name, testResult.getResult(),
+ testResult.getDetails(), testResult.getReportLog(), histories).execute();
}
class RefreshTestResultsTask extends AsyncTask<Void, Void, RefreshResult> {
@@ -214,6 +224,8 @@
mTestDetails.putAll(result.mDetails);
mReportLogs.clear();
mReportLogs.putAll(result.mReportLogs);
+ mHistories.clear();
+ mHistories.putAll(result.mHistories);
notifyDataSetChanged();
}
}
@@ -223,16 +235,19 @@
Map<String, Integer> mResults;
Map<String, String> mDetails;
Map<String, ReportLog> mReportLogs;
+ Map<String, TestResultHistoryCollection> mHistories;
RefreshResult(
List<TestListItem> items,
Map<String, Integer> results,
Map<String, String> details,
- Map<String, ReportLog> reportLogs) {
+ Map<String, ReportLog> reportLogs,
+ Map<String, TestResultHistoryCollection> histories) {
mItems = items;
mResults = results;
mDetails = details;
mReportLogs = reportLogs;
+ mHistories = histories;
}
}
@@ -244,12 +259,14 @@
TestResultsProvider.COLUMN_TEST_RESULT,
TestResultsProvider.COLUMN_TEST_DETAILS,
TestResultsProvider.COLUMN_TEST_METRICS,
+ TestResultsProvider.COLUMN_TEST_RESULT_HISTORY,
};
RefreshResult getRefreshResults(List<TestListItem> items) {
Map<String, Integer> results = new HashMap<String, Integer>();
Map<String, String> details = new HashMap<String, String>();
Map<String, ReportLog> reportLogs = new HashMap<String, ReportLog>();
+ Map<String, TestResultHistoryCollection> histories = new HashMap<>();
ContentResolver resolver = mContext.getContentResolver();
Cursor cursor = null;
try {
@@ -261,9 +278,12 @@
int testResult = cursor.getInt(2);
String testDetails = cursor.getString(3);
ReportLog reportLog = (ReportLog) deserialize(cursor.getBlob(4));
+ TestResultHistoryCollection historyCollection =
+ (TestResultHistoryCollection) deserialize(cursor.getBlob(5));
results.put(testName, testResult);
details.put(testName, testDetails);
reportLogs.put(testName, reportLog);
+ histories.put(testName, historyCollection);
} while (cursor.moveToNext());
}
} finally {
@@ -271,7 +291,7 @@
cursor.close();
}
}
- return new RefreshResult(items, results, details, reportLogs);
+ return new RefreshResult(items, results, details, reportLogs, histories);
}
class ClearTestResultsTask extends AsyncTask<Void, Void, Void> {
@@ -287,27 +307,28 @@
class SetTestResultTask extends AsyncTask<Void, Void, Void> {
private final String mTestName;
-
private final int mResult;
-
private final String mDetails;
-
private final ReportLog mReportLog;
+ private final TestResultHistoryCollection mHistoryCollection;
SetTestResultTask(
String testName,
int result,
String details,
- ReportLog reportLog) {
+ ReportLog reportLog,
+ TestResultHistoryCollection historyCollection) {
mTestName = testName;
mResult = result;
mDetails = details;
mReportLog = reportLog;
+ mHistoryCollection = historyCollection;
}
@Override
protected Void doInBackground(Void... params) {
- TestResultsProvider.setTestResult(mContext, mTestName, mResult, mDetails, mReportLog);
+ TestResultsProvider.setTestResult(
+ mContext, mTestName, mResult, mDetails, mReportLog, mHistoryCollection);
return null;
}
}
@@ -382,6 +403,19 @@
: null;
}
+ /**
+ * Get test result histories.
+ *
+ * @param position The position of test.
+ * @return A {@link TestResultHistoryCollection} object containing test result histories of tests.
+ */
+ public TestResultHistoryCollection getHistoryCollection(int position) {
+ TestListItem item = getItem(position);
+ return mHistories.containsKey(item.testName)
+ ? mHistories.get(item.testName)
+ : null;
+ }
+
public boolean allTestsPassed() {
for (TestListItem item : mRows) {
if (item.isTest() && (!mTestResults.containsKey(item.testName)
@@ -451,7 +485,7 @@
}
}
- private static Object deserialize(byte[] bytes) {
+ public static Object deserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) {
return null;
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestResult.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestResult.java
index 07208dd..9f867d5 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestResult.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestResult.java
@@ -17,6 +17,7 @@
package com.android.cts.verifier;
import com.android.compatibility.common.util.ReportLog;
+import com.android.compatibility.common.util.TestResultHistory;
import android.app.Activity;
import android.content.Intent;
@@ -38,11 +39,13 @@
private static final String TEST_RESULT = "result";
private static final String TEST_DETAILS = "details";
private static final String TEST_METRICS = "metrics";
+ private static final String TEST_HISTORY_COLLECTION = "historyCollection";
private final String mName;
private final int mResult;
private final String mDetails;
private final ReportLog mReportLog;
+ private final TestResultHistoryCollection mHistoryCollection;
/** Sets the test activity's result to pass. */
public static void setPassedResult(Activity activity, String testId, String testDetails) {
@@ -53,7 +56,14 @@
public static void setPassedResult(Activity activity, String testId, String testDetails,
ReportLog reportLog) {
activity.setResult(Activity.RESULT_OK, createResult(activity, TEST_RESULT_PASSED, testId,
- testDetails, reportLog));
+ testDetails, reportLog, null /*history*/));
+ }
+
+ /** Sets the test activity's result to pass including a test report log result and history. */
+ public static void setPassedResult(Activity activity, String testId, String testDetails,
+ ReportLog reportLog, TestResultHistoryCollection historyCollection) {
+ activity.setResult(Activity.RESULT_OK, createResult(activity, TEST_RESULT_PASSED, testId,
+ testDetails, reportLog, historyCollection));
}
/** Sets the test activity's result to failed. */
@@ -65,22 +75,30 @@
public static void setFailedResult(Activity activity, String testId, String testDetails,
ReportLog reportLog) {
activity.setResult(Activity.RESULT_OK, createResult(activity, TEST_RESULT_FAILED, testId,
- testDetails, reportLog));
+ testDetails, reportLog, null /*history*/));
+ }
+
+ /** Sets the test activity's result to failed including a test report log result and history. */
+ public static void setFailedResult(Activity activity, String testId, String testDetails,
+ ReportLog reportLog, TestResultHistoryCollection historyCollection) {
+ activity.setResult(Activity.RESULT_OK, createResult(activity, TEST_RESULT_FAILED, testId,
+ testDetails, reportLog, historyCollection));
}
public static Intent createResult(Activity activity, int testResult, String testName,
- String testDetails, ReportLog reportLog) {
+ String testDetails, ReportLog reportLog, TestResultHistoryCollection historyCollection) {
Intent data = new Intent(activity, activity.getClass());
- addResultData(data, testResult, testName, testDetails, reportLog);
+ addResultData(data, testResult, testName, testDetails, reportLog, historyCollection);
return data;
}
public static void addResultData(Intent intent, int testResult, String testName,
- String testDetails, ReportLog reportLog) {
+ String testDetails, ReportLog reportLog, TestResultHistoryCollection historyCollection) {
intent.putExtra(TEST_NAME, testName);
intent.putExtra(TEST_RESULT, testResult);
intent.putExtra(TEST_DETAILS, testDetails);
intent.putExtra(TEST_METRICS, reportLog);
+ intent.putExtra(TEST_HISTORY_COLLECTION, historyCollection);
}
/**
@@ -92,15 +110,20 @@
int result = data.getIntExtra(TEST_RESULT, TEST_RESULT_NOT_EXECUTED);
String details = data.getStringExtra(TEST_DETAILS);
ReportLog reportLog = (ReportLog) data.getSerializableExtra(TEST_METRICS);
- return new TestResult(name, result, details, reportLog);
+ TestResultHistoryCollection historyCollection =
+ (TestResultHistoryCollection) data.getSerializableExtra(TEST_HISTORY_COLLECTION);
+ return new TestResult(name, result, details, reportLog, historyCollection);
}
private TestResult(
- String name, int result, String details, ReportLog reportLog) {
+ String name, int result, String details, ReportLog reportLog,
+ TestResultHistoryCollection historyCollection) {
this.mName = name;
this.mResult = result;
this.mDetails = details;
this.mReportLog = reportLog;
+ this.mHistoryCollection =
+ historyCollection == null ? new TestResultHistoryCollection() : historyCollection;
}
/** Return the name of the test like "com.android.cts.verifier.foo.FooTest" */
@@ -122,4 +145,9 @@
public ReportLog getReportLog() {
return mReportLog;
}
+
+ /** @return the {@link TestResultHistoryCollection} containing test history */
+ public TestResultHistoryCollection getHistoryCollection() {
+ return mHistoryCollection;
+ }
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultHistoryCollection.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultHistoryCollection.java
new file mode 100644
index 0000000..0e7160c
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultHistoryCollection.java
@@ -0,0 +1,81 @@
+package com.android.cts.verifier;
+
+import com.android.compatibility.common.util.TestResultHistory;
+
+import java.io.Serializable;
+import java.util.AbstractMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class TestResultHistoryCollection implements Serializable {
+
+ private final Set<TestResultHistory> mHistoryCollection = new HashSet<>();
+
+ /**
+ * Covert object to set.
+ *
+ * @return A set of test result history.
+ */
+ public Set<TestResultHistory> asSet() {
+ return mHistoryCollection;
+ }
+
+ /**
+ * Add a test result history with test name, start time and end time.
+ *
+ * @param test a string of test name.
+ * @param start start time of a test.
+ * @param end end time of a test.
+ */
+ public void add(String test, long start, long end) {
+ Set<Map.Entry> duration = new HashSet<>();
+ duration.add(new AbstractMap.SimpleEntry<>(start, end));
+ mHistoryCollection.add(new TestResultHistory(test, duration));
+ }
+
+ /**
+ * Add test result histories for tests containing test name and a set of execution time.
+ *
+ * @param test test name.
+ * @param durations set of start and end time.
+ */
+ public void addAll(String test, Set<Map.Entry> durations) {
+ TestResultHistory history = new TestResultHistory(test, durations);
+ boolean match = false;
+ for (TestResultHistory resultHistory: mHistoryCollection) {
+ if (resultHistory.getTestName().equals(test)) {
+ resultHistory.getDurations().addAll(durations);
+ match = true;
+ break;
+ }
+ }
+ if (match == false) {
+ mHistoryCollection.add(history);
+ }
+ }
+
+ /**
+ * Merge test with its sub-tests result histories.
+ *
+ * @param prefix optional test name prefix to apply.
+ * @param resultHistoryCollection a set of test result histories.
+ */
+ public void merge(String prefix, TestResultHistoryCollection resultHistoryCollection) {
+ if (resultHistoryCollection != null) {
+ resultHistoryCollection.asSet().forEach(t-> addAll(
+ prefix != null ? prefix + ":" + t.getTestName() : t.getTestName(), t.getDurations()));
+ }
+ }
+
+ /**
+ * Merge test with its sub-tests result histories.
+ *
+ * @param prefix optional test name prefix to apply.
+ * @param resultHistories a list of test result history collection.
+ */
+ public void merge(String prefix, List<TestResultHistoryCollection> resultHistories) {
+ resultHistories.forEach(resultHistoryCollection -> merge(prefix, resultHistoryCollection));
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsProvider.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsProvider.java
index 64c04eb..bdf32fa 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsProvider.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsProvider.java
@@ -78,6 +78,9 @@
/** ReportLog containing the test result metrics. */
static final String COLUMN_TEST_METRICS = "testmetrics";
+ /** TestResultHistory containing the test run histories. */
+ static final String COLUMN_TEST_RESULT_HISTORY = "testresulthistory";
+
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static final int RESULTS_ALL = 1;
private static final int RESULTS_ID = 2;
@@ -120,7 +123,8 @@
+ COLUMN_TEST_RESULT + " INTEGER,"
+ COLUMN_TEST_INFO_SEEN + " INTEGER DEFAULT 0,"
+ COLUMN_TEST_DETAILS + " TEXT,"
- + COLUMN_TEST_METRICS + " BLOB);");
+ + COLUMN_TEST_METRICS + " BLOB,"
+ + COLUMN_TEST_RESULT_HISTORY + " BLOB);");
}
@Override
@@ -226,12 +230,13 @@
}
static void setTestResult(Context context, String testName, int testResult,
- String testDetails, ReportLog reportLog) {
+ String testDetails, ReportLog reportLog, TestResultHistoryCollection historyCollection) {
ContentValues values = new ContentValues(2);
values.put(TestResultsProvider.COLUMN_TEST_RESULT, testResult);
values.put(TestResultsProvider.COLUMN_TEST_NAME, testName);
values.put(TestResultsProvider.COLUMN_TEST_DETAILS, testDetails);
values.put(TestResultsProvider.COLUMN_TEST_METRICS, serialize(reportLog));
+ values.put(TestResultsProvider.COLUMN_TEST_RESULT_HISTORY, serialize(historyCollection));
final Uri uri = getResultContentUri(context);
ContentResolver resolver = context.getContentResolver();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java
index 8893e0d..d9d63c2 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java
@@ -29,6 +29,7 @@
import com.android.compatibility.common.util.ITestResult;
import com.android.compatibility.common.util.MetricsXmlSerializer;
import com.android.compatibility.common.util.ReportLog;
+import com.android.compatibility.common.util.TestResultHistory;
import com.android.compatibility.common.util.TestStatus;
import com.android.cts.verifier.TestListAdapter.TestListItem;
@@ -38,9 +39,16 @@
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
import java.util.Locale;
+import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
/**
* Helper class for creating an {@code InvocationResult} for CTS result generation.
@@ -135,6 +143,27 @@
if (reportLog != null) {
currentTestResult.setReportLog(reportLog);
}
+
+ TestResultHistoryCollection historyCollection = mAdapter.getHistoryCollection(i);
+ if (historyCollection != null) {
+ // Get non-terminal prefixes.
+ Set<String> prefixes = new HashSet<>();
+ for (TestResultHistory history: historyCollection.asSet()) {
+ Arrays.stream(history.getTestName().split(":")).reduce(
+ (total, current) -> { prefixes.add(total);
+ return total + ":" + current;
+ });
+ }
+
+ // Filter out non-leaf test histories.
+ List<TestResultHistory> leafTestHistories = new ArrayList<TestResultHistory>();
+ for (TestResultHistory history: historyCollection.asSet()) {
+ if (!prefixes.contains(history.getTestName())) {
+ leafTestHistories.add(history);
+ }
+ }
+ currentTestResult.setTestResultHistories(leafTestHistories);
+ }
}
}
moduleResult.setDone(true);