/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.test.infrastructure.process.rules; import static java.lang.Boolean.parseBoolean; import static java.lang.System.getProperty; import static org.apache.commons.io.FileUtils.deleteDirectory; import static org.apache.commons.io.FileUtils.deleteQuietly; import static org.apache.commons.io.FileUtils.moveDirectory; import static org.apache.commons.lang.StringUtils.isEmpty; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import org.apache.commons.lang.StringUtils; import org.junit.rules.ExternalResource; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This is a JUnit rule to install Mule Runtime during tests. Usage: * <p> * * <pre> * public class MuleRuntimeInstallationTest { * * @Rule * public MuleInstallation installation = new MuleInstallation("/path/to/packed/distribution.zip"); * * @Test * public void usingMuleRuntime() throws IOException { * String muleHomePath = installation.getMuleHome(); * MuleProcessController mule = new MuleProcessController(muleHomePath); * mule.start(); * } * } * </pre> */ public class MuleInstallation extends ExternalResource { private static final String DISTRIBUTION_PROPERTY = "mule.distribution"; private static final String DISTRIBUTIONS_DIR = "servers"; private static final Path WORKING_DIRECTORY = Paths.get(getProperty("user.dir")).resolve(DISTRIBUTIONS_DIR); private static final String DELETE_ON_EXIT = getProperty("mule.test.deleteOnExit"); private static final String zippedDistributionFromProperty = getProperty(DISTRIBUTION_PROPERTY); private static Logger logger = LoggerFactory.getLogger(MuleInstallation.class); protected String location; private File distribution; private File muleHome; public MuleInstallation() { this(zippedDistributionFromProperty); } public MuleInstallation(String zippedDistribution) { if (StringUtils.isEmpty(zippedDistribution)) { logger.error("You must configure the location for Mule distribution in the system property: " + DISTRIBUTION_PROPERTY); } distribution = new File(zippedDistribution); if (!distribution.exists()) { throw new IllegalArgumentException("Packed distribution not found: " + distribution); } } public String getMuleHome() { return muleHome.getAbsolutePath(); } @Override public Statement apply(final Statement base, final Description description) { location = description.getTestClass().getSimpleName(); return super.apply(base, description); } @Override protected void before() throws Throwable { logger.info("Unpacking Mule Distribution: " + distribution); muleHome = new DistroUnzipper(distribution, WORKING_DIRECTORY.resolve(location).toFile()).unzip().muleHome(); } @Override protected void after() { File dest = new File(new File("logs"), location); deleteQuietly(dest); if (isEmpty(DELETE_ON_EXIT) || parseBoolean(DELETE_ON_EXIT)) { try { logger.info("Deleting Mule Installation"); File logs = new File(muleHome, "logs"); moveDirectory(logs, dest); deleteDirectory(muleHome); } catch (IOException e) { throw new RuntimeException("Couldn't delete directory [" + muleHome + "], delete it manually.", e); } } } }