Skip to content

Commit

Permalink
Tools to generate User Agent strings in the performance-test project (#…
Browse files Browse the repository at this point in the history
…4620)

Changes to the performance-test project to generate User Agent strings. Used to help reproduce and test #4618.

Signed-off-by: David Venable <[email protected]>
  • Loading branch information
dlvenable authored Jun 14, 2024
1 parent 01ae1dc commit 7f64a6d
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -30,19 +32,28 @@ public static String now() {
}

public static Function<Session, String> apacheCommonLogTemplate(final int batchSize) {
return session -> {
final List<String> 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<Session, String> userAgent(final int batchSize) {
return generateLogArray(batchSize, () -> userAgent());
}

private static Function<Session, String> generateLogArray(final int batchSize, final Supplier<String> 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);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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("-", "");
}
}
Original file line number Diff line number Diff line change
@@ -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)));
}
}

0 comments on commit 7f64a6d

Please sign in to comment.