Skip to content

Commit

Permalink
Split files and replacement map setters
Browse files Browse the repository at this point in the history
  • Loading branch information
labkey-tchad committed Feb 4, 2025
1 parent 1556c52 commit ac048eb
Showing 1 changed file with 23 additions and 10 deletions.
33 changes: 23 additions & 10 deletions src/org/labkey/test/stress/Simulation.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
Expand All @@ -35,7 +36,6 @@
import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
* Simulation: A series of activities that represents some user workflow (e.g. loading the dashboard, navigating to the sample finder, and performing a search). For simplicity, API simulations in the initial proof of concept will consist of a single activity.
Expand Down Expand Up @@ -230,7 +230,10 @@ private void makeRequest(Activity.RequestParams requestParams) throws Interrupte
* {@link #_connectionFactory} - used to generate an API connection for the simulation to use
* </li>
* <li>
* {@link #activityDefinitions} - {@link Activity} list that defines the simulation. These are deserialized from {@link ApiTestsDocument} XML files.
* {@link #activityFiles} - {@link ApiTestsDocument} XML files that define the simulation. Used to generate {@link Activity} definitions.
* </li>
* <li>
* {@link #replacements} - String replacements to inject into activity definitions. e.g. 'CONTAINER' or 'USERID'
* </li>
* <li>
* {@link #maxActivityThreads} - the size of thread pool to use for requests
Expand All @@ -248,7 +251,8 @@ public static class Definition
{
private final Supplier<Connection> _connectionFactory;

private List<Activity> activityDefinitions = Collections.emptyList();
private List<File> activityFiles = new ArrayList<>();
private Map<String, String> replacements = Collections.emptyMap();
private int maxActivityThreads = 6; // This seems to be the number of parallel requests browsers handle
private int delayBetweenActivities = 5_000;
private boolean runOnce = false;
Expand Down Expand Up @@ -287,15 +291,13 @@ public Definition setDelayBetweenActivities(int delayBetweenActivities)

public Definition setActivityFiles(File... activityFiles)
{
return setActivityFilesWithReplacements(
Arrays.stream(activityFiles).collect(Collectors.toMap(f -> f, f -> Collections.emptyMap())));
this.activityFiles = Arrays.asList(activityFiles);
return this;
}

public Definition setActivityFilesWithReplacements(Map<File, Map<String, String>> activityFilesWithReplacements)
public Definition setReplacements(Map<String, String> replacements)
{
activityDefinitions = activityFilesWithReplacements.entrySet().stream()
.map(entry -> new Activity(entry.getKey().getName(), Definition.parseTests(entry.getKey(), entry.getValue())))
.toList();
this.replacements = new HashMap<>(replacements);
return this;
}

Expand All @@ -305,6 +307,17 @@ public Definition setRunOnce(boolean runOnce)
return this;
}

private List<Activity> buildActivityDefinitions()
{
if (activityFiles.isEmpty())
{
throw new IllegalArgumentException("No activity files specified");
}
return activityFiles.stream()
.map(file -> new Activity(file.getName(), Definition.parseTests(file, replacements)))
.toList();
}

/**
* Start the simulation according to this definition
* @param resultCollectorFactory The simulation will submit results to the supplied {@link ResultCollector}
Expand All @@ -316,7 +329,7 @@ public <T> Simulation<T> startSimulation(Function<Connection, ResultCollector<T>
Connection connection = _connectionFactory.get();
// Prime connection before starting simulation to ensure credentials are good
new WhoAmICommand().execute(connection, null);
return new Simulation<>(connection, activityDefinitions, delayBetweenActivities, maxActivityThreads, resultCollectorFactory.apply(connection), runOnce);
return new Simulation<>(connection, buildActivityDefinitions(), delayBetweenActivities, maxActivityThreads, resultCollectorFactory.apply(connection), runOnce);
}

public Simulation<RequestResult> startSimulation() throws IOException, CommandException
Expand Down

0 comments on commit ac048eb

Please sign in to comment.