Details
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/LogExecutor.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/LogExecutor.java
index 24cb842..4309215 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/LogExecutor.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/LogExecutor.java
@@ -7,6 +7,7 @@ package br.ufrgs.inf.prosoft.requestssimulator;
import br.ufrgs.inf.prosoft.requestssimulator.requests.GetRequest;
import br.ufrgs.inf.prosoft.requestssimulator.requests.PostRequest;
+import br.ufrgs.inf.prosoft.requestssimulator.requests.MultipartRequest;
import br.ufrgs.inf.prosoft.requestssimulator.requests.Request;
import br.ufrgs.inf.prosoft.requestssimulator.requests.RequestPlan;
import com.google.gson.Gson;
@@ -51,16 +52,13 @@ public class LogExecutor {
JsonArray requests = sessionExecution.getAsJsonArray();
requests.forEach(requestJson -> {
JsonObject jsonObject = requestJson.getAsJsonObject();
- String method = jsonObject.get("method").getAsString();
- String requestPlanReference = method;
- requestPlanReference += "@";
- requestPlanReference += jsonObject.get("URL").getAsString();
+ String requestPlanReference = jsonObject.get("reference").getAsString();
RequestPlan requestPlan = profile.getRequestPlan(requestPlanReference);
if (requestPlan == null) {
throw new RuntimeException("Request Plan not found");
}
Request request;
- if (method.equals("GET")) {
+ if (requestPlan.getMethod().equals("GET")) {
request = gson.fromJson(jsonObject, GetRequest.class);
} else {
JsonElement headers = jsonObject.get("headers");
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Profile.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Profile.java
index 77dfb01..3a2e8ae 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Profile.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Profile.java
@@ -6,8 +6,11 @@
package br.ufrgs.inf.prosoft.requestssimulator;
import br.ufrgs.inf.prosoft.requestssimulator.requests.RequestPlan;
+import com.google.gson.JsonObject;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
/**
@@ -18,6 +21,7 @@ public class Profile {
private final Collection<RequestPlan> roots;
private final Map<String, RequestPlan> urlHasRequestPlan;
+ private List<List<JsonObject>> logs;
public Profile(Map<String, RequestPlan> urlHasRequestPlan) {
this.urlHasRequestPlan = urlHasRequestPlan;
@@ -38,11 +42,18 @@ public class Profile {
return this.urlHasRequestPlan.get(requestPlanReference);
}
+ public List<List<JsonObject>> getLogs() {
+ return logs;
+ }
+
public void run(long time) {
+ this.logs = new ArrayList<>();
long end = System.currentTimeMillis() + time;
while (System.currentTimeMillis() < end) {
Session session = new Session(this.roots);
session.run();
+ List<JsonObject> sessionLogs = session.getLogs();
+ this.logs.add(sessionLogs);
}
}
}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/GetRequest.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/GetRequest.java
index 28471e6..ff4163b 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/GetRequest.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/GetRequest.java
@@ -57,5 +57,4 @@ public class GetRequest extends Request {
Logger.getGlobal().log(Level.SEVERE, "IOException");
}
}
-
}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/MultipartRequest.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/MultipartRequest.java
index 18bb1bc..907d7ad 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/MultipartRequest.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/MultipartRequest.java
@@ -92,5 +92,4 @@ public class MultipartRequest extends Request {
Logger.getGlobal().log(Level.SEVERE, "IOException");
}
}
-
}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/Request.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/Request.java
index f38a641..7e32525 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/Request.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/Request.java
@@ -12,6 +12,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
*
@@ -65,7 +67,7 @@ public abstract class Request {
public Request pickNextRequest(Session session) {
return this.requestPlan.pickNextRequest(session);
}
-
+
protected void processResponse(String response) {
this.requestPlan.forEachStoreField(new Consumer<String>() {
@@ -90,16 +92,36 @@ public abstract class Request {
return this;
}
-
protected String fillPropertyVariable(String property) {
String filledProperty = property;
if (filledProperty.contains("#")) {
String storedField = filledProperty.substring(filledProperty.indexOf("#") + 1);
String storedValue = this.session.getStoredValue(storedField);
- filledProperty = filledProperty.replace("#" + storedField, storedValue);
+ if (storedValue == null) {
+ Logger.getGlobal().log(Level.SEVERE, "variable {0} not stored", property);
+ } else {
+ filledProperty = filledProperty.replace("#" + storedField, storedValue);
+ }
}
return filledProperty;
}
public abstract void fire();
+
+ public final JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("reference", this.requestPlan.getReference());
+ jsonObject.addProperty("method", getMethod());
+ jsonObject.addProperty("URL", getURL());
+ jsonObject.addProperty("headers", getHeaders());
+ if (this instanceof PostRequest) {
+ PostRequest postRequest = (PostRequest) this;
+ jsonObject.addProperty("data", postRequest.getData());
+ }
+ if (this instanceof MultipartRequest) {
+ MultipartRequest multipartRequest = (MultipartRequest) this;
+ jsonObject.addProperty("forms", multipartRequest.getForms());
+ }
+ return jsonObject;
+ }
}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/RequestPlan.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/RequestPlan.java
index fe89440..8609d59 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/RequestPlan.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/RequestPlan.java
@@ -147,7 +147,7 @@ public class RequestPlan {
public Request build(Session session) {
Random random = new Random();
- int randomInt = random.nextInt();
+ int randomInt = random.nextInt() & Integer.MAX_VALUE;
if (this.URL == null || this.URL.isEmpty()) {
throw new RuntimeException("URL is empty");
}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Session.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Session.java
index 5facf23..6a623c8 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Session.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Session.java
@@ -7,8 +7,11 @@ package br.ufrgs.inf.prosoft.requestssimulator;
import br.ufrgs.inf.prosoft.requestssimulator.requests.Request;
import br.ufrgs.inf.prosoft.requestssimulator.requests.RequestPlan;
+import com.google.gson.JsonObject;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Random;
@@ -20,6 +23,7 @@ public class Session {
private final Collection<RequestPlan> roots;
private final Map<String, String> storedValues;
+ private List<JsonObject> logs;
public Session(Collection<RequestPlan> roots) {
this.roots = roots;
@@ -35,13 +39,19 @@ public class Session {
return this.storedValues.get(storedField);
}
+ public List<JsonObject> getLogs() {
+ return logs;
+ }
+
public void run() {
+ this.logs = new ArrayList<>();
Random random = new Random();
Request request = null;
int probability = 0;
while (probability < 50) {
request = pickNextRequest(request);
request.fire();
+ this.logs.add(request.toJsonObject());
probability = random.nextInt(100);
}
}
@@ -51,6 +61,9 @@ public class Session {
if (this.roots == null || this.roots.isEmpty()) {
throw new RuntimeException("root within cycle");
}
+ if (this.roots.size() == 1) {
+ return this.roots.stream().findAny().get().pickNextRequest(this);
+ }
currentRequest = RequestPlan.get("root")
.addLinks(this.roots)
.build(this);
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Simulator.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Simulator.java
index 1a24c8b..e8f1d33 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Simulator.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/Simulator.java
@@ -5,8 +5,15 @@
*/
package br.ufrgs.inf.prosoft.requestssimulator;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -24,9 +31,12 @@ public class Simulator {
public static final void simulate(Profile profile, long time, int users) {
Collection<Thread> threads = new ArrayList<>();
+ List<List<List<JsonObject>>> logs = new ArrayList<>();
for (int i = 0; i < users; i++) {
Thread thread = new Thread(() -> {
profile.run(time);
+ List<List<JsonObject>> profileLogs = profile.getLogs();
+ logs.add(profileLogs);
});
threads.add(thread);
thread.start();
@@ -38,5 +48,14 @@ public class Simulator {
Logger.getLogger(Simulator.class.getName()).log(Level.SEVERE, null, ex);
}
});
+ String logPath = System.getenv("SIMULATOR_LOG_PATH");
+ if (logPath != null) {
+ Gson gson = new GsonBuilder().setPrettyPrinting().create();
+ try (Writer writer = new FileWriter(logPath)) {
+ gson.toJson(logs, writer);
+ } catch (IOException ex) {
+ Logger.getLogger(Simulator.class.getName()).log(Level.SEVERE, "invalid log path");
+ }
+ }
}
}