Index: components/devtools_bridge/android/javatests2/src/org/chromium/components/devtools_bridge/SessionDependencyFactoryNativeTest.java |
diff --git a/components/devtools_bridge/android/javatests2/src/org/chromium/components/devtools_bridge/SessionDependencyFactoryNativeTest.java b/components/devtools_bridge/android/javatests2/src/org/chromium/components/devtools_bridge/SessionDependencyFactoryNativeTest.java |
index 12f9bbb29a87c5df5439ed8d3cf614e0ea7751dd..0be312e009a44ec20dfee295e895d68330e00ae5 100644 |
--- a/components/devtools_bridge/android/javatests2/src/org/chromium/components/devtools_bridge/SessionDependencyFactoryNativeTest.java |
+++ b/components/devtools_bridge/android/javatests2/src/org/chromium/components/devtools_bridge/SessionDependencyFactoryNativeTest.java |
@@ -7,19 +7,229 @@ package org.chromium.components.devtools_bridge; |
import android.test.InstrumentationTestCase; |
import android.test.suitebuilder.annotation.SmallTest; |
+import junit.framework.Assert; |
+ |
+import java.util.concurrent.CountDownLatch; |
+ |
/** |
* Tests for {@link SessionDependencyFactoryNative} |
*/ |
public class SessionDependencyFactoryNativeTest extends InstrumentationTestCase { |
+ private SessionDependencyFactoryNative mInstance; |
+ private AbstractPeerConnection mConnection; |
+ private ObserverMock mObserver; |
+ |
@Override |
protected void setUp() throws Exception { |
super.setUp(); |
System.loadLibrary("devtools_bridge_natives_so"); |
+ mObserver = new ObserverMock(); |
+ } |
+ |
+ @SmallTest |
+ public void testCreateFactory() { |
+ mInstance = newFactory(); |
+ mInstance.dispose(); |
+ } |
+ |
+ @SmallTest |
+ public void testCreateConnection() { |
+ mInstance = newFactory(); |
+ RTCConfiguration config = new RTCConfiguration.Builder() |
+ .addIceServer("http://expample.org") |
+ .build(); |
+ mInstance.createPeerConnection(config, mObserver).dispose(); |
+ mInstance.dispose(); |
+ } |
+ |
+ @SmallTest |
+ public void testCreateAndSetLocalOffer() throws Exception { |
+ mInstance = newFactory(); |
+ mConnection = newConnection(); |
+ mConnection.createAndSetLocalDescription( |
+ AbstractPeerConnection.SessionDescriptionType.OFFER); |
+ |
+ mObserver.localDescriptionAvailable.await(); |
+ |
+ Assert.assertEquals( |
+ AbstractPeerConnection.SessionDescriptionType.OFFER, |
+ mObserver.localDescriptionType); |
+ mConnection.dispose(); |
+ mInstance.dispose(); |
+ } |
+ |
+ @SmallTest |
+ public void testTerminateCallback() { |
+ mInstance = newFactory(); |
+ mConnection = newConnection(); |
+ mConnection.createAndSetLocalDescription( |
+ AbstractPeerConnection.SessionDescriptionType.OFFER); |
+ |
+ // Do not wait. |
+ |
+ mConnection.dispose(); |
+ mInstance.dispose(); |
+ } |
+ |
+ @SmallTest |
+ public void testCreateAndSetLocalAnswerFailed() throws Exception { |
+ mInstance = newFactory(); |
+ mConnection = newConnection(); |
+ // Creating answer without offer set must fail. |
+ mConnection.createAndSetLocalDescription( |
+ AbstractPeerConnection.SessionDescriptionType.ANSWER); |
+ |
+ mObserver.failureAvailable.await(); |
+ |
+ mConnection.dispose(); |
+ mInstance.dispose(); |
+ } |
+ |
+ @SmallTest |
+ public void testSetRemoteOffer() throws Exception { |
+ mInstance = newFactory(); |
+ mConnection = newConnection(); |
+ mConnection.createAndSetLocalDescription( |
+ AbstractPeerConnection.SessionDescriptionType.OFFER); |
+ mObserver.localDescriptionAvailable.await(); |
+ String offer = mObserver.localDescription; |
+ mConnection.dispose(); |
+ |
+ mConnection = newConnection(); |
+ mConnection.setRemoteDescription( |
+ AbstractPeerConnection.SessionDescriptionType.OFFER, offer); |
+ mObserver.remoteDescriptionSet.await(); |
+ |
+ mConnection.dispose(); |
+ mInstance.dispose(); |
+ } |
+ |
+ @SmallTest |
+ public void testNegotiation() throws Exception { |
+ mInstance = newFactory(); |
+ Pipe pipe = new Pipe(mInstance); |
+ pipe.negotiate(); |
+ pipe.dispose(); |
+ mInstance.dispose(); |
} |
@SmallTest |
- public void testCreateInstance() { |
- SessionDependencyFactoryNative instance = new SessionDependencyFactoryNative(); |
- instance.dispose(); |
+ public void testConnection() throws Exception { |
+ mInstance = newFactory(); |
+ Pipe pipe = new Pipe(mInstance); |
+ pipe.negotiate(); |
+ pipe.awaitConnected(); |
+ pipe.dispose(); |
+ mInstance.dispose(); |
+ } |
+ |
+ private SessionDependencyFactoryNative newFactory() { |
+ return new SessionDependencyFactoryNative(); |
+ } |
+ |
+ private AbstractPeerConnection newConnection() { |
+ return newConnection(mObserver); |
+ } |
+ |
+ private AbstractPeerConnection newConnection(ObserverMock observer) { |
+ return mInstance.createPeerConnection(new RTCConfiguration(), observer); |
+ } |
+ |
+ static class Pipe { |
+ final ObserverMock mObserver1 = new ObserverMock(); |
+ final ObserverMock mObserver2 = new ObserverMock(); |
+ |
+ final AbstractPeerConnection mConnection1; |
+ final AbstractPeerConnection mConnection2; |
+ |
+ final AbstractDataChannel mDataChannel1; |
+ final AbstractDataChannel mDataChannel2; |
+ |
+ Pipe(SessionDependencyFactoryNative factory) { |
+ RTCConfiguration config = new RTCConfiguration(); |
+ mConnection1 = factory.createPeerConnection(config, mObserver1); |
+ mConnection2 = factory.createPeerConnection(config, mObserver2); |
+ |
+ mObserver1.iceCandidatesSink = mConnection2; |
+ mObserver2.iceCandidatesSink = mConnection1; |
+ |
+ mDataChannel1 = mConnection1.createDataChannel(0); |
+ mDataChannel2 = mConnection2.createDataChannel(1); |
+ } |
+ |
+ void dispose() { |
+ mDataChannel1.dispose(); |
+ mDataChannel2.dispose(); |
+ mConnection1.dispose(); |
+ mConnection2.dispose(); |
+ } |
+ |
+ void negotiate() throws Exception { |
+ mConnection1.createAndSetLocalDescription( |
+ AbstractPeerConnection.SessionDescriptionType.OFFER); |
+ mObserver1.localDescriptionAvailable.await(); |
+ |
+ mConnection2.setRemoteDescription( |
+ AbstractPeerConnection.SessionDescriptionType.OFFER, |
+ mObserver1.localDescription); |
+ mObserver2.remoteDescriptionSet.await(); |
+ |
+ mConnection2.createAndSetLocalDescription( |
+ AbstractPeerConnection.SessionDescriptionType.ANSWER); |
+ mObserver2.localDescriptionAvailable.await(); |
+ |
+ mConnection1.setRemoteDescription( |
+ AbstractPeerConnection.SessionDescriptionType.ANSWER, |
+ mObserver2.localDescription); |
+ mObserver1.remoteDescriptionSet.await(); |
+ } |
+ |
+ void awaitConnected() throws Exception { |
+ mObserver1.connected.await(); |
+ mObserver2.connected.await(); |
+ } |
+ } |
+ |
+ private static class ObserverMock implements AbstractPeerConnection.Observer { |
+ public AbstractPeerConnection.SessionDescriptionType localDescriptionType; |
+ public String localDescription; |
+ public String failureDescription; |
+ |
+ public final CountDownLatch localDescriptionAvailable = new CountDownLatch(1); |
+ public final CountDownLatch failureAvailable = new CountDownLatch(1); |
+ public final CountDownLatch remoteDescriptionSet = new CountDownLatch(1); |
+ public final CountDownLatch connected = new CountDownLatch(1); |
+ |
+ public AbstractPeerConnection iceCandidatesSink; |
+ |
+ @Override |
+ public void onFailure(String description) { |
+ failureDescription = description; |
+ failureAvailable.countDown(); |
+ } |
+ |
+ @Override |
+ public void onLocalDescriptionCreatedAndSet( |
+ AbstractPeerConnection.SessionDescriptionType type, String description) { |
+ localDescriptionType = type; |
+ localDescription = description; |
+ localDescriptionAvailable.countDown(); |
+ } |
+ |
+ @Override |
+ public void onRemoteDescriptionSet() { |
+ remoteDescriptionSet.countDown(); |
+ } |
+ |
+ @Override |
+ public void onIceCandidate(String iceCandidate) { |
+ if (iceCandidatesSink != null) |
+ iceCandidatesSink.addIceCandidate(iceCandidate); |
+ } |
+ |
+ @Override |
+ public void onIceConnectionChange(boolean connected) { |
+ this.connected.countDown(); |
+ } |
} |
} |