1 /* 2 * Copyright 2013 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 package org.webrtc; 12 13 import static java.util.Collections.singletonList; 14 import static org.junit.Assert.assertEquals; 15 import static org.junit.Assert.assertFalse; 16 import static org.junit.Assert.assertNotNull; 17 import static org.junit.Assert.assertNull; 18 import static org.junit.Assert.assertTrue; 19 import static org.mockito.Mockito.mock; 20 21 import android.support.test.InstrumentationRegistry; 22 import androidx.test.filters.SmallTest; 23 import java.util.Arrays; 24 import java.util.List; 25 import org.junit.Before; 26 import org.junit.Test; 27 import org.webrtc.PeerConnection.TlsCertPolicy; 28 29 /** Unit tests for {@link PeerConnection}. */ 30 public class PeerConnectionTest { 31 @Before setUp()32 public void setUp() { 33 PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions 34 .builder(InstrumentationRegistry.getTargetContext()) 35 .setNativeLibraryName(TestConstants.NATIVE_LIBRARY) 36 .createInitializationOptions()); 37 } 38 39 @Test 40 @SmallTest testIceServerChanged()41 public void testIceServerChanged() throws Exception { 42 PeerConnection.IceServer iceServer1 = 43 PeerConnection.IceServer.builder("turn:fake.example.com") 44 .setUsername("fakeUsername") 45 .setPassword("fakePassword") 46 .setTlsCertPolicy(TlsCertPolicy.TLS_CERT_POLICY_SECURE) 47 .setHostname("fakeHostname") 48 .setTlsAlpnProtocols(singletonList("fakeTlsAlpnProtocol")) 49 .setTlsEllipticCurves(singletonList("fakeTlsEllipticCurve")) 50 .createIceServer(); 51 // Same as iceServer1. 52 PeerConnection.IceServer iceServer2 = 53 PeerConnection.IceServer.builder("turn:fake.example.com") 54 .setUsername("fakeUsername") 55 .setPassword("fakePassword") 56 .setTlsCertPolicy(TlsCertPolicy.TLS_CERT_POLICY_SECURE) 57 .setHostname("fakeHostname") 58 .setTlsAlpnProtocols(singletonList("fakeTlsAlpnProtocol")) 59 .setTlsEllipticCurves(singletonList("fakeTlsEllipticCurve")) 60 .createIceServer(); 61 // Differs from iceServer1 by the url. 62 PeerConnection.IceServer iceServer3 = 63 PeerConnection.IceServer.builder("turn:fake.example2.com") 64 .setUsername("fakeUsername") 65 .setPassword("fakePassword") 66 .setTlsCertPolicy(TlsCertPolicy.TLS_CERT_POLICY_SECURE) 67 .setHostname("fakeHostname") 68 .setTlsAlpnProtocols(singletonList("fakeTlsAlpnProtocol")) 69 .setTlsEllipticCurves(singletonList("fakeTlsEllipticCurve")) 70 .createIceServer(); 71 // Differs from iceServer1 by the username. 72 PeerConnection.IceServer iceServer4 = 73 PeerConnection.IceServer.builder("turn:fake.example.com") 74 .setUsername("fakeUsername2") 75 .setPassword("fakePassword") 76 .setTlsCertPolicy(TlsCertPolicy.TLS_CERT_POLICY_SECURE) 77 .setHostname("fakeHostname") 78 .setTlsAlpnProtocols(singletonList("fakeTlsAlpnProtocol")) 79 .setTlsEllipticCurves(singletonList("fakeTlsEllipticCurve")) 80 .createIceServer(); 81 // Differs from iceServer1 by the password. 82 PeerConnection.IceServer iceServer5 = 83 PeerConnection.IceServer.builder("turn:fake.example.com") 84 .setUsername("fakeUsername") 85 .setPassword("fakePassword2") 86 .setTlsCertPolicy(TlsCertPolicy.TLS_CERT_POLICY_SECURE) 87 .setHostname("fakeHostname") 88 .setTlsAlpnProtocols(singletonList("fakeTlsAlpnProtocol")) 89 .setTlsEllipticCurves(singletonList("fakeTlsEllipticCurve")) 90 .createIceServer(); 91 // Differs from iceServer1 by the TLS certificate policy. 92 PeerConnection.IceServer iceServer6 = 93 PeerConnection.IceServer.builder("turn:fake.example.com") 94 .setUsername("fakeUsername") 95 .setPassword("fakePassword") 96 .setTlsCertPolicy(TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK) 97 .setHostname("fakeHostname") 98 .setTlsAlpnProtocols(singletonList("fakeTlsAlpnProtocol")) 99 .setTlsEllipticCurves(singletonList("fakeTlsEllipticCurve")) 100 .createIceServer(); 101 // Differs from iceServer1 by the hostname. 102 PeerConnection.IceServer iceServer7 = 103 PeerConnection.IceServer.builder("turn:fake.example.com") 104 .setUsername("fakeUsername") 105 .setPassword("fakePassword") 106 .setTlsCertPolicy(TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK) 107 .setHostname("fakeHostname2") 108 .setTlsAlpnProtocols(singletonList("fakeTlsAlpnProtocol")) 109 .setTlsEllipticCurves(singletonList("fakeTlsEllipticCurve")) 110 .createIceServer(); 111 // Differs from iceServer1 by the TLS ALPN. 112 PeerConnection.IceServer iceServer8 = 113 PeerConnection.IceServer.builder("turn:fake.example.com") 114 .setUsername("fakeUsername") 115 .setPassword("fakePassword") 116 .setTlsCertPolicy(TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK) 117 .setHostname("fakeHostname") 118 .setTlsAlpnProtocols(singletonList("fakeTlsAlpnProtocol2")) 119 .setTlsEllipticCurves(singletonList("fakeTlsEllipticCurve")) 120 .createIceServer(); 121 // Differs from iceServer1 by the TLS elliptic curve. 122 PeerConnection.IceServer iceServer9 = 123 PeerConnection.IceServer.builder("turn:fake.example.com") 124 .setUsername("fakeUsername") 125 .setPassword("fakePassword") 126 .setTlsCertPolicy(TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK) 127 .setHostname("fakeHostname") 128 .setTlsAlpnProtocols(singletonList("fakeTlsAlpnProtocol")) 129 .setTlsEllipticCurves(singletonList("fakeTlsEllipticCurve2")) 130 .createIceServer(); 131 132 assertTrue(iceServer1.equals(iceServer2)); 133 assertFalse(iceServer1.equals(iceServer3)); 134 assertFalse(iceServer1.equals(iceServer4)); 135 assertFalse(iceServer1.equals(iceServer5)); 136 assertFalse(iceServer1.equals(iceServer6)); 137 assertFalse(iceServer1.equals(iceServer7)); 138 assertFalse(iceServer1.equals(iceServer8)); 139 assertFalse(iceServer1.equals(iceServer9)); 140 } 141 142 // TODO(fischman) MOAR test ideas: 143 // - Test that PC.removeStream() works; requires a second 144 // createOffer/createAnswer dance. 145 // - audit each place that uses `constraints` for specifying non-trivial 146 // constraints (and ensure they're honored). 147 // - test error cases 148 // - ensure reasonable coverage of jni code is achieved. Coverage is 149 // extra-important because of all the free-text (class/method names, etc) 150 // in JNI-style programming; make sure no typos! 151 // - Test that shutdown mid-interaction is crash-free. 152 153 // Tests that the JNI glue between Java and C++ does not crash when creating a PeerConnection. 154 @Test 155 @SmallTest testCreationWithConfig()156 public void testCreationWithConfig() throws Exception { 157 PeerConnectionFactory factory = PeerConnectionFactory.builder().createPeerConnectionFactory(); 158 List<PeerConnection.IceServer> iceServers = Arrays.asList( 159 PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").createIceServer(), 160 PeerConnection.IceServer.builder("turn:fake.example.com") 161 .setUsername("fakeUsername") 162 .setPassword("fakePassword") 163 .createIceServer()); 164 PeerConnection.RTCConfiguration config = new PeerConnection.RTCConfiguration(iceServers); 165 config.sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN; 166 167 // Test configuration options. 168 config.continualGatheringPolicy = PeerConnection.ContinualGatheringPolicy.GATHER_CONTINUALLY; 169 170 PeerConnection offeringPC = 171 factory.createPeerConnection(config, mock(PeerConnection.Observer.class)); 172 assertNotNull(offeringPC); 173 } 174 175 @Test 176 @SmallTest testCreationWithCertificate()177 public void testCreationWithCertificate() throws Exception { 178 PeerConnectionFactory factory = PeerConnectionFactory.builder().createPeerConnectionFactory(); 179 PeerConnection.RTCConfiguration config = new PeerConnection.RTCConfiguration(Arrays.asList()); 180 config.sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN; 181 182 // Test certificate. 183 RtcCertificatePem originalCert = RtcCertificatePem.generateCertificate(); 184 config.certificate = originalCert; 185 186 PeerConnection offeringPC = 187 factory.createPeerConnection(config, mock(PeerConnection.Observer.class)); 188 189 RtcCertificatePem restoredCert = offeringPC.getCertificate(); 190 assertEquals(originalCert.privateKey, restoredCert.privateKey); 191 assertEquals(originalCert.certificate, restoredCert.certificate); 192 } 193 194 @Test 195 @SmallTest testCreationWithCryptoOptions()196 public void testCreationWithCryptoOptions() throws Exception { 197 PeerConnectionFactory factory = PeerConnectionFactory.builder().createPeerConnectionFactory(); 198 PeerConnection.RTCConfiguration config = new PeerConnection.RTCConfiguration(Arrays.asList()); 199 config.sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN; 200 201 assertNull(config.cryptoOptions); 202 203 CryptoOptions cryptoOptions = CryptoOptions.builder() 204 .setEnableGcmCryptoSuites(true) 205 .setEnableAes128Sha1_32CryptoCipher(true) 206 .setEnableEncryptedRtpHeaderExtensions(true) 207 .setRequireFrameEncryption(true) 208 .createCryptoOptions(); 209 config.cryptoOptions = cryptoOptions; 210 211 PeerConnection offeringPC = 212 factory.createPeerConnection(config, mock(PeerConnection.Observer.class)); 213 assertNotNull(offeringPC); 214 } 215 } 216