This is an automated email from the ASF dual-hosted git repository. alopresto pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/master by this push: new ed19f61 NIFI-6331 Removed nifi-testharness module. ed19f61 is described below commit ed19f616821ae70cbca4dfdf56e51859b61c415c Author: Andy LoPresto <alopre...@apache.org> AuthorDate: Thu May 30 11:18:55 2019 -0700 NIFI-6331 Removed nifi-testharness module. This closes #3506. --- nifi-testharness/.gitignore | 1 - .../NIFI_TESTHARNESS_README.txt | 3 - nifi-testharness/pom.xml | 233 -------- .../SimpleNiFiFlowDefinitionEditor.java | 203 ------- .../apache/nifi/testharness/TestNiFiInstance.java | 620 --------------------- .../nifi/testharness/TestNiFiInstanceAware.java | 23 - .../testharness/api/FlowFileEditorCallback.java | 46 -- .../apache/nifi/testharness/util/FileUtils.java | 88 --- .../testharness/util/NiFiCoreLibClassLoader.java | 84 --- .../org/apache/nifi/testharness/util/XmlUtils.java | 67 --- .../java/org/apache/nifi/testharness/util/Zip.java | 134 ----- .../apache/nifi/testharness/samples/Constants.java | 32 -- .../nifi/testharness/samples/NiFiFlowTest.java | 157 ------ .../nifi/testharness/samples/NiFiMockFlowTest.java | 119 ---- .../apache/nifi/testharness/samples/TestUtils.java | 57 -- .../nifi/testharness/samples/mock/GetHTTPMock.java | 90 --- .../testharness/samples/mock/MockProcessor.java | 101 ---- nifi-testharness/src/test/resources/flow.xml | 154 ----- .../src/test/resources/logback-test.xml | 15 - .../src/test/resources/sample_technology_rss.xml | 24 - pom.xml | 1 - 21 files changed, 2252 deletions(-) diff --git a/nifi-testharness/.gitignore b/nifi-testharness/.gitignore deleted file mode 100644 index 17dff51..0000000 --- a/nifi-testharness/.gitignore +++ /dev/null @@ -1 +0,0 @@ -nifi_testharness_nifi_home/* \ No newline at end of file diff --git a/nifi-testharness/nifi_testharness_nifi_home/NIFI_TESTHARNESS_README.txt b/nifi-testharness/nifi_testharness_nifi_home/NIFI_TESTHARNESS_README.txt deleted file mode 100644 index e2d4da0..0000000 --- a/nifi-testharness/nifi_testharness_nifi_home/NIFI_TESTHARNESS_README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This directory is used to mimic NiFi's own home directory: the JVM hosting the -TestNiFiInstance has to be started here. Once started, TestNiFiInstance then -creates symlinks to the actual NiFi installation directory. \ No newline at end of file diff --git a/nifi-testharness/pom.xml b/nifi-testharness/pom.xml deleted file mode 100644 index fbafd7a..0000000 --- a/nifi-testharness/pom.xml +++ /dev/null @@ -1,233 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - 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. ---> -<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi</artifactId> - <version>1.10.0-SNAPSHOT</version> - </parent> - <artifactId>nifi-testharness</artifactId> - <description>A test harness for running NiFi flow tests</description> - <packaging>jar</packaging> - - <build> - <plugins> - <plugin> - <groupId>org.apache.rat</groupId> - <artifactId>apache-rat-plugin</artifactId> - <configuration> - <excludes combine.children="append"> - <exclude>nifi_testharness_nifi_home/NIFI_TESTHARNESS_README.txt</exclude> - <exclude>src/test/resources/sample_technology_rss.xml</exclude> - <exclude>src/test/resources/logback-test.xml</exclude> - <exclude>src/test/resources/flow.xml</exclude> - </excludes> - </configuration> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>compile</goal> - <goal>testCompile</goal> - </goals> - </execution> - </executions> - <configuration> - <source>1.8</source> - <target>1.8</target> - </configuration> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>2.20.1</version> - <configuration> - <forkCount>1</forkCount> - <reuseForks>false</reuseForks> - <workingDirectory>nifi_testharness_nifi_home</workingDirectory> - </configuration> - </plugin> - - </plugins> - </build> - - <profiles> - <profile> - <id>skip-testharness-tests</id> - <activation> - <activeByDefault>true</activeByDefault> - </activation> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <configuration> - <systemPropertyVariables> - <java.awt.headless>true</java.awt.headless> - </systemPropertyVariables> - <excludes> - <exclude>**/samples/*Test.class</exclude> - <exclude>**/samples/Test*.class</exclude> - <exclude>**/samples/*Spec.class</exclude> - </excludes> - <redirectTestOutputToFile>true</redirectTestOutputToFile> - <argLine combine.children="append">-Xmx1G - -Djava.net.preferIPv4Stack=true - ${maven.surefire.arguments} - </argLine> - </configuration> - </plugin> - </plugins> - </build> - </profile> - <profile> - <id>run-testharness-tests</id> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <configuration> - <reuseForks>false</reuseForks> - <workingDirectory>${project.basedir}/nifi_testharness_nifi_home</workingDirectory> - <systemPropertyVariables> - <java.awt.headless>true</java.awt.headless> - </systemPropertyVariables> - <includes> - <include>**/*Test.class</include> - <include>**/Test*.class</include> - <include>**/*Spec.class</include> - </includes> - <redirectTestOutputToFile>true</redirectTestOutputToFile> - <argLine combine.children="append">-Xmx1G - -Djava.net.preferIPv4Stack=true - ${maven.surefire.arguments} - </argLine> - </configuration> - </plugin> - </plugins> - </build> - </profile> - </profiles> - - - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <org.slf4j.version>1.7.25</org.slf4j.version> - </properties> - - <dependencies> - <dependency> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-runtime</artifactId> - <version>${project.version}</version> - <scope>provided</scope> - </dependency> - - <dependency> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-assembly</artifactId> - <version>${project.version}</version> - <scope>test</scope> - <type>pom</type> - </dependency> - - <dependency> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-framework-api</artifactId> - <version>${project.version}</version> - <scope>provided</scope> - </dependency> - - <dependency> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-framework-core</artifactId> - <version>${project.version}</version> - <scope>provided</scope> - </dependency> - - - <dependency> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-bootstrap</artifactId> - <version>${project.version}</version> - <scope>provided</scope> - </dependency> - - <dependency> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-api</artifactId> - <version>${project.version}</version> - <scope>provided</scope> - </dependency> - <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>javax.servlet-api</artifactId> - <version>3.1.0</version> - </dependency> - - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-server</artifactId> - <version>${jetty.version}</version> - <scope>provided</scope> - </dependency> - - - <dependency> - <groupId>org.easymock</groupId> - <artifactId>easymock</artifactId> - <version>3.4</version> - <scope>test</scope> - </dependency> - - - <dependency> - <groupId>org.easymock</groupId> - <artifactId>easymockclassextension</artifactId> - <version>3.2</version> - <scope>test</scope> - </dependency> - - - <dependency> - <groupId>org.powermock</groupId> - <artifactId>powermock-api-easymock</artifactId> - <version>1.7.1</version> - <scope>test</scope> - </dependency> - - - <dependency> - <groupId>org.powermock</groupId> - <artifactId>powermock-module-junit4</artifactId> - <version>1.7.1</version> - <scope>test</scope> - </dependency> - - </dependencies> - - -</project> diff --git a/nifi-testharness/src/main/java/org/apache/nifi/testharness/SimpleNiFiFlowDefinitionEditor.java b/nifi-testharness/src/main/java/org/apache/nifi/testharness/SimpleNiFiFlowDefinitionEditor.java deleted file mode 100644 index 27e6477..0000000 --- a/nifi-testharness/src/main/java/org/apache/nifi/testharness/SimpleNiFiFlowDefinitionEditor.java +++ /dev/null @@ -1,203 +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. - */ - - - -package org.apache.nifi.testharness; - -import org.apache.nifi.processor.Processor; -import org.apache.nifi.testharness.api.FlowFileEditorCallback; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathFactory; -import java.util.LinkedList; -import java.util.Objects; - - -/** - * <p> - * A facility to describe simple, common changes to a NiFi flow before it is installed to the test - * NiFi instance. Intended to be used by - * {@link TestNiFiInstance.Builder#modifyFlowXmlBeforeInstalling(FlowFileEditorCallback)} - * </p> - * - * <p> - * The desired edits can be configured via the {@link Builder} object returned by the {@link #builder()} - * method. Once fully configured, the {@link Builder#build()} emits a {@code FlowFileEditorCallback} - * object that can be passed to - * {@link TestNiFiInstance.Builder#modifyFlowXmlBeforeInstalling(FlowFileEditorCallback)}. - * </p> - * - * <p> - * <strong>CAUTION: THIS IS AN EXPERIMENTAL API: EXPECT CHANGES!</strong> - * Efforts will be made to retain backwards API compatibility, but - * no guarantee is given. - * </p> - * - * @see TestNiFiInstance.Builder#modifyFlowXmlBeforeInstalling(FlowFileEditorCallback) - * - */ - -public final class SimpleNiFiFlowDefinitionEditor implements FlowFileEditorCallback, TestNiFiInstanceAware { - - - private final LinkedList<FlowFileEditorCallback> delegateActions; - private TestNiFiInstance testNiFiInstance; - - private SimpleNiFiFlowDefinitionEditor(LinkedList<FlowFileEditorCallback> delegateActions) { - this.delegateActions = delegateActions; - } - - @Override - public Document edit(Document document) throws Exception { - - for (FlowFileEditorCallback change : delegateActions) { - if (change instanceof TestNiFiInstanceAware) { - ((TestNiFiInstanceAware)change).setTestNiFiInstance(testNiFiInstance); - } - - document = change.edit(document); - } - - return document; - } - - @Override - public void setTestNiFiInstance(TestNiFiInstance testNiFiInstance) { - this.testNiFiInstance = Objects.requireNonNull( - testNiFiInstance, "argument testNiFiInstance cannot be null"); - } - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - - private Builder() { - // no external instance - } - - private XPath xpath = XPathFactory.newInstance().newXPath(); - private final LinkedList<FlowFileEditorCallback> actions = new LinkedList<>(); - - public Builder rawXmlChange(FlowFileEditorCallback flowFileEditorCallback) { - actions.addLast(flowFileEditorCallback); - return this; - } - - public Builder setSingleProcessorProperty(String processorName, String propertyName, String newValue) { - - return rawXmlChange(document -> { - String xpathString = "//processor[name/text() = '" + processorName - + "']/property[name/text() = '" + propertyName + "']/value"; - - Node propertyValueNode = (Node) xpath.evaluate(xpathString, document, XPathConstants.NODE); - - if (propertyValueNode == null) { - throw new IllegalArgumentException("Reference to processor '"+ processorName +"' with property '" - + propertyName + "' not found: " + xpathString); - } - - propertyValueNode.setTextContent(newValue); - - return document; - }); - - - } - - public <P extends Processor> Builder setClassOfSingleProcessor(String processorName, Class<P> mockProcessor) { - - return setClassOfSingleProcessor(processorName, mockProcessor.getName()); - } - - public Builder setClassOfSingleProcessor(String processorName, String newFullyQualifiedClassName) { - - return rawXmlChange(document -> { - String xpathString = "//processor[name/text() = '" + processorName + "']/class"; - - Node classNameNode = (Node) xpath.evaluate(xpathString, document, XPathConstants.NODE); - - if (classNameNode == null) { - throw new IllegalArgumentException("Reference to processor '"+ processorName +" not found: " + - xpathString); - } - - classNameNode.setTextContent(newFullyQualifiedClassName); - - return document; - }); - } - - public Builder updateFlowFileBuiltInNiFiProcessorVersionsToNiFiVersion() { - - return rawXmlChange(new UpdateFlowFileNiFiVersionFlowFileEditorCallback()); - } - - - public SimpleNiFiFlowDefinitionEditor build() { - return new SimpleNiFiFlowDefinitionEditor(actions); - } - - } - - - private static final class UpdateFlowFileNiFiVersionFlowFileEditorCallback - implements FlowFileEditorCallback, TestNiFiInstanceAware { - - private TestNiFiInstance testNiFiInstance; - - @Override - public Document edit(Document document) throws Exception { - String niFiVersion = getNiFiVersion(); - - XPath xpath = XPathFactory.newInstance().newXPath(); - - NodeList processorNodeVersionList = (NodeList) - xpath.evaluate("//bundle/group[text() = \"org.apache.nifi\"]/parent::bundle/version", - document, XPathConstants.NODESET); - - final int length = processorNodeVersionList.getLength(); - for (int i=0; i<length; i++) { - Node processorNodeVersion = processorNodeVersionList.item(i); - - processorNodeVersion.setTextContent(niFiVersion); - } - - return document; - } - - private String getNiFiVersion() { - return Objects.requireNonNull( - testNiFiInstance, "testNiFiInstance cannot be null").getNifiVersion(); - } - - @Override - public void setTestNiFiInstance(TestNiFiInstance testNiFiInstance) { - this.testNiFiInstance = Objects.requireNonNull( - testNiFiInstance, "argument testNiFiInstance cannot be null"); - - } - - - } -} diff --git a/nifi-testharness/src/main/java/org/apache/nifi/testharness/TestNiFiInstance.java b/nifi-testharness/src/main/java/org/apache/nifi/testharness/TestNiFiInstance.java deleted file mode 100644 index e8a1fc6..0000000 --- a/nifi-testharness/src/main/java/org/apache/nifi/testharness/TestNiFiInstance.java +++ /dev/null @@ -1,620 +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. - */ - - - -package org.apache.nifi.testharness; - -import org.apache.nifi.EmbeddedNiFi; -import org.apache.nifi.testharness.api.FlowFileEditorCallback; -import org.apache.nifi.testharness.util.FileUtils; -import org.apache.nifi.testharness.util.NiFiCoreLibClassLoader; -import org.apache.nifi.testharness.util.XmlUtils; -import org.apache.nifi.testharness.util.Zip; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; -import java.util.zip.ZipEntry; - -/** - * <p> - * An API wrapper of a "test" NiFi instance to which a flow definition is installed for testing.</p> - * - * <p> - * Due to NiFi design restrictions, {@code TestNiFiInstance} has to take <i>full command</i> - * of the current working directory: it installs a full NiFi installation to there. To ensure - * this is desired, <strong>it will only run if the current directory is called - * "nifi_testharness_nifi_home"</strong>. As such the JVM process has to be started inside a directory - * called "nifi_testharness_nifi_home" so that the following is true: - * - * <pre><tt> - * new File(System.getProperty("user.dir")).getName().equals("nifi_testharness_nifi_home") - * </tt></pre> - * </p> - * - * <p> - * Before {@code TestNiFiInstance} can be used, it has to be configured via its builder - * interface: - * <ul> - * <li> - * {@link Builder#setNiFiBinaryDistributionZip(File)} specifies the location of the NiFi binary - * distribution ZIP file to be used. - * </li> - * <li> - * {@link Builder#setFlowXmlToInstallForTesting(File)} specifies the location of the NiFi flow - * to install. - * </li> - * <li> - * {@link Builder#modifyFlowXmlBeforeInstalling(FlowFileEditorCallback)} allows on-the-fly - * changes to be performed to the Flow file before it is actually installed. - * </li> - * </ul> - * - * <h5>Sample</h5> - * <pre><tt> - * TestNiFiInstance testNiFiInstance = TestNiFiInstance.builder() - * .setNiFiBinaryDistributionZip(YourConstants.NIFI_ZIP_FILE) - * .setFlowXmlToInstallForTesting(YourConstants.FLOW_XML_FILE) - * .modifyFlowXmlBeforeInstalling(YourConstants.FLOW_FILE_CHANGES_FOR_TESTS) - * .build(); - * </tt></pre> - * - * </p> - * - * <p> - * If the current working directory is called "nifi_testharness_nifi_home", the caller can - * {@link #install()} this {@code TestNiFiInstance}, which will - * <ol> - * <li> - * (as a first cleanup step) erase all content of the current working directory. - * (NOTE: this potentially destructive operation is the reason why we have the - * "nifi_testharness_nifi_home" directory name guard in place!) - * </li> - * <li> - * Extracts the contents of the NiFi binary distribution ZIP file specified in - * the configuration to a to a temporary directory. - * <li> - * Symlinks all files from the temporary directory to the current working - * directory, causing the directory to hold a fully functional - * NiFi installation. - * </li> - * <li> - * Installs the flow definition files(s) to the NiFi instance specified in - * the configuration. - * </li> - * </ol> - * </p> - * - * <p> - * - * The caller then can proceed to {@link #start()} this {@code TestNiFiInstance}, - * which will bootstrap the NiFi engine, which in turn will pick up and start processing - * the flow definition supplied by the caller in the configuration. - * </p> - * - * <p> - * Once the previous step is done, the caller can perform asserts regarding the observed behaviour - * of the NiFi flow, just like one would do it with standard Java test cases. - * </p> - * - * <p> - * To perform a clean shutdown of the hosted NiFi instance, the caller is required to call - * {@link #stopAndCleanup()}, which will shut down NiFi and remove all temporary files, including - * the symlinks created in the current working directory. - * </p> - * - * - * <h4>NOTES</h4> - * <ul> - * <li> - * {@code TestNiFiInstance} is NOT thread safe: if more than one thread uses it, - * external synchronisation is required. - * </li> - * <li> - * Only one {@code TestNiFiInstance} can be started in the same "nifi_testharness_nifi_home" - * directory at the same time. - * </li> - * <li> - * Currently, due to NiFi limitations, one {@code TestNiFiInstance} can be started per JVM process. - * If multiple test cases are required, launch a new JVM process per test case - * (in sequence, see the point above): Maven/Surefire has built-in support for this. - * </li> - * </ul> - * - * <p> - * <strong>CAUTION: THIS IS AN EXPERIMENTAL API: EXPECT CHANGES!</strong> - * Efforts will be made to retain backwards API compatibility, but - * no guarantee is given. - * </p> - * - * - * @see TestNiFiInstance#builder() - * - * - */ -public class TestNiFiInstance { - - private static final Logger LOGGER = LoggerFactory.getLogger(TestNiFiInstance.class); - - - private EmbeddedNiFi testNiFi; - - private final File nifiHomeDir; - private final File bootstrapLibDir; - - private File nifiProperties; - - private final File flowXmlGz; - - private final File placeholderNiFiHomeDir; - - private String nifiVersion; - - - private enum State { - STOPPED, - STOP_FAILED, - START_FAILED(STOPPED), - STARTED(STOPPED, STOP_FAILED), - INSTALLATION_FAILED(), - FLOW_INSTALLED(STARTED, START_FAILED), - INSTALLED(FLOW_INSTALLED, INSTALLATION_FAILED), - CREATED(INSTALLED, INSTALLATION_FAILED); - - - private final Set<State> allowedTransitions; - - State(State... allowedTransitions) { - this.allowedTransitions = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(allowedTransitions))); - } - - private void checkCanTransition(State newState) { - if (!this.allowedTransitions.contains(newState)) { - throw new IllegalStateException("Cannot transition from " + this + " to " + newState); - } - } - } - - private State currentState = State.CREATED; - - private final File nifiBinaryZip; - private final File flowXml; - private final FlowFileEditorCallback editCallback; - - private TestNiFiInstance(File nifiBinaryZip, File flowXml, FlowFileEditorCallback editCallback) { - this.nifiBinaryZip = Objects.requireNonNull(nifiBinaryZip, "nifiBinaryZip"); - this.flowXml = Objects.requireNonNull(flowXml, "flowXml"); - this.editCallback = editCallback; - - nifiHomeDir = requireCurrentWorkingDirectoryIsCorrect(); - - final File configDir = new File(nifiHomeDir, "conf"); - final File libDir = new File(nifiHomeDir, "lib"); - - bootstrapLibDir = new File(libDir, "bootstrap"); - - nifiProperties = new File(configDir, "nifi.properties"); - - flowXmlGz = new File(configDir, "flow.xml.gz"); - - placeholderNiFiHomeDir = requireCurrentWorkingDirectoryIsCorrect(); - } - - String getNifiVersion() { - switch (currentState) { - case INSTALLED: - case FLOW_INSTALLED: - case STARTED: - case START_FAILED: - case STOP_FAILED: - case STOPPED: - - return Objects.requireNonNull(nifiVersion, "nifiVersion is null"); - - default: - throw new IllegalStateException( - "NiFi version can only be retrieved after a successful installation, not in: " - + currentState); - } - } - - public void install() throws IOException { - - currentState.checkCanTransition(State.INSTALLED); - - File[] staleInstallations = placeholderNiFiHomeDir.listFiles((dir, name) -> name.startsWith("nifi-")); - if (staleInstallations != null) { - Arrays.stream(staleInstallations).forEach(TestNiFiInstance::deleteFileOrDirectoryRecursively); - } - - Path tempDirectory = null; - try { - tempDirectory = Files.createTempDirectory("installable-flow"); - - - - LOGGER.info("Uncompressing NiFi archive {} to {} ...", nifiBinaryZip, placeholderNiFiHomeDir); - - Zip.unzipFile(nifiBinaryZip, placeholderNiFiHomeDir, new Zip.StatusListenerAdapter() { - @Override - public void onUncompressDone(ZipEntry ze) { - LOGGER.debug("Uncompressed {}", ze.getName()); - } - }); - - LOGGER.info("Uncompressing DONE"); - - File actualNiFiHomeDir = getActualNiFiHomeDir(placeholderNiFiHomeDir); - - nifiVersion = getNiFiVersion(actualNiFiHomeDir); - - currentState = State.INSTALLED; - - File installableFlowFile = createInstallableFlowFile(tempDirectory); - - validateNiFiVersionAgainstFlowVersion(nifiVersion, installableFlowFile); - - FileUtils.createSymlinks(placeholderNiFiHomeDir, actualNiFiHomeDir); - - installFlowFile(installableFlowFile); - } catch (Exception e) { - - currentState = State.INSTALLATION_FAILED; - - throw new RuntimeException("Installation failed: " + e.getMessage(), e); - - } finally { - if (tempDirectory != null) { - FileUtils.deleteDirectoryRecursive(tempDirectory); - } - } - - currentState = State.FLOW_INSTALLED; - } - - private File createInstallableFlowFile(Path tempDirectory) throws IOException { - - File flowXmlFile = new File(tempDirectory.toFile(), "flow.xml"); - - if (editCallback == null) { - Files.copy(flowXml.toPath(), flowXmlFile.toPath()); - } else { - if (editCallback instanceof TestNiFiInstanceAware) { - ((TestNiFiInstanceAware)editCallback).setTestNiFiInstance(this); - } - - XmlUtils.editXml(flowXml, flowXmlFile, editCallback); - } - - return flowXmlFile; - } - - private void installFlowFile(File fileToIncludeInGz) throws IOException { - Zip.gzipFile(fileToIncludeInGz, flowXmlGz); - } - - private static String getNiFiVersion(File nifiInstallDir) { - - File libDir = new File(nifiInstallDir, "lib"); - if (!libDir.exists()) { - throw new IllegalStateException( - "No \"lib\" directory found in NiFi home directory: " + nifiInstallDir); - } - - File[] nifiApiJarLookupResults = - libDir.listFiles((dir, name) -> name.startsWith("nifi-api-") && name.endsWith(".jar")); - - if (nifiApiJarLookupResults == null) { - // since we check the existence before, this can only be null in case of an I/O error - throw new IllegalStateException( - "I/O error listing NiFi lib directory: " + libDir); - } - - if (nifiApiJarLookupResults.length == 0) { - throw new IllegalStateException( - "No \"\"nifi-api-*.jar\" file found in NiFi lib directory: " + libDir); - } - - if (nifiApiJarLookupResults.length != 1) { - throw new IllegalStateException( - "Multiple \"nifi-api-*.jar\" files found in NiFi lib directory: " + libDir); - } - - File nifiApiJar = nifiApiJarLookupResults[0]; - - - return nifiApiJar.getName() - .replace("nifi-api-", "") - .replace(".jar", ""); - } - - private static void validateNiFiVersionAgainstFlowVersion(String nifiVersion, File flowFile) { - - String flowFileVersion = extractFlowFileVersion(flowFile); - - if (flowFileVersion != null - && !flowFileVersion.equalsIgnoreCase(nifiVersion)) { - - // prevent user errors and fail fast in case we detect that the flow file - // was created by a different version of NiFi. This can prevent a lot of confusion! - - throw new RuntimeException(String.format( - "The NiFi version referenced in the flow file ('%s') does not match the version of NiFi being used ('%s')", - flowFileVersion, nifiVersion)); - } - } - - private static String extractFlowFileVersion(File flowFile) { - - Document flowDocument = XmlUtils.getFileAsDocument(flowFile); - - XPath xpath = XPathFactory.newInstance().newXPath(); - - try { - NodeList processorNodeVersion = (NodeList) - xpath.evaluate("//bundle/group[text() = \"org.apache.nifi\"]/parent::bundle/version/text()", - flowDocument, XPathConstants.NODESET); - - HashSet<String> versionNumbers = new HashSet<>(); - - final int length = processorNodeVersion.getLength(); - for (int i=0; i<length; i++) { - Node item = processorNodeVersion.item(i); - - String textContent = item.getTextContent(); - - versionNumbers.add(textContent); - } - - if (versionNumbers.size() == 0) { - return null; - } - - if (versionNumbers.size() > 1) { - throw new RuntimeException( - "Multiple NiFi versions found in Flow file, this is unexpected: " + versionNumbers); - } - - return versionNumbers.iterator().next(); - - } catch (XPathExpressionException e) { - throw new RuntimeException("Failure extracting version information from flow file: " + flowFile, e); - } - } - - - public void start() { - - currentState.checkCanTransition(State.STARTED); - - try { - if (!bootstrapLibDir.exists()) { - throw new IllegalStateException("Not found: " + bootstrapLibDir); - } - - - - System.setProperty("org.apache.jasper.compiler.disablejsr199", "true"); - System.setProperty("java.security.egd", "file:/dev/urandom"); - System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); - System.setProperty("java.net.preferIPv4Stack", "true"); - System.setProperty("java.awt.headless", "true"); - System.setProperty("java.protocol.handler.pkgs", "sun.net.www.protocol"); - - System.setProperty("nifi.properties.file.path", nifiProperties.getAbsolutePath()); - System.setProperty("app", "NiFi"); - System.setProperty("org.apache.nifi.bootstrap.config.log.dir", "./logs"); - - ClassLoader coreClassLoader = new NiFiCoreLibClassLoader(nifiHomeDir, ClassLoader.getSystemClassLoader()); - Thread.currentThread().setContextClassLoader(coreClassLoader); - - - - this.testNiFi = new EmbeddedNiFi(new String[0], coreClassLoader); - - } catch (Exception ex) { - - currentState = State.START_FAILED; - - throw new RuntimeException("Startup failed", ex); - - } - - currentState = State.STARTED; - - - } - - - public void stopAndCleanup() { - currentState.checkCanTransition(State.STOPPED); - - try { - testNiFi.shutdown(); - - removeNiFiFilesCreatedForTemporaryInstallation(placeholderNiFiHomeDir); - - } catch (Exception e) { - currentState = State.STOP_FAILED; - - throw new RuntimeException(e); - } - - currentState = State.STOPPED; - } - - private static File requireCurrentWorkingDirectoryIsCorrect() { - - File currentWorkDir = new File(System.getProperty("user.dir")); - if (!currentWorkDir.getName().equals("nifi_testharness_nifi_home")) { - - throw new IllegalStateException( - "The test's working directory has to be set to nifi_testharness_nifi_home, but was: " + currentWorkDir); - } - return currentWorkDir; - } - - private static File getActualNiFiHomeDir(File currentDir) { - File[] files = currentDir.listFiles((dir, name) -> name.startsWith("nifi-")); - - if (files == null || files.length == 0) { - throw new IllegalStateException( - "No \"nifi-*\" directory found in temporary NiFi home directory container: " + currentDir); - } - - if (files.length != 1) { - throw new IllegalStateException( - "Multiple \"nifi-*\" directories found in temporary NiFi home directory container: " + currentDir); - } - - return files[0]; - } - - private static void removeNiFiFilesCreatedForTemporaryInstallation(File directoryToClear) { - - if (directoryToClear != null) { - File[] directoryContents = directoryToClear.listFiles(); - if (directoryContents != null) { - Arrays.stream(directoryContents) - .filter(file -> !"NIFI_TESTHARNESS_README.txt".equals(file.getName())) - .forEach(TestNiFiInstance::deleteFileOrDirectoryRecursively); - } - } - } - - private static void deleteFileOrDirectoryRecursively(File file) { - if (file.isDirectory()) { - FileUtils.deleteDirectoryRecursive(file); - } else { - boolean deletedSuccessfully = file.delete(); - if (!deletedSuccessfully) { - throw new RuntimeException("Could not delete: " + file); - } - } - } - - @Override - public String toString() { - return "NiFi test instance(" + Integer.toHexString(hashCode()) - + ") state: " + currentState + ", home: " + nifiHomeDir; - } - - public static Builder builder() { - return new Builder(); - } - - - public static class Builder { - - private boolean isDisposed = false; - - private File nifiBinaryZip; - private File flowXml; - private FlowFileEditorCallback editCallback; - - /** - * Sets the location of the NiFi binary distribution file, from which the test instance - * will be uncompressed and built. - * - * @param nifiBinaryZip - * the NiFi binary distribution file, from which the test instance will be built (never {@code null}) - * @return {@code this} (for method chaining) - */ - public Builder setNiFiBinaryDistributionZip(File nifiBinaryZip) { - if (!nifiBinaryZip.exists()) { - throw new IllegalArgumentException("File not found: " + nifiBinaryZip); - } - - if (nifiBinaryZip.isDirectory()) { - throw new IllegalArgumentException("A ZIP file is expected to be specified, not a directory: " - + nifiBinaryZip); - } - - this.nifiBinaryZip = nifiBinaryZip; - return this; - } - - /** - * Sets the NiFi flow XML, which will be installed to the NiFi instance for testing. - * - * @param flowXml the NiFi flow file to install to the test instance for testing (never {@code null}) - * - * @return {@code this} (for method chaining) - */ - public Builder setFlowXmlToInstallForTesting(File flowXml) { - if (!flowXml.exists()) { - throw new IllegalArgumentException("File not found: " + flowXml); - } - - this.flowXml = flowXml; - return this; - } - - /** - * <p> - * An <strong>optional</strong> callback to change the flow definition read from - * {@link #setFlowXmlToInstallForTesting(File)}, before it is actually installed for testing. - * (NOTE: The original file remains unchanged: changes are applied to a copy of it.)</p> - * - * <p> - * NOTE: {@link SimpleNiFiFlowDefinitionEditor} provides various common flow definition changes - * useful for testing. - * </p> - * - * @param callback an <strong>optional</strong> callback to change the flow definition - * - * @return {@code this} (for method chaining) - * - * @see SimpleNiFiFlowDefinitionEditor - */ - public Builder modifyFlowXmlBeforeInstalling(FlowFileEditorCallback callback) { - this.editCallback = callback; - return this; - } - - - - public TestNiFiInstance build() { - if (isDisposed) { - throw new IllegalStateException("builder can only be used once"); - } - isDisposed = true; - - return new TestNiFiInstance(nifiBinaryZip, flowXml, editCallback); - } - - - } - - -} diff --git a/nifi-testharness/src/main/java/org/apache/nifi/testharness/TestNiFiInstanceAware.java b/nifi-testharness/src/main/java/org/apache/nifi/testharness/TestNiFiInstanceAware.java deleted file mode 100644 index 31889ed..0000000 --- a/nifi-testharness/src/main/java/org/apache/nifi/testharness/TestNiFiInstanceAware.java +++ /dev/null @@ -1,23 +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. - */ - - -package org.apache.nifi.testharness; - -public interface TestNiFiInstanceAware { - void setTestNiFiInstance(TestNiFiInstance testNiFiInstance); -} diff --git a/nifi-testharness/src/main/java/org/apache/nifi/testharness/api/FlowFileEditorCallback.java b/nifi-testharness/src/main/java/org/apache/nifi/testharness/api/FlowFileEditorCallback.java deleted file mode 100644 index dabf361..0000000 --- a/nifi-testharness/src/main/java/org/apache/nifi/testharness/api/FlowFileEditorCallback.java +++ /dev/null @@ -1,46 +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. - */ - - - -package org.apache.nifi.testharness.api; - -import org.w3c.dom.Document; - -/** - * <p> - * An interface that allows programmatic access to the contents of a NiFi Flow XML, - * allowing changes to be performed before it - * is actually installed to the NiFi instance.</p> - * - * <p> - * <strong>CAUTION: THIS IS AN EXPERIMENTAL API: EXPECT CHANGES!</strong> - * Efforts will be made to retain backwards API compatibility, but - * no guarantee is given. - * </p> - * - */ -public interface FlowFileEditorCallback { - - /** - * - * @param document the document to change (never {@code null}) - * @return the changed document (never {@code null}) - * @throws Exception in case the editing fails - */ - Document edit(Document document) throws Exception; -} diff --git a/nifi-testharness/src/main/java/org/apache/nifi/testharness/util/FileUtils.java b/nifi-testharness/src/main/java/org/apache/nifi/testharness/util/FileUtils.java deleted file mode 100644 index e207f08..0000000 --- a/nifi-testharness/src/main/java/org/apache/nifi/testharness/util/FileUtils.java +++ /dev/null @@ -1,88 +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. - */ - - - -package org.apache.nifi.testharness.util; - -import java.io.File; -import java.io.IOException; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.Arrays; - -public final class FileUtils { - - - private static final String MAC_DS_STORE_NAME = ".DS_Store"; - - private FileUtils() { - // no instances - } - - public static void deleteDirectoryRecursive(Path directory) throws IOException { - Files.walkFileTree(directory, new SimpleFileVisitor<Path>() { - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - Files.delete(file); - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - Files.delete(dir); - return FileVisitResult.CONTINUE; - } - }); - } - - public static void deleteDirectoryRecursive(File dir) { - try { - deleteDirectoryRecursive(dir.toPath()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static void createLink(Path newLink, Path existingFile) { - try { - Files.createSymbolicLink(newLink, existingFile); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static void createSymlinks(File newLinkDir, File existingDir) { - Arrays.stream(existingDir.list()) - .filter(fileName -> !MAC_DS_STORE_NAME.equals(fileName)) - .forEach(fileName -> { - Path newLink = Paths.get(newLinkDir.getAbsolutePath(), fileName); - Path existingFile = Paths.get(existingDir.getAbsolutePath(), fileName); - - File symlinkFile = newLink.toFile(); - if (symlinkFile.exists()) { - symlinkFile.delete(); - } - - createLink(newLink, existingFile); - }); - } -} diff --git a/nifi-testharness/src/main/java/org/apache/nifi/testharness/util/NiFiCoreLibClassLoader.java b/nifi-testharness/src/main/java/org/apache/nifi/testharness/util/NiFiCoreLibClassLoader.java deleted file mode 100644 index a3af363..0000000 --- a/nifi-testharness/src/main/java/org/apache/nifi/testharness/util/NiFiCoreLibClassLoader.java +++ /dev/null @@ -1,84 +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. - */ - - - -package org.apache.nifi.testharness.util; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.LinkedList; -import java.util.List; -import java.util.stream.Collectors; - -public final class NiFiCoreLibClassLoader extends URLClassLoader { - - - public NiFiCoreLibClassLoader(File nifiHomeDir, ClassLoader parent) { - super(getURls(nifiHomeDir), parent); - } - - private static URL[] getURls(File nifiHomeDir) { - - try { - File libDir = new File(nifiHomeDir, "lib"); - File bootstrapLibDir = new File(libDir, "bootstrap"); - - - List<URL> libs = Files.list(libDir.toPath()) - .filter(NiFiCoreLibClassLoader::isJarOrNarFile) - .map(NiFiCoreLibClassLoader::toURL) - .collect(Collectors.toList()); - List<URL> bootstrapLibs = Files.list(bootstrapLibDir.toPath()) - .filter(NiFiCoreLibClassLoader::isJarOrNarFile) - .map(NiFiCoreLibClassLoader::toURL) - .collect(Collectors.toList()); - - LinkedList<URL> urls = new LinkedList<>(); - urls.addAll(libs); - urls.addAll(bootstrapLibs); - - return urls.toArray(new URL[urls.size()]); - } catch (IOException ioEx) { - throw new RuntimeException(ioEx); - } - - - } - - private static URL toURL(Path path) { - try { - return path.toUri().toURL(); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - - } - - private static boolean isJarOrNarFile(Path path) { - String fullPathString = path.getFileName().toString(); - - return path.toFile().isFile() && fullPathString.endsWith(".jar"); - } - - -} diff --git a/nifi-testharness/src/main/java/org/apache/nifi/testharness/util/XmlUtils.java b/nifi-testharness/src/main/java/org/apache/nifi/testharness/util/XmlUtils.java deleted file mode 100644 index 3e225e7..0000000 --- a/nifi-testharness/src/main/java/org/apache/nifi/testharness/util/XmlUtils.java +++ /dev/null @@ -1,67 +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. - */ - - - -package org.apache.nifi.testharness.util; - -import org.apache.nifi.testharness.api.FlowFileEditorCallback; -import org.w3c.dom.Document; -import org.xml.sax.InputSource; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.File; -import java.io.FileInputStream; - -public final class XmlUtils { - - public static void editXml(File inputFile, File outputFile, FlowFileEditorCallback editCallback) { - - try { - Document document = getFileAsDocument(inputFile); - - document = editCallback.edit(document); - - // save the result - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - Transformer transformer = transformerFactory.newTransformer(); - transformer.transform(new DOMSource(document), new StreamResult(outputFile)); - - } catch (Exception e) { - throw new RuntimeException("Failed to change XML document: " + e.getMessage(), e); - } - } - - public static Document getFileAsDocument(File xmlFile) { - try(FileInputStream inputStream = new FileInputStream(xmlFile)) { - - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - - return documentBuilder.parse(new InputSource(inputStream)); - - } catch (Exception e) { - throw new RuntimeException("Failed to parse XML file: " + xmlFile, e); - } - } - -} \ No newline at end of file diff --git a/nifi-testharness/src/main/java/org/apache/nifi/testharness/util/Zip.java b/nifi-testharness/src/main/java/org/apache/nifi/testharness/util/Zip.java deleted file mode 100644 index 12ea403..0000000 --- a/nifi-testharness/src/main/java/org/apache/nifi/testharness/util/Zip.java +++ /dev/null @@ -1,134 +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. - */ - - - -package org.apache.nifi.testharness.util; - - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.util.zip.GZIPOutputStream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -public final class Zip { - - private Zip() { - // no external instances allowed - } - - - public interface StatusListener { - void onUncompressStarted(ZipEntry ze); - - void onUncompressDone(ZipEntry ze); - } - - public static class StatusListenerAdapter implements StatusListener { - - @Override - public void onUncompressStarted(ZipEntry ze) { - - } - - @Override - public void onUncompressDone(ZipEntry ze) { - - } - } - - private static final StatusListener NO_OP_STATUS_LISTENER = new StatusListenerAdapter(); - - public static void unzipFile(File zipFile, File targetDirectory) throws IOException { - unzipFile(zipFile, targetDirectory, NO_OP_STATUS_LISTENER); - - } - - - public static void unzipFile(File zipFile, File targetDirectory, - StatusListener statusListener) throws IOException { - - if (!targetDirectory.exists()) { - boolean mkdirs = targetDirectory.mkdirs(); - if (!mkdirs) { - throw new IOException("Failed to create directory: " + targetDirectory); - } - } - - try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFile))) { - - ZipEntry ze = zipInputStream.getNextEntry(); - - while (ze != null) { - - if(ze.isDirectory()) { - ze = zipInputStream.getNextEntry(); - continue; - } - - statusListener.onUncompressStarted(ze); - - String fileName = ze.getName(); - File outputFile = new File(targetDirectory, fileName); - - - File parentDir = new File(outputFile.getParent()); - if (!parentDir.exists()) { - boolean couldCreateParentDir = parentDir.mkdirs(); - if (!couldCreateParentDir) { - throw new IllegalStateException("Could not create: " + parentDir); - - } - } - - - - Files.copy(zipInputStream, outputFile.toPath()); - - statusListener.onUncompressDone(ze); - - - ze = zipInputStream.getNextEntry(); - } - - zipInputStream.closeEntry(); - - - } - - - } - - - public static void gzipFile(File inputFile, File gzipFile) throws IOException { - - try (GZIPOutputStream gzos = - new GZIPOutputStream(new FileOutputStream(gzipFile))) { - - - Files.copy(inputFile.toPath(), gzos); - - gzos.finish(); - } - } - - -} diff --git a/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/Constants.java b/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/Constants.java deleted file mode 100644 index 83653f7..0000000 --- a/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/Constants.java +++ /dev/null @@ -1,32 +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. - */ - - -package org.apache.nifi.testharness.samples; - -import java.io.File; - -public final class Constants { - - static final File OUTPUT_DIR = new File("./NiFiTest/NiFiReadTest"); - - // NOTE: you will have to have the NiFi distribution ZIP placed into this directory. - // Its version must be the same as the one referenced in the flow.xml, otherwise it will not work! - static final File NIFI_ZIP_DIR = new File("../../nifi-assembly/target"); - - static final File FLOW_XML_FILE = new File(NiFiMockFlowTest.class.getResource("/flow.xml").getFile()); -} diff --git a/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/NiFiFlowTest.java b/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/NiFiFlowTest.java deleted file mode 100644 index 9e13db7..0000000 --- a/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/NiFiFlowTest.java +++ /dev/null @@ -1,157 +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. - */ - - -package org.apache.nifi.testharness.samples; - - - -import org.apache.nifi.testharness.SimpleNiFiFlowDefinitionEditor; -import org.apache.nifi.testharness.TestNiFiInstance; -import org.apache.nifi.testharness.util.FileUtils; -import org.eclipse.jetty.server.Handler; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.Server; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.util.List; - -import static org.junit.Assert.assertTrue; - - -/** - * This test demonstrates how to mock the source data by starting a mock HTTP server (using Jetty) - * and rewriting the URL in flow definition. - */ -public class NiFiFlowTest { - - private static final SimpleNiFiFlowDefinitionEditor CONFIGURE_MOCKS_IN_NIFI_FLOW = SimpleNiFiFlowDefinitionEditor.builder() - .updateFlowFileBuiltInNiFiProcessorVersionsToNiFiVersion() - .setSingleProcessorProperty("GetHTTP", "URL", "http://localhost:12345") - .build(); - - // used by mocked GetHTTP; serves test data - private static Server testJettyServer; - - private TestNiFiInstance testNiFiInstance; - - - @BeforeClass - public static void beforeClass() throws Exception { - NiFiFlowTest.testJettyServer = new Server(12345); - - - Handler handler = new TestHandler(); - NiFiFlowTest.testJettyServer.setHandler(handler); - NiFiFlowTest.testJettyServer.start(); - } - - - @Before - public void bootstrapNiFi() throws Exception { - - if (Constants.OUTPUT_DIR.exists()) { - FileUtils.deleteDirectoryRecursive(Constants.OUTPUT_DIR.toPath()); - } - - File nifiZipFile = TestUtils.getBinaryDistributionZipFile(Constants.NIFI_ZIP_DIR); - - TestNiFiInstance testNiFi = TestNiFiInstance.builder() - .setNiFiBinaryDistributionZip(nifiZipFile) - .setFlowXmlToInstallForTesting(Constants.FLOW_XML_FILE) - .modifyFlowXmlBeforeInstalling(CONFIGURE_MOCKS_IN_NIFI_FLOW) - .build(); - - testNiFi.install(); - testNiFi.start(); - - // only assign testNiFi to the field in case it was started successfully - testNiFiInstance = testNiFi; - } - - @Test - public void testFlowCreatesFilesInCorrectLocation() throws IOException { - - // We deleted the output directory: our NiFi flow should create it - - assertTrue("Output directory not found: " + Constants.OUTPUT_DIR, Constants.OUTPUT_DIR.exists()); - - File outputFile = new File(Constants.OUTPUT_DIR, "bbc-world.rss.xml"); - - assertTrue("Output file not found: " + outputFile, outputFile.exists()); - - List<String> strings = Files.readAllLines(outputFile.toPath()); - - boolean atLeastOneLineContainsNiFi = strings.stream().anyMatch(line -> line.toLowerCase().contains("nifi")); - - assertTrue("There was no line containing NiFi", atLeastOneLineContainsNiFi); - - boolean atLeastOneLineContainsNiFiVersion = strings.stream().anyMatch(line -> line.toLowerCase().contains("latest nifi version")); - - assertTrue("There was no line containing 'latest NiFi version'", atLeastOneLineContainsNiFiVersion); - - } - - @After - public void shutdownNiFi() { - - if (testNiFiInstance != null) { - testNiFiInstance.stopAndCleanup(); - } - } - - @AfterClass - public static void afterClass() throws Exception { - NiFiFlowTest.testJettyServer.stop(); - } - - - private static class TestHandler extends org.eclipse.jetty.server.handler.AbstractHandler { - @Override - public void handle( - String target, - Request baseRequest, - HttpServletRequest httpServletRequest, - HttpServletResponse response) throws IOException, ServletException { - - response.setContentType("text/html;charset=utf-8"); - response.setStatus(HttpServletResponse.SC_OK); - baseRequest.setHandled(true); - - InputStream resource = TestHandler.class.getResourceAsStream("/sample_technology_rss.xml"); - ServletOutputStream outputStream = response.getOutputStream(); - - byte[] buffer = new byte[1024]; - int len; - while ((len = resource.read(buffer)) != -1) { - outputStream.write(buffer, 0, len); - } - } - } -} diff --git a/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/NiFiMockFlowTest.java b/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/NiFiMockFlowTest.java deleted file mode 100644 index c5a7139..0000000 --- a/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/NiFiMockFlowTest.java +++ /dev/null @@ -1,119 +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. - */ - - -package org.apache.nifi.testharness.samples; - - -import org.apache.nifi.testharness.SimpleNiFiFlowDefinitionEditor; -import org.apache.nifi.testharness.TestNiFiInstance; -import org.apache.nifi.testharness.samples.mock.GetHTTPMock; -import org.apache.nifi.testharness.util.FileUtils; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.util.List; - -import static org.junit.Assert.assertTrue; - - -/** - * This test demonstrates how to mock the source data by mocking the processor - * itself in the flow definition. - */ -public class NiFiMockFlowTest { - - private static final InputStream DEMO_DATA_AS_STREAM = - NiFiMockFlowTest.class.getResourceAsStream("/sample_technology_rss.xml"); - - - // We have a dedicated class. It has to be public static - // so that NiFi engine can instantiate it. - public static class MockedGetHTTP extends GetHTTPMock { - - public MockedGetHTTP() { - super("text/xml; charset=utf-8", () -> DEMO_DATA_AS_STREAM); - } - } - - - private static final SimpleNiFiFlowDefinitionEditor CONFIGURE_MOCKS_IN_NIFI_FLOW = SimpleNiFiFlowDefinitionEditor.builder() - .updateFlowFileBuiltInNiFiProcessorVersionsToNiFiVersion() - .setClassOfSingleProcessor("GetHTTP", MockedGetHTTP.class) - .build(); - - - private TestNiFiInstance testNiFiInstance; - - @Before - public void bootstrapNiFi() throws Exception { - - if (Constants.OUTPUT_DIR.exists()) { - FileUtils.deleteDirectoryRecursive(Constants.OUTPUT_DIR.toPath()); - } - - File nifiZipFile = TestUtils.getBinaryDistributionZipFile(Constants.NIFI_ZIP_DIR); - - TestNiFiInstance testNiFi = TestNiFiInstance.builder() - .setNiFiBinaryDistributionZip(nifiZipFile) - .setFlowXmlToInstallForTesting(Constants.FLOW_XML_FILE) - .modifyFlowXmlBeforeInstalling(CONFIGURE_MOCKS_IN_NIFI_FLOW) - .build(); - - testNiFi.install(); - testNiFi.start(); - - // only assign testNiFi to the field in case it was started successfully - testNiFiInstance = testNiFi; - } - - @Test - public void testFlowCreatesFilesInCorrectLocation() throws IOException { - - // We deleted the output directory: our NiFi flow should create it - - assertTrue("Output directory not found: " + Constants.OUTPUT_DIR, Constants.OUTPUT_DIR.exists()); - - File outputFile = new File(Constants.OUTPUT_DIR, "bbc-world.rss.xml"); - - assertTrue("Output file not found: " + outputFile, outputFile.exists()); - - List<String> strings = Files.readAllLines(outputFile.toPath()); - - boolean atLeastOneLineContainsNiFi = strings.stream().anyMatch(line -> line.toLowerCase().contains("nifi")); - - assertTrue("There was no line containing NiFi", atLeastOneLineContainsNiFi); - - boolean atLeastOneLineContainsNiFiVersion = strings.stream().anyMatch(line -> line.toLowerCase().contains("latest nifi version")); - - assertTrue("There was no line containing 'latest NiFi version'", atLeastOneLineContainsNiFiVersion); - - } - - @After - public void shutdownNiFi() { - - if (testNiFiInstance != null) { - testNiFiInstance.stopAndCleanup(); - } - } -} diff --git a/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/TestUtils.java b/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/TestUtils.java deleted file mode 100644 index 7d0b633..0000000 --- a/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/TestUtils.java +++ /dev/null @@ -1,57 +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. - */ - - - -package org.apache.nifi.testharness.samples; - -import java.io.File; - -final class TestUtils { - - private TestUtils() { - // no instances allowed - } - - static File getBinaryDistributionZipFile(File binaryDistributionZipDir) { - - if (!binaryDistributionZipDir.exists()) { - throw new IllegalStateException("NiFi distribution ZIP file not found at the expected location: " - + binaryDistributionZipDir.getAbsolutePath()); - } - - File[] files = binaryDistributionZipDir.listFiles((dir, name) -> - name.startsWith("nifi-") && name.endsWith("-bin.zip")); - - if (files == null) { - throw new IllegalStateException( - "Not a directory or I/O error reading: " + binaryDistributionZipDir.getAbsolutePath()); - } - - if (files.length == 0) { - throw new IllegalStateException( - "No NiFi distribution ZIP file is found in: " + binaryDistributionZipDir.getAbsolutePath()); - } - - if (files.length > 1) { - throw new IllegalStateException( - "Multiple NiFi distribution ZIP files are found in: " + binaryDistributionZipDir.getAbsolutePath()); - } - - return files[0]; - } -} diff --git a/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/mock/GetHTTPMock.java b/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/mock/GetHTTPMock.java deleted file mode 100644 index 67055e4..0000000 --- a/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/mock/GetHTTPMock.java +++ /dev/null @@ -1,90 +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. - */ - - -package org.apache.nifi.testharness.samples.mock; - -import org.apache.nifi.flowfile.FlowFile; -import org.apache.nifi.flowfile.attributes.CoreAttributes; -import org.apache.nifi.logging.ComponentLog; -import org.apache.nifi.processor.ProcessContext; -import org.apache.nifi.processor.ProcessSession; -import org.apache.nifi.processor.ProcessSessionFactory; -import org.apache.nifi.processor.Relationship; -import org.apache.nifi.util.StopWatch; - -import java.io.InputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; - -public class GetHTTPMock extends MockProcessor { - - private final String contentType; - private final Supplier<InputStream> inputStreamSupplier; - - public GetHTTPMock(String contentType, Supplier<InputStream> inputStreamSupplier) { - super("org.apache.nifi.processors.standard.GetHTTP"); - - this.contentType = contentType; - this.inputStreamSupplier = inputStreamSupplier; - } - - public static final Relationship REL_SUCCESS = new Relationship.Builder() - .name("success") - .description("All files are transferred to the success relationship") - .build(); - - @Override - public void onTrigger(ProcessContext context, ProcessSessionFactory processSessionFactory) { - - final ComponentLog logger = getLogger(); - - final StopWatch stopWatch = new StopWatch(true); - - final ProcessSession session = processSessionFactory.createSession(); - - final String url = context.getProperty("URL").evaluateAttributeExpressions().getValue(); - final URI uri; - String source = url; - try { - uri = new URI(url); - source = uri.getHost(); - } catch (final URISyntaxException swallow) { - // this won't happen as the url has already been validated - } - - FlowFile flowFile = session.create(); - - flowFile = session.putAttribute(flowFile, CoreAttributes.FILENAME.key(), context.getProperty("Filename").evaluateAttributeExpressions().getValue()); - flowFile = session.putAttribute(flowFile, this.getClass().getSimpleName().toLowerCase() + ".remote.source", source); - flowFile = session.importFrom(inputStreamSupplier.get(), flowFile); - - flowFile = session.putAttribute(flowFile, CoreAttributes.MIME_TYPE.key(), contentType); - - final long flowFileSize = flowFile.getSize(); - stopWatch.stop(); - session.getProvenanceReporter().receive(flowFile, url, stopWatch.getDuration(TimeUnit.MILLISECONDS)); - session.transfer(flowFile, REL_SUCCESS); - - final String dataRate = stopWatch.calculateDataRate(flowFileSize); - logger.info("Successfully received {} from {} at a rate of {}; transferred to success", new Object[]{flowFile, url, dataRate}); - session.commit(); - - } -} diff --git a/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/mock/MockProcessor.java b/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/mock/MockProcessor.java deleted file mode 100644 index cd62b2d..0000000 --- a/nifi-testharness/src/test/java/org/apache/nifi/testharness/samples/mock/MockProcessor.java +++ /dev/null @@ -1,101 +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. - */ - -package org.apache.nifi.testharness.samples.mock; - - -import org.apache.nifi.components.PropertyDescriptor; -import org.apache.nifi.components.ValidationContext; -import org.apache.nifi.components.ValidationResult; -import org.apache.nifi.logging.ComponentLog; -import org.apache.nifi.processor.ProcessContext; -import org.apache.nifi.processor.ProcessSessionFactory; -import org.apache.nifi.processor.Processor; -import org.apache.nifi.processor.ProcessorInitializationContext; -import org.apache.nifi.processor.Relationship; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -public abstract class MockProcessor implements Processor { - - private final Processor delegate; - private ComponentLog logger; - - protected MockProcessor(String delegateClassName) { - try { - - ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - final Class<?> delegateClass = Class.forName(delegateClassName, true, contextClassLoader); - - delegate = (Processor) delegateClass.newInstance(); - } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { - throw new RuntimeException(e); - } - - - } - - protected Processor getDelegate() { - return delegate; - - } - - protected final ComponentLog getLogger() { - return logger; - } - - @Override - public void initialize(ProcessorInitializationContext processorInitializationContext) { - getDelegate().initialize(processorInitializationContext); - logger = processorInitializationContext.getLogger(); - } - - @Override - public Set<Relationship> getRelationships() { - return getDelegate().getRelationships(); - } - - @Override - public abstract void onTrigger(ProcessContext processContext, ProcessSessionFactory processSessionFactory); - - @Override - public Collection<ValidationResult> validate(ValidationContext validationContext) { - return getDelegate().validate(validationContext); - } - - @Override - public PropertyDescriptor getPropertyDescriptor(String s) { - return getDelegate().getPropertyDescriptor(s); - } - - @Override - public void onPropertyModified(PropertyDescriptor propertyDescriptor, String s, String s1) { - getDelegate().onPropertyModified(propertyDescriptor, s, s1); - } - - @Override - public List<PropertyDescriptor> getPropertyDescriptors() { - return getDelegate().getPropertyDescriptors(); - } - - @Override - public String getIdentifier() { - return getDelegate().getIdentifier(); - } -} diff --git a/nifi-testharness/src/test/resources/flow.xml b/nifi-testharness/src/test/resources/flow.xml deleted file mode 100644 index 66a1cf2..0000000 --- a/nifi-testharness/src/test/resources/flow.xml +++ /dev/null @@ -1,154 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<flowController encoding-version="1.3"> - <maxTimerDrivenThreadCount>10</maxTimerDrivenThreadCount> - <maxEventDrivenThreadCount>5</maxEventDrivenThreadCount> - <registries/> - <rootGroup> - <id>92b74849-0166-1000-28d3-4da912e34551</id> - <name>NiFi Flow</name> - <position x="0.0" y="0.0"/> - <comment/> - <processor> - <id>92b9139c-0166-1000-04d5-1184adc0977a</id> - <name>PutFile</name> - <position x="632.0" y="98.0"/> - <styles/> - <comment/> - <class>org.apache.nifi.processors.standard.PutFile</class> - <bundle> - <group>org.apache.nifi</group> - <artifact>nifi-standard-nar</artifact> - <version>1.7.1</version> - </bundle> - <maxConcurrentTasks>1</maxConcurrentTasks> - <schedulingPeriod>0 sec</schedulingPeriod> - <penalizationPeriod>30 sec</penalizationPeriod> - <yieldPeriod>1 sec</yieldPeriod> - <bulletinLevel>WARN</bulletinLevel> - <lossTolerant>false</lossTolerant> - <scheduledState>RUNNING</scheduledState> - <schedulingStrategy>TIMER_DRIVEN</schedulingStrategy> - <executionNode>ALL</executionNode> - <runDurationNanos>0</runDurationNanos> - <property> - <name>Directory</name> - <value>./NiFiTest/NiFiReadTest</value> - </property> - <property> - <name>Conflict Resolution Strategy</name> - <value>ignore</value> - </property> - <property> - <name>Create Missing Directories</name> - <value>true</value> - </property> - <property> - <name>Maximum File Count</name> - </property> - <property> - <name>Last Modified Time</name> - </property> - <property> - <name>Permissions</name> - </property> - <property> - <name>Owner</name> - </property> - <property> - <name>Group</name> - </property> - <autoTerminatedRelationship>success</autoTerminatedRelationship> - <autoTerminatedRelationship>failure</autoTerminatedRelationship> - </processor> - <processor> - <id>92b87553-0166-1000-527e-7ecdc888d91a</id> - <name>GetHTTP</name> - <position x="238.0" y="98.0"/> - <styles/> - <comment/> - <class>org.apache.nifi.processors.standard.GetHTTP</class> - <bundle> - <group>org.apache.nifi</group> - <artifact>nifi-standard-nar</artifact> - <version>1.7.1</version> - </bundle> - <maxConcurrentTasks>1</maxConcurrentTasks> - <schedulingPeriod>0 sec</schedulingPeriod> - <penalizationPeriod>30 sec</penalizationPeriod> - <yieldPeriod>1 sec</yieldPeriod> - <bulletinLevel>WARN</bulletinLevel> - <lossTolerant>false</lossTolerant> - <scheduledState>RUNNING</scheduledState> - <schedulingStrategy>TIMER_DRIVEN</schedulingStrategy> - <executionNode>ALL</executionNode> - <runDurationNanos>0</runDurationNanos> - <property> - <name>URL</name> - <value>http://feeds.bbci.co.uk/news/technology/rss.xml?edition=uk#</value> - </property> - <property> - <name>Filename</name> - <value>bbc-world.rss.xml</value> - </property> - <property> - <name>SSL Context Service</name> - </property> - <property> - <name>Username</name> - </property> - <property> - <name>Password</name> - </property> - <property> - <name>Connection Timeout</name> - <value>30 sec</value> - </property> - <property> - <name>Data Timeout</name> - <value>30 sec</value> - </property> - <property> - <name>User Agent</name> - </property> - <property> - <name>Accept Content-Type</name> - </property> - <property> - <name>Follow Redirects</name> - <value>false</value> - </property> - <property> - <name>redirect-cookie-policy</name> - <value>default</value> - </property> - <property> - <name>proxy-configuration-service</name> - </property> - <property> - <name>Proxy Host</name> - </property> - <property> - <name>Proxy Port</name> - </property> - </processor> - <connection> - <id>92b9380b-0166-1000-981d-c9e319f135e3</id> - <name/> - <bendPoints/> - <labelIndex>1</labelIndex> - <zIndex>0</zIndex> - <sourceId>92b87553-0166-1000-527e-7ecdc888d91a</sourceId> - <sourceGroupId>92b74849-0166-1000-28d3-4da912e34551</sourceGroupId> - <sourceType>PROCESSOR</sourceType> - <destinationId>92b9139c-0166-1000-04d5-1184adc0977a</destinationId> - <destinationGroupId>92b74849-0166-1000-28d3-4da912e34551</destinationGroupId> - <destinationType>PROCESSOR</destinationType> - <relationship>success</relationship> - <maxWorkQueueSize>10000</maxWorkQueueSize> - <maxWorkQueueDataSize>1 GB</maxWorkQueueDataSize> - <flowFileExpiration>0 sec</flowFileExpiration> - </connection> - </rootGroup> - <controllerServices/> - <reportingTasks/> -</flowController> diff --git a/nifi-testharness/src/test/resources/logback-test.xml b/nifi-testharness/src/test/resources/logback-test.xml deleted file mode 100644 index ab903af..0000000 --- a/nifi-testharness/src/test/resources/logback-test.xml +++ /dev/null @@ -1,15 +0,0 @@ -<configuration debug="true"> - - <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> - <!-- encoders are by default assigned the type - ch.qos.logback.classic.encoder.PatternLayoutEncoder --> - <encoder> - <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> - </encoder> - </appender> - - <root level="INFO"> - <appender-ref ref="STDOUT" /> - </root> - -</configuration> \ No newline at end of file diff --git a/nifi-testharness/src/test/resources/sample_technology_rss.xml b/nifi-testharness/src/test/resources/sample_technology_rss.xml deleted file mode 100644 index a95ba96..0000000 --- a/nifi-testharness/src/test/resources/sample_technology_rss.xml +++ /dev/null @@ -1,24 +0,0 @@ - -<?xml version="1.0" encoding="UTF-8"?> -<?xml-stylesheet title="XSL_formatting" type="text/xsl" href="/shared/bsp/xsl/rss/nolsol.xsl"?> -<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"> - <channel> - <title>Sample Technology feed</title> - <description>Sample Technology feed</description> - <image> - <url>https://nifi.apache.org/assets/images/apache-nifi-logo.svg</url> - <title>NiFi sample</title> - <link>https://nifi.apache.org/</link> - </image> - <language>en-gb</language> - <ttl>15</ttl> - <item> - <title>The latest NiFi version is out</title> - <description>The latest version of NiFi is released</description> - <link>https://nifi.apache.org/</link> - <guid isPermaLink="true">https://nifi.apache.org/</guid> - <pubDate>Sat, 24 Sep 2018 17:10:10 GMT</pubDate> - <media:thumbnail width="1024" height="576" url="https://nifi.apache.org/assets/images/apache-nifi-logo.svg"/> - </item> - </channel> -</rss> \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3b0b0cb..1ce75b4 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,6 @@ <module>nifi-mock</module> <module>nifi-nar-bundles</module> <module>nifi-assembly</module> - <module>nifi-testharness</module> <module>nifi-docs</module> <module>nifi-maven-archetypes</module> <module>nifi-external</module>