/* * (C) Copyright 2015 Kurento (http://kurento.org/) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.kurento.test.services; import static org.kurento.commons.PropertiesManager.getProperty; import static org.kurento.test.config.TestConfiguration.FAKE_KMS_AUTOSTART_DEFAULT; import static org.kurento.test.config.TestConfiguration.FAKE_KMS_AUTOSTART_PROP; import static org.kurento.test.config.TestConfiguration.FAKE_KMS_LOGIN_PROP; import static org.kurento.test.config.TestConfiguration.FAKE_KMS_PASSWD_PROP; import static org.kurento.test.config.TestConfiguration.FAKE_KMS_PEM_PROP; import static org.kurento.test.config.TestConfiguration.FAKE_KMS_SCOPE_DEFAULT; import static org.kurento.test.config.TestConfiguration.FAKE_KMS_SCOPE_PROP; import static org.kurento.test.config.TestConfiguration.FAKE_KMS_WS_URI_DEFAULT; import static org.kurento.test.config.TestConfiguration.FAKE_KMS_WS_URI_PROP; import static org.kurento.test.config.TestConfiguration.FAKE_KMS_WS_URI_PROP_EXPORT; import static org.kurento.test.config.TestConfiguration.KMS_WS_URI_PROP; import java.util.ArrayList; import java.util.List; import org.kurento.client.EventListener; import org.kurento.client.IceCandidateFoundEvent; import org.kurento.client.MediaPipeline; import org.kurento.client.WebRtcEndpoint; import org.kurento.commons.exception.KurentoException; import org.kurento.test.monitor.SystemMonitorManager; import org.kurento.test.utils.WebRtcConnector; /** * Fake Kurento Media Server service. * * @author Boni Garcia (bgarcia@gsyc.es) * @since 6.1.1 */ public class FakeKmsService extends KmsService { protected List<WebRtcEndpoint> fakeWebRtcList = new ArrayList<>(); protected List<WebRtcEndpoint> fakeBrowserList = new ArrayList<>(); protected List<MediaPipeline> fakeMediaPipelineList = new ArrayList<>(); public FakeKmsService() { this.kmsLoginProp = FAKE_KMS_LOGIN_PROP; this.kmsPasswdProp = FAKE_KMS_PASSWD_PROP; this.kmsPemProp = FAKE_KMS_PEM_PROP; this.kmsAutostartProp = FAKE_KMS_AUTOSTART_PROP; this.kmsAutostartDefault = FAKE_KMS_AUTOSTART_DEFAULT; this.kmsWsUriProp = FAKE_KMS_WS_URI_PROP; this.kmsWsUriExportProp = FAKE_KMS_WS_URI_PROP_EXPORT; this.kmsScopeProp = FAKE_KMS_SCOPE_PROP; this.kmsScopeDefault = FAKE_KMS_SCOPE_DEFAULT; // KMS_WS_URI_PROP has priority if there's no value for FAKE_KMS_WS_URI_PROP String uri = getProperty(FAKE_KMS_WS_URI_PROP); if (uri == null) { if (getProperty(KMS_WS_URI_PROP) != null) { this.kmsWsUriProp = KMS_WS_URI_PROP; setWsUri(getProperty(KMS_WS_URI_PROP)); } else { setWsUri(FAKE_KMS_WS_URI_DEFAULT); } } else { setWsUri(uri); } } @Override protected String getDockerContainerNameSuffix() { return "_fakekms"; } @Override protected String getDockerLogSuffix() { return "-fakekms"; } public void addFakeClients(int numFakeClients, final int bandwidht, final MediaPipeline mainPipeline, final WebRtcEndpoint inputWebRtc, long timeBetweenClientMs, final SystemMonitorManager monitor, final WebRtcConnector connector) { if (kurentoClient == null) { throw new KurentoException("Fake kurentoClient for is not defined."); } else { log.debug("* * * Adding {} fake clients * * *", numFakeClients); final MediaPipeline fakePipeline = kurentoClient.createMediaPipeline(); for (int i = 0; i < numFakeClients; i++) { log.debug("* * * Adding fake client {} * * *", i); new Thread() { @Override public void run() { final WebRtcEndpoint fakeOutputWebRtc = new WebRtcEndpoint.Builder(mainPipeline).build(); final WebRtcEndpoint fakeBrowser = new WebRtcEndpoint.Builder(fakePipeline).build(); if (bandwidht != -1) { fakeOutputWebRtc.setMaxVideoSendBandwidth(bandwidht); fakeOutputWebRtc.setMinVideoSendBandwidth(bandwidht); fakeBrowser.setMaxVideoRecvBandwidth(bandwidht); } fakeOutputWebRtc .addIceCandidateFoundListener(new EventListener<IceCandidateFoundEvent>() { @Override public void onEvent(IceCandidateFoundEvent event) { fakeBrowser.addIceCandidate(event.getCandidate()); } }); fakeBrowser.addIceCandidateFoundListener(new EventListener<IceCandidateFoundEvent>() { @Override public void onEvent(IceCandidateFoundEvent event) { fakeOutputWebRtc.addIceCandidate(event.getCandidate()); } }); String sdpOffer = fakeBrowser.generateOffer(); String sdpAnswer = fakeOutputWebRtc.processOffer(sdpOffer); fakeBrowser.processAnswer(sdpAnswer); fakeOutputWebRtc.gatherCandidates(); fakeBrowser.gatherCandidates(); if (connector == null) { inputWebRtc.connect(fakeOutputWebRtc); } else { connector.connect(inputWebRtc, fakeOutputWebRtc); } fakeWebRtcList.add(fakeOutputWebRtc); fakeBrowserList.add(fakeBrowser); fakeMediaPipelineList.add(fakePipeline); } }.start(); if (monitor != null) { monitor.incrementNumClients(); } waitMs(timeBetweenClientMs); } } } public void releaseAllFakeClients(long timeBetweenClientMs, WebRtcEndpoint inputWebRtc, SystemMonitorManager monitor) { for (WebRtcEndpoint fakeWebRtc : fakeWebRtcList) { fakeWebRtc.release(); monitor.decrementNumClients(); waitMs(timeBetweenClientMs); } for (WebRtcEndpoint fakeBrowser : fakeBrowserList) { fakeBrowser.release(); waitMs(timeBetweenClientMs); } fakeWebRtcList = new ArrayList<>(); fakeBrowserList = new ArrayList<>(); } public void releaseAllFakePipelines(long timeBetweenClientMs, SystemMonitorManager monitor) { for (WebRtcEndpoint fakeWebRtc : fakeWebRtcList) { monitor.decrementNumClients(); waitMs(timeBetweenClientMs); } for (WebRtcEndpoint fakeBrowser : fakeBrowserList) { fakeBrowser.release(); waitMs(timeBetweenClientMs); } for (MediaPipeline fakeMediaPipeline : fakeMediaPipelineList) { fakeMediaPipeline.release(); } fakeWebRtcList = new ArrayList<>(); fakeBrowserList = new ArrayList<>(); fakeMediaPipelineList = new ArrayList<MediaPipeline>(); } public void removeAllFakeClients(long timeBetweenClientMs, WebRtcEndpoint inputWebRtc, SystemMonitorManager monitor) { for (WebRtcEndpoint fakeWebRtc : fakeWebRtcList) { inputWebRtc.disconnect(fakeWebRtc); monitor.decrementNumClients(); waitMs(timeBetweenClientMs); } } private void waitMs(long timeBetweenClientMs) { if (timeBetweenClientMs > 0) { try { Thread.sleep(timeBetweenClientMs); } catch (InterruptedException e) { log.warn("Interrupted exception working with fake clients", e); } } } }