This is an automated email from the ASF dual-hosted git repository.

exceptionfactory 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 60a03b90cb NIFI-13562 Removed carriage return characters from 
TestProcessorAuditor
60a03b90cb is described below

commit 60a03b90cbd0590fb4ed44ac4d5974ee1835dbfc
Author: exceptionfactory <[email protected]>
AuthorDate: Mon Jul 29 12:30:08 2024 -0500

    NIFI-13562 Removed carriage return characters from TestProcessorAuditor
    
    Signed-off-by: David Handermann <[email protected]>
---
 .../apache/nifi/audit/TestProcessorAuditor.java    | 788 ++++++++++-----------
 1 file changed, 394 insertions(+), 394 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/audit/TestProcessorAuditor.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/audit/TestProcessorAuditor.java
index b5bb381e6c..f2a2969bf6 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/audit/TestProcessorAuditor.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/audit/TestProcessorAuditor.java
@@ -1,394 +1,394 @@
-/*
- * 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.audit;
-
-import org.apache.nifi.action.Action;
-import org.apache.nifi.action.Component;
-import org.apache.nifi.action.Operation;
-import org.apache.nifi.action.details.ActionDetails;
-import org.apache.nifi.action.details.FlowChangeConfigureDetails;
-import org.apache.nifi.admin.service.AuditService;
-import org.apache.nifi.authorization.user.NiFiUser;
-import org.apache.nifi.authorization.user.NiFiUserDetails;
-import org.apache.nifi.authorization.user.StandardNiFiUser;
-import org.apache.nifi.bundle.Bundle;
-import org.apache.nifi.bundle.BundleCoordinate;
-import org.apache.nifi.bundle.BundleDetails;
-import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.components.state.StateManager;
-import org.apache.nifi.components.state.StateManagerProvider;
-import org.apache.nifi.controller.FlowController;
-import org.apache.nifi.controller.ProcessorNode;
-import org.apache.nifi.controller.flow.FlowManager;
-import org.apache.nifi.controller.service.ControllerServiceProvider;
-import org.apache.nifi.groups.ProcessGroup;
-import org.apache.nifi.nar.ExtensionManager;
-import org.apache.nifi.processor.Processor;
-import org.apache.nifi.web.api.dto.BundleDTO;
-import org.apache.nifi.web.api.dto.ProcessorConfigDTO;
-import org.apache.nifi.web.api.dto.ProcessorDTO;
-import org.apache.nifi.web.dao.ComponentStateDAO;
-import org.apache.nifi.web.dao.ProcessGroupDAO;
-import org.apache.nifi.web.dao.impl.StandardComponentStateDAO;
-import org.apache.nifi.web.dao.impl.StandardProcessGroupDAO;
-import org.apache.nifi.web.dao.impl.StandardProcessorDAO;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.EnableAspectJAutoProxy;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertInstanceOf;
-import static org.junit.jupiter.api.Assertions.assertNotEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoInteractions;
-import static org.mockito.Mockito.when;
-
-
-@ExtendWith({SpringExtension.class, MockitoExtension.class})
-@ContextConfiguration(classes = 
{TestProcessorAuditor.AuditorConfiguration.class})
-class TestProcessorAuditor {
-
-    private static final String PROC_1 = "processor1";
-    private static final String PN_SOURCE_NAME = "sourceName1";
-    private static final String PN_ID = "processorNodeId1";
-    private static final String GROUP_ID = "group-1";
-    private static final String USER_IDENTITY = "user-id";
-    private static final BundleCoordinate BUNDLE_COORDINATE = new 
BundleCoordinate("org.apache.nifi", "nifi-processor-nar", "0.0.0");
-
-    @Autowired
-    private StandardProcessorDAO processorDao;
-    @Autowired
-    private ProcessorAuditor processorAuditor;
-
-    @Autowired
-    private AuditService auditService;
-    @Mock
-    private Authentication authentication;
-    @Mock
-    private Processor processor;
-    @Mock
-    private ExtensionManager extensionManager;
-    @Mock
-    private FlowController flowController;
-    @Autowired
-    private FlowManager flowManager;
-    @Mock
-    private ProcessGroup processGroup;
-    @Mock
-    private ProcessorNode mockProcessorNode;
-    @Mock
-    private StateManagerProvider mockStateManagerProvider;
-    @Mock
-    private StateManager mockStateManager;
-    @Mock
-    private NiFiUserDetails userDetail;
-
-    @Captor
-    private ArgumentCaptor<List<Action>> actionsArgumentCaptor;
-
-    @BeforeEach
-    void init() {
-        reset(flowController);
-        reset(auditService);
-
-        SecurityContextHolder.getContext().setAuthentication(authentication);
-        final NiFiUser user = new 
StandardNiFiUser.Builder().identity(USER_IDENTITY).build();
-        userDetail = new NiFiUserDetails(user);
-        when(authentication.getPrincipal()).thenReturn(userDetail);
-
-        when(flowController.getFlowManager()).thenReturn(flowManager);
-
-        processorDao.setFlowController(flowController);
-        processorAuditor.setAuditService(auditService);
-    }
-
-    @Test
-    void testCreateProcessorAdvice() {
-        final ProcessorDTO processorDto = getProcessorDto();
-
-        when(mockProcessorNode.getIdentifier()).thenReturn(PN_ID);
-        when(mockProcessorNode.getName()).thenReturn(PN_SOURCE_NAME);
-        when(mockProcessorNode.getProcessor()).thenReturn(processor);
-        
when(mockProcessorNode.getCanonicalClassName()).thenReturn(mockProcessorNode.getClass().getCanonicalName());
-
-        when(processor.getIdentifier()).thenReturn(PN_ID);
-
-        
when(flowController.getExtensionManager()).thenReturn(extensionManager);
-        
when(flowController.getControllerServiceProvider()).thenReturn(mock(ControllerServiceProvider.class));
-        
when(flowController.getStateManagerProvider()).thenReturn(mockStateManagerProvider);
-
-        when(flowManager.getGroup(GROUP_ID)).thenReturn(processGroup);
-        when(flowManager.createProcessor(anyString(), anyString(), 
any())).thenReturn(mockProcessorNode);
-
-        final Bundle bundle = getBundle();
-
-        
when(extensionManager.getBundle(any(BundleCoordinate.class))).thenReturn(bundle);
-        
when(extensionManager.getBundles(anyString())).thenReturn(Collections.singletonList(bundle));
-
-
-        
when(mockStateManagerProvider.getStateManager(PN_ID)).thenReturn(mockStateManager);
-
-        final ProcessorNode processor = processorDao.createProcessor(GROUP_ID, 
processorDto);
-
-        assertNotNull(processor);
-        verify(auditService).addActions(actionsArgumentCaptor.capture());
-        final List<Action> actions = actionsArgumentCaptor.getValue();
-        assertActionFound(actions, Operation.Add);
-    }
-
-    @Test
-    void testRemoveProcessorAdvice() {
-        when(flowManager.getRootGroup()).thenReturn(processGroup);
-
-        ProcessorNode mockProcessorNode = mock(ProcessorNode.class);
-        when(mockProcessorNode.getIdentifier()).thenReturn(PN_ID);
-        when(mockProcessorNode.getName()).thenReturn(PN_SOURCE_NAME);
-        when(mockProcessorNode.getProcessGroup()).thenReturn(processGroup);
-
-        when(processGroup.findProcessor(PN_ID)).thenReturn(mockProcessorNode);
-
-        processorDao.deleteProcessor(PN_ID);
-
-        verify(auditService).addActions(actionsArgumentCaptor.capture());
-        final List<Action> actions = actionsArgumentCaptor.getValue();
-        assertActionFound(actions, Operation.Remove);
-    }
-
-    @Test
-    void testUpdateProcessorAdvice() {
-        
when(flowController.getExtensionManager()).thenReturn(extensionManager);
-        when(flowManager.getRootGroup()).thenReturn(processGroup);
-
-        final Bundle bundle = getBundle();
-
-        
when(extensionManager.getBundle(any(BundleCoordinate.class))).thenReturn(bundle);
-        
when(extensionManager.getBundles(anyString())).thenReturn(Collections.singletonList(bundle));
-
-        when(mockProcessorNode.getIdentifier()).thenReturn(PN_ID);
-        when(mockProcessorNode.getName()).thenReturn(PN_SOURCE_NAME);
-        
when(mockProcessorNode.getBundleCoordinate()).thenReturn(BUNDLE_COORDINATE);
-        
when(mockProcessorNode.getCanonicalClassName()).thenReturn(ProcessorNode.class.getCanonicalName());
-        when(mockProcessorNode.getProcessGroup()).thenReturn(processGroup);
-
-        when(processGroup.findProcessor(PN_ID)).thenReturn(mockProcessorNode);
-
-        final ProcessorDTO processorDto = getProcessorDto();
-        ProcessorConfigDTO config = new ProcessorConfigDTO();
-        config.setComments("comment1");
-        config.setRunDurationMillis(100L);
-
-        processorDto.setConfig(config);
-        processorDto.setId(PN_ID);
-
-        processorDao.updateProcessor(processorDto);
-
-        verify(auditService).addActions(actionsArgumentCaptor.capture());
-        final List<Action> actions = actionsArgumentCaptor.getValue();
-        final Action action = assertActionFound(actions, Operation.Configure);
-
-        final ActionDetails actionDetails = action.getActionDetails();
-        assertUpdateActionDetailsFound(actionDetails);
-    }
-
-    @Test
-    void testSensitivePropertyDeletesHistory() {
-        
when(flowController.getExtensionManager()).thenReturn(extensionManager);
-        when(flowManager.getRootGroup()).thenReturn(processGroup);
-
-        final Bundle bundle = getBundle();
-
-        
when(extensionManager.getBundle(any(BundleCoordinate.class))).thenReturn(bundle);
-        
when(extensionManager.getBundles(anyString())).thenReturn(Collections.singletonList(bundle));
-
-        when(mockProcessorNode.getIdentifier()).thenReturn(PN_ID);
-        when(mockProcessorNode.getName()).thenReturn(PN_SOURCE_NAME);
-        
when(mockProcessorNode.getBundleCoordinate()).thenReturn(BUNDLE_COORDINATE);
-        
when(mockProcessorNode.getCanonicalClassName()).thenReturn(ProcessorNode.class.getCanonicalName());
-        when(mockProcessorNode.getProcessGroup()).thenReturn(processGroup);
-
-        final String propertyName = "sensitive-property-descriptor-1";
-
-        PropertyDescriptor propertyDescriptor = new 
PropertyDescriptor.Builder()
-                .name(propertyName)
-                .sensitive(true)
-                .build();
-
-        
when(mockProcessorNode.getPropertyDescriptor("dynamicSensitiveProperty1")).thenReturn(propertyDescriptor);
-
-        when(processGroup.findProcessor(PN_ID)).thenReturn(mockProcessorNode);
-
-        final ProcessorDTO processorDto = getProcessorDto();
-        ProcessorConfigDTO config = new ProcessorConfigDTO();
-        
config.setProperties(Collections.singletonMap("dynamicSensitiveProperty1", 
"asd"));
-        
config.setSensitiveDynamicPropertyNames(Collections.singleton("dynamicSensitiveProperty1"));
-        config.setRunDurationMillis(100L);
-
-        processorDto.setConfig(config);
-        processorDto.setId(PN_ID);
-
-        processorDao.updateProcessor(processorDto);
-
-        ArgumentCaptor<String> propertyNameCaptor = 
ArgumentCaptor.forClass(String.class);
-        ArgumentCaptor<String> componentIdCaptor = 
ArgumentCaptor.forClass(String.class);
-
-        
verify(auditService).deletePreviousValues(propertyNameCaptor.capture(), 
componentIdCaptor.capture());
-
-        assertEquals(propertyName, propertyNameCaptor.getValue());
-        assertEquals(PN_ID, componentIdCaptor.getValue());
-    }
-
-    @Test
-    void testUpdateProcessorAdviceProcessorUnchanged() {
-        
when(flowController.getExtensionManager()).thenReturn(extensionManager);
-        when(flowManager.getRootGroup()).thenReturn(processGroup);
-
-        final Bundle bundle = getBundle();
-
-        
when(extensionManager.getBundle(any(BundleCoordinate.class))).thenReturn(bundle);
-        
when(extensionManager.getBundles(anyString())).thenReturn(Collections.singletonList(bundle));
-
-        when(mockProcessorNode.getIdentifier()).thenReturn(PN_ID);
-        
when(mockProcessorNode.getBundleCoordinate()).thenReturn(BUNDLE_COORDINATE);
-        
when(mockProcessorNode.getCanonicalClassName()).thenReturn(ProcessorNode.class.getCanonicalName());
-        when(mockProcessorNode.getProcessGroup()).thenReturn(processGroup);
-
-        when(processGroup.findProcessor(PN_ID)).thenReturn(mockProcessorNode);
-
-        final ProcessorDTO processorDto = getProcessorDto();
-        processorDto.setId(PN_ID);
-
-        processorDao.updateProcessor(processorDto);
-
-        verifyNoInteractions(auditService);
-    }
-
-    private void assertUpdateActionDetailsFound(final ActionDetails 
actionDetails) {
-        assertInstanceOf(FlowChangeConfigureDetails.class, actionDetails);
-        final FlowChangeConfigureDetails flowChangeConfigureDetails = 
(FlowChangeConfigureDetails) actionDetails;
-
-        assertEquals("Comments", flowChangeConfigureDetails.getName());
-        assertNotEquals("Comments", 
flowChangeConfigureDetails.getPreviousValue());
-    }
-
-    private Action assertActionFound(final List<Action> actions, final 
Operation operation) {
-        assertNotNull(actions);
-
-        final Optional<Action> actionFound = actions.stream().findFirst();
-        assertTrue(actionFound.isPresent());
-
-        final Action action = actionFound.get();
-        assertEquals(USER_IDENTITY, action.getUserIdentity());
-        assertEquals(operation, action.getOperation());
-        assertEquals(PN_ID, action.getSourceId());
-        assertEquals(PN_SOURCE_NAME, action.getSourceName());
-        assertEquals(Component.Processor, action.getSourceType());
-        assertNotNull(action.getTimestamp());
-
-        return action;
-    }
-
-    private ProcessorDTO getProcessorDto() {
-        final ProcessorDTO processorDto = new ProcessorDTO();
-        processorDto.setId(PROC_1);
-        processorDto.setType("Processor");
-        final BundleDTO bundleDto = new BundleDTO();
-        bundleDto.setArtifact(BUNDLE_COORDINATE.getId());
-        bundleDto.setGroup(BUNDLE_COORDINATE.getGroup());
-        bundleDto.setVersion(BUNDLE_COORDINATE.getVersion());
-        processorDto.setBundle(bundleDto);
-        processorDto.setExtensionMissing(false);
-        processorDto.setStyle(Collections.emptyMap());
-
-        return processorDto;
-    }
-
-    private Bundle getBundle() {
-        final BundleDetails bundleDetails = new BundleDetails.Builder()
-                .coordinate(BUNDLE_COORDINATE)
-                .workingDir(new File("."))
-                .build();
-        return new Bundle(bundleDetails, this.getClass().getClassLoader());
-    }
-
-    @Configuration
-    @EnableAspectJAutoProxy(proxyTargetClass = true)
-    public static class AuditorConfiguration {
-
-        @Bean
-        public ProcessorAuditor processorAuditor() {
-            return new ProcessorAuditor();
-        }
-
-        @Bean
-        public StandardProcessorDAO processorDAO() {
-            return new StandardProcessorDAO();
-        }
-
-        @Bean
-        public ProcessGroupDAO processGroupDAO() {
-            return new StandardProcessGroupDAO();
-        }
-
-        @Bean
-        public ComponentStateDAO componentStateDAO() {
-            return new StandardComponentStateDAO();
-        }
-
-        @Bean
-        public StateManagerProvider stateManagerProvider() {
-            return mock(StateManagerProvider.class);
-        }
-
-        @Bean
-        public FlowManager flowManager() {
-            return mock(FlowManager.class);
-        }
-
-        @Bean
-        public AuditService auditService() {
-            return mock(AuditService.class);
-        }
-
-        @Bean
-        public FlowController flowController() {
-            return mock(FlowController.class);
-        }
-    }
-}
+/*
+ * 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.audit;
+
+import org.apache.nifi.action.Action;
+import org.apache.nifi.action.Component;
+import org.apache.nifi.action.Operation;
+import org.apache.nifi.action.details.ActionDetails;
+import org.apache.nifi.action.details.FlowChangeConfigureDetails;
+import org.apache.nifi.admin.service.AuditService;
+import org.apache.nifi.authorization.user.NiFiUser;
+import org.apache.nifi.authorization.user.NiFiUserDetails;
+import org.apache.nifi.authorization.user.StandardNiFiUser;
+import org.apache.nifi.bundle.Bundle;
+import org.apache.nifi.bundle.BundleCoordinate;
+import org.apache.nifi.bundle.BundleDetails;
+import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.components.state.StateManager;
+import org.apache.nifi.components.state.StateManagerProvider;
+import org.apache.nifi.controller.FlowController;
+import org.apache.nifi.controller.ProcessorNode;
+import org.apache.nifi.controller.flow.FlowManager;
+import org.apache.nifi.controller.service.ControllerServiceProvider;
+import org.apache.nifi.groups.ProcessGroup;
+import org.apache.nifi.nar.ExtensionManager;
+import org.apache.nifi.processor.Processor;
+import org.apache.nifi.web.api.dto.BundleDTO;
+import org.apache.nifi.web.api.dto.ProcessorConfigDTO;
+import org.apache.nifi.web.api.dto.ProcessorDTO;
+import org.apache.nifi.web.dao.ComponentStateDAO;
+import org.apache.nifi.web.dao.ProcessGroupDAO;
+import org.apache.nifi.web.dao.impl.StandardComponentStateDAO;
+import org.apache.nifi.web.dao.impl.StandardProcessGroupDAO;
+import org.apache.nifi.web.dao.impl.StandardProcessorDAO;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
+import static org.mockito.Mockito.when;
+
+
+@ExtendWith({SpringExtension.class, MockitoExtension.class})
+@ContextConfiguration(classes = 
{TestProcessorAuditor.AuditorConfiguration.class})
+class TestProcessorAuditor {
+
+    private static final String PROC_1 = "processor1";
+    private static final String PN_SOURCE_NAME = "sourceName1";
+    private static final String PN_ID = "processorNodeId1";
+    private static final String GROUP_ID = "group-1";
+    private static final String USER_IDENTITY = "user-id";
+    private static final BundleCoordinate BUNDLE_COORDINATE = new 
BundleCoordinate("org.apache.nifi", "nifi-processor-nar", "0.0.0");
+
+    @Autowired
+    private StandardProcessorDAO processorDao;
+    @Autowired
+    private ProcessorAuditor processorAuditor;
+
+    @Autowired
+    private AuditService auditService;
+    @Mock
+    private Authentication authentication;
+    @Mock
+    private Processor processor;
+    @Mock
+    private ExtensionManager extensionManager;
+    @Mock
+    private FlowController flowController;
+    @Autowired
+    private FlowManager flowManager;
+    @Mock
+    private ProcessGroup processGroup;
+    @Mock
+    private ProcessorNode mockProcessorNode;
+    @Mock
+    private StateManagerProvider mockStateManagerProvider;
+    @Mock
+    private StateManager mockStateManager;
+    @Mock
+    private NiFiUserDetails userDetail;
+
+    @Captor
+    private ArgumentCaptor<List<Action>> actionsArgumentCaptor;
+
+    @BeforeEach
+    void init() {
+        reset(flowController);
+        reset(auditService);
+
+        SecurityContextHolder.getContext().setAuthentication(authentication);
+        final NiFiUser user = new 
StandardNiFiUser.Builder().identity(USER_IDENTITY).build();
+        userDetail = new NiFiUserDetails(user);
+        when(authentication.getPrincipal()).thenReturn(userDetail);
+
+        when(flowController.getFlowManager()).thenReturn(flowManager);
+
+        processorDao.setFlowController(flowController);
+        processorAuditor.setAuditService(auditService);
+    }
+
+    @Test
+    void testCreateProcessorAdvice() {
+        final ProcessorDTO processorDto = getProcessorDto();
+
+        when(mockProcessorNode.getIdentifier()).thenReturn(PN_ID);
+        when(mockProcessorNode.getName()).thenReturn(PN_SOURCE_NAME);
+        when(mockProcessorNode.getProcessor()).thenReturn(processor);
+        
when(mockProcessorNode.getCanonicalClassName()).thenReturn(mockProcessorNode.getClass().getCanonicalName());
+
+        when(processor.getIdentifier()).thenReturn(PN_ID);
+
+        
when(flowController.getExtensionManager()).thenReturn(extensionManager);
+        
when(flowController.getControllerServiceProvider()).thenReturn(mock(ControllerServiceProvider.class));
+        
when(flowController.getStateManagerProvider()).thenReturn(mockStateManagerProvider);
+
+        when(flowManager.getGroup(GROUP_ID)).thenReturn(processGroup);
+        when(flowManager.createProcessor(anyString(), anyString(), 
any())).thenReturn(mockProcessorNode);
+
+        final Bundle bundle = getBundle();
+
+        
when(extensionManager.getBundle(any(BundleCoordinate.class))).thenReturn(bundle);
+        
when(extensionManager.getBundles(anyString())).thenReturn(Collections.singletonList(bundle));
+
+
+        
when(mockStateManagerProvider.getStateManager(PN_ID)).thenReturn(mockStateManager);
+
+        final ProcessorNode processor = processorDao.createProcessor(GROUP_ID, 
processorDto);
+
+        assertNotNull(processor);
+        verify(auditService).addActions(actionsArgumentCaptor.capture());
+        final List<Action> actions = actionsArgumentCaptor.getValue();
+        assertActionFound(actions, Operation.Add);
+    }
+
+    @Test
+    void testRemoveProcessorAdvice() {
+        when(flowManager.getRootGroup()).thenReturn(processGroup);
+
+        ProcessorNode mockProcessorNode = mock(ProcessorNode.class);
+        when(mockProcessorNode.getIdentifier()).thenReturn(PN_ID);
+        when(mockProcessorNode.getName()).thenReturn(PN_SOURCE_NAME);
+        when(mockProcessorNode.getProcessGroup()).thenReturn(processGroup);
+
+        when(processGroup.findProcessor(PN_ID)).thenReturn(mockProcessorNode);
+
+        processorDao.deleteProcessor(PN_ID);
+
+        verify(auditService).addActions(actionsArgumentCaptor.capture());
+        final List<Action> actions = actionsArgumentCaptor.getValue();
+        assertActionFound(actions, Operation.Remove);
+    }
+
+    @Test
+    void testUpdateProcessorAdvice() {
+        
when(flowController.getExtensionManager()).thenReturn(extensionManager);
+        when(flowManager.getRootGroup()).thenReturn(processGroup);
+
+        final Bundle bundle = getBundle();
+
+        
when(extensionManager.getBundle(any(BundleCoordinate.class))).thenReturn(bundle);
+        
when(extensionManager.getBundles(anyString())).thenReturn(Collections.singletonList(bundle));
+
+        when(mockProcessorNode.getIdentifier()).thenReturn(PN_ID);
+        when(mockProcessorNode.getName()).thenReturn(PN_SOURCE_NAME);
+        
when(mockProcessorNode.getBundleCoordinate()).thenReturn(BUNDLE_COORDINATE);
+        
when(mockProcessorNode.getCanonicalClassName()).thenReturn(ProcessorNode.class.getCanonicalName());
+        when(mockProcessorNode.getProcessGroup()).thenReturn(processGroup);
+
+        when(processGroup.findProcessor(PN_ID)).thenReturn(mockProcessorNode);
+
+        final ProcessorDTO processorDto = getProcessorDto();
+        ProcessorConfigDTO config = new ProcessorConfigDTO();
+        config.setComments("comment1");
+        config.setRunDurationMillis(100L);
+
+        processorDto.setConfig(config);
+        processorDto.setId(PN_ID);
+
+        processorDao.updateProcessor(processorDto);
+
+        verify(auditService).addActions(actionsArgumentCaptor.capture());
+        final List<Action> actions = actionsArgumentCaptor.getValue();
+        final Action action = assertActionFound(actions, Operation.Configure);
+
+        final ActionDetails actionDetails = action.getActionDetails();
+        assertUpdateActionDetailsFound(actionDetails);
+    }
+
+    @Test
+    void testSensitivePropertyDeletesHistory() {
+        
when(flowController.getExtensionManager()).thenReturn(extensionManager);
+        when(flowManager.getRootGroup()).thenReturn(processGroup);
+
+        final Bundle bundle = getBundle();
+
+        
when(extensionManager.getBundle(any(BundleCoordinate.class))).thenReturn(bundle);
+        
when(extensionManager.getBundles(anyString())).thenReturn(Collections.singletonList(bundle));
+
+        when(mockProcessorNode.getIdentifier()).thenReturn(PN_ID);
+        when(mockProcessorNode.getName()).thenReturn(PN_SOURCE_NAME);
+        
when(mockProcessorNode.getBundleCoordinate()).thenReturn(BUNDLE_COORDINATE);
+        
when(mockProcessorNode.getCanonicalClassName()).thenReturn(ProcessorNode.class.getCanonicalName());
+        when(mockProcessorNode.getProcessGroup()).thenReturn(processGroup);
+
+        final String propertyName = "sensitive-property-descriptor-1";
+
+        PropertyDescriptor propertyDescriptor = new 
PropertyDescriptor.Builder()
+                .name(propertyName)
+                .sensitive(true)
+                .build();
+
+        
when(mockProcessorNode.getPropertyDescriptor("dynamicSensitiveProperty1")).thenReturn(propertyDescriptor);
+
+        when(processGroup.findProcessor(PN_ID)).thenReturn(mockProcessorNode);
+
+        final ProcessorDTO processorDto = getProcessorDto();
+        ProcessorConfigDTO config = new ProcessorConfigDTO();
+        
config.setProperties(Collections.singletonMap("dynamicSensitiveProperty1", 
"asd"));
+        
config.setSensitiveDynamicPropertyNames(Collections.singleton("dynamicSensitiveProperty1"));
+        config.setRunDurationMillis(100L);
+
+        processorDto.setConfig(config);
+        processorDto.setId(PN_ID);
+
+        processorDao.updateProcessor(processorDto);
+
+        ArgumentCaptor<String> propertyNameCaptor = 
ArgumentCaptor.forClass(String.class);
+        ArgumentCaptor<String> componentIdCaptor = 
ArgumentCaptor.forClass(String.class);
+
+        
verify(auditService).deletePreviousValues(propertyNameCaptor.capture(), 
componentIdCaptor.capture());
+
+        assertEquals(propertyName, propertyNameCaptor.getValue());
+        assertEquals(PN_ID, componentIdCaptor.getValue());
+    }
+
+    @Test
+    void testUpdateProcessorAdviceProcessorUnchanged() {
+        
when(flowController.getExtensionManager()).thenReturn(extensionManager);
+        when(flowManager.getRootGroup()).thenReturn(processGroup);
+
+        final Bundle bundle = getBundle();
+
+        
when(extensionManager.getBundle(any(BundleCoordinate.class))).thenReturn(bundle);
+        
when(extensionManager.getBundles(anyString())).thenReturn(Collections.singletonList(bundle));
+
+        when(mockProcessorNode.getIdentifier()).thenReturn(PN_ID);
+        
when(mockProcessorNode.getBundleCoordinate()).thenReturn(BUNDLE_COORDINATE);
+        
when(mockProcessorNode.getCanonicalClassName()).thenReturn(ProcessorNode.class.getCanonicalName());
+        when(mockProcessorNode.getProcessGroup()).thenReturn(processGroup);
+
+        when(processGroup.findProcessor(PN_ID)).thenReturn(mockProcessorNode);
+
+        final ProcessorDTO processorDto = getProcessorDto();
+        processorDto.setId(PN_ID);
+
+        processorDao.updateProcessor(processorDto);
+
+        verifyNoInteractions(auditService);
+    }
+
+    private void assertUpdateActionDetailsFound(final ActionDetails 
actionDetails) {
+        assertInstanceOf(FlowChangeConfigureDetails.class, actionDetails);
+        final FlowChangeConfigureDetails flowChangeConfigureDetails = 
(FlowChangeConfigureDetails) actionDetails;
+
+        assertEquals("Comments", flowChangeConfigureDetails.getName());
+        assertNotEquals("Comments", 
flowChangeConfigureDetails.getPreviousValue());
+    }
+
+    private Action assertActionFound(final List<Action> actions, final 
Operation operation) {
+        assertNotNull(actions);
+
+        final Optional<Action> actionFound = actions.stream().findFirst();
+        assertTrue(actionFound.isPresent());
+
+        final Action action = actionFound.get();
+        assertEquals(USER_IDENTITY, action.getUserIdentity());
+        assertEquals(operation, action.getOperation());
+        assertEquals(PN_ID, action.getSourceId());
+        assertEquals(PN_SOURCE_NAME, action.getSourceName());
+        assertEquals(Component.Processor, action.getSourceType());
+        assertNotNull(action.getTimestamp());
+
+        return action;
+    }
+
+    private ProcessorDTO getProcessorDto() {
+        final ProcessorDTO processorDto = new ProcessorDTO();
+        processorDto.setId(PROC_1);
+        processorDto.setType("Processor");
+        final BundleDTO bundleDto = new BundleDTO();
+        bundleDto.setArtifact(BUNDLE_COORDINATE.getId());
+        bundleDto.setGroup(BUNDLE_COORDINATE.getGroup());
+        bundleDto.setVersion(BUNDLE_COORDINATE.getVersion());
+        processorDto.setBundle(bundleDto);
+        processorDto.setExtensionMissing(false);
+        processorDto.setStyle(Collections.emptyMap());
+
+        return processorDto;
+    }
+
+    private Bundle getBundle() {
+        final BundleDetails bundleDetails = new BundleDetails.Builder()
+                .coordinate(BUNDLE_COORDINATE)
+                .workingDir(new File("."))
+                .build();
+        return new Bundle(bundleDetails, this.getClass().getClassLoader());
+    }
+
+    @Configuration
+    @EnableAspectJAutoProxy(proxyTargetClass = true)
+    public static class AuditorConfiguration {
+
+        @Bean
+        public ProcessorAuditor processorAuditor() {
+            return new ProcessorAuditor();
+        }
+
+        @Bean
+        public StandardProcessorDAO processorDAO() {
+            return new StandardProcessorDAO();
+        }
+
+        @Bean
+        public ProcessGroupDAO processGroupDAO() {
+            return new StandardProcessGroupDAO();
+        }
+
+        @Bean
+        public ComponentStateDAO componentStateDAO() {
+            return new StandardComponentStateDAO();
+        }
+
+        @Bean
+        public StateManagerProvider stateManagerProvider() {
+            return mock(StateManagerProvider.class);
+        }
+
+        @Bean
+        public FlowManager flowManager() {
+            return mock(FlowManager.class);
+        }
+
+        @Bean
+        public AuditService auditService() {
+            return mock(AuditService.class);
+        }
+
+        @Bean
+        public FlowController flowController() {
+            return mock(FlowController.class);
+        }
+    }
+}

Reply via email to