18 changed files with 589 additions and 25 deletions
@ -0,0 +1,37 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2024 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed 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 |
||||||
|
* |
||||||
|
* https://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.springframework.boot.autoconfigure.jms.artemis; |
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.service.connection.ConnectionDetails; |
||||||
|
|
||||||
|
/** |
||||||
|
* Details required to establish a connection to an Artemis service. |
||||||
|
* |
||||||
|
* @author Eddú Meléndez |
||||||
|
* @since 3.3.0 |
||||||
|
*/ |
||||||
|
public interface ArtemisConnectionDetails extends ConnectionDetails { |
||||||
|
|
||||||
|
ArtemisMode getMode(); |
||||||
|
|
||||||
|
String getBrokerUrl(); |
||||||
|
|
||||||
|
String getUser(); |
||||||
|
|
||||||
|
String getPassword(); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,84 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2024 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed 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 |
||||||
|
* |
||||||
|
* https://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.springframework.boot.docker.compose.service.connection.activemq; |
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.jms.artemis.ArtemisConnectionDetails; |
||||||
|
import org.springframework.boot.autoconfigure.jms.artemis.ArtemisMode; |
||||||
|
import org.springframework.boot.docker.compose.core.RunningService; |
||||||
|
import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; |
||||||
|
import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource; |
||||||
|
|
||||||
|
/** |
||||||
|
* {@link DockerComposeConnectionDetailsFactory} to create |
||||||
|
* {@link ArtemisConnectionDetails} for an {@code artemis} service. |
||||||
|
* |
||||||
|
* @author Eddú Meléndez |
||||||
|
*/ |
||||||
|
class ArtemisDockerComposeConnectionDetailsFactory |
||||||
|
extends DockerComposeConnectionDetailsFactory<ArtemisConnectionDetails> { |
||||||
|
|
||||||
|
private static final int ACTIVEMQ_PORT = 61616; |
||||||
|
|
||||||
|
protected ArtemisDockerComposeConnectionDetailsFactory() { |
||||||
|
super("apache/activemq-classic"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected ArtemisConnectionDetails getDockerComposeConnectionDetails(DockerComposeConnectionSource source) { |
||||||
|
return new ArtemisDockerComposeConnectionDetails(source.getRunningService()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@link ArtemisConnectionDetails} backed by a {@code artemis} |
||||||
|
* {@link RunningService}. |
||||||
|
*/ |
||||||
|
static class ArtemisDockerComposeConnectionDetails extends DockerComposeConnectionDetails |
||||||
|
implements ArtemisConnectionDetails { |
||||||
|
|
||||||
|
private final ArtemisEnvironment environment; |
||||||
|
|
||||||
|
private final String brokerUrl; |
||||||
|
|
||||||
|
protected ArtemisDockerComposeConnectionDetails(RunningService service) { |
||||||
|
super(service); |
||||||
|
this.environment = new ArtemisEnvironment(service.env()); |
||||||
|
this.brokerUrl = "tcp://" + service.host() + ":" + service.ports().get(ACTIVEMQ_PORT); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ArtemisMode getMode() { |
||||||
|
return ArtemisMode.NATIVE; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getBrokerUrl() { |
||||||
|
return this.brokerUrl; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getUser() { |
||||||
|
return this.environment.getUser(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPassword() { |
||||||
|
return this.environment.getPassword(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,45 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2024 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed 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 |
||||||
|
* |
||||||
|
* https://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.springframework.boot.docker.compose.service.connection.activemq; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* Artemis environment details. |
||||||
|
* |
||||||
|
* @author Eddú Meléndez |
||||||
|
*/ |
||||||
|
class ArtemisEnvironment { |
||||||
|
|
||||||
|
private final String user; |
||||||
|
|
||||||
|
private final String password; |
||||||
|
|
||||||
|
ArtemisEnvironment(Map<String, String> env) { |
||||||
|
this.user = env.get("ACTIVEMQ_CONNECTION_USER"); |
||||||
|
this.password = env.get("ACTIVEMQ_CONNECTION_PASSWORD"); |
||||||
|
} |
||||||
|
|
||||||
|
String getUser() { |
||||||
|
return this.user; |
||||||
|
} |
||||||
|
|
||||||
|
String getPassword() { |
||||||
|
return this.password; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,48 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2024 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed 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 |
||||||
|
* |
||||||
|
* https://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.springframework.boot.docker.compose.service.connection.activemq; |
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.jms.artemis.ArtemisConnectionDetails; |
||||||
|
import org.springframework.boot.autoconfigure.jms.artemis.ArtemisMode; |
||||||
|
import org.springframework.boot.docker.compose.service.connection.test.AbstractDockerComposeIntegrationTests; |
||||||
|
import org.springframework.boot.testsupport.testcontainers.DockerImageNames; |
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Integration tests for {@link ArtemisDockerComposeConnectionDetailsFactory}. |
||||||
|
* |
||||||
|
* @author Eddú Meléndez |
||||||
|
*/ |
||||||
|
class ArtemisDockerComposeConnectionDetailsFactoryIntegrationTests extends AbstractDockerComposeIntegrationTests { |
||||||
|
|
||||||
|
ArtemisDockerComposeConnectionDetailsFactoryIntegrationTests() { |
||||||
|
super("artemis-compose.yaml", DockerImageNames.artemis()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void runCreatesConnectionDetails() { |
||||||
|
ArtemisConnectionDetails connectionDetails = run(ArtemisConnectionDetails.class); |
||||||
|
assertThat(connectionDetails.getMode()).isEqualTo(ArtemisMode.NATIVE); |
||||||
|
assertThat(connectionDetails.getBrokerUrl()).isNotNull().startsWith("tcp://"); |
||||||
|
assertThat(connectionDetails.getUser()).isEqualTo("root"); |
||||||
|
assertThat(connectionDetails.getPassword()).isEqualTo("secret"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,57 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2024 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed 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 |
||||||
|
* |
||||||
|
* https://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.springframework.boot.docker.compose.service.connection.activemq; |
||||||
|
|
||||||
|
import java.util.Collections; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests for {@link ArtemisEnvironment}. |
||||||
|
* |
||||||
|
* @author Eddú Meléndez |
||||||
|
*/ |
||||||
|
class ArtemisEnvironmentTests { |
||||||
|
|
||||||
|
@Test |
||||||
|
void getUserWhenHasNoActiveMqUser() { |
||||||
|
ArtemisEnvironment environment = new ArtemisEnvironment(Collections.emptyMap()); |
||||||
|
assertThat(environment.getUser()).isNull(); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getUserWhenHasActiveMqUser() { |
||||||
|
ArtemisEnvironment environment = new ArtemisEnvironment(Map.of("ACTIVEMQ_CONNECTION_USER", "me")); |
||||||
|
assertThat(environment.getUser()).isEqualTo("me"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getPasswordWhenHasNoActiveMqPassword() { |
||||||
|
ArtemisEnvironment environment = new ArtemisEnvironment(Collections.emptyMap()); |
||||||
|
assertThat(environment.getPassword()).isNull(); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getPasswordWhenHasActiveMqPassword() { |
||||||
|
ArtemisEnvironment environment = new ArtemisEnvironment(Map.of("ACTIVEMQ_CONNECTION_PASSWORD", "secret")); |
||||||
|
assertThat(environment.getPassword()).isEqualTo("secret"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,8 @@ |
|||||||
|
services: |
||||||
|
artemis: |
||||||
|
image: '{imageName}' |
||||||
|
ports: |
||||||
|
- '61616' |
||||||
|
environment: |
||||||
|
ACTIVEMQ_CONNECTION_USER: 'root' |
||||||
|
ACTIVEMQ_CONNECTION_PASSWORD: 'secret' |
||||||
@ -0,0 +1,71 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2024 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed 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 |
||||||
|
* |
||||||
|
* https://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.springframework.boot.testcontainers.service.connection.activemq; |
||||||
|
|
||||||
|
import org.testcontainers.activemq.ArtemisContainer; |
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.jms.artemis.ArtemisConnectionDetails; |
||||||
|
import org.springframework.boot.autoconfigure.jms.artemis.ArtemisMode; |
||||||
|
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory; |
||||||
|
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource; |
||||||
|
import org.springframework.boot.testcontainers.service.connection.ServiceConnection; |
||||||
|
|
||||||
|
/** |
||||||
|
* {@link ContainerConnectionDetailsFactory} to create {@link ArtemisConnectionDetails} |
||||||
|
* from a {@link ServiceConnection @ServiceConnection}-annotated {@link ArtemisContainer}. |
||||||
|
* |
||||||
|
* @author Eddú Meléndez |
||||||
|
*/ |
||||||
|
class ArtemisContainerConnectionDetailsFactory |
||||||
|
extends ContainerConnectionDetailsFactory<ArtemisContainer, ArtemisConnectionDetails> { |
||||||
|
|
||||||
|
@Override |
||||||
|
protected ArtemisConnectionDetails getContainerConnectionDetails( |
||||||
|
ContainerConnectionSource<ArtemisContainer> source) { |
||||||
|
return new ArtemisContainerConnectionDetails(source); |
||||||
|
} |
||||||
|
|
||||||
|
private static final class ArtemisContainerConnectionDetails extends ContainerConnectionDetails<ArtemisContainer> |
||||||
|
implements ArtemisConnectionDetails { |
||||||
|
|
||||||
|
private ArtemisContainerConnectionDetails(ContainerConnectionSource<ArtemisContainer> source) { |
||||||
|
super(source); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ArtemisMode getMode() { |
||||||
|
return ArtemisMode.NATIVE; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getBrokerUrl() { |
||||||
|
return getContainer().getBrokerUrl(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getUser() { |
||||||
|
return getContainer().getUser(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPassword() { |
||||||
|
return getContainer().getPassword(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,91 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2024 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed 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 |
||||||
|
* |
||||||
|
* https://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.springframework.boot.testcontainers.service.connection.activemq; |
||||||
|
|
||||||
|
import java.time.Duration; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.awaitility.Awaitility; |
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
import org.testcontainers.activemq.ArtemisContainer; |
||||||
|
import org.testcontainers.junit.jupiter.Container; |
||||||
|
import org.testcontainers.junit.jupiter.Testcontainers; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.boot.autoconfigure.ImportAutoConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration; |
||||||
|
import org.springframework.boot.testcontainers.service.connection.ServiceConnection; |
||||||
|
import org.springframework.boot.testsupport.testcontainers.DockerImageNames; |
||||||
|
import org.springframework.context.annotation.Bean; |
||||||
|
import org.springframework.context.annotation.Configuration; |
||||||
|
import org.springframework.jms.annotation.JmsListener; |
||||||
|
import org.springframework.jms.core.JmsMessagingTemplate; |
||||||
|
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; |
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests for {@link ArtemisContainerConnectionDetailsFactory}. |
||||||
|
* |
||||||
|
* @author Eddú Meléndez |
||||||
|
*/ |
||||||
|
@SpringJUnitConfig |
||||||
|
@Testcontainers(disabledWithoutDocker = true) |
||||||
|
class ArtemisContainerConnectionDetailsFactoryIntegrationTests { |
||||||
|
|
||||||
|
@Container |
||||||
|
@ServiceConnection |
||||||
|
static final ArtemisContainer artemis = new ArtemisContainer(DockerImageNames.artemis()); |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private JmsMessagingTemplate jmsTemplate; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private TestListener listener; |
||||||
|
|
||||||
|
@Test |
||||||
|
void connectionCanBeMadeToActiveMQContainer() { |
||||||
|
this.jmsTemplate.convertAndSend("sample.queue", "message"); |
||||||
|
Awaitility.waitAtMost(Duration.ofMinutes(1)) |
||||||
|
.untilAsserted(() -> assertThat(this.listener.messages).containsExactly("message")); |
||||||
|
} |
||||||
|
|
||||||
|
@Configuration(proxyBeanMethods = false) |
||||||
|
@ImportAutoConfiguration({ ArtemisAutoConfiguration.class, JmsAutoConfiguration.class }) |
||||||
|
static class TestConfiguration { |
||||||
|
|
||||||
|
@Bean |
||||||
|
TestListener testListener() { |
||||||
|
return new TestListener(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
static class TestListener { |
||||||
|
|
||||||
|
private final List<String> messages = new ArrayList<>(); |
||||||
|
|
||||||
|
@JmsListener(destination = "sample.queue") |
||||||
|
void processMessage(String message) { |
||||||
|
this.messages.add(message); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
Loading…
Reference in new issue