ExperimentRunner.java Source code

Java tutorial

Introduction

Here is the source code for ExperimentRunner.java

Source

/*
 * Copyright 2014 University of California, Berkeley.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Author: Liang Gong

/*
Compile command:
javac -cp src/java/jitaware/thirdparty/selenium-server-standalone-2.41.0.jar `pwd`/src/java/jitaware/ExperimentRunner.java
*/

import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.Hashtable;
import java.util.ArrayList;

import org.junit.Test;
//import org.openqa.jetty.log.LogStream.STDOUT;
import org.openqa.selenium.By;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxBinary;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.logging.LoggingPreferences;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

public class ExperimentRunner {

    private int rounds = 30;
    private WebDriver driver = null;
    private int maxWaitTime = 10 * 60;

    public static void main(String[] args) throws Exception {
        if (!isSupportedPlatform()) {
            System.out.println("only supports Windows and Mac OS");
        }
        ExperimentRunner runner = new ExperimentRunner();
        //runner.run("Safari");
        runner.run("Firefox");
        runner.run("Chrome");
    }

    private static boolean isSupportedPlatform() {
        Platform current = Platform.getCurrent();
        return Platform.MAC.is(current) || Platform.WINDOWS.is(current);
    }

    final String firefoxBinary = //"/Applications/Firefox.app/Contents/MacOS/firefox-bin";
            "/Applications/Nightly.app/Contents/MacOS/firefox-bin";

    private void setupFirefox() throws Exception {
        DesiredCapabilities desiredCapabilities = DesiredCapabilities.firefox();
        FirefoxBinary binary = new FirefoxBinary(new File(firefoxBinary));
        FirefoxProfile profile = new FirefoxProfile();
        profile.setPreference("browser.cache.disk.enable", false);
        profile.setPreference("browser.cache.disk_cache_ssl", false);
        profile.setPreference("browser.cache.memory.enable", false);
        profile.setPreference("browser.cache.offline.capacity", 0);
        profile.setPreference("browser.cache.offline.enable", false);
        profile.setPreference("media.cache_size", 0);
        profile.setPreference("network.http.use-cache", false);
        //profile.setPreference("brwoser.dom.window.dump.enabled", true);
        driver = new FirefoxDriver(binary, profile, desiredCapabilities);
        driver.manage().timeouts().implicitlyWait(120, TimeUnit.SECONDS);
    }

    protected void createDriver(String browser) throws Exception {
        if (browser.equals("Safari")) {
            driver = new SafariDriver();
        } else if (browser.equals("Firefox")) {
            setupFirefox();
            //driver = new FirefoxDriver();
        } else if (browser.equals("Chrome")) {
            driver = new ChromeDriver();
        } else {
            System.out.println("unknown browser: " + browser);
            System.exit(0);
        }
    }

    protected void quitDriver() {
        driver.quit();
    }

    private Hashtable<String, ArrayList<String>> octaneOrigResult = new Hashtable<String, ArrayList<String>>();
    private Hashtable<String, ArrayList<String>> octaneModifiedResult = new Hashtable<String, ArrayList<String>>();

    private Hashtable<String, ArrayList<String>> sunspiderOrigResult = new Hashtable<String, ArrayList<String>>();
    private Hashtable<String, ArrayList<String>> sunspiderModifiedResult = new Hashtable<String, ArrayList<String>>();

    protected void resetResult() {
        octaneOrigResult.clear();
        octaneModifiedResult.clear();
        sunspiderOrigResult.clear();
        sunspiderModifiedResult.clear();
    }

    protected void run(String browser) {
        try {
            createDriver(browser);
            resetResult();
            String filename = browser + "-result.csv";
            for (int i = 0; i < rounds; i++) {
                System.out.println("--------- Round " + i + " ----------");
                runExperiment("http://127.0.0.1:8080/octane/octane.html", octaneOrigResult);
                runExperiment("http://127.0.0.1:8080/octane/octane_modified.html", octaneModifiedResult);
                runExperiment("http://127.0.0.1:8080/sunspider/driver.html", sunspiderOrigResult);
                runExperiment("http://127.0.0.1:8080/sunspider2/driver.html", sunspiderModifiedResult);
                generateCSV(browser);
            }
            quitDriver();
        } catch (Exception ex) {
            System.out.println("running experiment on browser " + browser + " got exception:");
            System.out.println("\t" + ex.toString());
        }
    }

    protected void runExperiment(String url, Hashtable<String, ArrayList<String>> store) {
        driver.get(url);
        // for octane, if an element with id="jit_final_result" contains text "===experiment done==="
        new WebDriverWait(driver, maxWaitTime).until(ExpectedConditions
                .textToBePresentInElementLocated(By.id("jit_final_result"), "===experiment done==="));
        System.out.println("text found in element");
        String expResult = driver.findElement(By.id("jit_final_result")).getAttribute("innerHTML");
        System.out.println(expResult);
        processRecordConsoleOutput(expResult, store);
    }

    protected void processRecordConsoleOutput(String content, Hashtable<String, ArrayList<String>> store) {
        System.out.println("start processing console output:");
        System.out.println(content);
        Hashtable<String, String> result = new Hashtable<String, String>();
        if (content.indexOf("===sunspider===") >= 0 || content.indexOf("===octane===") >= 0) {
            String[] lines = content.split("\n");
            for (int i = 0; i < lines.length; i++) {
                String[] cols = lines[i].split(",");
                if (cols.length == 4) {
                    String bench_name = cols[0];
                    String avg_time = cols[2];
                    result.put(bench_name, avg_time);
                }
            }
        } else {
            System.out.println("!!! unknown format of console.txt");
        }

        addResultToStore(result, store);
    }

    protected void addResultToStore(Hashtable<String, String> result, Hashtable<String, ArrayList<String>> store) {
        for (String bench_name : result.keySet()) {
            String avg_time = result.get(bench_name);
            System.out.println("benchmark name: " + bench_name);
            System.out.println("average time: " + avg_time);
            ArrayList<String> numbers = store.get(bench_name);
            if (numbers == null) {
                numbers = new ArrayList<String>();
            }
            numbers.add(avg_time);
            store.put(bench_name, numbers);
        }
    }

    protected void generateCSV(String browser) {
        String csvContent = "";
        /**/
        for (String bench_name : octaneOrigResult.keySet()) {
            ArrayList<String> orig = octaneOrigResult.get(bench_name);
            csvContent += "octane-" + browser + "-" + bench_name + ",";
            for (int i = 0; i < orig.size(); i++) {
                csvContent += orig.get(i) + ",";
            }
            csvContent += "\r\n";
            ArrayList<String> modified = octaneModifiedResult.get(bench_name);
            csvContent += "octane-" + browser + "-" + bench_name + "-2,";
            for (int i = 0; i < modified.size(); i++) {
                csvContent += modified.get(i) + ",";
            }
            csvContent += "\r\n";
        }

        for (String bench_name : sunspiderOrigResult.keySet()) {
            ArrayList<String> orig = sunspiderOrigResult.get(bench_name);
            csvContent += "sunspider-" + browser + "-" + bench_name + ",";
            for (int i = 0; i < orig.size(); i++) {
                csvContent += orig.get(i) + ",";
            }
            csvContent += "\r\n";
            ArrayList<String> modified = sunspiderModifiedResult.get(bench_name + "(*)");
            csvContent += "sunspider-" + browser + "-" + bench_name + "-2,";
            for (int i = 0; i < modified.size(); i++) {
                csvContent += modified.get(i) + ",";
            }
            csvContent += "\r\n";
        }

        PrintWriter writer = null;
        try {
            System.out.println(csvContent);
            writer = new PrintWriter("tests/jitaware/experiments/exp_output/" + browser + "-result.csv", "UTF-8");
            writer.println("result:");
            writer.println(csvContent);
        } catch (Exception exp) {
            System.out.println(exp.toString());
        } finally {
            if (writer != null) {
                writer.close();
            }
        }
    }
}