/*
* Sakuli - Testing and Monitoring-Tool for Websites and common UIs.
*
* Copyright 2013 - 2015 the original author or authors.
*
* 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.sakuli.starter.helper;
import org.apache.commons.lang.StringUtils;
import org.sakuli.datamodel.properties.SahiProxyProperties;
import org.sakuli.datamodel.properties.SakuliProperties;
import org.sakuli.datamodel.properties.TestSuiteProperties;
import org.sakuli.utils.SakuliPropertyPlaceholderConfigurer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileNotFoundException;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
/**
* @author tschneck
* Date: 13.03.15
*/
public class SakuliFolderHelper {
private static final Logger LOGGER = LoggerFactory.getLogger(SakuliFolderHelper.class);
/**
* Validates the path to the test suite folder and ensure that it contains the files:
* <ul>
* <li>testsuite.properties</li>
* <li>testsuite.suite</li>
* </ul>
* After all checks were succefull,the values will be set to the {@link SakuliPropertyPlaceholderConfigurer}.
*
* @param testSuiteFolderPath path to test suite folder
* @param tempLogCache temporary string for later logging
* @return the updated tempLogCache String.
* @throws FileNotFoundException if some of the above files are missing
*/
public static String checkTestSuiteFolderAndSetContextVariables(String testSuiteFolderPath, String tempLogCache) throws FileNotFoundException {
Path testSuiteFolder = normalizePath(testSuiteFolderPath);
Path propertyFile = Paths.get(testSuiteFolder + TestSuiteProperties.TEST_SUITE_PROPERTIES_FILE_APPENDER);
Path suiteFile = Paths.get(testSuiteFolder + TestSuiteProperties.TEST_SUITE_SUITE_FILE_APPENDER);
if (testSuiteFolder == null || !Files.exists(testSuiteFolder)) {
throw new FileNotFoundException("sakuli test suite folder \"" + testSuiteFolderPath + "\" does not exist!");
} else if (!Files.exists(propertyFile)) {
throw new FileNotFoundException("property file \"" + TestSuiteProperties.TEST_SUITE_PROPERTIES_FILE_NAME + "\" does not exist in folder: " + testSuiteFolderPath);
} else if (!Files.exists(suiteFile)) {
throw new FileNotFoundException("suite file \"" + TestSuiteProperties.TEST_SUITE_SUITE_FILE_NAME + "\" does not exist in folder: " + testSuiteFolderPath);
}
SakuliPropertyPlaceholderConfigurer.TEST_SUITE_FOLDER_VALUE = testSuiteFolder.toAbsolutePath().toString();
return tempLogCache + "\nset property '" + TestSuiteProperties.TEST_SUITE_FOLDER + "' to \"" + SakuliPropertyPlaceholderConfigurer.TEST_SUITE_FOLDER_VALUE + "\"";
}
/**
* Method remove some not valid windows escape chars like ' or " . To prevent a {@link InvalidPathException}.
* <p/>
* {@code 'C:\PROGRA~1\.' => C:\PROGRA~1\.}
* <br/>
* {@code "C:\PROGRA~1\." => C:\PROGRA~1\. }
*
* @param path as {@link String}
* @return modified path as {@link String}
*/
public static Path normalizePath(String path) {
String oldPath = path;
for (char c : Arrays.asList('\'', '\"')) {
path = StringUtils.remove(path, c);
}
if (!StringUtils.equals(oldPath, path)) {
LOGGER.debug("Path [{}] modified to [{}]", oldPath, path);
}
return path == null ? null : Paths.get(path).toAbsolutePath().normalize();
}
/**
* Validates the path to the sakuli main folder and set the path to {@link SakuliPropertyPlaceholderConfigurer}
*
* @param sakuliMainFolderPath path to the sakuli main folder
* @param tempLogCache temporary string for later logging
* @return the updated tempLogCache String.
* @throws FileNotFoundException if the folder doesn't exist
*/
public static String checkSakuliHomeFolderAndSetContextVariables(String sakuliMainFolderPath, String tempLogCache) throws FileNotFoundException {
Path normalizedPath = normalizePath(sakuliMainFolderPath);
Path mainFolderPath = normalizedPath != null ? normalizedPath : getAlternativeSakuliMainFolder();
if (!Files.exists(mainFolderPath)) {
throw new FileNotFoundException("SAKULI HOME folder \"" + mainFolderPath + "\" does not exist!");
}
if (!checkSubMainFolder(mainFolderPath)) {
throw new FileNotFoundException("the assigned SAKULI HOME folder \"" + mainFolderPath + "\" does not have a valid file structure! Please use the correct folder!");
}
SakuliPropertyPlaceholderConfigurer.SAKULI_HOME_FOLDER_VALUE = mainFolderPath.normalize().toAbsolutePath().toString();
return tempLogCache + "\nset property '" + SakuliProperties.SAKULI_HOME_FOLDER + "' to \"" + SakuliPropertyPlaceholderConfigurer.SAKULI_HOME_FOLDER_VALUE + "\"";
}
private static Path getAlternativeSakuliMainFolder() throws FileNotFoundException {
String envSakuliHome = System.getenv("SAKULI_HOME");
Path sakuli_home = StringUtils.isNotEmpty(envSakuliHome) ? normalizePath(envSakuliHome) : Paths.get(".");
if (sakuli_home != null && Files.exists(sakuli_home) && checkSubMainFolder(sakuli_home)) {
return sakuli_home;
}
throw new FileNotFoundException("no valid SAKULI HOME folder specified - please configure one!");
}
private static boolean checkSubMainFolder(Path mainFolder) {
List<String> subs = Arrays.asList("bin", "config", "libs", "setup");
return subs.stream().filter(s -> !Files.exists(mainFolder.resolve(s))).count() == 0;
}
/**
* Validates the path to the sahi home folder and set the path to {@link SakuliPropertyPlaceholderConfigurer}
*
* @param sahiProxyHomePath path to the sahi home folder
* @param tempLogCache temporary string for later logging
* @return the updated tempLogCache String.
* @throws FileNotFoundException if the folde doesn't exist
*/
public static String checkSahiProxyHomeAndSetContextVariables(String sahiProxyHomePath, String tempLogCache) throws FileNotFoundException {
Path sahiFolder = normalizePath(sahiProxyHomePath);
if (sahiFolder == null || !Files.exists(sahiFolder)) {
throw new FileNotFoundException("sahi folder \"" + sahiProxyHomePath + "\" does not exist!");
}
SakuliPropertyPlaceholderConfigurer.SAHI_HOME_VALUE = sahiFolder.toString();
return tempLogCache + "\nset property '" + SahiProxyProperties.PROXY_HOME_FOLDER + "' to \"" + SakuliPropertyPlaceholderConfigurer.SAHI_HOME_VALUE + "\"";
}
/**
* set the {@link TestSuiteProperties#BROWSER_NAME} to the assigned testSuiteBrowserName.
*
* @param testSuiteBrowserName name of a configured browser for the test suite
* @param tempLogCache temporary string for later logging
* @return the updated tempLogCache String.
*/
public static String setTestSuiteBrowserContextVariable(String testSuiteBrowserName, String tempLogCache) {
SakuliPropertyPlaceholderConfigurer.TEST_SUITE_BROWSER = StringUtils.trimToNull(testSuiteBrowserName);
return tempLogCache + "\nset property '" + TestSuiteProperties.BROWSER_NAME + "' to \"" + SakuliPropertyPlaceholderConfigurer.TEST_SUITE_BROWSER + "\"";
}
}