/*
* (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.base;
import static org.kurento.commons.PropertiesManager.getProperty;
import static org.kurento.test.config.Protocol.FILE;
import static org.kurento.test.config.Protocol.HTTP;
import static org.kurento.test.config.TestConfiguration.KMS_STUN_IP_PROPERTY;
import static org.kurento.test.config.TestConfiguration.KMS_STUN_PORT_PROPERTY;
import static org.kurento.test.config.TestConfiguration.TEST_CONFIG_JSON_DEFAULT;
import static org.kurento.test.config.TestConfiguration.TEST_FILES_DISK_DEFAULT;
import static org.kurento.test.config.TestConfiguration.TEST_FILES_DISK_PROP;
import static org.kurento.test.config.TestConfiguration.TEST_FILES_DISK_PROP_OLD;
import static org.kurento.test.config.TestConfiguration.TEST_FILES_HTTP_DEFAULT;
import static org.kurento.test.config.TestConfiguration.TEST_FILES_HTTP_PROP;
import static org.kurento.test.config.TestConfiguration.TEST_FILES_MONGO_DEFAULT;
import static org.kurento.test.config.TestConfiguration.TEST_FILES_MONGO_PROP;
import static org.kurento.test.config.TestConfiguration.TEST_FILES_S3_DEFAULT;
import static org.kurento.test.config.TestConfiguration.TEST_FILES_S3_PROP;
import static org.kurento.test.config.TestConfiguration.TEST_FILES_S3_PROP_OLD;
import static org.kurento.test.config.TestConfiguration.TEST_FILES_URL_PROP;
import static org.kurento.test.config.TestConfiguration.TEST_ICE_SERVER_CREDENTIAL_PROPERTY;
import static org.kurento.test.config.TestConfiguration.TEST_ICE_SERVER_URL_PROPERTY;
import static org.kurento.test.config.TestConfiguration.TEST_ICE_SERVER_USERNAME_PROPERTY;
import static org.kurento.test.config.TestConfiguration.TEST_NUMRETRIES_PROPERTY;
import static org.kurento.test.config.TestConfiguration.TEST_NUM_NUMRETRIES_DEFAULT;
import static org.kurento.test.config.TestConfiguration.TEST_PRINT_LOG_DEFAULT;
import static org.kurento.test.config.TestConfiguration.TEST_PRINT_LOG_PROP;
import static org.kurento.test.config.TestConfiguration.TEST_PROJECT_PATH_DEFAULT;
import static org.kurento.test.config.TestConfiguration.TEST_PROJECT_PATH_PROP;
import static org.kurento.test.config.TestConfiguration.TEST_RECORD_DEFAULTPATH_PROP;
import static org.kurento.test.config.TestConfiguration.TEST_RECORD_URL_PROP;
import static org.kurento.test.config.TestConfiguration.TEST_SEEK_REPETITIONS;
import static org.kurento.test.config.TestConfiguration.TEST_SEEK_REPETITIONS_DEFAULT;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.Rule;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runners.Parameterized.UseParametersRunnerFactory;
import org.kurento.commons.ConfigFileManager;
import org.kurento.test.config.Retry;
import org.kurento.test.config.TestReport;
import org.kurento.test.config.TestScenario;
import org.kurento.test.lifecycle.FailedTest;
import org.kurento.test.lifecycle.FinishedTest;
import org.kurento.test.lifecycle.KurentoBlockJUnit4ClassRunnerWithParametersFactory;
import org.kurento.test.lifecycle.KurentoTestRunner;
import org.kurento.test.lifecycle.KurentoTestWatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Base for Kurento tests.
*
* @author Boni Garcia (bgarcia@gsyc.es)
* @author Micael Gallego (micael.gallego@gmail.com)
* @since 6.1.1
*/
@RunWith(KurentoTestRunner.class)
@UseParametersRunnerFactory(KurentoBlockJUnit4ClassRunnerWithParametersFactory.class)
public class KurentoTest {
@Rule
public Retry retry = new Retry(numRetries);
@Rule
public KurentoTestWatcher watcher = new KurentoTestWatcher();
@Parameter
public TestScenario testScenario;
@Parameters
public static Collection<Object[]> data() {
return TestScenario.empty();
}
protected static int numRetries =
getProperty(TEST_NUMRETRIES_PROPERTY, TEST_NUM_NUMRETRIES_DEFAULT);
protected static String testDir = getProperty(TEST_PROJECT_PATH_PROP, TEST_PROJECT_PATH_DEFAULT);
protected static boolean printLogs = getProperty(TEST_PRINT_LOG_PROP, TEST_PRINT_LOG_DEFAULT);
public static Logger log = LoggerFactory.getLogger(KurentoTest.class);
protected static String testIdentifier;
protected static String testMethodName;
protected static String testClassName;
protected static List<File> logFiles;
protected static boolean deleteLogsIfSuccess;
public static final String SEPARATOR = "+" + StringUtils.repeat("-", 70);
static {
ConfigFileManager.loadConfigFile(TEST_CONFIG_JSON_DEFAULT);
}
public KurentoTest() {
testClassName = this.getClass().getName();
testIdentifier = this.getClass().getSimpleName() + " [" + new Date() + "]";
retry.useReport(testIdentifier);
deleteLogsIfSuccess = true;
}
@FailedTest
public static void printKmsLogs() {
if (printLogs) {
if (logFiles != null) {
for (File logFile : logFiles) {
if (logFile != null && logFile.exists()) {
System.err.println(SEPARATOR);
System.err.println("Log file: " + logFile.getAbsolutePath());
try {
for (String line : FileUtils.readLines(logFile)) {
System.err.println(line);
}
} catch (Throwable e) {
log.warn("Error reading log file {}: {} {}", logFile, e.getClass(), e.getMessage());
}
System.err.println(SEPARATOR);
}
}
}
}
}
@FinishedTest
public static void deleteLogs() {
if (KurentoTestWatcher.isSuccees() && deleteLogsIfSuccess) {
File folder = KurentoTest.getDefaultOutputFolder();
final File[] files = folder.listFiles(new FilenameFilter() {
@Override
public boolean accept(final File dir, final String name) {
return name.contains(KurentoTest.getSimpleTestName());
}
});
if (files != null) {
for (final File file : files) {
try {
if (file.isDirectory()) {
FileUtils.deleteDirectory(file);
} else {
file.delete();
}
if (file.exists()) {
log.error("Can't remove {}", file.getAbsolutePath());
}
} catch (Throwable e) {
log.warn("Exception deleting file {}: {} {}", file, e.getClass(), e.getMessage());
}
}
}
}
}
// @Before
// public void setupKurentoTest() {
// logMessage("| TEST STARTING: " + getTestClassName() + "."
// + getTestMethodName());
// }
//
// @After
// public void teardownKurentoTest() {
// logMessage("| TEST FINISHED: " + getTestClassName() + "."
// + getTestMethodName());
// }
public TestReport getTestReport() {
return retry.getTestReport();
}
public static File getDefaultOutputFolder() {
File testResultsFolder = new File(testDir + File.separator + testClassName);
if (!testResultsFolder.exists()) {
testResultsFolder.mkdirs();
}
return testResultsFolder;
}
public static String getDefaultOutputFile(String suffix) {
return getDefaultOutputFolder().getAbsolutePath() + File.separator + getSimpleTestName()
+ suffix;
}
public static String getDefaultOutputTestPath() {
return getDefaultOutputFolder().getAbsolutePath() + File.separator + getSimpleTestName()
+ File.separator;
}
public static String getRecordDefaultPath() {
return getProperty(TEST_RECORD_DEFAULTPATH_PROP);
}
public static String getRecordUrl(String suffix) {
String recordUrl = getProperty(TEST_RECORD_URL_PROP);
if (recordUrl == null) {
return FILE + "://" + getDefaultOutputFile(suffix);
}
return recordUrl + File.separator + getSimpleTestName() + suffix;
}
public static String getPlayerUrl(String mediaName) {
String playerUrl = getProperty(TEST_FILES_URL_PROP);
if (playerUrl == null) {
return HTTP + "://" + getTestFilesHttpPath() + mediaName;
}
return playerUrl + mediaName;
}
public static String getSimpleTestName() {
String out = testMethodName;
if (testMethodName != null && out.indexOf(":") != -1) {
out = out.substring(0, out.indexOf(":")) + "]";
}
return out;
}
public static String getTestMethodName() {
return testMethodName;
}
public static void setTestMethodName(String testMethodName) {
KurentoTest.testMethodName = testMethodName;
}
public static String getTestClassName() {
return testClassName;
}
public static void setTestClassName(String testClassName) {
KurentoTest.testClassName = testClassName;
}
public static String getTestDir() {
return testDir;
}
public static void setTestDir(String testDir) {
KurentoTest.testDir = testDir;
}
public static String getTestIdentifier() {
return testIdentifier;
}
public static void setTestIdentifier(String testIdentifier) {
KurentoTest.testIdentifier = testIdentifier;
}
public static boolean isDeleteLogsIfSuccess() {
return deleteLogsIfSuccess;
}
public static void setDeleteLogsIfSuccess(boolean deleteLogsIfSuccess) {
KurentoTest.deleteLogsIfSuccess = deleteLogsIfSuccess;
}
public static void addLogFile(File logFile) {
log.debug("Adding log file: {}", logFile);
if (logFiles == null) {
logFiles = new ArrayList<>();
}
logFiles.add(logFile);
}
public static List<File> getServerLogFiles() {
int countFiles = logFiles != null ? logFiles.size() : 0;
log.debug("Logs files {}", countFiles);
return logFiles;
}
public static String getTestFilesDiskPath() {
String testFilesDisk = getProperty(TEST_FILES_DISK_PROP);
if (testFilesDisk == null) {
testFilesDisk = getProperty(TEST_FILES_DISK_PROP_OLD, TEST_FILES_DISK_DEFAULT);
}
return testFilesDisk;
}
public static String getTestFilesS3Path() {
String testFilesS3 = getProperty(TEST_FILES_S3_PROP);
if (testFilesS3 == null) {
testFilesS3 = getProperty(TEST_FILES_S3_PROP_OLD, TEST_FILES_S3_DEFAULT);
}
return testFilesS3;
}
public static String getTestFilesHttpPath() {
return getProperty(TEST_FILES_HTTP_PROP, TEST_FILES_HTTP_DEFAULT);
}
public static String getTestFilesMongoPath() {
return getProperty(TEST_FILES_MONGO_PROP, TEST_FILES_MONGO_DEFAULT);
}
public static void logMessage(String message) {
log.debug(SEPARATOR);
log.debug(message);
log.debug(SEPARATOR);
}
public static int getTestSeekRepetitions() {
return getProperty(TEST_SEEK_REPETITIONS, TEST_SEEK_REPETITIONS_DEFAULT);
}
public static String getTestStunServerUrl() {
return "stun:" + getProperty(KMS_STUN_IP_PROPERTY) + ":" + getProperty(KMS_STUN_PORT_PROPERTY);
}
public static String getTestIceServerUrl() {
return getProperty(TEST_ICE_SERVER_URL_PROPERTY);
}
public static String getTestIceServerUsername() {
return getProperty(TEST_ICE_SERVER_USERNAME_PROPERTY);
}
public static String getTestIceServerCredential() {
return getProperty(TEST_ICE_SERVER_CREDENTIAL_PROPERTY);
}
}