summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tadashi G. Takaoka <takaoka@google.com> 2018-10-15 12:59:51 +0900
committer Tadashi G. Takaoka <takaoka@google.com> 2018-10-18 10:56:15 +0900
commit041a05a06b23e35fa9969673f5e4ca4e18a38163 (patch)
tree6cf7847999df34297f90e704fbaec6cfd76bc88e
parentc500a378b7b82417d19b30642a489ddeacef7256 (diff)
Release SurfaceControl native resource when test finishes
By replacing factory methods, records all SurfaceControl and Transaction objects created while test is running. Then release native resources of those after test finishes. This will mitigate resource presure while running WindowManagerService tests. Bug: 116449554 Test: atest :presubmit in frameworks/base/services/core/java/com/android/server/wm Change-Id: Iac99f80ee995bd64a82b965e4ea8a3135b0a5bd5
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java51
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/ZOrderingTests.java6
2 files changed, 54 insertions, 3 deletions
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
index 54fd7db9b537..cff9504ef9dc 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
@@ -34,8 +34,8 @@ import android.hardware.display.DisplayManagerInternal;
import android.os.PowerManagerInternal;
import android.os.PowerSaveState;
import android.view.InputChannel;
-
-import androidx.test.InstrumentationRegistry;
+import android.view.SurfaceControl;
+import android.view.SurfaceControl.Transaction;
import com.android.server.LocalServices;
import com.android.server.input.InputManagerService;
@@ -46,6 +46,12 @@ import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import org.mockito.invocation.InvocationOnMock;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.test.InstrumentationRegistry;
+
/**
* A test rule that sets up a fresh WindowManagerService instance before each test and makes sure
* to properly tear it down after.
@@ -61,6 +67,12 @@ public class WindowManagerServiceRule implements TestRule {
private WindowManagerService mService;
private TestWindowManagerPolicy mPolicy;
+ // Record all {@link SurfaceControl.Transaction} created while testing and releases native
+ // resources when test finishes.
+ private final List<WeakReference<Transaction>> mSurfaceTransactions = new ArrayList<>();
+ // Record all {@link SurfaceControl} created while testing and releases native resources when
+ // test finishes.
+ private final List<WeakReference<SurfaceControl>> mSurfaceControls = new ArrayList<>();
@Override
public Statement apply(Statement base, Description description) {
@@ -114,6 +126,19 @@ public class WindowManagerServiceRule implements TestRule {
mService = WindowManagerService.main(context, ims, false,
false, mPolicy = new TestWindowManagerPolicy(
WindowManagerServiceRule.this::getWindowManagerService));
+ mService.mTransactionFactory = () -> {
+ final SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
+ mSurfaceTransactions.add(new WeakReference<>(transaction));
+ return transaction;
+ };
+ mService.mSurfaceBuilderFactory = session -> new SurfaceControl.Builder(session) {
+ @Override
+ public SurfaceControl build() {
+ final SurfaceControl control = super.build();
+ mSurfaceControls.add(new WeakReference<>(control));
+ return control;
+ }
+ };
mService.onInitReady();
@@ -135,6 +160,8 @@ public class WindowManagerServiceRule implements TestRule {
private void tearDown() {
waitUntilWindowManagerHandlersIdle();
+ destroyAllSurfaceTransactions();
+ destroyAllSurfaceControls();
removeServices();
mService = null;
mPolicy = null;
@@ -158,4 +185,24 @@ public class WindowManagerServiceRule implements TestRule {
SurfaceAnimationThread.getHandler().runWithScissors(() -> { }, 0);
}
}
+
+ private void destroyAllSurfaceTransactions() {
+ for (final WeakReference<Transaction> reference : mSurfaceTransactions) {
+ final Transaction transaction = reference.get();
+ if (transaction != null) {
+ reference.clear();
+ transaction.close();
+ }
+ }
+ }
+
+ private void destroyAllSurfaceControls() {
+ for (final WeakReference<SurfaceControl> reference : mSurfaceControls) {
+ final SurfaceControl control = reference.get();
+ if (control != null) {
+ reference.clear();
+ control.destroy();
+ }
+ }
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/ZOrderingTests.java b/services/tests/servicestests/src/com/android/server/wm/ZOrderingTests.java
index a610e6efda8c..3a8c4ae73493 100644
--- a/services/tests/servicestests/src/com/android/server/wm/ZOrderingTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/ZOrderingTests.java
@@ -98,10 +98,13 @@ public class ZOrderingTests extends WindowTestsBase {
super(s);
}
+ @Override
public SurfaceControl.Builder setParent(SurfaceControl sc) {
mPendingParent = sc;
return super.setParent(sc);
}
+
+ @Override
public SurfaceControl build() {
SurfaceControl sc = super.build();
mParentFor.put(sc, mPendingParent);
@@ -110,7 +113,7 @@ public class ZOrderingTests extends WindowTestsBase {
}
}
- class HierarchyRecordingBuilderFactory implements SurfaceBuilderFactory {
+ private class HierarchyRecordingBuilderFactory implements SurfaceBuilderFactory {
public SurfaceControl.Builder make(SurfaceSession s) {
return new HierarchyRecorder(s);
}
@@ -131,6 +134,7 @@ public class ZOrderingTests extends WindowTestsBase {
@After
public void after() {
mTransaction.close();
+ mParentFor.keySet().forEach(SurfaceControl::destroy);
mParentFor.clear();
}