This is an automated email from the ASF dual-hosted git repository. kdoran pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push: new c1c1d0da82 NIFI-10153 Refactored DocGeneratorTest and removed binary test files c1c1d0da82 is described below commit c1c1d0da8261004559029c11c59fb9b019df27a2 Author: exceptionfactory <exceptionfact...@apache.org> AuthorDate: Wed Jun 22 10:57:57 2022 -0500 NIFI-10153 Refactored DocGeneratorTest and removed binary test files This closes #6146 Signed-off-by: Kevin Doran <kdo...@apache.org> --- .../nifi/documentation/DocGeneratorTest.java | 152 ++++++++++----------- .../src/test/resources/conf/nifi.properties | 125 ----------------- .../src/test/resources/lib/example.nar | Bin 721040 -> 0 bytes .../src/test/resources/lib/jetty.nar | Bin 4638519 -> 0 bytes .../src/test/resources/lib/nifi-framework-nar.nar | Bin 406 -> 0 bytes .../src/test/resources/lib/nifiserver-test-nar.nar | Bin 298794 -> 0 bytes 6 files changed, 69 insertions(+), 208 deletions(-) diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/java/org/apache/nifi/documentation/DocGeneratorTest.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/java/org/apache/nifi/documentation/DocGeneratorTest.java index 749d938820..617fa7e39c 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/java/org/apache/nifi/documentation/DocGeneratorTest.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/java/org/apache/nifi/documentation/DocGeneratorTest.java @@ -19,101 +19,87 @@ package org.apache.nifi.documentation; import org.apache.commons.io.FileUtils; import org.apache.nifi.bundle.Bundle; import org.apache.nifi.bundle.BundleCoordinate; -import org.apache.nifi.nar.ExtensionDiscoveringManager; +import org.apache.nifi.bundle.BundleDetails; +import org.apache.nifi.documentation.example.ProcessorWithLogger; +import org.apache.nifi.nar.ExtensionDefinition; +import org.apache.nifi.nar.ExtensionManager; import org.apache.nifi.nar.ExtensionMapping; -import org.apache.nifi.nar.NarClassLoadersHolder; -import org.apache.nifi.nar.NarUnpacker; -import org.apache.nifi.nar.StandardExtensionDiscoveringManager; -import org.apache.nifi.nar.SystemBundle; -import org.apache.nifi.nar.NarUnpackMode; +import org.apache.nifi.processor.Processor; import org.apache.nifi.util.NiFiProperties; -import org.junit.Assert; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.io.TempDir; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; -import java.io.BufferedInputStream; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Collection; +import java.util.Collections; import java.util.Properties; import java.util.Set; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) public class DocGeneratorTest { + private static final Class<ProcessorWithLogger> PROCESSOR_CLASS = ProcessorWithLogger.class; + + private static final String[] HTML_EXTENSIONS = new String[]{"html"}; + + private static final boolean RECURSIVE_ENABLED = true; + + @Mock + ExtensionManager extensionManager; @Test - public void testProcessorLoadsNarResources() throws IOException, ClassNotFoundException { - TemporaryFolder temporaryFolder = new TemporaryFolder(); - temporaryFolder.create(); - - NiFiProperties properties = loadSpecifiedProperties("/conf/nifi.properties", - NiFiProperties.COMPONENT_DOCS_DIRECTORY, - temporaryFolder.getRoot().getAbsolutePath()); - - final Bundle systemBundle = SystemBundle.create(properties); - final ExtensionMapping mapping = NarUnpacker.unpackNars(properties, systemBundle, NarUnpackMode.UNPACK_INDIVIDUAL_JARS); - - NarClassLoadersHolder.getInstance().init(properties.getFrameworkWorkingDirectory(), properties.getExtensionsWorkingDirectory()); - - final ExtensionDiscoveringManager extensionManager = new StandardExtensionDiscoveringManager(); - extensionManager.discoverExtensions(systemBundle, NarClassLoadersHolder.getInstance().getBundles()); - - DocGenerator.generate(properties, extensionManager, mapping); - - final String extensionClassName = "org.apache.nifi.processors.WriteResourceToStream"; - final BundleCoordinate coordinate = mapping.getProcessorNames().get(extensionClassName).stream().findFirst().get(); - final String path = coordinate.getGroup() + "/" + coordinate.getId() + "/" + coordinate.getVersion() + "/" + extensionClassName; - File processorDirectory = new File(temporaryFolder.getRoot(), path); - File indexHtml = new File(processorDirectory, "index.html"); - Assert.assertTrue(indexHtml + " should have been generated", indexHtml.exists()); - String generatedHtml = FileUtils.readFileToString(indexHtml, Charset.defaultCharset()); - Assert.assertNotNull(generatedHtml); - Assert.assertTrue(generatedHtml.contains("This example processor loads a resource from the nar and writes it to the FlowFile content")); - Assert.assertTrue(generatedHtml.contains("files that were successfully processed")); - Assert.assertTrue(generatedHtml.contains("files that were not successfully processed")); - Assert.assertTrue(generatedHtml.contains("resources")); + void testGenerateExtensionsNotFound(@TempDir final File workingDirectory) { + final NiFiProperties properties = getProperties(workingDirectory); + final ExtensionMapping extensionMapping = new ExtensionMapping(); + + DocGenerator.generate(properties, extensionManager, extensionMapping); + + final Collection<File> files = FileUtils.listFiles(workingDirectory, HTML_EXTENSIONS, RECURSIVE_ENABLED); + assertTrue(files.isEmpty()); + } + + @Test + void testGenerateProcessor(@TempDir final File workingDirectory) throws IOException { + final NiFiProperties properties = getProperties(workingDirectory); + final ExtensionMapping extensionMapping = new ExtensionMapping(); + + final BundleCoordinate bundleCoordinate = BundleCoordinate.UNKNOWN_COORDINATE; + final BundleDetails bundleDetails = new BundleDetails.Builder().workingDir(workingDirectory).coordinate(bundleCoordinate).build(); + final Bundle bundle = new Bundle(bundleDetails, getClass().getClassLoader()); + final ExtensionDefinition definition = new ExtensionDefinition(PROCESSOR_CLASS.getName(), bundle, Processor.class); + final Set<ExtensionDefinition> extensions = Collections.singleton(definition); + when(extensionManager.getExtensions(eq(Processor.class))).thenReturn(extensions); + doReturn(PROCESSOR_CLASS).when(extensionManager).getClass(eq(definition)); + + final Processor processor = new ProcessorWithLogger(); + when(extensionManager.getTempComponent(eq(PROCESSOR_CLASS.getName()), eq(bundleCoordinate))).thenReturn(processor); + + DocGenerator.generate(properties, extensionManager, extensionMapping); + + final Collection<File> files = FileUtils.listFiles(workingDirectory, HTML_EXTENSIONS, RECURSIVE_ENABLED); + assertFalse(files.isEmpty()); + + final File file = files.iterator().next(); + final byte[] bytes = Files.readAllBytes(file.toPath()); + final String html = new String(bytes, StandardCharsets.UTF_8); + + assertTrue(html.contains(PROCESSOR_CLASS.getSimpleName())); } - private NiFiProperties loadSpecifiedProperties(final String propertiesFile, final String key, final String value) { - String file = DocGeneratorTest.class.getResource(propertiesFile).getFile(); - - System.setProperty(NiFiProperties.PROPERTIES_FILE_PATH, file); - - final Properties props = new Properties(); - InputStream inStream = null; - try { - inStream = new BufferedInputStream(new FileInputStream(file)); - props.load(inStream); - } catch (final Exception ex) { - throw new RuntimeException("Cannot load properties file due to " - + ex.getLocalizedMessage(), ex); - } finally { - if (null != inStream) { - try { - inStream.close(); - } catch (final Exception ex) { - /** - * do nothing * - */ - } - } - } - - if (key != null && value != null) { - props.setProperty(key, value); - } - - return new NiFiProperties() { - @Override - public String getProperty(String key) { - return props.getProperty(key); - } - - @Override - public Set<String> getPropertyKeys() { - return props.stringPropertyNames(); - } - }; + private NiFiProperties getProperties(final File workingDirectory) { + final Properties properties = new Properties(); + properties.setProperty(NiFiProperties.COMPONENT_DOCS_DIRECTORY, workingDirectory.getAbsolutePath()); + return NiFiProperties.createBasicNiFiProperties(null, properties); } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/conf/nifi.properties b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/conf/nifi.properties deleted file mode 100644 index bc0e5346ff..0000000000 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/conf/nifi.properties +++ /dev/null @@ -1,125 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Core Properties # -nifi.flow.configuration.file=./target/flow.xml.gz -nifi.flow.configuration.archive.dir=./target/archive/ -nifi.flowcontroller.autoResumeState=true -nifi.flowcontroller.graceful.shutdown.period=10 sec -nifi.flowservice.writedelay.interval=2 sec -nifi.administrative.yield.duration=30 sec - -nifi.reporting.task.configuration.file=./target/reporting-tasks.xml -nifi.controller.service.configuration.file=./target/controller-services.xml -nifi.templates.directory=./target/templates -nifi.ui.banner.text=UI Banner Text -nifi.ui.autorefresh.interval=30 sec -nifi.nar.library.directory=./target/test-classes/lib/ -nifi.nar.library.directory.alt=./target/test-classes/lib2/ - -nifi.nar.working.directory=./target/work/nar/ - -# H2 Settings -nifi.database.directory=./target/database_repository -nifi.h2.url.append=;LOCK_TIMEOUT=25000;WRITE_DELAY=0;AUTO_SERVER=FALSE - -# FlowFile Repository -nifi.flowfile.repository.directory=./target/test-repo -nifi.flowfile.repository.partitions=1 -nifi.flowfile.repository.checkpoint.interval=2 mins -nifi.queue.swap.threshold=20000 -nifi.swap.storage.directory=./target/test-repo/swap -nifi.swap.in.period=5 sec -nifi.swap.in.threads=1 -nifi.swap.out.period=5 sec -nifi.swap.out.threads=4 - -# Content Repository -nifi.content.claim.max.appendable.size=10 MB -nifi.content.claim.max.flow.files=100 -nifi.content.repository.directory.default=./target/content_repository - -# Provenance Repository Properties -nifi.provenance.repository.storage.directory=./target/provenance_repository -nifi.provenance.repository.max.storage.time=24 hours -nifi.provenance.repository.max.storage.size=1 GB -nifi.provenance.repository.rollover.time=30 secs -nifi.provenance.repository.rollover.size=100 MB - -# Site to Site properties -nifi.remote.input.socket.port=9990 -nifi.remote.input.secure=true - -# web properties # -nifi.web.war.directory=./target/lib -nifi.web.http.host= -nifi.web.http.port=8080 -nifi.web.https.host= -nifi.web.https.port= -nifi.web.jetty.working.directory=./target/work/jetty - -# security properties # -nifi.sensitive.props.key=key -nifi.sensitive.props.algorithm=PBEWITHMD5AND256BITAES-CBC-OPENSSL - -nifi.security.keystore= -nifi.security.keystoreType= -nifi.security.keystorePasswd= -nifi.security.keyPasswd= -nifi.security.truststore= -nifi.security.truststoreType= -nifi.security.truststorePasswd= -nifi.security.user.authorizer= - -# cluster common properties (cluster manager and nodes must have same values) # -nifi.cluster.protocol.heartbeat.interval=5 sec -nifi.cluster.protocol.is.secure=false -nifi.cluster.protocol.socket.timeout=30 sec -nifi.cluster.protocol.connection.handshake.timeout=45 sec -# if multicast is used, then nifi.cluster.protocol.multicast.xxx properties must be configured # -nifi.cluster.protocol.use.multicast=false -nifi.cluster.protocol.multicast.address= -nifi.cluster.protocol.multicast.port= -nifi.cluster.protocol.multicast.service.broadcast.delay=500 ms -nifi.cluster.protocol.multicast.service.locator.attempts=3 -nifi.cluster.protocol.multicast.service.locator.attempts.delay=1 sec - -# cluster node properties (only configure for cluster nodes) # -nifi.cluster.is.node=false -nifi.cluster.node.address= -nifi.cluster.node.protocol.port= -nifi.cluster.node.protocol.threads=2 -# if multicast is not used, nifi.cluster.node.unicast.xxx must have same values as nifi.cluster.manager.xxx # -nifi.cluster.node.unicast.manager.address= -nifi.cluster.node.unicast.manager.protocol.port= -nifi.cluster.node.unicast.manager.authority.provider.port= - -# cluster manager properties (only configure for cluster manager) # -nifi.cluster.is.manager=false -nifi.cluster.manager.address= -nifi.cluster.manager.protocol.port= -nifi.cluster.manager.authority.provider.port= -nifi.cluster.manager.authority.provider.threads=10 -nifi.cluster.manager.node.firewall.file= -nifi.cluster.manager.node.event.history.size=10 -nifi.cluster.manager.node.api.connection.timeout=30 sec -nifi.cluster.manager.node.api.read.timeout=30 sec -nifi.cluster.manager.node.api.request.threads=10 -nifi.cluster.manager.flow.retrieval.delay=5 sec -nifi.cluster.manager.protocol.threads=10 -nifi.cluster.manager.safemode.duration=0 sec - -# analytics properties # -nifi.analytics.predict.interval=3 mins \ No newline at end of file diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/lib/example.nar b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/lib/example.nar deleted file mode 100644 index 0bca10b513..0000000000 Binary files a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/lib/example.nar and /dev/null differ diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/lib/jetty.nar b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/lib/jetty.nar deleted file mode 100644 index f92d6154d1..0000000000 Binary files a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/lib/jetty.nar and /dev/null differ diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/lib/nifi-framework-nar.nar b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/lib/nifi-framework-nar.nar deleted file mode 100644 index d2a8b9667e..0000000000 Binary files a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/lib/nifi-framework-nar.nar and /dev/null differ diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/lib/nifiserver-test-nar.nar b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/lib/nifiserver-test-nar.nar deleted file mode 100644 index c60026ecd1..0000000000 Binary files a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/resources/lib/nifiserver-test-nar.nar and /dev/null differ