/*
* (C) Copyright 2013-2014 Nuxeo SA (http://nuxeo.com/) and contributors.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public License
* (LGPL) version 2.1 which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-2.1.html
*
* This library 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
* Lesser General Public License for more details.
*
* Contributors:
* Florent Guillaume
*/
package org.nuxeo.launcher;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.cli.ParseException;
import org.apache.commons.io.Charsets;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.internal.AssumptionViolatedException;
import org.nuxeo.common.Environment;
import org.nuxeo.connect.identity.LogicalInstanceIdentifier;
import org.nuxeo.connect.identity.LogicalInstanceIdentifier.InvalidCLID;
import org.nuxeo.connect.update.PackageException;
import org.nuxeo.launcher.NuxeoLauncher.SolarisProcessManager;
import org.nuxeo.launcher.config.AbstractConfigurationTest;
import org.nuxeo.launcher.config.ConfigurationException;
import org.nuxeo.launcher.config.ConfigurationGenerator;
import org.nuxeo.launcher.config.TomcatConfigurator;
import org.nuxeo.launcher.info.InstanceInfo;
public class TestNuxeoLauncher extends AbstractConfigurationTest {
private static final String TEST_INSTANCE_CLID = "/opt/build/hudson/instance.clid";
private static final String NUXEO_PATH = "/opt/nuxeo";
private static final String STARTUP_CLASS = "org.apache.catalina.startup.Bootstrap";
// USER PID %CPU %MEM SZ RSS TT S START TIME COMMAND
private static final String SOL_PS1_CMD = "fsflush";
private static final String SOL_PS1 = "root 3 0.2 0.0 0 0 ? S 16:02:16 0:00 "
+ SOL_PS1_CMD;
private static final String SOL_PS2_CMD = "/usr/lib/rad/rad -m /usr/lib/rad/transport -m /usr/lib/rad/protocol -m /usr/lib/rad/module -m /usr/lib/rad/site-modules -t pipe:fd=3,exit -e 180";
private static final String SOL_PS2 = "fguillau 1786 0.0 0.219136 3908 ? S 16:05:41 0:00 "
+ SOL_PS2_CMD;
private static final String SOL_PS3_CMD = "gnome-terminal";
private static final String SOL_PS3 = "fguillau 1921 2.2 0.913130018836 ? S 16:08:28 0:00 "
+ SOL_PS3_CMD;
private static final String SOL_PS4_CMD = "/usr/jdk/instances/jdk1.7.0/jre/bin/java -server -Xms512m -Xmx1024m -XX:MaxPermSize=512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dfile.encoding=UTF-8 -Dmail.mime.decodeparameters=true -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -cp .:/opt/nuxeo/nxserver/lib:/opt/nuxeo/bin/bootstrap.jar:/opt/nuxeo/bin/tomcat-juli.jar -Dnuxeo.home=/opt/nuxeo -Dnuxeo.conf=/opt/nuxeo/bin/nuxeo.conf -Dnuxeo.log.dir=/opt/nuxeo/log -Dnuxeo.data.dir=/opt/nuxeo/nxserver/data -Dnuxeo.tmp.dir=/opt/nuxeo/tmp -Djava.io.tmpdir=/opt/nuxeo/tmp -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dcatalina.base=/opt/nuxeo -Dcatalina.home=/opt/nuxeo -Djava.endorsed.dirs=/opt/nuxeo/endorsed org.apache.catalina.startup.Bootstrap start";
private static final String SOL_PS4 = "fguillau 2788 1.2 19.5699008405296 pts/2 S 18:54:51 1:26 "
+ SOL_PS4_CMD;
protected class MockSolarisProcessManager extends SolarisProcessManager {
protected Map<String, List<String>> commands = new HashMap<>();
public void setLines(String command, List<String> lines) {
commands.put(command, lines);
}
@Override
protected List<String> execute(String... command) throws IOException {
for (Entry<String, List<String>> es : commands.entrySet()) {
String c = es.getKey();
if (command[0].contains(c)) {
return es.getValue();
}
}
fail("Bad command: " + Arrays.toString(command));
return null;
}
}
/** Code from {@link NuxeoLauncher#init} */
protected String getRegex() {
return "^(?!/bin/sh).*" + Pattern.quote(NUXEO_PATH) + ".*"
+ Pattern.quote(STARTUP_CLASS) + ".*$";
}
protected static void assertSolarisMatch(MockSolarisProcessManager pm,
String expectedPid, String expectedCommand, String line) {
Matcher lineMatcher = pm.getLineMatcher(line);
assertTrue(lineMatcher.matches());
String pid = lineMatcher.group(1);
String command = lineMatcher.group(2);
assertEquals(expectedPid, pid);
assertEquals(expectedCommand, command);
}
@Test
public void testSolarisProcessManagerParsing() throws Exception {
MockSolarisProcessManager pm = new MockSolarisProcessManager();
pm.setLines("uname", Collections.singletonList("5.11"));
assertEquals("5.11", pm.getSolarisVersion());
assertSolarisMatch(pm, "3", SOL_PS1_CMD, SOL_PS1);
assertSolarisMatch(pm, "1786", SOL_PS2_CMD, SOL_PS2);
assertSolarisMatch(pm, "1921", SOL_PS3_CMD, SOL_PS3);
assertSolarisMatch(pm, "2788", SOL_PS4_CMD, SOL_PS4);
pm.setLines("ps", Arrays.asList(SOL_PS1, SOL_PS2, SOL_PS3, SOL_PS4));
assertEquals("2788", pm.findPid(getRegex()));
}
@Override
@Before
public void setUp() throws Exception {
nuxeoHome = new File("target/launcher");
FileUtils.deleteQuietly(nuxeoHome);
nuxeoHome.mkdirs();
File nuxeoConf = getResourceFile("config/nuxeo.conf");
FileUtils.copyFileToDirectory(nuxeoConf, nuxeoHome);
FileUtils.copyDirectory(getResourceFile("templates"), new File(
nuxeoHome, "templates"));
System.setProperty(Environment.NUXEO_HOME, nuxeoHome.getPath());
System.setProperty(ConfigurationGenerator.NUXEO_CONF, new File(
nuxeoHome, nuxeoConf.getName()).getPath());
System.setProperty(
TomcatConfigurator.TOMCAT_HOME,
org.nuxeo.common.Environment.getDefault().getServerHome().getPath());
}
@Test
public void testClidOption() throws ConfigurationException, ParseException,
IOException, PackageException, InvalidCLID {
configGenerator = new ConfigurationGenerator();
assertTrue(configGenerator.init());
Path instanceClid = Paths.get(TEST_INSTANCE_CLID);
if (!Files.exists(instanceClid)) {
throw new AssumptionViolatedException("No test CLID available");
}
String[] args = new String[] { "--clid", instanceClid.toString(),
"showconf" };
final NuxeoLauncher launcher = NuxeoLauncher.createLauncher(args);
InstanceInfo info = launcher.showConfig();
assertNotNull("Failed to get instance info", info);
List<String> clidLines = Files.readAllLines(instanceClid,
Charsets.UTF_8);
LogicalInstanceIdentifier expectedClid = new LogicalInstanceIdentifier(
clidLines.get(0) + LogicalInstanceIdentifier.ID_SEP
+ clidLines.get(1), "expected clid");
assertEquals("Not the right instance.clid file: ",
expectedClid.getCLID(), info.clid);
}
@Override
@After
public void tearDown() {
FileUtils.deleteQuietly(nuxeoHome);
Properties sysProperties = System.getProperties();
sysProperties.remove(ConfigurationGenerator.NUXEO_CONF);
sysProperties.remove(Environment.NUXEO_HOME);
sysProperties.remove(TomcatConfigurator.TOMCAT_HOME);
sysProperties.remove(Environment.NUXEO_DATA_DIR);
sysProperties.remove(Environment.NUXEO_LOG_DIR);
}
}