private void assertIce( JSONObject mediaDescription, String ufrag, String password, IceCandidate... candidates) { JSONObject ice = mediaDescription.optJSONObject("ice"); assertNotNull(ice); assertEquals(ufrag, ice.optString("ufrag")); assertEquals(password, ice.optString("password")); JSONArray jsonCandidates = ice.optJSONArray("candidates"); if (candidates.length == 0) { assertTrue(jsonCandidates == null || jsonCandidates.length() == 0); return; } assertNotNull(jsonCandidates); assertEquals(candidates.length, jsonCandidates.length()); LinkedList<IceCandidate> remainingCandidates = new LinkedList<>(Arrays.asList(candidates)); for (int i = 0; i < jsonCandidates.length(); i++) { JSONObject jsonCandidate = jsonCandidates.optJSONObject(i); assertNotNull(jsonCandidate); IceCandidate chosenCandidate = null; for (IceCandidate candidate : remainingCandidates) { if (candidate.isMatch(jsonCandidate)) { chosenCandidate = candidate; break; } } assertNotNull(chosenCandidate); remainingCandidates.remove(chosenCandidate); } }
@Test public void testHostCandidateHarvesting() throws IOException { // given FoundationsRegistry foundationsRegistry = new LiteFoundationsRegistry(); HostCandidateHarvester harvester = new HostCandidateHarvester(foundationsRegistry); IceMediaStream mediaStream = new IceMediaStream("audio", true); Selector selector = Selector.open(); // when try { PortManager portManager = new PortManager(); portManager.setHighestPort(62000); portManager.setLowestPort(61000); harvester.harvest(portManager, mediaStream, selector); } catch (NoCandidatesGatheredException e) { fail(); } catch (HarvestException e) { fail(); } // then List<LocalCandidateWrapper> rtpCandidates = mediaStream.getRtpComponent().getLocalCandidates(); List<LocalCandidateWrapper> rtcpCandidates = mediaStream.getRtcpComponent().getLocalCandidates(); assertTrue(rtpCandidates.size() > 0); assertTrue(rtcpCandidates.size() > 0); // Evaluate RTP Candidates for (LocalCandidateWrapper candidateWrapper : rtpCandidates) { DatagramChannel udpChannel = candidateWrapper.getChannel(); assertFalse(udpChannel.isBlocking()); assertFalse(udpChannel.isConnected()); assertTrue(udpChannel.isOpen()); IceCandidate candidate = candidateWrapper.getCandidate(); assertEquals(candidate, candidate.getBase()); assertEquals( new InetSocketAddress(candidate.getAddress(), candidate.getPort()), udpChannel.getLocalAddress()); assertNotNull(udpChannel.keyFor(selector)); } // Evaluate RTCP candidates for (LocalCandidateWrapper candidateWrapper : rtcpCandidates) { DatagramChannel udpChannel = candidateWrapper.getChannel(); assertFalse(udpChannel.isBlocking()); assertFalse(udpChannel.isConnected()); assertTrue(udpChannel.isOpen()); IceCandidate candidate = candidateWrapper.getCandidate(); assertEquals(candidate, candidate.getBase()); assertEquals( new InetSocketAddress(candidate.getAddress(), candidate.getPort()), udpChannel.getLocalAddress()); assertNotNull(udpChannel.keyFor(selector)); } }