/*
* Syncany, www.syncany.org
* Copyright (C) 2011-2015 Philipp C. Heckel <philipp.heckel@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.syncany.tests.unit.util;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
import org.syncany.cli.CommandLineClient;
import org.syncany.config.Config;
import org.syncany.config.ConfigException;
import org.syncany.config.to.ConfigTO;
import org.syncany.tests.unit.util.TestFileUtil;
import org.syncany.tests.util.TestConfigUtil;
import org.syncany.util.StringUtil;
public class TestCliUtil {
private static final Logger logger = Logger.getLogger(TestCliUtil.class.getSimpleName());
public static Map<String, String> createLocalTestEnv(String machineName, Map<String, String> connectionProperties) throws Exception {
Map<String, String> clientSettings = new HashMap<String, String>();
File tempLocalDir = TestFileUtil.createTempDirectoryInSystemTemp(TestConfigUtil.createUniqueName("client-" + machineName,
connectionProperties));
tempLocalDir.mkdirs();
// Client settings
clientSettings.put("machinename", machineName);
clientSettings.put("localdir", tempLocalDir.getAbsolutePath());
clientSettings.put("repopath", connectionProperties.get("path"));
return clientSettings;
}
public static Map<String, String> createLocalTestEnvAndInit(String machineName, Map<String, String> connectionProperties) throws Exception {
Map<String, String> client = createLocalTestEnv(machineName, connectionProperties);
// Init
String[] initArgs = new String[] {
"--localdir", client.get("localdir"),
"init",
"--plugin", "local",
"--plugin-option", "path=" + client.get("repopath"),
"--no-encryption",
"--no-compression",
};
logger.log(Level.INFO, "Running syncany with argument: " + StringUtil.join(initArgs, " "));
new CommandLineClient(initArgs).start();
fixMachineName(client);
return client;
}
public static Map<String, String> createLocalTestEnvAndConnect(String machineName, Map<String, String> connectionProperties) throws Exception {
Map<String, String> client = createLocalTestEnv(machineName, connectionProperties);
// Init
String[] connectArgs = new String[] {
"--localdir", client.get("localdir"),
"connect",
"--plugin", "local",
"--plugin-option", "path=" + client.get("repopath")
};
logger.log(Level.INFO, "Running syncany with argument: " + StringUtil.join(connectArgs, " "));
new CommandLineClient(connectArgs).start();
fixMachineName(client);
return client;
}
public static String[] runAndCaptureOutput(CommandLineClient cli) throws Exception {
ByteArrayOutputStream bufferedCliOut = new ByteArrayOutputStream();
cli.setOut(new SplitOutputStream(bufferedCliOut, System.out));
cli.start();
logger.log(Level.INFO, "CLI output: ");
logger.log(Level.INFO, toString(bufferedCliOut));
return toStringArray(bufferedCliOut);
}
private static void fixMachineName(Map<String, String> client) throws Exception {
File configFile = new File(client.get("localdir") + "/" + Config.DIR_APPLICATION + "/" + Config.FILE_CONFIG);
Serializer serializer = new Persister();
ConfigTO configTO = serializer.read(ConfigTO.class, configFile);
configTO.setMachineName(client.get("machinename"));
serializer.write(configTO, configFile);
}
public static void deleteTestLocalConfigAndData(Map<String, String> clientSettings) throws ConfigException {
if (clientSettings.get("localdir") != null)
TestFileUtil.deleteDirectory(new File(clientSettings.get("localdir")));
if (clientSettings.get("cachedir") != null)
TestFileUtil.deleteDirectory(new File(clientSettings.get("cachedir")));
if (clientSettings.get("databasedir") != null)
TestFileUtil.deleteDirectory(new File(clientSettings.get("databasedir")));
if (clientSettings.get("configfile") != null)
TestFileUtil.deleteDirectory(new File(clientSettings.get("configfile")));
if (clientSettings.get("appdir") != null)
TestFileUtil.deleteDirectory(new File(clientSettings.get("appdir")));
if (clientSettings.get("repopath") != null)
TestFileUtil.deleteDirectory(new File(clientSettings.get("repopath")));
}
public static String toString(ByteArrayOutputStream bos) {
return new String(bos.toByteArray());
}
public static String[] toStringArray(ByteArrayOutputStream bos) {
return toString(bos).split("[\\r\\n]|[\\n\\r]|[\\n]");
}
public static boolean setCurrentDirectory(File newDirectory) {
boolean result = false;
File directory = newDirectory.getAbsoluteFile();
if (directory.exists() || directory.mkdirs()) {
result = (System.setProperty("user.dir", directory.getAbsolutePath()) != null);
}
return result;
}
}