This is an automated email from the ASF dual-hosted git repository.
pvillard 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 48b6ee674c NIFI-14876: Mock TestRunners to allows setting of
ParameterLookup
48b6ee674c is described below
commit 48b6ee674cf2008debf50a218e51f9086173aaf0
Author: Asger Askov Blekinge <[email protected]>
AuthorDate: Tue Aug 19 11:53:58 2025 +0200
NIFI-14876: Mock TestRunners to allows setting of ParameterLookup
Co-authored-by: Pierre Villard <[email protected]>
Signed-off-by: Pierre Villard <[email protected]>
This closes #10217.
---
.../processors/standard/TestGenerateFlowFile.java | 19 ++++++++++++++++
.../org/apache/nifi/util/MockParameterLookup.java | 4 ++--
.../org/apache/nifi/util/MockProcessContext.java | 25 ++++++++++++++++++++--
.../org/apache/nifi/util/MockPropertyValue.java | 14 ++++++++++--
.../nifi/util/StandardProcessorTestRunner.java | 17 ++++++++++++++-
.../main/java/org/apache/nifi/util/TestRunner.java | 21 ++++++++++++++++++
6 files changed, 93 insertions(+), 7 deletions(-)
diff --git
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestGenerateFlowFile.java
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestGenerateFlowFile.java
index 1ee7018ac2..575e4927b5 100644
---
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestGenerateFlowFile.java
+++
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestGenerateFlowFile.java
@@ -77,6 +77,25 @@ public class TestGenerateFlowFile {
generatedFlowFile.assertAttributeEquals("mime.type",
"application/text");
}
+ @Test
+ public void testContextParametersToAttributes() {
+ TestRunner runner = TestRunners.newTestRunner(new GenerateFlowFile());
+ runner.setParameterContextValue("context.parameter.property",
"context.parameter.value");
+ runner.setProperty(GenerateFlowFile.FILE_SIZE, "1B");
+ runner.setProperty(GenerateFlowFile.DATA_FORMAT,
GenerateFlowFile.DATA_FORMAT_TEXT);
+ runner.setProperty(GenerateFlowFile.MIME_TYPE, "application/text");
+ runner.setProperty("expression.context.parameter",
"#{context.parameter.property}");
+ runner.assertValid();
+
+ runner.run();
+
+ runner.assertTransferCount(GenerateFlowFile.SUCCESS, 1);
+ MockFlowFile generatedFlowFile =
runner.getFlowFilesForRelationship(GenerateFlowFile.SUCCESS).get(0);
+
generatedFlowFile.assertAttributeEquals("expression.context.parameter",
"context.parameter.value");
+ generatedFlowFile.assertAttributeEquals("mime.type",
"application/text");
+ }
+
+
@Test
public void testExpressionLanguageSupport() {
TestRunner runner = TestRunners.newTestRunner(new GenerateFlowFile());
diff --git
a/nifi-mock/src/main/java/org/apache/nifi/util/MockParameterLookup.java
b/nifi-mock/src/main/java/org/apache/nifi/util/MockParameterLookup.java
index 6cfeeca4ca..b77e1125d2 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/MockParameterLookup.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockParameterLookup.java
@@ -19,7 +19,7 @@ package org.apache.nifi.util;
import org.apache.nifi.parameter.Parameter;
import org.apache.nifi.parameter.ParameterLookup;
-import java.util.HashMap;
+import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicLong;
@@ -30,7 +30,7 @@ public class MockParameterLookup implements ParameterLookup {
private final AtomicLong version = new AtomicLong(1);
public MockParameterLookup(final Map<String, String> parameters) {
- this.parameters = parameters == null ? new HashMap<>() : new
HashMap<>(parameters);
+ this.parameters = parameters == null ? Collections.emptyMap() :
Collections.unmodifiableMap(parameters);
}
@Override
diff --git
a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java
b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java
index b406e9bcf1..b3fc283f2d 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java
@@ -30,6 +30,7 @@ import org.apache.nifi.controller.ControllerService;
import org.apache.nifi.controller.ControllerServiceLookup;
import org.apache.nifi.controller.NodeTypeProvider;
import org.apache.nifi.expression.ExpressionLanguageScope;
+import org.apache.nifi.parameter.ParameterLookup;
import org.apache.nifi.processor.ProcessContext;
import org.apache.nifi.processor.Processor;
import org.apache.nifi.processor.Relationship;
@@ -77,6 +78,8 @@ public class MockProcessContext extends
MockControllerServiceLookup implements P
// This is only for testing purposes as we don't want to set env/sys
variables in the tests
private final Map<String, String> environmentVariables;
+ private final ParameterLookup parameterLookup;
+
public MockProcessContext(final ConfigurableComponent component) {
this(component, null, new MockStateManager(component), null);
}
@@ -132,11 +135,29 @@ public class MockProcessContext extends
MockControllerServiceLookup implements P
final String componentName,
final StateManager stateManager,
final Map<String, String> environmentVariables) {
+ this(component, componentName, stateManager, environmentVariables,
null);
+ }
+
+ /**
+ * Creates a new MockProcessContext for the given Processor with given name
+ *
+ * @param component being mocked
+ * @param componentName the name to be given the component;
+ * @param stateManager state manager
+ * @param environmentVariables the environment variables
+ * @param contextParameters the context parameters
+ */
+ public MockProcessContext(final ConfigurableComponent component,
+ final String componentName,
+ final StateManager stateManager,
+ final Map<String, String> environmentVariables,
+ final Map<String, String> contextParameters) {
this.component = Objects.requireNonNull(component);
this.componentName = componentName == null ? "" : componentName;
this.inputRequirement =
component.getClass().getAnnotation(InputRequirement.class);
this.stateManager = stateManager;
this.environmentVariables = environmentVariables;
+ this.parameterLookup = contextParameters != null ? new
MockParameterLookup(contextParameters) : ParameterLookup.EMPTY;
}
@@ -181,7 +202,7 @@ public class MockProcessContext extends
MockControllerServiceLookup implements P
final String propValue = (setPropertyValue == null) ?
descriptor.getDefaultValue() : setPropertyValue;
final boolean alreadyEvaluated = !this.allowExpressionValidation;
- return new MockPropertyValue(propValue, this, descriptor,
alreadyEvaluated, environmentVariables);
+ return new MockPropertyValue(propValue, this, descriptor,
alreadyEvaluated, environmentVariables, parameterLookup);
}
private List<ValidatedPropertyDependency>
determineUnsatisfiedDependencies(PropertyDescriptor descriptor) {
@@ -229,7 +250,7 @@ public class MockProcessContext extends
MockControllerServiceLookup implements P
@Override
public PropertyValue newPropertyValue(final String rawValue) {
- return new MockPropertyValue(rawValue, this, environmentVariables);
+ return new MockPropertyValue(rawValue, this, environmentVariables,
parameterLookup);
}
public ValidationResult setProperty(final String propertyName, final
String propertyValue) {
diff --git
a/nifi-mock/src/main/java/org/apache/nifi/util/MockPropertyValue.java
b/nifi-mock/src/main/java/org/apache/nifi/util/MockPropertyValue.java
index 817aef3ac8..d7f6619693 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/MockPropertyValue.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockPropertyValue.java
@@ -66,15 +66,25 @@ public class MockPropertyValue implements PropertyValue {
this(rawValue, serviceLookup, null, environmentVariables);
}
+ public MockPropertyValue(final String rawValue, final
ControllerServiceLookup serviceLookup, final Map<String, String>
environmentVariables, ParameterLookup parameterLookup) {
+ this(rawValue, serviceLookup, null, false, environmentVariables,
parameterLookup);
+ }
+
public MockPropertyValue(final String rawValue, final
ControllerServiceLookup serviceLookup, final PropertyDescriptor
propertyDescriptor,
final Map<String, String> environmentVariables) {
this(rawValue, serviceLookup, propertyDescriptor, false,
environmentVariables);
}
protected MockPropertyValue(final String rawValue, final
ControllerServiceLookup serviceLookup, final PropertyDescriptor
propertyDescriptor,
- final boolean alreadyEvaluated, final Map<String, String>
environmentVariables) {
+ final boolean alreadyEvaluated, final
Map<String, String> environmentVariables) {
+ this(rawValue, serviceLookup, propertyDescriptor, alreadyEvaluated,
environmentVariables, ParameterLookup.EMPTY);
+ }
+
+
+ protected MockPropertyValue(final String rawValue, final
ControllerServiceLookup serviceLookup, final PropertyDescriptor
propertyDescriptor,
+ final boolean alreadyEvaluated, final Map<String, String>
environmentVariables, ParameterLookup parameterLookup) {
final ResourceContext resourceContext = new
StandardResourceContext(new StandardResourceReferenceFactory(),
propertyDescriptor);
- this.stdPropValue = new StandardPropertyValue(resourceContext,
rawValue, serviceLookup, ParameterLookup.EMPTY);
+ this.stdPropValue = new StandardPropertyValue(resourceContext,
rawValue, serviceLookup, parameterLookup);
this.rawValue = rawValue;
this.serviceLookup = (MockControllerServiceLookup) serviceLookup;
this.expectExpressions = propertyDescriptor == null ? null :
propertyDescriptor.isExpressionLanguageSupported();
diff --git
a/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
b/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
index 482da4b425..aa479a2c63 100644
---
a/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
+++
b/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
@@ -110,6 +110,9 @@ public class StandardProcessorTestRunner implements
TestRunner {
// This only for testing purposes as we don't want to set env/sys
variables in the tests
private final Map<String, String> environmentVariables = new HashMap<>();
+ // This is only for testing purposes to simulate parameters coming from
parameter contexts
+ private final Map<String, String> contextParameters =
Collections.synchronizedMap(new HashMap<>());
+
StandardProcessorTestRunner(final Processor processor) {
this(processor, null);
}
@@ -126,6 +129,7 @@ public class StandardProcessorTestRunner implements
TestRunner {
this(processor, processorName, logger, null);
}
+
StandardProcessorTestRunner(final Processor processor, String
processorName, MockComponentLog logger, KerberosContext kerberosContext) {
this.processor = processor;
this.idGenerator = new AtomicLong(0L);
@@ -134,7 +138,7 @@ public class StandardProcessorTestRunner implements
TestRunner {
this.processorStateManager = new MockStateManager(processor);
this.sessionFactory = new MockSessionFactory(sharedState, processor,
enforceReadStreamsClosed, processorStateManager,
allowSynchronousSessionCommits, allowRecursiveReads);
- this.context = new MockProcessContext(processor, processorName,
processorStateManager, environmentVariables);
+ this.context = new MockProcessContext(processor, processorName,
processorStateManager, environmentVariables, contextParameters);
this.kerberosContext = kerberosContext;
final MockProcessorInitializationContext mockInitContext = new
MockProcessorInitializationContext(processor, context, logger, kerberosContext);
@@ -1059,6 +1063,17 @@ public class StandardProcessorTestRunner implements
TestRunner {
environmentVariables.put(name, value);
}
+ @Override
+ public String getParameterContextValue(final String name) {
+ Objects.requireNonNull(name);
+ return contextParameters.get(name);
+ }
+
+ @Override
+ public void setParameterContextValue(String name, String value) {
+ contextParameters.put(name, value);
+ }
+
/**
* Asserts that all FlowFiles meet all conditions.
*
diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java
b/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java
index 9232432252..050eb1298c 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/TestRunner.java
@@ -1069,6 +1069,27 @@ public interface TestRunner {
*/
void setEnvironmentVariableValue(String name, String value);
+ /**
+ * Returns the current value for the given parameter name from the
simulated Parameter Context
+ *
+ * @param name the name of the parameter from the Parameter Context whose
value should be returned.
+ * @return the current value for the given parameter name from the
simulated Parameter Context or <code>null</code> if no value is currently set
+ *
+ * @throws NullPointerException if the name is null
+ */
+ String getParameterContextValue(String name);
+
+ /**
+ * Sets a parameter with the given name and value into the simulated
Parameter Context.
+ * This makes available the parameter to the properties of the component
being tested through parameter referencing such as <code>#{name}</code>.
+ *
+ * @param parameterName the name of the parameter to set
+ * @param parameterValue the value of the parameter to set
+ *
+ * @throws NullPointerException if the name is null
+ */
+ void setParameterContextValue(final String parameterName, final String
parameterValue);
+
/**
* Asserts that all FlowFiles meet all conditions.
*