• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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