blob: ffca3348aa7b2c58c593f3fd3c77a1e91fcb67cd [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.android_webview.test.ui.util;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.chromium.android_webview.test.OnlyRunIn.ProcessMode.SINGLE_PROCESS;
import android.support.test.filters.SmallTest;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.android_webview.common.crash.CrashInfo;
import org.chromium.android_webview.common.crash.CrashInfo.UploadState;
import org.chromium.android_webview.test.AwJUnit4ClassRunner;
import org.chromium.android_webview.test.OnlyRunIn;
import org.chromium.android_webview.ui.util.WebViewCrashInfoCollector;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
* Unit tests for WebViewCrashInfoCollector.
*/
@RunWith(AwJUnit4ClassRunner.class)
@OnlyRunIn(SINGLE_PROCESS)
public class WebViewCrashInfoCollectorTest {
private CrashInfo createCrashInfo(String localId, long captureTime, String uploadId,
long uploadTime, String packageName, String variations, UploadState state) {
CrashInfo crashInfo = new CrashInfo(localId);
crashInfo.captureTime = captureTime;
crashInfo.uploadId = uploadId;
crashInfo.uploadTime = uploadTime;
crashInfo.packageName = packageName;
if (variations != null) crashInfo.variations = Arrays.asList(variations.split(","));
crashInfo.uploadState = state;
return crashInfo;
}
private class CrashInfoEqualityMatcher extends BaseMatcher<CrashInfo> {
private final CrashInfo mCrashInfo;
CrashInfoEqualityMatcher(CrashInfo crashInfo) {
mCrashInfo = crashInfo;
}
@Override
public boolean matches(Object o) {
if (o == mCrashInfo) return true;
if (o == null || o.getClass() != mCrashInfo.getClass()) return false;
CrashInfo c = (CrashInfo) o;
return mCrashInfo.uploadState == c.uploadState
&& Objects.equals(mCrashInfo.localId, c.localId)
&& mCrashInfo.captureTime == c.captureTime
&& Objects.equals(mCrashInfo.packageName, c.packageName)
&& Objects.equals(mCrashInfo.variations, c.variations)
&& Objects.equals(mCrashInfo.uploadId, c.uploadId)
&& mCrashInfo.uploadTime == c.uploadTime;
}
@Override
public void describeTo(Description description) {
description.appendText("equals CrashInfo");
}
}
/**
* Test that merging two {@code CrashInfo} objects works correctly.
*/
@Test
@SmallTest
public void testMergeCrashInfo() {
CrashInfo a = createCrashInfo("123456", 10987654321L, null, -1, null, "123456,78910", null);
CrashInfo b = createCrashInfo(
"123456", -1, "abcdefg", 12345678910L, null, null, UploadState.UPLOADED);
WebViewCrashInfoCollector.mergeCrashInfo(a, b);
Assert.assertEquals("123456", a.localId);
Assert.assertEquals(10987654321L, a.captureTime);
Assert.assertEquals("abcdefg", a.uploadId);
Assert.assertEquals(12345678910L, a.uploadTime);
Assert.assertNull(a.packageName);
Assert.assertEquals(Arrays.asList("123456", "78910"), a.variations);
Assert.assertEquals(UploadState.UPLOADED, a.uploadState);
}
/**
* Test that merging two {@code CrashInfo} objects works correctly.
*/
@Test
@SmallTest
public void testMergeCrashInfo_differentUploadStates() {
CrashInfo a = createCrashInfo("123456", -1, null, -1, null, null, UploadState.PENDING);
CrashInfo b = createCrashInfo("123456", -1, null, -1, null, null, UploadState.UPLOADED);
WebViewCrashInfoCollector.mergeCrashInfo(a, b);
Assert.assertEquals("123456", a.localId);
// UPLOADED state is the merge result, regardless of order.
Assert.assertEquals(UploadState.UPLOADED, a.uploadState);
}
/**
* Test that merging two {@code CrashInfo} objects works correctly.
*/
@Test
@SmallTest
public void testMergeCrashInfo_differentCaptureTime() {
CrashInfo a = createCrashInfo("123456", 1234567, null, -1, null, null, null);
CrashInfo b = createCrashInfo("123456", 1234555, null, -1, null, null, null);
WebViewCrashInfoCollector.mergeCrashInfo(a, b);
Assert.assertEquals("123456", a.localId);
// Older capture time is the merging result regardless of the order.
Assert.assertEquals(1234555, a.captureTime);
}
/**
* Test that merging {@code CrashInfo} that has the same {@code localID} works correctly.
*/
@Test
@SmallTest
public void testMergeDuplicates() {
List<CrashInfo> testList = Arrays.asList(
createCrashInfo("xyz123", 112233445566L, null, -1, null, null, UploadState.PENDING),
createCrashInfo(
"def789", -1, "55667788", 123344556677L, null, null, UploadState.UPLOADED),
createCrashInfo("abc456", -1, null, -1, null, null, UploadState.PENDING),
createCrashInfo(
"xyz123", 112233445566L, null, -1, "com.test.package", "222222", null),
createCrashInfo("abc456", 445566778899L, null, -1, "org.test.package", null, null),
createCrashInfo("abc456", -1, null, -1, null, null, null),
createCrashInfo(
"xyz123", -1, "11223344", 223344556677L, null, null, UploadState.UPLOADED));
List<CrashInfo> uniqueList = WebViewCrashInfoCollector.mergeDuplicates(testList);
Assert.assertThat(uniqueList,
containsInAnyOrder(
new CrashInfoEqualityMatcher(createCrashInfo("abc456", 445566778899L, null,
-1, "org.test.package", null, UploadState.PENDING)),
new CrashInfoEqualityMatcher(
createCrashInfo("xyz123", 112233445566L, "11223344", 223344556677L,
"com.test.package", "222222", UploadState.UPLOADED)),
new CrashInfoEqualityMatcher(createCrashInfo("def789", -1, "55667788",
123344556677L, null, null, UploadState.UPLOADED))));
}
/**
* Test that sort method works correctly; it sorts by recent crashes first (capture time then
* upload time).
*/
@Test
@SmallTest
public void testSortByRecentCaptureTime() {
List<CrashInfo> testList = Arrays.asList(
createCrashInfo("xyz123", -1, "11223344", 123L, null, null, UploadState.UPLOADED),
createCrashInfo("def789", 111L, "55667788", 100L, null, null, UploadState.UPLOADED),
createCrashInfo("abc456", -1, null, -1, null, null, UploadState.PENDING),
createCrashInfo("ghijkl", 112L, null, -1, "com.test.package", "222222", null),
createCrashInfo("abc456", 112L, null, 112L, "org.test.package", null, null),
createCrashInfo(null, 100, "11223344", -1, "com.test.package", null, null),
createCrashInfo("abc123", 100, null, -1, null, null, null));
WebViewCrashInfoCollector.sortByMostRecent(testList);
Assert.assertThat(testList,
contains(new CrashInfoEqualityMatcher(createCrashInfo(
"abc456", 112L, null, 112L, "org.test.package", null, null)),
new CrashInfoEqualityMatcher(createCrashInfo(
"ghijkl", 112L, null, -1, "com.test.package", "222222", null)),
new CrashInfoEqualityMatcher(createCrashInfo("def789", 111L, "55667788",
100L, null, null, UploadState.UPLOADED)),
new CrashInfoEqualityMatcher(createCrashInfo(
null, 100, "11223344", -1, "com.test.package", null, null)),
new CrashInfoEqualityMatcher(
createCrashInfo("abc123", 100, null, -1, null, null, null)),
new CrashInfoEqualityMatcher(createCrashInfo(
"xyz123", -1, "11223344", 123L, null, null, UploadState.UPLOADED)),
new CrashInfoEqualityMatcher(createCrashInfo(
"abc456", -1, null, -1, null, null, UploadState.PENDING))));
}
}