Verified Commit c03eb01d authored by João Capucho's avatar João Capucho
Browse files

Add tests for unseal listener

parent 1b51dcca
Loading
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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>
+7 −3
Original line number Diff line number Diff line
@@ -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 {
@@ -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);
    }
}
+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());
        }
    }

}