| /* | |
| * 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 static org.junit.Assert.assertFalse; | |
| import static org.junit.Assert.assertTrue; | |
| import static org.junit.Assert.fail; | |
| import static org.mockito.ArgumentMatchers.any; | |
| import static org.mockito.ArgumentMatchers.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; | |
| import android.os.Build; | |
| import org.junit.Before; | |
| import org.junit.Test; | |
| import org.junit.runner.RunWith; | |
| import org.robolectric.annotation.Config; | |
| import org.robolectric.shadows.ShadowLog; | |
| import org.robolectric.RobolectricTestRunner; | |
| import org.webrtc.IceCandidate; | |
| import org.webrtc.SessionDescription; | |
| /** | |
| * 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 = 100; | |
| public static final int NETWORK_TIMEOUT = 1000; | |
| private DirectRTCClient client; | |
| private DirectRTCClient server; | |
| AppRTCClient.SignalingEvents clientEvents; | |
| AppRTCClient.SignalingEvents serverEvents; | |
| @Before | |
| public void setUp() { | |
| ShadowLog.stream = System.out; | |
| clientEvents = mock(AppRTCClient.SignalingEvents.class); | |
| serverEvents = mock(AppRTCClient.SignalingEvents.class); | |
| client = new DirectRTCClient(clientEvents); | |
| server = new DirectRTCClient(serverEvents); | |
| } | |
| @Test | |
| public void testValidIpPattern() { | |
| // Strings that should match the pattern. | |
| // clang-format off | |
| final String[] ipAddresses = new String[] { | |
| "0.0.0.0", | |
| "127.0.0.1", | |
| "192.168.0.1", | |
| "0.0.0.0:8888", | |
| "127.0.0.1:8888", | |
| "192.168.0.1:8888", | |
| "::", | |
| "::1", | |
| "2001:0db8:85a3:0000:0000:8a2e:0370:7946", | |
| "[::]", | |
| "[::1]", | |
| "[2001:0db8:85a3:0000:0000:8a2e:0370:7946]", | |
| "[::]:8888", | |
| "[::1]:8888", | |
| "[2001:0db8:85a3:0000:0000:8a2e:0370:7946]:8888" | |
| }; | |
| // clang-format on | |
| for (String ip : ipAddresses) { | |
| assertTrue(ip + " didn't match IP_PATTERN even though it should.", | |
| DirectRTCClient.IP_PATTERN.matcher(ip).matches()); | |
| } | |
| } | |
| @Test | |
| public void testInvalidIpPattern() { | |
| // Strings that shouldn't match the pattern. | |
| // clang-format off | |
| final String[] invalidIpAddresses = new String[] { | |
| "Hello, World!", | |
| "aaaa", | |
| "1111", | |
| "[hello world]", | |
| "hello:world" | |
| }; | |
| // clang-format on | |
| for (String invalidIp : invalidIpAddresses) { | |
| assertFalse(invalidIp + " matched IP_PATTERN even though it shouldn't.", | |
| DirectRTCClient.IP_PATTERN.matcher(invalidIp).matches()); | |
| } | |
| } | |
| // TODO(sakal): Replace isNotNull(class) with isNotNull() once Java 8 is used. | |
| @SuppressWarnings("deprecation") | |
| @Test | |
| public void testDirectRTCClient() { | |
| int port = 8888 + Build.VERSION.SDK_INT; | |
| server.connectToRoom( | |
| new AppRTCClient.RoomConnectionParameters(ROOM_URL, "0.0.0.0:" + port, LOOPBACK)); | |
| try { | |
| Thread.sleep(SERVER_WAIT); | |
| } catch (InterruptedException e) { | |
| fail(e.getMessage()); | |
| } | |
| client.connectToRoom( | |
| new AppRTCClient.RoomConnectionParameters(ROOM_URL, "127.0.0.1:" + port, 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(); | |
| server.disconnectFromRoom(); | |
| verifyNoMoreInteractions(clientEvents); | |
| verifyNoMoreInteractions(serverEvents); | |
| } | |
| } |