/* * 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.capability.xml.schema; import static java.util.Arrays.asList; import static java.util.Arrays.stream; import static java.util.Collections.emptySet; import static org.apache.commons.lang.StringUtils.isBlank; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Answers.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.when; import static org.mule.runtime.module.extension.internal.capability.xml.schema.SpringSchemaBundleResourceFactory.BUNDLE_MASK; import static org.mule.runtime.module.extension.internal.capability.xml.schema.SpringSchemaBundleResourceFactory.GENERATED_FILE_NAME; import static org.mule.runtime.config.spring.dsl.api.xml.SchemaConstants.CURRENT_VERSION; import static org.mule.test.module.extension.internal.util.ExtensionsTestUtils.mockSubTypes; import org.mule.runtime.api.meta.model.ExtensionModel; import org.mule.runtime.api.meta.model.XmlDslModel; import org.mule.runtime.core.api.registry.ServiceRegistry; import org.mule.runtime.extension.api.dsl.syntax.resources.spi.DslResourceFactory; import org.mule.runtime.extension.api.resources.GeneratedResource; import org.mule.runtime.extension.api.resources.ResourcesGenerator; import org.mule.runtime.extension.api.resources.spi.GeneratedResourceFactory; import org.mule.runtime.module.extension.internal.config.ExtensionNamespaceHandler; import org.mule.runtime.module.extension.internal.resources.AbstractGeneratedResourceFactoryTestCase; import org.mule.runtime.module.extension.internal.resources.AnnotationProcessorResourceGenerator; import org.mule.tck.size.SmallTest; import java.util.ServiceLoader; import javax.annotation.processing.ProcessingEnvironment; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @SmallTest @RunWith(MockitoJUnitRunner.class) public class XmlGeneratedResourcesTestCase extends AbstractGeneratedResourceFactoryTestCase { private static final String EXTENSION_NAME = "extension"; private static final String EXTENSION_VERSION = "version"; private static final String SCHEMA_LOCATION = "mulesoft.com/extension"; private static final String UNESCAPED_LOCATION_PREFIX = "http://"; private static final String ESCAPED_LOCATION_PREFIX = "http\\://"; private static final String SCHEMA_NAME = "mule-extension.xsd"; @Mock private ExtensionModel extensionModel; @Mock(answer = RETURNS_DEEP_STUBS) private ServiceRegistry serviceRegistry; @Mock private ProcessingEnvironment processingEnvironment; private ResourcesGenerator generator; private XmlDslModel xmlDslModel; private SpringHandlerBundleResourceFactory springHandlerFactory = new SpringHandlerBundleResourceFactory(); private SpringSchemaBundleResourceFactory springSchemaBundleResourceFactory = new SpringSchemaBundleResourceFactory(); private SchemaXmlResourceFactory schemaXmlResourceFactory = new SchemaXmlResourceFactory(); @Before public void before() { xmlDslModel = XmlDslModel.builder() .setSchemaVersion(EXTENSION_VERSION) .setPrefix(EXTENSION_NAME) .setNamespace(UNESCAPED_LOCATION_PREFIX + SCHEMA_LOCATION) .setSchemaLocation(String.format("%s/%s/%s", UNESCAPED_LOCATION_PREFIX + SCHEMA_LOCATION, CURRENT_VERSION, SCHEMA_NAME)) .setXsdFileName(SCHEMA_NAME) .build(); when(extensionModel.getXmlDslModel()).thenReturn(xmlDslModel); mockSubTypes(extensionModel); when(extensionModel.getImportedTypes()).thenReturn(emptySet()); generator = new AnnotationProcessorResourceGenerator(asList(springHandlerFactory, springSchemaBundleResourceFactory, schemaXmlResourceFactory), processingEnvironment); when(extensionModel.getName()).thenReturn(EXTENSION_NAME); when(extensionModel.getVersion()).thenReturn(EXTENSION_VERSION); } @Override protected Class<? extends GeneratedResourceFactory>[] getResourceFactoryTypes() { return new Class[] {SpringHandlerBundleResourceFactory.class, SchemaXmlResourceFactory.class, SpringSchemaBundleResourceFactory.class}; } @Test public void spiDiscovery() throws Exception { ServiceLoader<DslResourceFactory> services = ServiceLoader.load(DslResourceFactory.class); assertThat(stream(getResourceFactoryTypes()).allMatch(factoryClass -> { for (GeneratedResourceFactory factory : services) { if (factoryClass.isAssignableFrom(factory.getClass())) { return true; } } return false; }), is(true)); } @Test public void generateSchema() throws Exception { GeneratedResource resource = schemaXmlResourceFactory.generateResource(extensionModel).get(); assertThat(isBlank(new String(resource.getContent())), is(false)); } @Test public void springHandlers() throws Exception { GeneratedResource resource = springHandlerFactory.generateResource(extensionModel).get(); assertThat(SpringHandlerBundleResourceFactory.GENERATED_FILE_NAME, equalTo(resource.getPath())); assertThat(new String(resource.getContent()), equalTo(String.format(SpringHandlerBundleResourceFactory.BUNDLE_MASK, ESCAPED_LOCATION_PREFIX + SCHEMA_LOCATION, ExtensionNamespaceHandler.class.getName()))); } @Test public void springSchemas() throws Exception { GeneratedResource resource = springSchemaBundleResourceFactory.generateResource(extensionModel).get(); assertThat(resource.getPath(), equalTo(GENERATED_FILE_NAME)); StringBuilder expected = new StringBuilder(); expected.append(String.format(BUNDLE_MASK, ESCAPED_LOCATION_PREFIX + SCHEMA_LOCATION, EXTENSION_VERSION, SCHEMA_NAME, SCHEMA_NAME)); expected.append(String.format(BUNDLE_MASK, ESCAPED_LOCATION_PREFIX + SCHEMA_LOCATION, "current", SCHEMA_NAME, SCHEMA_NAME)); assertThat(new String(resource.getContent()), equalTo(expected.toString())); } }