/*
* 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.extension.internal.resources;
import static java.lang.String.format;
import static java.util.Arrays.asList;
import static java.util.Collections.emptySet;
import static java.util.stream.Collectors.toList;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.core.Is.is;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mule.runtime.api.dsl.DslResolvingContext.getDefault;
import static org.mule.runtime.core.config.MuleManifest.getProductVersion;
import static org.mule.runtime.core.util.IOUtils.getResourceAsString;
import static org.mule.runtime.module.extension.internal.loader.java.AbstractJavaExtensionModelLoader.TYPE_PROPERTY_NAME;
import static org.mule.runtime.module.extension.internal.loader.java.AbstractJavaExtensionModelLoader.VERSION;
import org.mule.runtime.api.dsl.DslResolvingContext;
import org.mule.runtime.api.meta.model.ExtensionModel;
import org.mule.runtime.core.api.registry.ServiceRegistry;
import org.mule.runtime.extension.api.loader.DeclarationEnricher;
import org.mule.runtime.extension.api.loader.ExtensionModelLoader;
import org.mule.runtime.extension.api.persistence.ExtensionModelJsonSerializer;
import org.mule.runtime.module.extension.internal.loader.enricher.JavaXmlDeclarationEnricher;
import org.mule.runtime.module.extension.internal.loader.java.DefaultJavaExtensionModelLoader;
import org.mule.runtime.module.extension.internal.runtime.connectivity.basic.GlobalInnerPojoConnector;
import org.mule.runtime.module.extension.internal.runtime.connectivity.basic.GlobalPojoConnector;
import org.mule.runtime.module.extension.internal.runtime.connectivity.basic.ListConnector;
import org.mule.runtime.module.extension.internal.runtime.connectivity.basic.MapConnector;
import org.mule.runtime.module.extension.internal.runtime.connectivity.basic.StringListConnector;
import org.mule.runtime.module.extension.internal.runtime.connectivity.basic.TestConnector;
import org.mule.runtime.module.extension.soap.internal.loader.SoapExtensionModelLoader;
import org.mule.tck.junit4.AbstractMuleTestCase;
import org.mule.tck.size.SmallTest;
import org.mule.test.heisenberg.extension.HeisenbergExtension;
import org.mule.test.marvel.MarvelExtension;
import org.mule.test.metadata.extension.MetadataExtension;
import org.mule.test.oauth.TestOAuthExtension;
import org.mule.test.petstore.extension.PetStoreConnector;
import org.mule.test.ram.RickAndMortyExtension;
import org.mule.test.soap.extension.FootballSoapExtension;
import org.mule.test.subtypes.extension.SubTypesMappingConnector;
import org.mule.test.transactional.TransactionalExtension;
import org.mule.test.typed.value.extension.extension.TypedValueExtension;
import org.mule.test.vegan.extension.VeganExtension;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@SmallTest
@RunWith(Parameterized.class)
public class ExtensionModelJsonGeneratorTestCase extends AbstractMuleTestCase {
static final Map<String, ExtensionModel> extensionModels = new HashMap<>();
private static ExtensionModelLoader javaLoader = new DefaultJavaExtensionModelLoader();
private static ExtensionModelLoader soapLoader = new SoapExtensionModelLoader();
@Parameterized.Parameter(0)
public ExtensionModel extensionUnderTest;
@Parameterized.Parameter(1)
public String expectedSource;
private ExtensionModelJsonSerializer generator;
private String expectedJson;
@Parameterized.Parameters(name = "{1}")
public static Collection<Object[]> data() {
final ClassLoader classLoader = ExtensionModelJsonGeneratorTestCase.class.getClassLoader();
final ServiceRegistry serviceRegistry = mock(ServiceRegistry.class);
when(serviceRegistry.lookupProviders(DeclarationEnricher.class, classLoader))
.thenReturn(asList(new JavaXmlDeclarationEnricher()));
final List<SchemaGeneratorTestUnit> extensions = Arrays.asList(
new SchemaGeneratorTestUnit(javaLoader, MapConnector.class,
"map.json"),
new SchemaGeneratorTestUnit(javaLoader, ListConnector.class,
"list.json"),
new SchemaGeneratorTestUnit(javaLoader, TestConnector.class,
"basic.json"),
new SchemaGeneratorTestUnit(javaLoader,
StringListConnector.class,
"string-list.json"),
new SchemaGeneratorTestUnit(javaLoader,
GlobalPojoConnector.class,
"global-pojo.json"),
new SchemaGeneratorTestUnit(javaLoader,
GlobalInnerPojoConnector.class,
"global-inner-pojo.json"),
new SchemaGeneratorTestUnit(javaLoader, VeganExtension.class,
"vegan.json"),
new SchemaGeneratorTestUnit(javaLoader,
PetStoreConnector.class,
"petstore.json"),
new SchemaGeneratorTestUnit(javaLoader,
MetadataExtension.class,
"metadata.json"),
new SchemaGeneratorTestUnit(javaLoader,
HeisenbergExtension.class,
"heisenberg.json"),
new SchemaGeneratorTestUnit(javaLoader,
TransactionalExtension.class,
"tx-ext.json"),
new SchemaGeneratorTestUnit(javaLoader,
SubTypesMappingConnector.class,
"subtypes.json"),
new SchemaGeneratorTestUnit(javaLoader, MarvelExtension.class,
"marvel.json"),
new SchemaGeneratorTestUnit(soapLoader,
FootballSoapExtension.class,
"soap.json"),
new SchemaGeneratorTestUnit(soapLoader,
RickAndMortyExtension.class,
"ram.json"),
new SchemaGeneratorTestUnit(javaLoader,
TypedValueExtension.class,
"typed-value.json"),
new SchemaGeneratorTestUnit(javaLoader,
TestOAuthExtension.class,
"test-oauth.json"));
BiFunction<Class<?>, ExtensionModelLoader, ExtensionModel> createExtensionModel = (extension, loader) -> {
ExtensionModel model = loadExtension(extension, loader);
if (extensionModels.put(model.getName(), model) != null) {
throw new IllegalArgumentException(format("Extension names must be unique. Name [%s] for extension [%s] was already used",
model.getName(), extension.getName()));
}
return model;
};
return extensions.stream()
.map(e -> new Object[] {createExtensionModel.apply(e.getExtensionClass(), e.getLoader()), e.getFileName()})
.collect(toList());
}
@Before
public void setup() throws IOException {
generator = new ExtensionModelJsonSerializer(true);
expectedJson = getResourceAsString("models/" + expectedSource, getClass()).trim();
}
@Test
public void generate() throws Exception {
String json = generator.serialize(extensionUnderTest).trim();
if (!json.equals(expectedJson)) {
System.out.println(json);
}
assertThat(expectedJson, is(equalTo(json)));
}
public static ExtensionModel loadExtension(Class<?> clazz, ExtensionModelLoader loader) {
Map<String, Object> params = new HashMap<>();
params.put(TYPE_PROPERTY_NAME, clazz.getName());
params.put(VERSION, getProductVersion());
//TODO MULE-11797: as this utils is consumed from org.mule.runtime.module.extension.internal.capability.xml.schema.AbstractXmlResourceFactory.generateResource(org.mule.runtime.api.meta.model.ExtensionModel), this util should get dropped once the ticket gets implemented.
final DslResolvingContext dslResolvingContext = getDefault(emptySet());
return loader.loadExtensionModel(clazz.getClassLoader(), dslResolvingContext, params);
}
static class SchemaGeneratorTestUnit {
final ExtensionModelLoader loader;
final Class<?> extensionClass;
final String fileName;
SchemaGeneratorTestUnit(ExtensionModelLoader loader, Class<?> extensionClass, String fileName) {
this.loader = loader;
this.extensionClass = extensionClass;
this.fileName = fileName;
}
ExtensionModelLoader getLoader() {
return loader;
}
Class<?> getExtensionClass() {
return extensionClass;
}
String getFileName() {
return fileName;
}
}
}