From e5758eb294549f271dc4c6b7ce5adb59543701e2 Mon Sep 17 00:00:00 2001 From: chandresh pancholi Date: Fri, 27 May 2022 17:38:10 +0530 Subject: [PATCH] updating version along with litmus-proxy unit test --- Dockerfile.core | 4 +- Dockerfile.proxy | 4 +- litmus-cache/pom.xml | 4 +- litmus-client/pom.xml | 6 +- litmus-core/pom.xml | 24 ++--- .../src/main/resources/application.properties | 1 + litmus-db/pom.xml | 6 +- litmus-liquibase/pom.xml | 4 +- litmus-mock/pom.xml | 8 +- litmus-model/pom.xml | 4 +- litmus-proxy/pom.xml | 25 +++--- .../java/com/navi/medici/LitmusProxyApp.java | 2 + .../controller/LitmusProxyController.java | 12 ++- .../src/main/resources/application.properties | 2 + .../medici/service/LitmusServiceImplTest.java | 90 +++++++++++++++++++ litmus-util/pom.xml | 12 ++- .../navi/medici/metrics/MetricsRegistry.java | 10 ++- pom.xml | 2 +- 18 files changed, 161 insertions(+), 59 deletions(-) create mode 100644 litmus-proxy/src/test/java/com/navi/medici/service/LitmusServiceImplTest.java diff --git a/Dockerfile.core b/Dockerfile.core index 38d79d6..fa591f6 100644 --- a/Dockerfile.core +++ b/Dockerfile.core @@ -1,5 +1,5 @@ FROM 193044292705.dkr.ecr.ap-south-1.amazonaws.com/common/maven:3.8.3-openjdk-17-slim as builder -ARG ARTIFACT_VERSION=2.0.4-RELEASE +ARG ARTIFACT_VERSION=2.0.5-SNAPSHOT RUN mkdir -p /build WORKDIR /build COPY . /build @@ -7,7 +7,7 @@ RUN mvn clean install RUN mvn clean verify -DskipTests -Dartifact.version=${ARTIFACT_VERSION} FROM 193044292705.dkr.ecr.ap-south-1.amazonaws.com/common/openjdk:17-slim-bullseye -ARG ARTIFACT_VERSION=2.0.4-RELEASE +ARG ARTIFACT_VERSION=2.0.5-SNAPSHOT RUN mkdir -p /usr/local RUN apt-get update -y && apt-get -y install fontconfig libpng-dev WORKDIR /usr/local/ diff --git a/Dockerfile.proxy b/Dockerfile.proxy index 8a5204b..9e98941 100644 --- a/Dockerfile.proxy +++ b/Dockerfile.proxy @@ -1,5 +1,5 @@ FROM 193044292705.dkr.ecr.ap-south-1.amazonaws.com/common/maven:3.8.3-openjdk-17-slim as builder -ARG ARTIFACT_VERSION=2.0.4-RELEASE +ARG ARTIFACT_VERSION=2.0.5-SNAPSHOT RUN mkdir -p /build WORKDIR /build COPY . /build @@ -7,7 +7,7 @@ RUN mvn clean install -DskipTests RUN mvn clean verify -DskipTests -Dartifact.version=${ARTIFACT_VERSION} FROM 193044292705.dkr.ecr.ap-south-1.amazonaws.com/common/openjdk:17-slim-bullseye -ARG ARTIFACT_VERSION=2.0.4-RELEASE +ARG ARTIFACT_VERSION=2.0.5-SNAPSHOT RUN mkdir -p /usr/local RUN apt-get update -y && apt-get -y install fontconfig libpng-dev WORKDIR /usr/local/ diff --git a/litmus-cache/pom.xml b/litmus-cache/pom.xml index 8a45c62..786616e 100644 --- a/litmus-cache/pom.xml +++ b/litmus-cache/pom.xml @@ -4,11 +4,11 @@ litmus com.navi.medici - 2.0.4-RELEASE + 2.0.5-SNAPSHOT litmus-cache - 2.0.4-RELEASE + 2.0.5-SNAPSHOT jar litmus-cache diff --git a/litmus-client/pom.xml b/litmus-client/pom.xml index 5c935c0..2e7dab0 100644 --- a/litmus-client/pom.xml +++ b/litmus-client/pom.xml @@ -5,11 +5,11 @@ litmus com.navi.medici - 2.0.4-RELEASE + 2.0.5-SNAPSHOT litmus-client - 2.0.4-RELEASE + 2.0.5-SNAPSHOT jar litmus-client @@ -43,7 +43,7 @@ com.navi.medici litmus-model - 2.0.4-RELEASE + 2.0.5-SNAPSHOT diff --git a/litmus-core/pom.xml b/litmus-core/pom.xml index 8e6b500..7d1ce6e 100644 --- a/litmus-core/pom.xml +++ b/litmus-core/pom.xml @@ -5,11 +5,11 @@ litmus com.navi.medici - 2.0.4-RELEASE + 2.0.5-SNAPSHOT litmus-core - 2.0.4-RELEASE + 2.0.5-SNAPSHOT jar litmus-core @@ -31,25 +31,25 @@ com.navi.medici litmus-model - 2.0.4-RELEASE + 2.0.5-SNAPSHOT com.navi.medici litmus-db - 2.0.4-RELEASE + 2.0.5-SNAPSHOT com.navi.medici litmus-cache - 2.0.4-RELEASE + 2.0.5-SNAPSHOT com.navi.medici litmus-util - 2.0.4-RELEASE + 2.0.5-SNAPSHOT @@ -57,17 +57,6 @@ spring-boot-starter-web - - org.springframework.boot - spring-boot-starter-actuator - - - com.squareup.okhttp3 - okhttp - - - - javax.servlet javax.servlet-api @@ -92,7 +81,6 @@ 1.6.8 - diff --git a/litmus-core/src/main/resources/application.properties b/litmus-core/src/main/resources/application.properties index 13edcfe..fedceb4 100644 --- a/litmus-core/src/main/resources/application.properties +++ b/litmus-core/src/main/resources/application.properties @@ -1,5 +1,6 @@ server.servlet.context-path=/litmus-core spring.main.banner-mode=off +spring.application.name = litmus-core server.port = ${PORT:12000} spring.datasource.hikari.maximum-pool-size=${DB_POOL_MAX_SIZE:2} spring.datasource.hikari.minimum-idle=${DB_POOL_MIN_IDLE:1} diff --git a/litmus-db/pom.xml b/litmus-db/pom.xml index 1460c9f..83e4404 100644 --- a/litmus-db/pom.xml +++ b/litmus-db/pom.xml @@ -4,11 +4,11 @@ litmus com.navi.medici - 2.0.4-RELEASE + 2.0.5-SNAPSHOT litmus-db - 2.0.4-RELEASE + 2.0.5-SNAPSHOT jar litmus-db @@ -27,7 +27,7 @@ com.navi.medici litmus-model - 2.0.4-RELEASE + 2.0.5-SNAPSHOT diff --git a/litmus-liquibase/pom.xml b/litmus-liquibase/pom.xml index 04d451a..ca18e55 100644 --- a/litmus-liquibase/pom.xml +++ b/litmus-liquibase/pom.xml @@ -4,11 +4,11 @@ litmus com.navi.medici - 2.0.4-RELEASE + 2.0.5-SNAPSHOT litmus-liquibase - 2.0.4-RELEASE + 2.0.5-SNAPSHOT jar litmus-liquibase diff --git a/litmus-mock/pom.xml b/litmus-mock/pom.xml index 6626706..767da83 100644 --- a/litmus-mock/pom.xml +++ b/litmus-mock/pom.xml @@ -4,11 +4,11 @@ litmus com.navi.medici - 2.0.4-RELEASE + 2.0.5-SNAPSHOT litmus-mock - 2.0.4-RELEASE + 2.0.5-SNAPSHOT jar litmus-mock @@ -16,13 +16,13 @@ com.navi.medici litmus-model - 2.0.4-RELEASE + 2.0.5-SNAPSHOT com.navi.medici litmus-client - 2.0.4-RELEASE + 2.0.5-SNAPSHOT diff --git a/litmus-model/pom.xml b/litmus-model/pom.xml index 6c672c2..a0c4d9d 100644 --- a/litmus-model/pom.xml +++ b/litmus-model/pom.xml @@ -5,11 +5,11 @@ litmus com.navi.medici - 2.0.4-RELEASE + 2.0.5-SNAPSHOT litmus-model - 2.0.4-RELEASE + 2.0.5-SNAPSHOT jar litmus-model diff --git a/litmus-proxy/pom.xml b/litmus-proxy/pom.xml index b0f64df..24fcd9d 100644 --- a/litmus-proxy/pom.xml +++ b/litmus-proxy/pom.xml @@ -4,11 +4,11 @@ litmus com.navi.medici - 2.0.4-RELEASE + 2.0.5-SNAPSHOT litmus-proxy - 2.0.4-RELEASE + 2.0.5-SNAPSHOT jar litmus-proxy @@ -17,13 +17,19 @@ com.navi.medici litmus-model - 2.0.4-RELEASE + 2.0.5-SNAPSHOT com.navi.medici litmus-client - 2.0.4-RELEASE + 2.0.5-SNAPSHOT + + + + com.navi.medici + litmus-util + 2.0.5-SNAPSHOT @@ -33,21 +39,16 @@ org.springframework.boot - spring-boot-starter-actuator - - - com.squareup.okhttp3 - okhttp - - + spring-boot-starter-test + test + org.springdoc springdoc-openapi-ui 1.6.8 - diff --git a/litmus-proxy/src/main/java/com/navi/medici/LitmusProxyApp.java b/litmus-proxy/src/main/java/com/navi/medici/LitmusProxyApp.java index b146f0c..9e435e8 100644 --- a/litmus-proxy/src/main/java/com/navi/medici/LitmusProxyApp.java +++ b/litmus-proxy/src/main/java/com/navi/medici/LitmusProxyApp.java @@ -2,8 +2,10 @@ package com.navi.medici; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; @SpringBootApplication +@ComponentScan(basePackages = {"com.navi.medici"}) public class LitmusProxyApp { public static void main(String[] args) { diff --git a/litmus-proxy/src/main/java/com/navi/medici/controller/LitmusProxyController.java b/litmus-proxy/src/main/java/com/navi/medici/controller/LitmusProxyController.java index b9e9369..c94ffce 100644 --- a/litmus-proxy/src/main/java/com/navi/medici/controller/LitmusProxyController.java +++ b/litmus-proxy/src/main/java/com/navi/medici/controller/LitmusProxyController.java @@ -5,6 +5,7 @@ import com.navi.medici.model.request.v1.FetchBatchExperimentRequest; import com.navi.medici.model.request.v1.FetchBatchVariantRequest; import com.navi.medici.service.LitmusService; import io.micrometer.core.annotation.Timed; +import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -18,10 +19,13 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/v1/proxy") @Log4j2 -public record LitmusProxyController(Litmus litmus, LitmusService litmusService) { +@RequiredArgsConstructor +public class LitmusProxyController { + + private final LitmusService litmusService; @GetMapping(value = "/experiment", produces = MediaType.APPLICATION_JSON_VALUE) - @Timed(value = "litmus.proxy.fetch.experiment", percentiles = {0.95, 0.99}, extraTags = {"mt", "fetch"} ) + @Timed(percentiles = {0.95, 0.99}, extraTags = {"mt", "fetch"} ) public ResponseEntity fetch(@RequestParam("name") String experimentName) { var result = litmusService.fetchExperimentResponse(experimentName); @@ -29,7 +33,7 @@ public record LitmusProxyController(Litmus litmus, LitmusService litmusService) } @GetMapping(value = "/variant", produces = MediaType.APPLICATION_JSON_VALUE) - @Timed(value = "litmus.proxy.fetch.experiment", percentiles = {0.95, 0.99}, extraTags = {"mt", "fetchVariants"}) + @Timed(percentiles = {0.95, 0.99}, extraTags = {"mt", "fetchVariants"}) public ResponseEntity fetchVariants(@RequestParam("name") String variantName) { var variant = litmusService.fetchVariant(variantName); @@ -37,6 +41,7 @@ public record LitmusProxyController(Litmus litmus, LitmusService litmusService) } @PostMapping(value = "/batch/experiments", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Timed(percentiles = {0.95, 0.99}, extraTags = {"mt", "fetchBatchExperiment"}) public ResponseEntity fetchBatchExperiment(@RequestBody FetchBatchExperimentRequest fetchBatchExperimentRequest) { var response = litmusService.batchExperimentResponse(fetchBatchExperimentRequest); @@ -44,6 +49,7 @@ public record LitmusProxyController(Litmus litmus, LitmusService litmusService) } @PostMapping(value = "/batch/variants", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Timed(percentiles = {0.95, 0.99}, extraTags = {"mt", "fetchBatchVariantExperiment"}) public ResponseEntity fetchBatchVariantExperiment(@RequestBody FetchBatchVariantRequest fetchBatchVariantRequest) { var response = litmusService.batchVariantResponse(fetchBatchVariantRequest); diff --git a/litmus-proxy/src/main/resources/application.properties b/litmus-proxy/src/main/resources/application.properties index e3d7c36..4c72bfc 100644 --- a/litmus-proxy/src/main/resources/application.properties +++ b/litmus-proxy/src/main/resources/application.properties @@ -1,5 +1,7 @@ +spring.main.banner-mode=off server.port=${PORT:13000} server.servlet.context-path=/litmus-proxy +spring.application.name = litmus-proxy management.server.port=4001 management.endpoints.web.exposure.include=prometheus,health,info,metric,heapdump,threaddump diff --git a/litmus-proxy/src/test/java/com/navi/medici/service/LitmusServiceImplTest.java b/litmus-proxy/src/test/java/com/navi/medici/service/LitmusServiceImplTest.java new file mode 100644 index 0000000..7e7d9c4 --- /dev/null +++ b/litmus-proxy/src/test/java/com/navi/medici/service/LitmusServiceImplTest.java @@ -0,0 +1,90 @@ +package com.navi.medici.service; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +import com.navi.medici.litmus.Litmus; +import com.navi.medici.model.request.v1.ExperimentResponse; +import com.navi.medici.model.request.v1.ExperimentVariantResponse; +import com.navi.medici.model.request.v1.FetchBatchExperimentRequest; +import com.navi.medici.model.request.v1.FetchBatchVariantRequest; +import com.navi.medici.variants.Variant; +import java.util.List; +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class LitmusServiceImplTest { + @Mock + Litmus litmus; + + @InjectMocks + LitmusServiceImpl litmusService; + + @Test + public void testBatchExperimentResponse() { + var request = FetchBatchExperimentRequest.builder() + .experimentNames(List.of("dummy-1", "dummy-2")) + .build(); + var response = litmusService.batchExperimentResponse(request); + + response.stream().map(ExperimentResponse::getResult).forEach(Assert::assertFalse); + } + + @Test + public void testBatchExperimentResponse100Rollout() { + var request = FetchBatchExperimentRequest.builder() + .experimentNames(List.of("dummy-1", "dummy-2")) + .build(); + when(litmus.isEnabled(anyString())).thenReturn(true); + + var response = litmusService.batchExperimentResponse(request); + + response.stream().map(ExperimentResponse::getResult).forEach(Assert::assertTrue); + } + + @Test + public void testSingleExperimentResponse() { + when(litmus.isEnabled(anyString())).thenReturn(true); + + var response = litmusService.fetchExperimentResponse("random-string"); + + assertTrue(response.getResult()); + } + + @Test + public void testVariant() { + when(litmus.getVariant(anyString())).thenReturn(Variant.builder() + .name("test-variant-name") + .build()); + + var response = litmusService.fetchVariant("random-variant"); + + assertEquals(response.getVariant().getName(), "test-variant-name"); + } + + @Test + public void testBatchVariant() { + var request = FetchBatchVariantRequest.builder() + .experimentNames(List.of("dummy-1", "dummy-2")) + .build(); + + when(litmus.getVariant(anyString())).thenReturn(Variant.builder().build()); + var response = litmusService.batchVariantResponse(request); + + response.stream() + .map(ExperimentVariantResponse::getVariant) + .map(Variant::isEnabled) + .forEach(Assert::assertFalse); + + + } +} \ No newline at end of file diff --git a/litmus-util/pom.xml b/litmus-util/pom.xml index 1bca6a1..96272b7 100644 --- a/litmus-util/pom.xml +++ b/litmus-util/pom.xml @@ -4,11 +4,11 @@ litmus com.navi.medici - 2.0.4-RELEASE + 2.0.5-SNAPSHOT litmus-util - 2.0.4-RELEASE + 2.0.5-SNAPSHOT litmus-util @@ -16,13 +16,19 @@ io.micrometer micrometer-registry-prometheus - 1.7.0 + 1.9.0 org.springframework.boot spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-aop + + diff --git a/litmus-util/src/main/java/com/navi/medici/metrics/MetricsRegistry.java b/litmus-util/src/main/java/com/navi/medici/metrics/MetricsRegistry.java index 3a1a8af..faaf1cf 100644 --- a/litmus-util/src/main/java/com/navi/medici/metrics/MetricsRegistry.java +++ b/litmus-util/src/main/java/com/navi/medici/metrics/MetricsRegistry.java @@ -3,21 +3,27 @@ package com.navi.medici.metrics; import com.navi.medici.exceptions.LitmusException; import io.micrometer.core.aop.TimedAspect; import io.micrometer.core.instrument.MeterRegistry; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.stereotype.Component; import java.net.InetAddress; import java.net.UnknownHostException; -@Component +@Configuration public class MetricsRegistry { + @Value("${spring.application.name}") + private String appName; + @Bean MeterRegistryCustomizer metricsCommonTags() { InetAddress inetAddress = inetAddress(); return registry -> registry.config() - .commonTags("app.name", "litmus") + .commonTags("app.name", appName) .commonTags("host.ip", inetAddress.getHostAddress().trim()) .commonTags("host.name", inetAddress.getHostName().trim()); } diff --git a/pom.xml b/pom.xml index 9eb40e5..0f47296 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.navi.medici litmus - 2.0.4-RELEASE + 2.0.5-SNAPSHOT pom litmus