Index: mojo/android/javatests/src/org/chromium/mojo/bindings/AutoCloseableRouterTest.java |
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/AutoCloseableRouterTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/AutoCloseableRouterTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..43d4a26a2c8b6a21386092dabd0453462d7d452d |
--- /dev/null |
+++ b/mojo/android/javatests/src/org/chromium/mojo/bindings/AutoCloseableRouterTest.java |
@@ -0,0 +1,96 @@ |
+// Copyright 2014 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.mojo.bindings; |
+ |
+import android.test.suitebuilder.annotation.SmallTest; |
+ |
+import org.chromium.mojo.MojoTestCase; |
+import org.chromium.mojo.system.Core; |
+import org.chromium.mojo.system.MessagePipeHandle; |
+import org.chromium.mojo.system.impl.CoreImpl; |
+ |
+import java.lang.ref.WeakReference; |
+ |
+/** |
+ * Testing the the AutoCloseableRouter. |
+ */ |
+public class AutoCloseableRouterTest extends MojoTestCase { |
+ |
+ private static final long RUN_LOOP_TIMEOUT_MS = 25; |
+ |
+ private static class CloseRecordingRouter implements Router { |
+ |
+ private Thread mThread = null; |
+ |
+ @Override |
+ public boolean acceptWithResponder(Message message, MessageReceiver receiver) { |
+ return false; |
+ } |
+ |
+ @Override |
+ public boolean accept(Message message) { |
+ return false; |
+ } |
+ |
+ @Override |
+ public MessagePipeHandle passHandle() { |
+ return null; |
+ } |
+ |
+ @Override |
+ public void start() { |
+ } |
+ |
+ @Override |
+ public void setIncomingMessageReceiver( |
+ MessageReceiverWithResponder incomingMessageReceiver) { |
+ } |
+ |
+ @Override |
+ public void setErrorHandler(ConnectionErrorHandler errorHandler) { |
+ } |
+ |
+ /** |
+ * Record the thread it was last called on. |
+ */ |
+ @Override |
+ public void close() { |
+ mThread = Thread.currentThread(); |
+ } |
+ |
+ /** |
+ * Returns the thread this router was last called on. Returns |null| if it was never closed. |
+ */ |
+ public Thread getClosingThread() { |
+ return mThread; |
+ } |
+ } |
+ |
+ /** |
+ * Testing that an {@link AutoCloseableRouter} close its delegate when getting deallocated. |
+ */ |
+ @SmallTest |
+ public void testCloseOnDeallocation() { |
+ Core core = CoreImpl.getInstance(); |
+ CloseRecordingRouter closeRecordingRouter = new CloseRecordingRouter(); |
+ AutoCloseableRouter autoCloseableRouter = new AutoCloseableRouter(core, |
+ closeRecordingRouter); |
+ WeakReference<AutoCloseableRouter> weakRef = new WeakReference<AutoCloseableRouter>( |
+ autoCloseableRouter); |
+ |
+ assertNotNull(weakRef.get()); |
+ assertNull(closeRecordingRouter.getClosingThread()); |
+ |
+ autoCloseableRouter = null; |
+ System.gc(); |
+ System.runFinalization(); |
+ |
+ assertNull(weakRef.get()); |
+ |
+ nativeRunLoop(RUN_LOOP_TIMEOUT_MS); |
+ |
+ assertEquals(Thread.currentThread(), closeRecordingRouter.getClosingThread()); |
+ } |
+} |