/*
* 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.runner.api;
import static com.google.common.collect.Lists.newArrayList;
import static java.util.Collections.emptyMap;
import static org.apache.commons.io.FileUtils.writeStringToFile;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.emptyCollectionOf;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.rules.ExpectedException.none;
import static org.mule.runtime.deployment.model.api.plugin.ArtifactPluginDescriptor.MULE_PLUGIN_CLASSIFIER;
import static org.mule.runtime.deployment.model.api.plugin.ArtifactPluginDescriptor.MULE_PLUGIN_JSON;
import static org.mule.runtime.deployment.model.api.plugin.MavenClassLoaderConstants.EXPORTED_PACKAGES;
import static org.mule.runtime.deployment.model.api.plugin.MavenClassLoaderConstants.EXPORTED_RESOURCES;
import static org.mule.runtime.deployment.model.api.plugin.MavenClassLoaderConstants.MAVEN;
import org.mule.runtime.api.deployment.meta.MuleArtifactLoaderDescriptor;
import org.mule.runtime.api.deployment.meta.MulePluginModel;
import org.mule.runtime.api.deployment.meta.MulePluginModel.MulePluginModelBuilder;
import org.mule.runtime.api.deployment.persistence.MulePluginModelJsonSerializer;
import org.mule.tck.junit4.AbstractMuleTestCase;
import org.mule.tck.size.SmallTest;
import java.io.File;
import java.net.URL;
import java.util.Collections;
import java.util.List;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import org.mockito.Matchers;
@SmallTest
public class PluginResourcesResolverTestCase extends AbstractMuleTestCase {
private static final String ORG_MULE_TEST_RUNNER = "org.mule.test.runner";
private static final String ORG_MULE_TEST_RUNNER_API = "org.mule.test.runner.api";
private static final String META_INF_RESOURCE_PROPERTIES = "/META-INF/resource.properties";
private static final String META_INF_ANOTHER_RESOURCE_PROPERTIES = "/META-INF/anotherResource.properties";
@Rule
public ExpectedException expectedException = none();
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Test
public void resolvePluginResourcesForMulePluginWithoutPluginPropertiesDescriptor() {
PluginUrlClassification mulePluginClassification = newPluginUrlClassification(Collections.<URL>emptyList());
PluginResourcesResolver resolver = new PluginResourcesResolver();
expectedException.expect(IllegalStateException.class);
expectedException.expectMessage(Matchers.contains(MULE_PLUGIN_JSON + " couldn't be found for plugin"));
resolver.resolvePluginResourcesFor(mulePluginClassification);
}
@Test
public void resolvePluginResourcesForMulePlugin() throws Exception {
MulePluginModelBuilder builder = new MulePluginModelBuilder();
builder.withClassLoaderModelDescriber()
.setId("maven")
.addProperty(EXPORTED_PACKAGES, newArrayList(ORG_MULE_TEST_RUNNER, ORG_MULE_TEST_RUNNER_API))
.addProperty(EXPORTED_RESOURCES, newArrayList(META_INF_RESOURCE_PROPERTIES, META_INF_ANOTHER_RESOURCE_PROPERTIES))
.build();
builder.withBundleDescriptorLoader(new MuleArtifactLoaderDescriptor(MAVEN, emptyMap()));
MulePluginModel mulePluginModel = builder
.setName("samplePlugin")
.setMinMuleVersion("4.0.0")
.build();
String mulePluginModelJson = new MulePluginModelJsonSerializer().serialize(mulePluginModel);
File pluginPropertiesFile =
new File(new File(new File(temporaryFolder.getRoot(), "META-INF"), "mule-artifact"), MULE_PLUGIN_JSON);
writeStringToFile(pluginPropertiesFile, mulePluginModelJson);
URL classPathUrl = temporaryFolder.getRoot().toURI().toURL();
List<URL> urls = newArrayList(classPathUrl);
PluginUrlClassification mulePluginClassification = newPluginUrlClassification(urls);
PluginResourcesResolver resolver = new PluginResourcesResolver();
PluginUrlClassification result = resolver.resolvePluginResourcesFor(mulePluginClassification);
assertResolvedResources(mulePluginClassification, result);
}
private PluginUrlClassification newPluginUrlClassification(List<URL> urls) {
return new PluginUrlClassification(MULE_PLUGIN_CLASSIFIER, urls, Collections.<Class>emptyList(),
Collections.<String>emptyList());
}
private void assertResolvedResources(PluginUrlClassification original, PluginUrlClassification resolved) {
assertThat(resolved.getName(), equalTo(original.getName()));
assertThat(resolved.getUrls(), hasSize(1));
assertThat(resolved.getUrls(), equalTo(original.getUrls()));
assertThat(resolved.getExportClasses(), emptyCollectionOf(Class.class));
assertThat(resolved.getExportedPackages(), hasSize(2));
assertThat(resolved.getExportedPackages(), contains(ORG_MULE_TEST_RUNNER, ORG_MULE_TEST_RUNNER_API));
assertThat(resolved.getExportedResources(), hasSize(2));
assertThat(resolved.getExportedResources(), contains(META_INF_RESOURCE_PROPERTIES, META_INF_ANOTHER_RESOURCE_PROPERTIES));
}
}