Index: components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/DataChannelMock.java |
diff --git a/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/DataChannelMock.java b/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/DataChannelMock.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9821de1f91b5f86309369f12fdd45c782fd648dc |
--- /dev/null |
+++ b/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/DataChannelMock.java |
@@ -0,0 +1,135 @@ |
+// 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.components.devtools_bridge; |
+ |
+import junit.framework.Assert; |
+ |
+import java.nio.ByteBuffer; |
+import java.util.concurrent.LinkedBlockingQueue; |
+ |
+/** |
+ * Mock of AbstractDataChannel tests. Also base class for DataPipe channels. |
+ */ |
+public class DataChannelMock extends AbstractDataChannel { |
+ private final SignalingThreadMock mSignalingThread; |
+ private Observer mObserver; |
+ private boolean mOpen = false; |
+ private final LinkedBlockingQueue<ByteBuffer> mQueue = new LinkedBlockingQueue<ByteBuffer>(); |
+ |
+ // |signalingThread| will be disposed in the |dispose| method. If successor needs |
+ // to control it's lifetime it must override |disposeSignalingThread| and not to invoke super's |
+ // implementation. |
+ protected DataChannelMock(SignalingThreadMock signalingThread) { |
+ mSignalingThread = signalingThread; |
+ } |
+ |
+ public DataChannelMock() { |
+ this(new SignalingThreadMock()); |
+ } |
+ |
+ public void open() { |
+ onStateChange(AbstractDataChannel.State.OPEN); |
+ } |
+ |
+ @Override |
+ public void close() { |
+ onStateChange(AbstractDataChannel.State.CLOSED); |
+ } |
+ |
+ private void onStateChange(final State state) { |
+ mSignalingThread.invoke(new Runnable() { |
+ @Override |
+ public void run() { |
+ mObserver.onStateChange(state); |
+ } |
+ }); |
+ } |
+ |
+ // Sends onMessage to the observer. |
+ public void notifyMessage(ByteBuffer data) { |
+ final byte[] bytes = toByteArray(data); |
+ mSignalingThread.invoke(new Runnable() { |
+ @Override |
+ public void run() { |
+ notifyMessageOnSignalingThread(ByteBuffer.wrap(bytes)); |
+ } |
+ }); |
+ } |
+ |
+ protected void notifyMessageOnSignalingThread(ByteBuffer buffer) { |
+ mObserver.onMessage(buffer); |
+ } |
+ |
+ // Blocks until message received. Removes it from the queue and returns. |
+ public ByteBuffer receive() { |
+ try { |
+ return mQueue.take(); |
+ } catch (InterruptedException e) { |
+ throw new RuntimeException(e); |
+ } |
+ } |
+ |
+ @Override |
+ public void registerObserver(final Observer observer) { |
+ mSignalingThread.invoke(new Runnable() { |
+ @Override |
+ public void run() { |
+ Assert.assertNull(mObserver); |
+ mObserver = observer; |
+ Assert.assertNotNull(mObserver); |
+ } |
+ }); |
+ } |
+ |
+ @Override |
+ public void unregisterObserver() { |
+ mSignalingThread.invoke(new Runnable() { |
+ @Override |
+ public void run() { |
+ Assert.assertNotNull(mObserver); |
+ mObserver = null; |
+ } |
+ }); |
+ } |
+ |
+ private byte[] toByteArray(ByteBuffer data) { |
+ final byte[] result = new byte[data.remaining()]; |
+ data.get(result); |
+ return result; |
+ } |
+ |
+ @Override |
+ public void send(ByteBuffer message, MessageType type) { |
+ final byte[] data = toByteArray(message); |
+ assert data.length > 0; |
+ mSignalingThread.post(new Runnable() { |
+ @Override |
+ public void run() { |
+ sendOnSignalingThread(ByteBuffer.wrap(data)); |
+ android.util.Log.d("DataChannelMock", "Packet sent."); |
+ } |
+ }); |
+ } |
+ |
+ protected void sendOnSignalingThread(ByteBuffer message) { |
+ boolean success = mQueue.offer(message); |
+ assert success; |
+ } |
+ |
+ @Override |
+ public void dispose() { |
+ mSignalingThread.invoke(new Runnable() { |
+ @Override |
+ public void run() { |
+ Assert.assertNull(mObserver); |
+ } |
+ }); |
+ disposeSignalingThread(); |
+ } |
+ |
+ protected void disposeSignalingThread() { |
+ mSignalingThread.dispose(); |
+ } |
+} |