/* * 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.extension.internal.loader; import static java.io.File.separator; import static java.lang.Thread.currentThread; import static java.util.Collections.emptySet; import static java.util.stream.Collectors.toList; import static org.custommonkey.xmlunit.XMLUnit.setIgnoreAttributeOrder; import static org.custommonkey.xmlunit.XMLUnit.setIgnoreComments; import static org.custommonkey.xmlunit.XMLUnit.setIgnoreWhitespace; import static org.custommonkey.xmlunit.XMLUnit.setNormalizeWhitespace; import static org.mule.runtime.api.dsl.DslResolvingContext.getDefault; import static org.mule.runtime.extension.internal.loader.XmlExtensionLoaderDelegate.XSD_SUFFIX; import static org.mule.runtime.extension.internal.loader.XmlExtensionModelLoader.RESOURCE_XML; import org.custommonkey.xmlunit.DetailedDiff; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.Difference; import org.custommonkey.xmlunit.XMLUnit; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.mule.runtime.api.meta.model.ExtensionModel; import org.mule.runtime.core.util.IOUtils; import org.mule.runtime.extension.api.resources.GeneratedResource; import org.mule.runtime.module.extension.internal.capability.xml.schema.SchemaXmlResourceFactory; import org.mule.tck.junit4.AbstractMuleTestCase; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Function; /** * Tests to ensure XSD generation coming from an XML using the {@link ExtensionModel} mechanism. * * @since 4.0 */ @RunWith(Parameterized.class) public class ModuleSchemaGeneratorTestCase extends AbstractMuleTestCase { @Parameterized.Parameter public ExtensionModel extensionModel; @Parameterized.Parameter(1) public String expectedXSD; @Parameterized.Parameter(2) public String extensionName; private SchemaXmlResourceFactory schemaXmlResourceFactory; @Parameterized.Parameters(name = "{index}: Validating xsd for {2}") public static Collection<Object[]> data() { final Class classLoader = ModuleSchemaGeneratorTestCase.class; final List<String> extensions = new ArrayList<String>() { { add("module-namespace-custom"); add("module-param-default-types"); add("module-param-custom-types"); add("module-param-role"); add("module-param-types"); add("module-properties-default-types"); add("module-properties-types"); add("module-single-op-with-property"); add("module-single-operation"); } }; Function<String, Object[]> stringFunction = moduleName -> { String moduleNamePrefix = "modules" + separator + "schema" + separator + moduleName; String modulePath = moduleNamePrefix + ".xml"; ClassLoader contextClassLoader = currentThread().getContextClassLoader(); Map<String, Object> parameters = new HashMap<>(); parameters.put(RESOURCE_XML, modulePath); ExtensionModel extensionModel = new XmlExtensionModelLoader().loadExtensionModel(contextClassLoader, getDefault(emptySet()), parameters); try { return new Object[] {extensionModel, IOUtils.getResourceAsString(moduleNamePrefix + XSD_SUFFIX, classLoader), extensionModel.getName() }; } catch (IOException e) { throw new IllegalArgumentException(String.format("Couldn't load .xsd for the [%s] module", moduleName)); } }; return extensions.stream().map(stringFunction).collect(toList()); } @Before public void setUp() throws IOException { schemaXmlResourceFactory = new SchemaXmlResourceFactory(); } @Test public void generateXsd() throws Exception { Optional<GeneratedResource> generatedResource = schemaXmlResourceFactory.generateResource(extensionModel); String schema = new String(generatedResource.get().getContent()); compareXML(expectedXSD, schema); } private void compareXML(String expected, String actual) throws Exception { setNormalizeWhitespace(true); setIgnoreWhitespace(true); setIgnoreComments(true); setIgnoreAttributeOrder(false); Diff diff = XMLUnit.compareXML(expected, actual); if (!(diff.similar() && diff.identical())) { System.out.println(actual); DetailedDiff detDiff = new DetailedDiff(diff); @SuppressWarnings("rawtypes") List differences = detDiff.getAllDifferences(); StringBuilder diffLines = new StringBuilder(); for (Object object : differences) { Difference difference = (Difference) object; diffLines.append(difference.toString() + '\n'); } throw new IllegalArgumentException("Actual XML differs from expected: \n" + diffLines.toString()); } } }