package com.kurento.kmf.test.services;
import static com.kurento.kmf.common.PropertiesManager.getProperty;
import static com.kurento.kmf.media.factory.KmfMediaApiProperties.getRabbitMqAddress;
import static com.kurento.kmf.media.factory.KmfMediaApiProperties.getThriftKmfAddress;
import static com.kurento.kmf.media.factory.KmfMediaApiProperties.getThriftKmsAddress;
import java.io.File;
import org.apache.catalina.LifecycleException;
import com.kurento.kmf.common.PropertiesManager;
import com.kurento.kmf.connector.MediaConnectorManager;
import com.kurento.kmf.jsonrpcconnector.client.JsonRpcClient;
import com.kurento.kmf.media.factory.KmfMediaApi;
import com.kurento.kmf.rabbitmq.server.RabbitMqConnectorManager;
public class KurentoServicesTestHelper {
public static final String KMS_TRANSPORT_PROP = "kms.transport";
public static final String KMS_TRANSPORT_THRIFT_VALUE = "thrift";
public static final String KMS_TRANSPORT_RABBITMQ_VALUE = "rabbitmq";
public static final String KMS_TRANSPORT_DEFAULT = KMS_TRANSPORT_THRIFT_VALUE;
public static final String KMS_PRINT_LOG_PROP = "kms.print.log";
public static final String KMS_PRINT_LOG_DEFAULT = "true";
public static final String AUTOSTART_FALSE_VALUE = "false";
public static final String AUTOSTART_TEST_VALUE = "test";
public static final String AUTOSTART_TEST_SUITE_VALUE = "testsuite";
public static final String KMS_AUTOSTART_PROP = "kms.autostart";
public static final String KMS_AUTOSTART_DEFAULT = AUTOSTART_TEST_VALUE;
public static final String KMC_AUTOSTART_PROP = "kmc.autostart";
public static final String KMC_AUTOSTART_DEFAULT = AUTOSTART_FALSE_VALUE;
public static final String KRC_AUTOSTART_PROP = "krc.autostart";
public static final String KRC_AUTOSTART_DEFAULT = AUTOSTART_FALSE_VALUE;
public static final String KMS_HTTP_PORT_PROP = "kms.http.port";
public static final int KMS_HTTP_PORT_DEFAULT = 9091;
public static final String APP_HTTP_PORT_PROP = "app.http.port";
public static final int APP_HTTP_PORT_DEFAULT = 7779;
public static final String KMC_HTTP_PORT_PROP = "kmc.http.port";
public static final int KMC_HTTP_PORT_DEFAULT = 7788;
public static final String MEDIA_CONNECTOR_PREFIX = "kmc";
public static final String RABBITMQ_CONNECTOR_PREFIX = "krc";
public static final String KURENTO_TESTFILES_PROP = "kurento.test.files";
public static final String KURENTO_TESTFILES_DEFAULT = "/var/lib/jenkins/test-files";
private static HttpServer httpServer;
private static KurentoMediaServerManager kms;
private static RabbitMqConnectorManager rabbitMqConnector;
private static MediaConnectorManager mediaConnector;
private static String testCaseName;
private static String testName;
private static String testDir;
private static String kmsAutostart = KMS_AUTOSTART_DEFAULT;
private static String krcAutostart = KRC_AUTOSTART_DEFAULT;
private static String kmcAutostart = KMS_AUTOSTART_DEFAULT;
private static String kmsPrintLog;
private static File logFile;
public static void startKurentoServicesIfNeccessary() {
startKurentoMediaServerIfNecessary();
startRabbitMqConnectorIfNecessary();
startMediaConnectorIfNecessary();
}
private static void startMediaConnectorIfNecessary() {
kmcAutostart = getProperty(KMC_AUTOSTART_PROP, KMC_AUTOSTART_DEFAULT);
switch (kmcAutostart) {
case AUTOSTART_FALSE_VALUE:
break;
case AUTOSTART_TEST_VALUE:
startMediaConnector();
break;
case AUTOSTART_TEST_SUITE_VALUE:
if (mediaConnector == null) {
startMediaConnector();
}
break;
default:
throw new IllegalArgumentException("The value '" + kmcAutostart
+ "' is not valid for property " + KMC_AUTOSTART_PROP);
}
}
private static void startRabbitMqConnectorIfNecessary() {
krcAutostart = getProperty(KRC_AUTOSTART_PROP, KRC_AUTOSTART_DEFAULT);
switch (krcAutostart) {
case AUTOSTART_FALSE_VALUE:
break;
case AUTOSTART_TEST_VALUE:
startRabbitMqConnector();
break;
case AUTOSTART_TEST_SUITE_VALUE:
if (mediaConnector == null) {
startRabbitMqConnector();
}
break;
default:
throw new IllegalArgumentException("The value '" + krcAutostart
+ "' is not valid for property " + KRC_AUTOSTART_PROP);
}
}
private static void startKurentoMediaServerIfNecessary() {
kmsAutostart = getProperty(KMS_AUTOSTART_PROP, KMS_AUTOSTART_DEFAULT);
kmsPrintLog = getProperty(KMS_PRINT_LOG_PROP, KMS_PRINT_LOG_DEFAULT);
switch (kmsAutostart) {
case AUTOSTART_FALSE_VALUE:
break;
case AUTOSTART_TEST_VALUE:
startKurentoMediaServer();
break;
case AUTOSTART_TEST_SUITE_VALUE:
if (mediaConnector == null) {
startKurentoMediaServer();
}
break;
default:
throw new IllegalArgumentException("The value '" + kmsAutostart
+ "' is not valid for property " + KMS_AUTOSTART_PROP);
}
}
private static void startRabbitMqConnector() {
rabbitMqConnector = new RabbitMqConnectorManager(
getThriftKmsAddress(RABBITMQ_CONNECTOR_PREFIX),
getThriftKmfAddress(RABBITMQ_CONNECTOR_PREFIX),
getRabbitMqAddress(RABBITMQ_CONNECTOR_PREFIX));
}
private static void startMediaConnector() {
JsonRpcClient client = KmfMediaApi
.createJsonRpcClientFromSystemProperties(MEDIA_CONNECTOR_PREFIX);
mediaConnector = new MediaConnectorManager(client, getKmcHttpPort());
}
public static void startKurentoMediaServer() {
String transport = PropertiesManager.getProperty(KMS_TRANSPORT_PROP,
KMS_TRANSPORT_DEFAULT);
int httpPort = getKmsHttpPort();
switch (transport) {
case KMS_TRANSPORT_THRIFT_VALUE:
kms = KurentoMediaServerManager.createWithThriftTransport(
getThriftKmsAddress(), httpPort);
break;
case KMS_TRANSPORT_RABBITMQ_VALUE:
kms = KurentoMediaServerManager.createWithRabbitMqTransport(
getRabbitMqAddress(), httpPort);
break;
default:
throw new IllegalArgumentException("The value " + transport
+ " is not valid for property " + KMS_TRANSPORT_PROP);
}
kms.setTestClassName(testCaseName);
kms.setTestMethodName(testName);
kms.start();
}
public static void startHttpServer() {
try {
httpServer = new HttpServer(getAppHttpPort());
httpServer.start();
} catch (Exception e) {
throw new RuntimeException("Exception starting http server", e);
}
}
public static void teardownServices() {
teardownHttpServer();
teardownMediaServer();
teardownMediaConnector();
teardownRabbitMediaConnector();
}
private static void teardownMediaConnector() {
if (mediaConnector != null && kmcAutostart.equals(AUTOSTART_TEST_VALUE)) {
mediaConnector.destroy();
mediaConnector = null;
}
}
private static void teardownRabbitMediaConnector() {
if (rabbitMqConnector != null
&& krcAutostart.equals(AUTOSTART_TEST_VALUE)) {
rabbitMqConnector.destroy();
rabbitMqConnector = null;
}
}
private static void teardownMediaServer() {
if (kms != null && kmsAutostart.equals(AUTOSTART_TEST_VALUE)) {
kms.stop();
kms = null;
}
}
public static void teardownHttpServer() {
if (httpServer != null) {
try {
httpServer.destroy();
} catch (LifecycleException e) {
e.printStackTrace();
}
}
}
public static void setTestName(String testName) {
KurentoServicesTestHelper.testName = testName;
}
public static String getTestName() {
return KurentoServicesTestHelper.testName;
}
public static void setTestCaseName(String testCaseName) {
KurentoServicesTestHelper.testCaseName = testCaseName;
}
public static String getTestCaseName() {
return KurentoServicesTestHelper.testCaseName;
}
public static void setTestDir(String testDir) {
KurentoServicesTestHelper.testDir = testDir;
}
public static String getTestDir() {
return KurentoServicesTestHelper.testDir;
}
public static boolean printKmsLog() {
return Boolean.parseBoolean(kmsPrintLog);
}
public static int getKmsHttpPort() {
return PropertiesManager.getProperty(KMS_HTTP_PORT_PROP,
KMS_HTTP_PORT_DEFAULT);
}
public static int getAppHttpPort() {
return PropertiesManager.getProperty(APP_HTTP_PORT_PROP,
APP_HTTP_PORT_DEFAULT);
}
public static int getKmcHttpPort() {
return PropertiesManager.getProperty(KMC_HTTP_PORT_PROP,
KMC_HTTP_PORT_DEFAULT);
}
public static String getTestFilesPath() {
return PropertiesManager.getProperty(KURENTO_TESTFILES_PROP,
KURENTO_TESTFILES_DEFAULT);
}
public static void setServerLogFilePath(File logFile) {
KurentoServicesTestHelper.logFile = logFile;
}
public static File getServerLogFile() {
return logFile;
}
}