From f910ecdfc54251c66ac92b450607844387ae6c14 Mon Sep 17 00:00:00 2001 From: sakal Date: Thu, 19 May 2016 00:00:41 -0700 Subject: [PATCH] Add test for DirectRTCClient in AppRTC Demo for Android Test is very simple but should test the basic sanity of the class. Test is implemented as a JUnit test using Robolectric. Also removed unused imports from TCPChannelClientTest. Review-Url: https://codereview.webrtc.org/1989013003 Cr-Commit-Position: refs/heads/master@{#12804} --- .../src/org/appspot/apprtc/CallActivity.java | 2 +- .../org/appspot/apprtc/DirectRTCClient.java | 7 +- .../appspot/apprtc/DirectRTCClientTest.java | 103 ++++++++++++++++++ .../appspot/apprtc/TCPChannelClientTest.java | 9 -- 4 files changed, 108 insertions(+), 13 deletions(-) create mode 100644 webrtc/examples/androidjunit/src/org/appspot/apprtc/DirectRTCClientTest.java diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java index ed7e60f7e6..9109383f45 100644 --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java @@ -245,7 +245,7 @@ public class CallActivity extends Activity appRtcClient = new WebSocketRTCClient(this, new LooperExecutor()); } else { Log.i(TAG, "Using DirectRTCClient because room name looks like an IP."); - appRtcClient = new DirectRTCClient(this); + appRtcClient = new DirectRTCClient(this, new LooperExecutor()); } // Create connection parameters. roomConnectionParameters = new RoomConnectionParameters( diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/DirectRTCClient.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/DirectRTCClient.java index 8db38ae830..3de0dc03b3 100644 --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/DirectRTCClient.java +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/DirectRTCClient.java @@ -64,9 +64,9 @@ public class DirectRTCClient implements AppRTCClient, TCPChannelClient.TCPChanne // All alterations of the room state should be done from inside the looper thread. private ConnectionState roomState; - public DirectRTCClient(SignalingEvents events) { + public DirectRTCClient(SignalingEvents events, LooperExecutor looperExecutor) { this.events = events; - executor = new LooperExecutor(); + executor = looperExecutor; executor.requestStart(); roomState = ConnectionState.NEW; @@ -100,7 +100,6 @@ public class DirectRTCClient implements AppRTCClient, TCPChannelClient.TCPChanne disconnectFromRoomInternal(); } }); - executor.requestStop(); } /** @@ -296,11 +295,13 @@ public class DirectRTCClient implements AppRTCClient, TCPChannelClient.TCPChanne @Override public void onTCPError(String description) { reportError("TCP connection error: " + description); + executor.requestStop(); } @Override public void onTCPClose() { events.onChannelClose(); + executor.requestStop(); } // -------------------------------------------------------------------- diff --git a/webrtc/examples/androidjunit/src/org/appspot/apprtc/DirectRTCClientTest.java b/webrtc/examples/androidjunit/src/org/appspot/apprtc/DirectRTCClientTest.java new file mode 100644 index 0000000000..ee3b7c4656 --- /dev/null +++ b/webrtc/examples/androidjunit/src/org/appspot/apprtc/DirectRTCClientTest.java @@ -0,0 +1,103 @@ +/* + * Copyright 2016 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +package org.appspot.apprtc; + +import android.util.Log; + +import org.appspot.apprtc.util.RobolectricLooperExecutor; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; +import org.webrtc.IceCandidate; +import org.webrtc.SessionDescription; + +import static org.junit.Assert.fail; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.isNotNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + +/** + * Test for DirectRTCClient. Test is very simple and only tests the overall sanity of the class + * behaviour. + */ +@RunWith(RobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class DirectRTCClientTest { + private static final String ROOM_URL = ""; + private static final boolean LOOPBACK = false; + + private static final String DUMMY_SDP_MID = "sdpMid"; + private static final String DUMMY_SDP = "sdp"; + + public static final int SERVER_WAIT = 10; + public static final int NETWORK_TIMEOUT = 100; + + private DirectRTCClient client; + private DirectRTCClient server; + + AppRTCClient.SignalingEvents clientEvents; + AppRTCClient.SignalingEvents serverEvents; + + @Before + public void setUp() { + clientEvents = mock(AppRTCClient.SignalingEvents.class); + serverEvents = mock(AppRTCClient.SignalingEvents.class); + + client = new DirectRTCClient(clientEvents, new RobolectricLooperExecutor()); + server = new DirectRTCClient(serverEvents, new RobolectricLooperExecutor()); + } + + @Test + public void testDirectRTCClient() { + server.connectToRoom(new AppRTCClient.RoomConnectionParameters(ROOM_URL, "0.0.0.0", LOOPBACK)); + try { + Thread.sleep(SERVER_WAIT); + } catch (InterruptedException e) { + fail(e.getMessage()); + } + client.connectToRoom( + new AppRTCClient.RoomConnectionParameters(ROOM_URL, "127.0.0.1", LOOPBACK)); + verify(serverEvents, timeout(NETWORK_TIMEOUT)) + .onConnectedToRoom(any(AppRTCClient.SignalingParameters.class)); + + SessionDescription offerSdp = new SessionDescription(SessionDescription.Type.OFFER, DUMMY_SDP); + server.sendOfferSdp(offerSdp); + verify(clientEvents, timeout(NETWORK_TIMEOUT)) + .onConnectedToRoom(any(AppRTCClient.SignalingParameters.class)); + + SessionDescription answerSdp + = new SessionDescription(SessionDescription.Type.ANSWER, DUMMY_SDP); + client.sendAnswerSdp(answerSdp); + verify(serverEvents, timeout(NETWORK_TIMEOUT)) + .onRemoteDescription(isNotNull(SessionDescription.class)); + + IceCandidate candidate = new IceCandidate(DUMMY_SDP_MID, 0, DUMMY_SDP); + server.sendLocalIceCandidate(candidate); + verify(clientEvents, timeout(NETWORK_TIMEOUT)) + .onRemoteIceCandidate(isNotNull(IceCandidate.class)); + + client.sendLocalIceCandidate(candidate); + verify(serverEvents, timeout(NETWORK_TIMEOUT)) + .onRemoteIceCandidate(isNotNull(IceCandidate.class)); + + client.disconnectFromRoom(); + verify(clientEvents, timeout(NETWORK_TIMEOUT)).onChannelClose(); + verify(serverEvents, timeout(NETWORK_TIMEOUT)).onChannelClose(); + + verifyNoMoreInteractions(clientEvents); + verifyNoMoreInteractions(serverEvents); + } +} diff --git a/webrtc/examples/androidjunit/src/org/appspot/apprtc/TCPChannelClientTest.java b/webrtc/examples/androidjunit/src/org/appspot/apprtc/TCPChannelClientTest.java index 4c60299456..e0e29630d1 100644 --- a/webrtc/examples/androidjunit/src/org/appspot/apprtc/TCPChannelClientTest.java +++ b/webrtc/examples/androidjunit/src/org/appspot/apprtc/TCPChannelClientTest.java @@ -10,7 +10,6 @@ package org.appspot.apprtc; -import org.appspot.apprtc.util.LooperExecutor; import org.appspot.apprtc.util.RobolectricLooperExecutor; import org.junit.After; import org.junit.Before; @@ -18,22 +17,14 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; - import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE)