diff options
author | Scott Lobdell <slobdell@google.com> | 2021-07-27 17:02:32 +0000 |
---|---|---|
committer | Scott Lobdell <slobdell@google.com> | 2021-07-27 17:02:32 +0000 |
commit | cb84bc77bfeb89a940d8439f7458fe5d9bef7bef (patch) | |
tree | d6e70908803e918eb485e058341ce55d0a957188 /core/tests | |
parent | dc5ea9d31ab76ba378da9c550813e6b7d8be1e69 (diff) | |
parent | 6aa393b52cd7362100a2b3e9b0b1dece473cf6dd (diff) |
Merge SP1A.210723.002
Change-Id: I220cdfc5cb9db40162fd33f400a54591018d54cf
Diffstat (limited to 'core/tests')
8 files changed, 174 insertions, 100 deletions
diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index 6f17ea994699..fb820cb2f5e5 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -286,6 +286,7 @@ public class ActivityThreadTest { } @Test + @FlakyTest(bugId = 194242735) public void testHandleActivityConfigurationChanged_EnsureUpdatesProcessedInOrder() throws Exception { final TestActivity activity = mActivityTestRule.launchActivity(new Intent()); diff --git a/core/tests/coretests/src/android/app/appsearch/AppSearchSessionUnitTest.java b/core/tests/coretests/src/android/app/appsearch/AppSearchSessionUnitTest.java index d51004c08585..07e4333e74b1 100644 --- a/core/tests/coretests/src/android/app/appsearch/AppSearchSessionUnitTest.java +++ b/core/tests/coretests/src/android/app/appsearch/AppSearchSessionUnitTest.java @@ -16,6 +16,8 @@ package android.app.appsearch; +import static android.app.appsearch.SearchSpec.TERM_MATCH_PREFIX; + import static com.google.common.truth.Truth.assertThat; import static org.testng.Assert.expectThrows; @@ -30,6 +32,8 @@ import com.android.server.appsearch.testing.AppSearchEmail; import org.junit.Before; import org.junit.Test; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -100,4 +104,127 @@ public class AppSearchSessionUnitTest { .isEqualTo(AppSearchResult.RESULT_INTERNAL_ERROR); assertThat(appSearchException.getMessage()).startsWith("NullPointerException"); } + + @Test + public void testGetEmptyNextPage() throws Exception { + // Set the schema. + CompletableFuture<AppSearchResult<SetSchemaResponse>> schemaFuture = + new CompletableFuture<>(); + mSearchSession.setSchema( + new SetSchemaRequest.Builder() + .addSchemas(new AppSearchSchema.Builder("schema1").build()) + .setForceOverride(true).build(), + mExecutor, mExecutor, schemaFuture::complete); + schemaFuture.get().getResultValue(); + + // Create a document and index it. + GenericDocument document1 = new GenericDocument.Builder<>("namespace", "id1", + "schema1").build(); + CompletableFuture<AppSearchBatchResult<String, Void>> putDocumentsFuture = + new CompletableFuture<>(); + mSearchSession.put( + new PutDocumentsRequest.Builder().addGenericDocuments(document1).build(), + mExecutor, new BatchResultCallback<String, Void>() { + @Override + public void onResult(AppSearchBatchResult<String, Void> result) { + putDocumentsFuture.complete(result); + } + + @Override + public void onSystemError(Throwable throwable) { + putDocumentsFuture.completeExceptionally(throwable); + } + }); + putDocumentsFuture.get(); + + // Search and get the first page. + SearchSpec searchSpec = new SearchSpec.Builder() + .setTermMatch(TERM_MATCH_PREFIX) + .setResultCountPerPage(1) + .build(); + SearchResults searchResults = mSearchSession.search("", searchSpec); + + CompletableFuture<AppSearchResult<List<SearchResult>>> getNextPageFuture = + new CompletableFuture<>(); + searchResults.getNextPage(mExecutor, getNextPageFuture::complete); + List<SearchResult> results = getNextPageFuture.get().getResultValue(); + assertThat(results).hasSize(1); + assertThat(results.get(0).getGenericDocument()).isEqualTo(document1); + + // We get all documents, and it shouldn't fail if we keep calling getNextPage(). + getNextPageFuture = new CompletableFuture<>(); + searchResults.getNextPage(mExecutor, getNextPageFuture::complete); + results = getNextPageFuture.get().getResultValue(); + assertThat(results).isEmpty(); + } + + @Test + public void testGetEmptyNextPage_multiPages() throws Exception { + // Set the schema. + CompletableFuture<AppSearchResult<SetSchemaResponse>> schemaFuture = + new CompletableFuture<>(); + mSearchSession.setSchema( + new SetSchemaRequest.Builder() + .addSchemas(new AppSearchSchema.Builder("schema1").build()) + .setForceOverride(true).build(), + mExecutor, mExecutor, schemaFuture::complete); + schemaFuture.get().getResultValue(); + + // Create a document and insert 3 package1 documents + GenericDocument document1 = new GenericDocument.Builder<>("namespace", "id1", + "schema1").build(); + GenericDocument document2 = new GenericDocument.Builder<>("namespace", "id2", + "schema1").build(); + GenericDocument document3 = new GenericDocument.Builder<>("namespace", "id3", + "schema1").build(); + CompletableFuture<AppSearchBatchResult<String, Void>> putDocumentsFuture = + new CompletableFuture<>(); + mSearchSession.put( + new PutDocumentsRequest.Builder() + .addGenericDocuments(document1, document2, document3).build(), + mExecutor, new BatchResultCallback<String, Void>() { + @Override + public void onResult(AppSearchBatchResult<String, Void> result) { + putDocumentsFuture.complete(result); + } + + @Override + public void onSystemError(Throwable throwable) { + putDocumentsFuture.completeExceptionally(throwable); + } + }); + putDocumentsFuture.get(); + + // Search for only 2 result per page + SearchSpec searchSpec = new SearchSpec.Builder() + .setTermMatch(TERM_MATCH_PREFIX) + .setResultCountPerPage(2) + .build(); + SearchResults searchResults = mSearchSession.search("", searchSpec); + + // Get the first page, it contains 2 results. + List<GenericDocument> outDocs = new ArrayList<>(); + CompletableFuture<AppSearchResult<List<SearchResult>>> getNextPageFuture = + new CompletableFuture<>(); + searchResults.getNextPage(mExecutor, getNextPageFuture::complete); + List<SearchResult> results = getNextPageFuture.get().getResultValue(); + assertThat(results).hasSize(2); + outDocs.add(results.get(0).getGenericDocument()); + outDocs.add(results.get(1).getGenericDocument()); + + // Get the second page, it contains only 1 result. + getNextPageFuture = new CompletableFuture<>(); + searchResults.getNextPage(mExecutor, getNextPageFuture::complete); + results = getNextPageFuture.get().getResultValue(); + assertThat(results).hasSize(1); + outDocs.add(results.get(0).getGenericDocument()); + + assertThat(outDocs).containsExactly(document1, document2, document3); + + // We get all documents, and it shouldn't fail if we keep calling getNextPage(). + getNextPageFuture = new CompletableFuture<>(); + searchResults.getNextPage(mExecutor, getNextPageFuture::complete); + results = getNextPageFuture.get().getResultValue(); + assertThat(results).isEmpty(); + } } diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java index 6884f13d4cc9..3d820acf2d22 100644 --- a/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java +++ b/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java @@ -62,4 +62,18 @@ public class GenericDocumentTest { assertThat(outDoc.getPropertyDocument("propDocument").getPropertyBytesArray("propBytes")) .isEqualTo(new byte[][] {{3, 4}}); } + + @Test + public void testPutLargeDocument_exceedLimit() throws Exception { + // Create a String property that has a very large property. + char[] chars = new char[10_000_000]; + String property = new StringBuilder().append(chars).append("the end.").toString(); + + GenericDocument doc = + new GenericDocument.Builder<>("namespace", "id1", "schema1") + .setPropertyString("propString", property) + .build(); + + assertThat(doc.getPropertyString("propString")).isEqualTo(property); + } } diff --git a/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java b/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java index 7dea82d7ee54..69eb13f7854a 100644 --- a/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java +++ b/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java @@ -22,12 +22,6 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeNotNull; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; import android.os.PerformanceHintManager.Session; @@ -120,92 +114,9 @@ public class PerformanceHintManagerTest { } @Test - public void testRateLimitWithDurationFastEnough() throws Exception { - FakeClock fakeClock = new FakeClock(); - Session s = new Session(mIHintSessionMock, fakeClock, RATE_1000, TARGET_166); - - reset(mIHintSessionMock); - fakeClock.setNow(0); - s.updateTargetWorkDuration(TARGET_166); - - s.reportActualWorkDuration(TARGET_166 - 1); - s.reportActualWorkDuration(TARGET_166); - // we should not see update as the rate should be 10X for over-perform case. - verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any()); - fakeClock.incrementClock(10 * RATE_1000); - s.reportActualWorkDuration(TARGET_166); - verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any()); - fakeClock.incrementClock(1); - s.reportActualWorkDuration(TARGET_166); - // we should see update after rate limit - verify(mIHintSessionMock, times(1)).reportActualWorkDuration( - eq(new long[] {TARGET_166 - 1, TARGET_166, TARGET_166, TARGET_166}), - eq(new long[] {0, 0, 10 * RATE_1000, 10 * RATE_1000 + 1})); - - reset(mIHintSessionMock); - s.reportActualWorkDuration(TARGET_166); - s.reportActualWorkDuration(TARGET_166 - 1); - s.reportActualWorkDuration(TARGET_166 - 2); - // we should not see update as the rate should be 10X for over-perform case. - verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any()); - fakeClock.incrementClock(10 * RATE_1000 + 1); - s.reportActualWorkDuration(TARGET_166); - s.reportActualWorkDuration(TARGET_166 - 1); - // we should see update now - verify(mIHintSessionMock, times(1)).reportActualWorkDuration( - eq(new long[] {TARGET_166, TARGET_166 - 1, TARGET_166 - 2, TARGET_166}), - eq(new long[] {10 * RATE_1000 + 1, 10 * RATE_1000 + 1, 10 * RATE_1000 + 1, - (10 * RATE_1000 + 1) * 2})); - } - - @Test - public void testRateLimitWithDurationTooSlow() throws Exception { - FakeClock fakeClock = new FakeClock(); - Session s = new Session(mIHintSessionMock, fakeClock, RATE_1000, TARGET_166); - - reset(mIHintSessionMock); - fakeClock.setNow(0); - s.updateTargetWorkDuration(TARGET_166); - - verify(mIHintSessionMock, times(1)).updateTargetWorkDuration(eq(TARGET_166)); - // shouldn't update before rate limit - s.reportActualWorkDuration(TARGET_166 + 1); - verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any()); - - // shouldn't update when the time is exactly at rate limit - fakeClock.incrementClock(RATE_1000); - s.reportActualWorkDuration(TARGET_166 + 1); - verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any()); - - // should be ready for sending hint - fakeClock.incrementClock(1); - s.reportActualWorkDuration(TARGET_166 + 1); - verify(mIHintSessionMock, times(1)).reportActualWorkDuration( - eq(new long[] {TARGET_166 + 1, TARGET_166 + 1, TARGET_166 + 1}), - eq(new long[] {0 , RATE_1000, RATE_1000 + 1})); - } - - @Test public void testCloseHintSession() { Session s = createSession(); assumeNotNull(s); s.close(); } - - private static class FakeClock implements PerformanceHintManager.NanoClock { - private long mCurrentTime = 0L; - - @Override - public long nanos() { - return mCurrentTime; - } - - public void setNow(long nanos) { - mCurrentTime = nanos; - } - - public void incrementClock(long nanos) { - mCurrentTime += nanos; - } - } } diff --git a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java index c8f8ca9fd5b0..96b4316ffafc 100644 --- a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java +++ b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java @@ -257,21 +257,14 @@ public class FrameTrackerTest { } @Test - public void testRemoveObserversWhenCancelledInEnd() { + public void testCancelIfEndVsyncIdEqualsToBeginVsyncId() { when(mChoreographer.getVsyncId()).thenReturn(100L); mTracker.begin(); verify(mRenderer, only()).addObserver(any()); - // send first frame - not janky - sendFrame(4, JANK_NONE, 100L); - - // send another frame - should be considered janky - sendFrame(40, JANK_APP_DEADLINE_MISSED, 101L); - // end the trace session when(mChoreographer.getVsyncId()).thenReturn(101L); mTracker.end(FrameTracker.REASON_END_NORMAL); - sendFrame(4, JANK_NONE, 102L); // Since the begin vsync id (101) equals to the end vsync id (101), will be treat as cancel. verify(mTracker).cancel(FrameTracker.REASON_CANCEL_SAME_VSYNC); @@ -284,6 +277,26 @@ public class FrameTrackerTest { } @Test + public void testCancelIfEndVsyncIdLessThanBeginVsyncId() { + when(mChoreographer.getVsyncId()).thenReturn(100L); + mTracker.begin(); + verify(mRenderer, only()).addObserver(any()); + + // end the trace session at the same vsync id, end vsync id will less than the begin one. + // Because the begin vsync id is supposed to the next frame, + mTracker.end(FrameTracker.REASON_END_NORMAL); + + // The begin vsync id (101) is larger than the end one (100), will be treat as cancel. + verify(mTracker).cancel(FrameTracker.REASON_CANCEL_SAME_VSYNC); + + // Observers should be removed in this case, or FrameTracker object will be leaked. + verify(mTracker).removeObservers(); + + // Should never trigger Perfetto since it is a cancel. + verify(mTracker, never()).triggerPerfetto(); + } + + @Test public void testCancelWhenSessionNeverBegun() { mTracker.cancel(FrameTracker.REASON_CANCEL_NORMAL); verify(mTracker).removeObservers(); diff --git a/core/tests/coretests/src/com/android/internal/jank/InteractionJankMonitorTest.java b/core/tests/coretests/src/com/android/internal/jank/InteractionJankMonitorTest.java index 8ec1559861f3..c153b38d3f02 100644 --- a/core/tests/coretests/src/com/android/internal/jank/InteractionJankMonitorTest.java +++ b/core/tests/coretests/src/com/android/internal/jank/InteractionJankMonitorTest.java @@ -99,6 +99,8 @@ public class InteractionJankMonitorTest { new FrameMetricsWrapper(), /*traceThresholdMissedFrames=*/ 1, /*traceThresholdFrameTimeMillis=*/ -1, null)); doReturn(tracker).when(monitor).createFrameTracker(any(), any()); + doNothing().when(tracker).triggerPerfetto(); + doNothing().when(tracker).postTraceStartMarker(); // Simulate a trace session and see if begin / end are invoked. assertThat(monitor.begin(mView, session.getCuj())).isTrue(); @@ -146,6 +148,8 @@ public class InteractionJankMonitorTest { new FrameMetricsWrapper(), /*traceThresholdMissedFrames=*/ 1, /*traceThresholdFrameTimeMillis=*/ -1, null)); doReturn(tracker).when(monitor).createFrameTracker(any(), any()); + doNothing().when(tracker).triggerPerfetto(); + doNothing().when(tracker).postTraceStartMarker(); assertThat(monitor.begin(mView, session.getCuj())).isTrue(); verify(tracker).begin(); diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java index 24baa93337ba..cca66420c596 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java @@ -69,11 +69,11 @@ public class BatteryStatsImplTest { when(mKernelSingleUidTimeReader.singleUidCpuTimesAvailable()).thenReturn(true); mBatteryStatsImpl = new MockBatteryStatsImpl() .setKernelCpuUidFreqTimeReader(mKernelUidCpuFreqTimeReader) - .setKernelSingleUidTimeReader(mKernelSingleUidTimeReader); + .setKernelSingleUidTimeReader(mKernelSingleUidTimeReader) + .setTrackingCpuByProcStateEnabled(true); } @Test - @SkipPresubmit("b/180015146") public void testUpdateProcStateCpuTimes() { mBatteryStatsImpl.setOnBatteryInternal(true); mBatteryStatsImpl.updateTimeBasesLocked(false, Display.STATE_ON, 0, 0); @@ -231,7 +231,6 @@ public class BatteryStatsImplTest { } @Test - @SkipPresubmit("b/180015146") public void testCopyFromAllUidsCpuTimes() { mBatteryStatsImpl.setOnBatteryInternal(false); mBatteryStatsImpl.updateTimeBasesLocked(false, Display.STATE_ON, 0, 0); diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java index 80def71ce812..99d576d259ec 100644 --- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java +++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java @@ -174,6 +174,11 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { return this; } + public MockBatteryStatsImpl setTrackingCpuByProcStateEnabled(boolean enabled) { + mConstants.TRACK_CPU_TIMES_BY_PROC_STATE = enabled; + return this; + } + public SparseIntArray getPendingUids() { return mPendingUids; } |