diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2e0ea547e4f020993c36a53460979b43e0d57f4c..1967e4afeacc6e81ad68eca7d0ccb97337f32f3d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -298,7 +298,7 @@ test-frontend: - build-frontend script: - "make test-frontend" - - "cat ./fda-analyse-service/coverage.txt | grep -o 'TOTAL[^%]*%'" + - "cat ./fda-ui/coverage.txt | grep -o 'Lines[^%]*%'" artifacts: when: always paths: diff --git a/.junit/teardown b/.junit/teardown new file mode 100755 index 0000000000000000000000000000000000000000..6e818f5ad3acd1eb58002c9c8851b932b159c7c7 --- /dev/null +++ b/.junit/teardown @@ -0,0 +1,27 @@ +#!/bin/bash +echo "=== [ Stopping dbrepo-* ] ===" +docker container stop $(docker container ls -aq -f name=^/dbrepo-.*) || true +echo "=== [ Removing dbrepo-* ] ===" +docker container rm $(docker container ls -aq -f name=^/dbrepo-.*) || true +docker volume rm $(docker volume ls -q -f name=^dbrepo-.*) || true +docker network rm $(docker network ls -q -f name=^dbrepo-.*) || true +echo "=== [ Stopping * ] ===" +docker container stop $(docker container ls -aq -f name=.*-service) || true +docker container stop ui ui-proxy metadata-db || true +echo "=== [ Removing * ] ===" +docker container rm $(docker container ls -aq -f name=.*-service) || true +docker container rm ui ui-proxy metadata-db || true +docker volume rm $(docker volume ls -q) || true +docker network rm core public userdb || true +echo "=== [ Stopping fda-* ] ===" +docker container stop $(docker container ls -aq -f name=^/fda-.*) || true +echo "=== [ Removing fda-* ] ===" +docker container rm $(docker container ls -aq -f name=^/fda-.*) || true +docker volume rm $(docker volume ls -q -f name=^fda-.*) || true +docker network rm $(docker network ls -q -f name=^fda-.*) || true +echo "=== [ Stopping tuw-* ] ===" +docker container stop $(docker container ls -aq -f name=^/tuw-.*) || true +echo "=== [ Removing tuw-* ] ===" +docker container rm $(docker container ls -aq -f name=^/tuw-.*) || true +docker volume rm $(docker volume ls -q -f name=^tuw-.*) || true +docker network rm $(docker network ls -q -f name=^tuw-.*) || true \ No newline at end of file diff --git a/Makefile b/Makefile index ce4752b5fb461585a359e97afa1b370c0e433a53..a5bce8de2e48b1547e456f13be75256590b415c9 100644 --- a/Makefile +++ b/Makefile @@ -189,10 +189,8 @@ coverage-frontend: build-frontend test-frontend: clean build-frontend yarn --cwd ./fda-ui install - cp .env.unix.example .env - docker compose up -d - yarn --cwd ./fda-ui run test:e2e || true - docker compose down + yarn --cwd ./fda-ui run test:unit || true + yarn --cwd ./fda-ui run coverage || true clean: docker system prune -f --volumes @@ -203,4 +201,4 @@ test-clients: test: test-backend test-frontend teardown: - ./.dbrepo2/teardown + ./.junit/teardown diff --git a/fda-query-service/rest-service/src/main/resources/application-local.yml b/fda-query-service/rest-service/src/main/resources/application-local.yml index 8e36da9b7be6e9aa2e1ba5aee7d69ab244f1cd24..9451262fbd588419c058cfa6f760a81500a7b1e6 100644 --- a/fda-query-service/rest-service/src/main/resources/application-local.yml +++ b/fda-query-service/rest-service/src/main/resources/application-local.yml @@ -32,7 +32,7 @@ logging: pattern.console: "%d %highlight(%-5level) %msg%n" level: root: warn - at.tuwien.: info + at.tuwien.: trace org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug eureka: instance.hostname: query-service diff --git a/fda-query-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java b/fda-query-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java index 16ddbb350bf104f333febe8b6f1cdf08c04e632b..b369dfe7c4a12c8092a4c747a1620ea7d29dc646 100644 --- a/fda-query-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java +++ b/fda-query-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java @@ -300,6 +300,16 @@ public abstract class BaseUnitTest { .tag(IMAGE_ELASTIC_TAG) .build(); + public final static Long IMAGE_PROXY_ID = 4L; + public final static String IMAGE_PROXY_REPOSITORY = "nginx"; + public final static String IMAGE_PROXY_TAG = "latest"; + + public final static ContainerImage IMAGE_PROXY = ContainerImage.builder() + .id(IMAGE_PROXY_ID) + .repository(IMAGE_PROXY_REPOSITORY) + .tag(IMAGE_PROXY_TAG) + .build(); + public final static Long CONTAINER_1_ID = 1L; public final static String CONTAINER_1_HASH = "deadbeef"; public final static ContainerImage CONTAINER_1_IMAGE = IMAGE_1; @@ -434,6 +444,28 @@ public abstract class BaseUnitTest { .creator(USER_1) .build(); + public final static Long CONTAINER_PROXY_ID = 7L; + public final static String CONTAINER_PROXY_NAME = "dbrepo-proxy"; + public final static String CONTAINER_PROXY_INTERNAL_NAME = "dbrepo-proxy"; + public final static String CONTAINER_PROXY_IP = "172.31.0.4"; + public final static String CONTAINER_PROXY_HASH = "deadbeef"; + public final static Instant CONTAINER_PROXY_CREATED = Instant.now().minus(1, HOURS); + public final static String[] CONTAINER_PROXY_ENV = new String[]{}; + public final static HealthCheck CONTAINER_PROXY_HEALTHCHECK = new HealthCheck() + .withTest(List.of("CMD", "service", "nginx", "status")); + + public final static Container CONTAINER_PROXY = Container.builder() + .id(CONTAINER_PROXY_ID) + .name(CONTAINER_PROXY_NAME) + .internalName(CONTAINER_PROXY_INTERNAL_NAME) + .imageId(IMAGE_PROXY_ID) + .image(IMAGE_PROXY) + .hash(CONTAINER_PROXY_HASH) + .ipAddress(CONTAINER_PROXY_IP) + .created(CONTAINER_PROXY_CREATED) + .creator(USER_1) + .build(); + public final static Long DATABASE_1_ID = 1L; public final static String DATABASE_1_NAME = "Weather"; public final static String DATABASE_1_INTERNALNAME = "weather"; diff --git a/fda-query-service/rest-service/src/test/java/at/tuwien/config/DockerConfig.java b/fda-query-service/rest-service/src/test/java/at/tuwien/config/DockerConfig.java index cdeff597fc39b98e2498306d1e8293457ef9c1e6..f91219b29e5831a008e39cc3656d47d9bbdcf6e0 100644 --- a/fda-query-service/rest-service/src/test/java/at/tuwien/config/DockerConfig.java +++ b/fda-query-service/rest-service/src/test/java/at/tuwien/config/DockerConfig.java @@ -90,12 +90,16 @@ public class DockerConfig extends BaseUnitTest { final HostConfig hostConfig1; final String network = (container.getInternalName().contains("userdb") ? "fda-userdb" : "fda-public"); if (bind == null) { + log.trace("map standard binding /tmp:/tmp"); hostConfig1 = hostConfig.withNetworkMode(network) .withBinds(Bind.parse("/tmp:/tmp")); } else { - hostConfig1 = hostConfig.withNetworkMode(network).withBinds(Bind.parse(bind), Bind.parse("/tmp:/tmp")); + log.trace("map non-standard binding {}, /tmp:/tmp", bind); + hostConfig1 = hostConfig.withNetworkMode(network) + .withBinds(Bind.parse(bind), Bind.parse("/tmp:/tmp")); } if (port != null) { + log.trace("map port binding {}:{}", port, port); hostConfig1.withPortBindings(PortBinding.parse(port + ":" + port)); } final CreateContainerCmd cmd = dockerClient.createContainerCmd(container.getImage().getRepository() + ":" + container.getImage().getTag()) @@ -191,6 +195,9 @@ public class DockerConfig extends BaseUnitTest { case 5: log.debug("container with id {} has a health check config", containerId); return CONTAINER_BROKER_HEALTHCHECK; + case 7: + log.debug("container with id {} has a health check config", containerId); + return CONTAINER_PROXY_HEALTHCHECK; } log.trace("container with id {} does not have a healthcheck config", containerId); return null; diff --git a/fda-query-service/rest-service/src/test/java/at/tuwien/listener/RabbitMqListenerIntegrationTest.java b/fda-query-service/rest-service/src/test/java/at/tuwien/listener/RabbitMqListenerIntegrationTest.java index 2a1e4ab13b30e61e87b7acf0c3ae4cc4fcc4d63a..79b0f37ba1eba66423510c703ec9992249b3098e 100644 --- a/fda-query-service/rest-service/src/test/java/at/tuwien/listener/RabbitMqListenerIntegrationTest.java +++ b/fda-query-service/rest-service/src/test/java/at/tuwien/listener/RabbitMqListenerIntegrationTest.java @@ -3,9 +3,6 @@ package at.tuwien.listener; import at.tuwien.BaseUnitTest; import at.tuwien.api.amqp.ConsumerDto; import at.tuwien.config.*; -import at.tuwien.exception.*; -import at.tuwien.gateway.BrokerServiceGateway; -import at.tuwien.listener.impl.RabbitMqListenerImpl; import at.tuwien.repository.jpa.*; import com.rabbitmq.client.BuiltinExchangeType; import com.rabbitmq.client.Channel; @@ -18,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.io.IOException; @@ -25,10 +23,10 @@ import java.util.*; import java.util.stream.Collectors; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; @Log4j2 +@ActiveProfiles(profiles = "junit") @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @SpringBootTest @ExtendWith(SpringExtension.class) @@ -40,9 +38,6 @@ public class RabbitMqListenerIntegrationTest extends BaseUnitTest { @MockBean private IndexConfig indexConfig; - @MockBean - private BrokerServiceGateway brokerServiceGateway; - @Autowired private Channel channel; @@ -58,9 +53,6 @@ public class RabbitMqListenerIntegrationTest extends BaseUnitTest { @Autowired private TableRepository tableRepository; - @Autowired - private RabbitMqListenerImpl rabbitMqListener; - @Autowired private H2Utils h2Utils; @@ -71,12 +63,14 @@ public class RabbitMqListenerIntegrationTest extends BaseUnitTest { private AmqpConfig amqpConfig; @Rule - public Timeout globalTimeout = Timeout.seconds(60); + public Timeout globalTimeout = Timeout.seconds(300); @BeforeAll public static void beforeAll() throws InterruptedException { afterAll(); + /* create networks */ DockerConfig.createAllNetworks(); + /* create containers */ DockerConfig.createContainer(null, CONTAINER_BROKER, 15672, CONTAINER_BROKER_ENV); DockerConfig.startContainer(CONTAINER_BROKER); } @@ -102,9 +96,10 @@ public class RabbitMqListenerIntegrationTest extends BaseUnitTest { } @Test - public void updateConsumers_succeeds() throws AmqpException, IOException, InterruptedException { + public void updateConsumers_succeeds() throws IOException, InterruptedException { /* pre-condition */ + assertEquals(0, getConsumers().size()); assertEquals(2, amqpConfig.getAmqpConsumers()); /* mock */ @@ -115,19 +110,23 @@ public class RabbitMqListenerIntegrationTest extends BaseUnitTest { channel.queueBind(TABLE_2_QUEUE_NAME, DATABASE_1_EXCHANGE, TABLE_2_ROUTING_KEY); channel.queueDeclare(TABLE_3_QUEUE_NAME, true, false, false, null); channel.queueBind(TABLE_3_QUEUE_NAME, DATABASE_1_EXCHANGE, TABLE_3_ROUTING_KEY); - when(brokerServiceGateway.findAllConsumers()) - .thenReturn(List.of()); /* test */ - rabbitMqListener.updateConsumers(); - Thread.sleep(10 * 1000); - final List<ConsumerDto> response = rabbitMqConfig.findAllConsumers() + Thread.sleep(30 * 1000) /* wait for scheduled insert */; + final List<ConsumerDto> response = getConsumers(); + final List<ConsumerDto> consumers1 = response.stream().filter(c -> c.getQueue().getName().equals(TABLE_1_QUEUE_NAME)).collect(Collectors.toList()); + assertEquals(2, consumers1.size()); + final List<ConsumerDto> consumers2 = response.stream().filter(c -> c.getQueue().getName().equals(TABLE_2_QUEUE_NAME)).collect(Collectors.toList()); + assertEquals(2, consumers2.size()); + final List<ConsumerDto> consumers3 = response.stream().filter(c -> c.getQueue().getName().equals(TABLE_3_QUEUE_NAME)).collect(Collectors.toList()); + assertEquals(2, consumers3.size()); + } + + private List<ConsumerDto> getConsumers() throws IOException { + return rabbitMqConfig.findAllConsumers() .stream() .filter(c -> List.of(TABLE_1_QUEUE_NAME, TABLE_2_QUEUE_NAME, TABLE_3_QUEUE_NAME).contains(c.getQueue().getName())) .collect(Collectors.toList()); - assertEquals(2, (int) response.stream().filter(c -> c.getQueue().getName().equals(TABLE_1_QUEUE_NAME)).count()); - assertEquals(2, (int) response.stream().filter(c -> c.getQueue().getName().equals(TABLE_2_QUEUE_NAME)).count()); - assertEquals(2, (int) response.stream().filter(c -> c.getQueue().getName().equals(TABLE_3_QUEUE_NAME)).count()); } } diff --git a/fda-query-service/rest-service/src/test/resources/application.properties b/fda-query-service/rest-service/src/test/resources/application.properties index ce3b3e9dab09f37c7ce57290953607d20eccc211..4eea490a9199d7e0155b1f33cf3500a5e1f2863f 100644 --- a/fda-query-service/rest-service/src/test/resources/application.properties +++ b/fda-query-service/rest-service/src/test/resources/application.properties @@ -19,7 +19,7 @@ spring.jpa.show-sql=false # additional logging logging.level.root=error -logging.level.at.tuwien.=info +logging.level.at.tuwien.=trace # broker service spring.rabbitmq.host=dbrepo-broker-service @@ -27,4 +27,6 @@ spring.rabbitmq.username=guest spring.rabbitmq.password=guest # search service +fda.consumers=2 +fda.gateway.endpoint: http://localhost:15672 fda.elastic.endpoint=dbrepo-search-service:9200 \ No newline at end of file diff --git a/fda-query-service/rest-service/src/test/resources/webserver/weather_aus.csv b/fda-query-service/rest-service/src/test/resources/webserver/weather_aus.csv deleted file mode 100644 index 9bfb33891d9c10db7cd04ba1cf8d32ddc1dcde96..0000000000000000000000000000000000000000 --- a/fda-query-service/rest-service/src/test/resources/webserver/weather_aus.csv +++ /dev/null @@ -1,3 +0,0 @@ -1,2008-12-01,Albury,13.4,0.6 -2,2008-12-02,Albury,7.4,0 -3,2008-12-03,Albury,12.9,0 \ No newline at end of file diff --git a/fda-query-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java b/fda-query-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java index 16afe426ad48f3bc7733fd86f1140e886319261f..4629fbe4ccb3c567001e215a25d0c1182d78c472 100644 --- a/fda-query-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java +++ b/fda-query-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java @@ -7,7 +7,9 @@ import at.tuwien.gateway.BrokerServiceGateway; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.core.ParameterizedTypeReference; +import org.springframework.core.env.Environment; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -17,6 +19,7 @@ import org.springframework.web.client.RestTemplate; import java.net.URI; import java.nio.charset.Charset; +import java.util.Arrays; import java.util.List; @Slf4j @@ -26,20 +29,30 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway { private final AmqpConfig amqpConfig; private final RestTemplate restTemplate; private final GatewayConfig gatewayConfig; + private final Environment environment; private final static String VIRTUAL_SERVER = "%2F"; @Autowired - public BrokerServiceGatewayImpl(AmqpConfig amqpConfig, RestTemplate restTemplate, GatewayConfig gatewayConfig) { + public BrokerServiceGatewayImpl(AmqpConfig amqpConfig, RestTemplate restTemplate, GatewayConfig gatewayConfig, + Environment environment) { this.amqpConfig = amqpConfig; this.restTemplate = restTemplate; this.gatewayConfig = gatewayConfig; + this.environment = environment; } @Override public List<ConsumerDto> findAllConsumers() { + final StringBuilder urlBuilder = new StringBuilder(gatewayConfig.getGatewayEndpoint()) + .append("/api"); + if (Arrays.stream(environment.getActiveProfiles()).noneMatch(p -> p.equals("junit"))) { + urlBuilder.append("/broker"); + } + urlBuilder.append("/consumers/") + .append(VIRTUAL_SERVER); log.trace("gateway broker find all consumers, virtual server={}", VIRTUAL_SERVER); - final URI findUri = URI.create(gatewayConfig.getGatewayEndpoint() + "/api/broker/consumers/" + VIRTUAL_SERVER); + final URI findUri = URI.create(urlBuilder.toString()); final ResponseEntity<List<ConsumerDto>> response = restTemplate.exchange(findUri, HttpMethod.GET, new HttpEntity<>(null, getHeaders()), new ParameterizedTypeReference<>() { }); diff --git a/fda-ui/.gitignore b/fda-ui/.gitignore index 6e6e590a03c7704d79c826c1a550cdd3d0fe7dfd..a6a8dd571f3fc30997a2b59aab90d21abc4aff7c 100644 --- a/fda-ui/.gitignore +++ b/fda-ui/.gitignore @@ -21,6 +21,7 @@ lib-cov # Coverage directory used by tools like istanbul coverage/ +coverage.txt # nyc test coverage .nyc_output diff --git a/fda-ui/.nycrc b/fda-ui/.nycrc index ccda5111b9ac9d41694692f5c4e0a12dadc6fbbb..a4841b7947c1e8e06b5ca816319f1eb0f20b952e 100644 --- a/fda-ui/.nycrc +++ b/fda-ui/.nycrc @@ -6,7 +6,7 @@ "branches": 35, "check-coverage": true, "include": [ "components/**/*.vue", "layouts/**/*.vue", "pages/**/*.vue", "server-middleware/**/*.js", "store/**/*.js"], - "exclude": ["node_modules"], + "exclude": ["node_modules", "server-middleware", "store"], "extension": [".js", ".vue"], "reporter": [ "lcov", diff --git a/fda-ui/package.json b/fda-ui/package.json index bb9ddae2dc4c9bedf488275eda92ae855faa54b0..1649177b07b97389c2827d1c565f2db4f7e77ca9 100644 --- a/fda-ui/package.json +++ b/fda-ui/package.json @@ -12,7 +12,7 @@ "ver": "nuxt --version", "lint:js": "eslint --ext .js,.vue --ignore-path .gitignore .", "lint": "yarn lint:js", - "coverage": "nyc ava test/unit/**/* test/specs/**/*", + "coverage": "nyc ava test/unit/**/* test/specs/**/* > ./coverage.txt", "test:unit": "ava test/unit/**/* test/specs/**/*", "test:watch": "ava --watch test/unit/**/* test/specs/**/*", "test:e2e": "yarn clean && cross-env PORT=3001 ava --timeout=2h --fail-fast test/e2e/**",