All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mule.runtime.module.embedded.EmbeddedTestHelper Maven / Gradle / Ivy

/*
 * 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.runtime.module.embedded;

import static java.lang.Thread.currentThread;
import static org.apache.commons.io.FileUtils.deleteDirectory;
import static org.apache.commons.io.FileUtils.toFile;
import static org.mule.maven.client.api.model.RemoteRepository.newRemoteRepositoryBuilder;
import static org.mule.maven.client.test.MavenTestHelper.createDefaultCommunityMavenConfigurationBuilder;
import static org.mule.maven.client.test.MavenTestHelper.createDefaultEnterpriseMavenConfigurationBuilder;
import static org.mule.maven.client.test.MavenTestHelper.getLocalRepositoryFolder;
import static org.mule.runtime.module.embedded.api.EmbeddedContainer.builder;
import org.mule.maven.client.api.model.MavenConfiguration;
import org.mule.runtime.module.embedded.api.ContainerConfiguration;
import org.mule.runtime.module.embedded.api.EmbeddedContainer;
import org.mule.runtime.module.embedded.internal.classloading.FilteringClassLoader;
import org.mule.runtime.module.embedded.internal.classloading.JdkOnlyClassLoaderFactory;

import java.io.File;
import java.io.IOException;
import java.util.function.Consumer;

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.model.ZipParameters;
import org.junit.rules.TemporaryFolder;

/**
 * Helper class for running embedded tests.
 * 
 * @since 4.0
 */
public class EmbeddedTestHelper {

  private final TemporaryFolder temporaryFolder;
  private final boolean enterprise;
  private File containerFolder;
  private File localRepositoryFolder;
  private EmbeddedContainer container;

  public EmbeddedTestHelper(boolean enterprise) {
    try {
      temporaryFolder = new TemporaryFolder();
      temporaryFolder.create();
      this.localRepositoryFolder = temporaryFolder.newFolder();
      this.enterprise = enterprise;
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

  public void recreateContainerFolder() {
    try {
      this.containerFolder = temporaryFolder.newFolder();
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

  /**
   * Sets the proper context for creating an embedded container
   * 
   * @param runnable a task that will create a {@link org.mule.runtime.module.embedded.api.EmbeddedContainer} for testing
   *        purposes.
   */
  public void test(Runnable runnable) {
    ClassLoader contextClassLoader = currentThread().getContextClassLoader();
    try {
      // Sets a classloader with the JDK only to ensure that dependencies are read form the embedded container classloader
      FilteringClassLoader jdkOnlyClassLoader = JdkOnlyClassLoaderFactory.create();
      currentThread().setContextClassLoader(jdkOnlyClassLoader);

      runnable.run();
    } finally {
      currentThread().setContextClassLoader(contextClassLoader);
    }
  }

  /**
   * Preconfigures the {@link EmbeddedContainer} with default settings
   * 
   * @param embeddedContainerConfigurer function to add configuration to the embedded container
   * @param test function that run the tests
   */
  public void testWithDefaultSettings(Consumer embeddedContainerConfigurer,
                                      Consumer test) {
    test(() -> {
      EmbeddedContainer.EmbeddedContainerBuilder embeddedContainerBuilder;
      try {
        recreateContainerFolder();
        MavenConfiguration.MavenConfigurationBuilder mavenConfigurationBuilder =
            enterprise ? createDefaultEnterpriseMavenConfigurationBuilder() : createDefaultCommunityMavenConfigurationBuilder();
        embeddedContainerBuilder = builder()
            .muleVersion(System.getProperty("mule.version"))
            .containerConfiguration(ContainerConfiguration.builder().containerFolder(containerFolder).build())
            .mavenConfiguration(mavenConfigurationBuilder.localMavenRepositoryLocation(localRepositoryFolder)
                .remoteRepository(newRemoteRepositoryBuilder().id("local.repo")
                    .url(getLocalRepositoryFolder().toURI().toURL())
                    .build())
                .build());
        embeddedContainerConfigurer.accept(embeddedContainerBuilder);
      } catch (Exception e) {
        throw new RuntimeException(e);
      }

      container = null;
      try {
        container = embeddedContainerBuilder.build();
        container.start();
        test.accept(container);
      } finally {
        if (container != null)
          try {
            container.stop();
            deleteDirectory(containerFolder);
          } catch (Throwable containerStopException) {
            // Never mind
          }
      }
    });
  }

  public File getContainerFolder() {
    return containerFolder;
  }

  public void dispose() {
    temporaryFolder.delete();
  }

  public File getPackagedApplication(File applicationFolder) throws Exception {
    File compressedFile = temporaryFolder.newFile(applicationFolder.getName());
    ZipFile zipFile = new ZipFile(compressedFile.getAbsolutePath() + ".jar");
    File[] files = applicationFolder.listFiles();
    for (File file : files) {
      if (file.isDirectory()) {
        zipFile.addFolder(file, new ZipParameters());
      } else {
        zipFile.addFile(file, new ZipParameters());
      }
    }
    return zipFile.getFile();
  }

  public File getFolderForApplication(String applicationFolderName) {
    return toFile(getClass().getClassLoader().getResource(applicationFolderName));
  }

  public EmbeddedContainer getContainer() {
    return container;
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy