requests-simulator

added execution log

2/25/2019 6:26:25 AM

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");
+            }
+        }
     }
 }