Migration to JUnit5 as default test runtime (#1082)

* Migrate tests to JUnit5

Signed-off-by: Dominic Schabel <dominic.schabel@bosch.io>

* REST docs tests migrated to JUnit5

Signed-off-by: Dominic Schabel <dominic.schabel@bosch.io>

* Migrated security and UI tests to JUnit5

Signed-off-by: Dominic Schabel <dominic.schabel@bosch.io>

* Migrated management tests to JUnit5

Signed-off-by: Dominic Schabel <dominic.schabel@bosch.io>

* Reflecting changes from JUnit5 migration

Signed-off-by: Dominic Schabel <dominic.schabel@bosch.io>

* Fix RabbitMQ test detection

Signed-off-by: Dominic Schabel <dominic.schabel@bosch.io>

* Drop support for JUnit4

Signed-off-by: Dominic Schabel <dominic.schabel@bosch.io>
This commit is contained in:
Dominic Schabel
2021-03-15 13:40:40 +01:00
committed by GitHub
parent 82ab18cf42
commit 81defa10a6
140 changed files with 572 additions and 657 deletions

View File

@@ -16,14 +16,13 @@ import org.awaitility.core.ConditionFactory;
import org.eclipse.hawkbit.repository.jpa.RepositoryApplicationConfiguration;
import org.eclipse.hawkbit.repository.test.TestConfiguration;
import org.eclipse.hawkbit.repository.test.util.AbstractIntegrationTest;
import org.junit.Before;
import org.junit.Rule;
import org.junit.jupiter.api.BeforeEach;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.junit.BrokerRunning;
import org.springframework.amqp.rabbit.junit.RabbitAvailable;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.test.binder.TestSupportBinderAutoConfiguration;
@@ -31,17 +30,15 @@ import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ContextConfiguration;
@RabbitAvailable
@ContextConfiguration(classes = { RepositoryApplicationConfiguration.class, AmqpTestConfiguration.class,
TestConfiguration.class, TestSupportBinderAutoConfiguration.class })
// Dirty context is necessary to create a new vhost and recreate all necessary
// beans after every test class.
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public abstract class AbstractAmqpIntegrationTest extends AbstractIntegrationTest {
private static final Duration TIMEOUT = Duration.ofSeconds(5);
@Rule
@Autowired
public BrokerRunning brokerRunning;
private static final Duration TIMEOUT = Duration.ofSeconds(5);
@Autowired
private ConnectionFactory connectionFactory;
@@ -51,7 +48,7 @@ public abstract class AbstractAmqpIntegrationTest extends AbstractIntegrationTes
private RabbitTemplate dmfClient;
@Before
@BeforeEach
public void setup() {
dmfClient = createDmfClient();
}

View File

@@ -17,16 +17,10 @@ import java.util.concurrent.TimeUnit;
import org.eclipse.hawkbit.HawkbitServerProperties;
import org.eclipse.hawkbit.api.HostnameResolver;
import org.eclipse.hawkbit.rabbitmq.test.RabbitMqSetupService.AlivenessException;
import org.eclipse.hawkbit.repository.jpa.model.helper.SystemSecurityContextHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.junit.BrokerRunning;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@@ -43,8 +37,6 @@ import com.google.common.base.Throwables;
@Configuration
public class AmqpTestConfiguration {
private static final Logger LOG = LoggerFactory.getLogger(AmqpTestConfiguration.class);
@Bean
SystemSecurityContextHolder systemSecurityContextHolder() {
return SystemSecurityContextHolder.getInstance();
@@ -82,26 +74,13 @@ public class AmqpTestConfiguration {
}
@Bean
ConnectionFactory rabbitConnectionFactory(final RabbitMqSetupService rabbitmqSetupService) {
final CachingConnectionFactory factory = new CachingConnectionFactory();
factory.setHost(rabbitmqSetupService.getHostname());
factory.setPort(5672);
factory.setUsername(rabbitmqSetupService.getUsername());
factory.setPassword(rabbitmqSetupService.getPassword());
try {
factory.setVirtualHost(rabbitmqSetupService.createVirtualHost());
// All exception are catched. The BrokerRunning decide if the
// test should break or not
} catch (@SuppressWarnings("squid:S2221") final Exception e) {
Throwables.propagateIfInstanceOf(e, AlivenessException.class);
LOG.error("Cannot create virtual host.", e);
}
return factory;
ConnectionFactory rabbitConnectionFactory(RabbitMqSetupService rabbitMqSetupService) {
return rabbitMqSetupService.newVirtualHostWithConnectionFactory();
}
@Bean
RabbitMqSetupService rabbitmqSetupService(final RabbitProperties properties) {
return new RabbitMqSetupService(properties);
RabbitMqSetupService rabbitMqSetupService(){
return new RabbitMqSetupService();
}
@Bean
@@ -113,14 +92,4 @@ public class AmqpTestConfiguration {
rabbitTemplate.setReceiveTimeout(TimeUnit.SECONDS.toMillis(3));
return rabbitTemplate;
}
@Bean
BrokerRunning brokerRunning(final RabbitMqSetupService rabbitmqSetupService) {
final BrokerRunning brokerRunning = BrokerRunning.isRunning();
brokerRunning.setHostName(rabbitmqSetupService.getHostname());
brokerRunning.getConnectionFactory().setUsername(rabbitmqSetupService.getUsername());
brokerRunning.getConnectionFactory().setPassword(rabbitmqSetupService.getPassword());
return brokerRunning;
}
}

View File

@@ -14,10 +14,11 @@ import java.util.UUID;
import javax.annotation.PreDestroy;
import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.junit.BrokerRunningSupport;
import org.springframework.util.StringUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.common.base.Throwables;
import com.rabbitmq.http.client.Client;
import com.rabbitmq.http.client.domain.UserPermissions;
@@ -25,18 +26,15 @@ import com.rabbitmq.http.client.domain.UserPermissions;
/**
* Creates and deletes a new virtual host if the rabbit mq management api is
* available.
*
*/
// exception squid:S2068 - Test instance passwd
@SuppressWarnings("squid:S2068")
public class RabbitMqSetupService {
private static final String GUEST = "guest";
private static final String DEFAULT_USER = GUEST;
private static final String DEFAULT_PASSWORD = GUEST;
private Client rabbitmqHttpClient;
private final com.rabbitmq.client.ConnectionFactory connectionFactory;
private String virtualHost;
private final String hostname;
@@ -45,18 +43,13 @@ public class RabbitMqSetupService {
private String password;
public RabbitMqSetupService(final RabbitProperties properties) {
hostname = properties.getHost();
username = properties.getUsername();
if (StringUtils.isEmpty(username)) {
username = DEFAULT_USER;
}
password = properties.getPassword();
if (StringUtils.isEmpty(password)) {
password = DEFAULT_PASSWORD;
}
public RabbitMqSetupService() {
BrokerRunningSupport brokerSupport = BrokerRunningSupport.isRunning();
connectionFactory = brokerSupport.getConnectionFactory();
hostname = brokerSupport.getHostName();
username = brokerSupport.getUser();
password = brokerSupport.getPassword();
}
private synchronized Client getRabbitmqHttpClient() {
@@ -74,17 +67,12 @@ public class RabbitMqSetupService {
return "http://" + getHostname() + ":15672/api/";
}
@SuppressWarnings("squid:S1162")
public String createVirtualHost() throws JsonProcessingException {
if (!getRabbitmqHttpClient().alivenessTest("/")) {
throw new AlivenessException(getHostname());
}
public ConnectionFactory newVirtualHostWithConnectionFactory() {
virtualHost = UUID.randomUUID().toString();
getRabbitmqHttpClient().createVhost(virtualHost);
getRabbitmqHttpClient().updatePermissions(virtualHost, getUsername(), createUserPermissionsFullAccess());
return virtualHost;
connectionFactory.setVirtualHost(virtualHost);
return new CachingConnectionFactory(connectionFactory);
}
@PreDestroy
@@ -95,15 +83,15 @@ public class RabbitMqSetupService {
getRabbitmqHttpClient().deleteVhost(virtualHost);
}
public String getHostname() {
private String getHostname() {
return hostname;
}
public String getPassword() {
private String getPassword() {
return password;
}
public String getUsername() {
private String getUsername() {
return username;
}
@@ -115,14 +103,4 @@ public class RabbitMqSetupService {
permissions.setWrite(".*");
return permissions;
}
static class AlivenessException extends RuntimeException {
private static final long serialVersionUID = 1L;
public AlivenessException(final String hostname) {
super("Aliveness test failed for " + hostname
+ ":15672 guest/quest; rabbit mq management api not available");
}
}
}