diff --git a/performance-test/src/gatling/java/org/opensearch/dataprepper/test/performance/tools/Templates.java b/performance-test/src/gatling/java/org/opensearch/dataprepper/test/performance/tools/Templates.java index 27df8a1848..67347ff393 100644 --- a/performance-test/src/gatling/java/org/opensearch/dataprepper/test/performance/tools/Templates.java +++ b/performance-test/src/gatling/java/org/opensearch/dataprepper/test/performance/tools/Templates.java @@ -7,12 +7,14 @@ import io.gatling.javaapi.core.Session; import org.opensearch.dataprepper.test.data.generation.IpAddress; +import org.opensearch.dataprepper.test.data.generation.UserAgent; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Random; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -30,19 +32,28 @@ public static String now() { } public static Function apacheCommonLogTemplate(final int batchSize) { - return session -> { - final List logs = IntStream.range(0, batchSize) - .mapToObj(i -> "{\"log\": \"" + ipAddress() + " - frank [" + now() + "] \\\"" + httpMethod() + " /apache_pb.gif HTTP/1.0\\\" "+ statusCode() + " " + responseSize() + "\"}") - .collect(Collectors.toList()); - final String logArray = String.join(",", logs); - return "[" + logArray + "]"; - }; + return generateLogArray(batchSize, + () -> ipAddress() + " - frank [" + now() + "] \\\"" + httpMethod() + " /apache_pb.gif HTTP/1.0\\\" "+ statusCode() + " " + responseSize()); + } + + public static Function userAgent(final int batchSize) { + return generateLogArray(batchSize, () -> userAgent()); + } + + private static Function generateLogArray(final int batchSize, final Supplier stringSupplier) { + return session -> IntStream.range(0, batchSize) + .mapToObj(i -> "{\"log\": \"" + stringSupplier.get() + "\"}") + .collect(Collectors.joining(",", "[", "]")); } private static String ipAddress() { return IpAddress.getInstance().ipAddress(); } + private static String userAgent() { + return UserAgent.getInstance().userAgent(); + } + private static String httpMethod() { return randomFromList(HTTP_METHODS); } diff --git a/performance-test/src/main/java/org/opensearch/dataprepper/test/data/generation/UserAgent.java b/performance-test/src/main/java/org/opensearch/dataprepper/test/data/generation/UserAgent.java new file mode 100644 index 0000000000..ced3b090c4 --- /dev/null +++ b/performance-test/src/main/java/org/opensearch/dataprepper/test/data/generation/UserAgent.java @@ -0,0 +1,66 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.dataprepper.test.data.generation; + +import java.util.Random; +import java.util.UUID; + +public class UserAgent { + private static final UserAgent USER_AGENT = new UserAgent(); + private final Random random; + + private UserAgent() { + random = new Random(); + } + + public static UserAgent getInstance() { + return USER_AGENT; + } + + public String userAgent() { + final StringBuilder userAgentBuilder = new StringBuilder(); + + buildBrowserPart(userAgentBuilder); + userAgentBuilder.append(" ("); + + buildDevicePart(userAgentBuilder); + userAgentBuilder.append(" "); + + buildOsPart(userAgentBuilder); + userAgentBuilder.append(")"); + + return userAgentBuilder.toString(); + } + + private void buildOsPart(final StringBuilder userAgentBuilder) { + userAgentBuilder.append(randomString()); + userAgentBuilder.append(" "); + buildVersionString(userAgentBuilder); + } + + private void buildDevicePart(final StringBuilder userAgentBuilder) { + userAgentBuilder.append(randomString()); + userAgentBuilder.append(";"); + } + + private void buildBrowserPart(final StringBuilder userAgentBuilder) { + userAgentBuilder.append(randomString()); + userAgentBuilder.append("/"); + buildVersionString(userAgentBuilder); + } + + private void buildVersionString(final StringBuilder userAgentBuilder) { + userAgentBuilder.append(random.nextInt(9) + 1); + userAgentBuilder.append("."); + userAgentBuilder.append(random.nextInt(30)); + userAgentBuilder.append("."); + userAgentBuilder.append(random.nextInt(30)); + } + + private static String randomString() { + return UUID.randomUUID().toString().replaceAll("-", ""); + } +} diff --git a/performance-test/src/test/java/org/opensearch/dataprepper/test/data/generation/UserAgentTest.java b/performance-test/src/test/java/org/opensearch/dataprepper/test/data/generation/UserAgentTest.java new file mode 100644 index 0000000000..0967c3c3e4 --- /dev/null +++ b/performance-test/src/test/java/org/opensearch/dataprepper/test/data/generation/UserAgentTest.java @@ -0,0 +1,40 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.dataprepper.test.data.generation; + +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.matchesPattern; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; + +class UserAgentTest { + @Test + void userAgent_returns_string() { + final String userAgent = UserAgent.getInstance().userAgent(); + + assertThat(userAgent, notNullValue()); + assertThat(userAgent.length(), greaterThanOrEqualTo(10)); + + String expectedRegex = "^[A-Za-z0-9]+/[0-9]+.[0-9]+.[0-9]+ \\([A-Za-z0-9]+; [A-Za-z0-9]+ [0-9]+.[0-9]+.[0-9]+\\)$"; + + assertThat(userAgent, matchesPattern(expectedRegex)); + } + + @Test + void userAgent_returns_unique_value_on_multiple_calls() { + final UserAgent objectUnderTest = UserAgent.getInstance(); + final String userAgent = objectUnderTest.userAgent(); + + assertThat(userAgent, notNullValue()); + assertThat(objectUnderTest.userAgent(), not(equalTo(userAgent))); + assertThat(objectUnderTest.userAgent(), not(equalTo(userAgent))); + assertThat(objectUnderTest.userAgent(), not(equalTo(userAgent))); + } +} \ No newline at end of file