Loading pom.xml +5 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,11 @@ <artifactId>spring-boot-starter-artemis-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>artemis-jms-server</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.etsi.osl</groupId> Loading src/main/java/org/etsi/osl/secretcontroller/listeners/ControllerCommandsListener.java +7 −3 Original line number Diff line number Diff line Loading @@ -12,7 +12,7 @@ import org.springframework.jms.support.JmsMessageHeaderAccessor; import org.springframework.stereotype.Component; import tools.jackson.databind.ObjectMapper; import java.util.Map; import java.util.HashMap; @Component public class ControllerCommandsListener { Loading Loading @@ -60,8 +60,12 @@ public class ControllerCommandsListener { log.debug("Unseal request: Secret not found"); } final var headers = new HashMap<String, Object>(); final var correlationId = jmsHeaderAccessor.getCorrelationId(); if (correlationId != null) headers.put(JmsHeaders.CORRELATION_ID, correlationId); this.jmsClient.destination(destination) .send(this.objectMapper.writeValueAsString(result), Map.of(JmsHeaders.CORRELATION_ID, jmsHeaderAccessor.getCorrelationId())); .send(this.objectMapper.writeValueAsString(result), headers); } } src/test/java/org/etsi/osl/secretcontroller/listeners/ControllerCommandsListenerTest.java 0 → 100644 +120 −0 Original line number Diff line number Diff line package org.etsi.osl.secretcontroller.listeners; import jakarta.jms.*; import org.etsi.osl.secretcontroller.VaultService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jms.core.JmsTemplate; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.bean.override.mockito.MockitoBean; import tools.jackson.databind.ObjectMapper; import java.util.Map; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) @TestPropertySource(properties = { "spring.artemis.mode=embedded", "spring.artemis.embedded.persistent=false", "spring.artemis.embedded.queues=SECRETS.CHARACTERISTIC.UNSEAL", "topics.SECRETS_CHARACTERISTIC_UNSEAL=SECRETS.CHARACTERISTIC.UNSEAL", "vault.token=test-token" }) @ActiveProfiles("test") class ControllerCommandsListenerTest { @Autowired private JmsTemplate jmsTemplate; @Autowired private ConnectionFactory connectionFactory; @MockitoBean private VaultService vaultService; private final ObjectMapper objectMapper = new ObjectMapper(); @Test void processUnsealCommand_whenSecretUriNotBelonging_shouldNotSendResponse() throws Exception { when(vaultService.extractVaultKeyFromUri(anyString())).thenReturn(Optional.empty()); try (Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)) { connection.start(); TemporaryQueue replyQueue = session.createTemporaryQueue(); MessageConsumer consumer = session.createConsumer(replyQueue); String content = objectMapper .writeValueAsString(Map.of("secretURI", "http://some-uri", "characteristic", "password")); jmsTemplate.convertAndSend("SECRETS.CHARACTERISTIC.UNSEAL", content, msg -> { msg.setJMSReplyTo(replyQueue); msg.setJMSCorrelationID("test-corr-1"); return msg; }); Message response = consumer.receive(1000); assertNull(response); } } @Test void processUnsealCommand_whenSecretNotFound_shouldSendNullResponse() throws Exception { when(vaultService.extractVaultKeyFromUri(anyString())).thenReturn(Optional.of("key")); when(vaultService.getSecret(anyString())).thenReturn(Optional.empty()); try (Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)) { connection.start(); TemporaryQueue replyQueue = session.createTemporaryQueue(); MessageConsumer consumer = session.createConsumer(replyQueue); String content = objectMapper .writeValueAsString(Map.of("secretURI", "http://vault/prefix/key", "characteristic", "password")); jmsTemplate.convertAndSend("SECRETS.CHARACTERISTIC.UNSEAL", content, msg -> { msg.setJMSReplyTo(replyQueue); msg.setJMSCorrelationID("test-corr-2"); return msg; }); Message response = consumer.receive(5000); assertNotNull(response); assertInstanceOf(TextMessage.class, response); assertEquals("null", ((TextMessage) response).getText()); assertEquals("test-corr-2", response.getJMSCorrelationID()); } } @Test void processUnsealCommand_whenSecretFoundAndCharacteristicExists_shouldSendCharacteristicValue() throws Exception { when(vaultService.extractVaultKeyFromUri(anyString())).thenReturn(Optional.of("key")); when(vaultService.getSecret(anyString())).thenReturn(Optional.of(Map.of("password", "supersecret"))); try (Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)) { connection.start(); TemporaryQueue replyQueue = session.createTemporaryQueue(); MessageConsumer consumer = session.createConsumer(replyQueue); String content = objectMapper .writeValueAsString(Map.of("secretURI", "http://vault/prefix/key", "characteristic", "password")); jmsTemplate.convertAndSend("SECRETS.CHARACTERISTIC.UNSEAL", content, msg -> { msg.setJMSReplyTo(replyQueue); msg.setJMSCorrelationID("test-corr-3"); return msg; }); Message response = consumer.receive(5000); assertNotNull(response); assertInstanceOf(TextMessage.class, response); assertEquals(objectMapper.writeValueAsString("supersecret"), ((TextMessage) response).getText()); assertEquals("test-corr-3", response.getJMSCorrelationID()); } } } Loading
pom.xml +5 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,11 @@ <artifactId>spring-boot-starter-artemis-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>artemis-jms-server</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.etsi.osl</groupId> Loading
src/main/java/org/etsi/osl/secretcontroller/listeners/ControllerCommandsListener.java +7 −3 Original line number Diff line number Diff line Loading @@ -12,7 +12,7 @@ import org.springframework.jms.support.JmsMessageHeaderAccessor; import org.springframework.stereotype.Component; import tools.jackson.databind.ObjectMapper; import java.util.Map; import java.util.HashMap; @Component public class ControllerCommandsListener { Loading Loading @@ -60,8 +60,12 @@ public class ControllerCommandsListener { log.debug("Unseal request: Secret not found"); } final var headers = new HashMap<String, Object>(); final var correlationId = jmsHeaderAccessor.getCorrelationId(); if (correlationId != null) headers.put(JmsHeaders.CORRELATION_ID, correlationId); this.jmsClient.destination(destination) .send(this.objectMapper.writeValueAsString(result), Map.of(JmsHeaders.CORRELATION_ID, jmsHeaderAccessor.getCorrelationId())); .send(this.objectMapper.writeValueAsString(result), headers); } }
src/test/java/org/etsi/osl/secretcontroller/listeners/ControllerCommandsListenerTest.java 0 → 100644 +120 −0 Original line number Diff line number Diff line package org.etsi.osl.secretcontroller.listeners; import jakarta.jms.*; import org.etsi.osl.secretcontroller.VaultService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jms.core.JmsTemplate; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.bean.override.mockito.MockitoBean; import tools.jackson.databind.ObjectMapper; import java.util.Map; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) @TestPropertySource(properties = { "spring.artemis.mode=embedded", "spring.artemis.embedded.persistent=false", "spring.artemis.embedded.queues=SECRETS.CHARACTERISTIC.UNSEAL", "topics.SECRETS_CHARACTERISTIC_UNSEAL=SECRETS.CHARACTERISTIC.UNSEAL", "vault.token=test-token" }) @ActiveProfiles("test") class ControllerCommandsListenerTest { @Autowired private JmsTemplate jmsTemplate; @Autowired private ConnectionFactory connectionFactory; @MockitoBean private VaultService vaultService; private final ObjectMapper objectMapper = new ObjectMapper(); @Test void processUnsealCommand_whenSecretUriNotBelonging_shouldNotSendResponse() throws Exception { when(vaultService.extractVaultKeyFromUri(anyString())).thenReturn(Optional.empty()); try (Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)) { connection.start(); TemporaryQueue replyQueue = session.createTemporaryQueue(); MessageConsumer consumer = session.createConsumer(replyQueue); String content = objectMapper .writeValueAsString(Map.of("secretURI", "http://some-uri", "characteristic", "password")); jmsTemplate.convertAndSend("SECRETS.CHARACTERISTIC.UNSEAL", content, msg -> { msg.setJMSReplyTo(replyQueue); msg.setJMSCorrelationID("test-corr-1"); return msg; }); Message response = consumer.receive(1000); assertNull(response); } } @Test void processUnsealCommand_whenSecretNotFound_shouldSendNullResponse() throws Exception { when(vaultService.extractVaultKeyFromUri(anyString())).thenReturn(Optional.of("key")); when(vaultService.getSecret(anyString())).thenReturn(Optional.empty()); try (Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)) { connection.start(); TemporaryQueue replyQueue = session.createTemporaryQueue(); MessageConsumer consumer = session.createConsumer(replyQueue); String content = objectMapper .writeValueAsString(Map.of("secretURI", "http://vault/prefix/key", "characteristic", "password")); jmsTemplate.convertAndSend("SECRETS.CHARACTERISTIC.UNSEAL", content, msg -> { msg.setJMSReplyTo(replyQueue); msg.setJMSCorrelationID("test-corr-2"); return msg; }); Message response = consumer.receive(5000); assertNotNull(response); assertInstanceOf(TextMessage.class, response); assertEquals("null", ((TextMessage) response).getText()); assertEquals("test-corr-2", response.getJMSCorrelationID()); } } @Test void processUnsealCommand_whenSecretFoundAndCharacteristicExists_shouldSendCharacteristicValue() throws Exception { when(vaultService.extractVaultKeyFromUri(anyString())).thenReturn(Optional.of("key")); when(vaultService.getSecret(anyString())).thenReturn(Optional.of(Map.of("password", "supersecret"))); try (Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)) { connection.start(); TemporaryQueue replyQueue = session.createTemporaryQueue(); MessageConsumer consumer = session.createConsumer(replyQueue); String content = objectMapper .writeValueAsString(Map.of("secretURI", "http://vault/prefix/key", "characteristic", "password")); jmsTemplate.convertAndSend("SECRETS.CHARACTERISTIC.UNSEAL", content, msg -> { msg.setJMSReplyTo(replyQueue); msg.setJMSCorrelationID("test-corr-3"); return msg; }); Message response = consumer.receive(5000); assertNotNull(response); assertInstanceOf(TextMessage.class, response); assertEquals(objectMapper.writeValueAsString("supersecret"), ((TextMessage) response).getText()); assertEquals("test-corr-3", response.getJMSCorrelationID()); } } }