11package net .stefankrause ;
22
3+ import java .io .IOException ;
34import java .util .*;
45
6+ import org .json .JSONException ;
7+ import org .json .JSONObject ;
58import org .openqa .selenium .*;
69import org .openqa .selenium .chrome .*;
710import org .openqa .selenium .logging .*;
8- import org .openqa .selenium .remote .*;
911import org .openqa .selenium .support .ui .ExpectedConditions ;
1012import org .openqa .selenium .support .ui .WebDriverWait ;
1113
12- public abstract class AbstractMemoryBench implements Bench {
14+ public abstract class AbstractMemoryBench extends Bench {
1315 abstract void init (WebDriver driver , String url );
1416 abstract void test (WebDriver driver );
1517
@@ -24,28 +26,32 @@ public Double run(ChromeDriver driver, Framework framework, double lastWait) thr
2426 WebDriverWait wait = new WebDriverWait (driver , 10 );
2527 WebElement element = wait .until (ExpectedConditions .elementToBeClickable (By .id ("run" )));
2628
29+ driver .executeScript ("window.gc();" );
2730 Thread .sleep (2000 );
2831
2932 System .out .println (framework .framework + " " + this .getName () + " => run" );
3033 this .test (driver );
3134 System .out .println ("run " + this .getName ());
3235
33- Thread .sleep (20000 );
36+ Thread .sleep (1000 + (int ) lastWait );
37+ driver .executeScript ("window.gc();" );
38+ Double mem = extractMem (driver );
39+ System .out .println ("Memory from GC: " +mem );
3440
35- return snapMemorySize (driver );
41+ return mem ; // snapMemorySize(driver);
3642 }
3743
3844 private double snapMemorySize (ChromeDriver driver ) {
3945 JavascriptExecutor executor = ((JavascriptExecutor ) driver );
40-
46+
4147 Map <String , ?> heapSnapshot = (Map <String , ?>) executor .executeScript (":takeHeapSnapshot" );
42-
48+
4349 Map <String , ?> snapshot = (Map <String , ?>) heapSnapshot .get ("snapshot" );
4450 Map <String , ?> meta = (Map <String , ?>) snapshot .get ("meta" );
4551 ArrayList <String > node_fields = (ArrayList <String >) meta .get ("node_fields" );
4652
4753 ArrayList <Long > nodes = (ArrayList <Long >) heapSnapshot .get ("nodes" );
48-
54+
4955 long self_size = 0 ;
5056 for (int k = node_fields .indexOf ("self_size" ), l = nodes .size (), d = node_fields .size (); k < l ; k += d ) {
5157 self_size += nodes .get (k );
@@ -57,4 +63,35 @@ private double snapMemorySize(ChromeDriver driver) {
5763
5864 return memory ;
5965 }
66+
67+ List <Double > submitPerformanceResult (List <LogEntry > perfLogEntries , boolean print )
68+ throws IOException , JSONException {
69+ ArrayList <Double > filtered = new ArrayList <>();
70+
71+ if (print ) System .out .println (perfLogEntries .size () + " performance log entries found" );
72+ for (LogEntry entry : perfLogEntries ) {
73+ JSONObject obj = new JSONObject (entry .getMessage ());
74+ String name = getAsString (obj , "message.params.name" );
75+ if (print ) System .out .println (entry .getMessage ());
76+ if ("MajorGC" .equals (name ) && getAsString (obj , "message.params.args.type" )==null ) {
77+ filtered .add (Double .valueOf (getAsDouble (obj , "message.params.args.usedHeapSizeAfter" )/1024.0 /1024.0 ));
78+ }
79+ }
80+
81+ return filtered ;
82+ }
83+
84+ Double extractMem (WebDriver driver ) throws Exception {
85+ Logs logs = driver .manage ().logs ();
86+ ArrayList <LogEntry > perfEntries = new ArrayList <>();
87+ for (String lt : logs .getAvailableLogTypes ()) {
88+ List <LogEntry > entries = logs .get (lt ).getAll ();
89+ if (LogType .PERFORMANCE .equals (lt )) perfEntries .addAll (entries );
90+ System .out .println (entries .size () + " " + lt + " log entries found" );
91+ }
92+ List <Double > filtered = submitPerformanceResult (perfEntries , false );
93+ // System.out.println(filtered);
94+ if (filtered .size ()==0 ) return -1.0 ;
95+ return filtered .get (filtered .size ()-1 );
96+ }
6097}
0 commit comments