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.
      *

Reply via email to