partial work on nb webdriver

This commit is contained in:
Jonathan Shook 2020-04-10 16:00:19 -05:00
parent 5e8c5bdfca
commit 115b0260f2
19 changed files with 454 additions and 139 deletions

136
driver-web/pom.xml Normal file
View File

@ -0,0 +1,136 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>driver-web</artifactId>
<packaging>jar</packaging>
<parent>
<artifactId>mvn-defaults</artifactId>
<groupId>io.nosqlbench</groupId>
<version>3.12.83-SNAPSHOT</version>
<relativePath>../mvn-defaults</relativePath>
</parent>
<name>${project.artifactId}</name>
<description>
A nosqlbench driver module;
Provides the ability to drive steps through the webdriver API.
</description>
<dependencies>
<dependency>
<groupId>io.nosqlbench</groupId>
<artifactId>engine-api</artifactId>
<version>3.12.83-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>htmlunit-driver</artifactId>
<version>2.39.0</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
<version>3.141.59</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.seleniumhq.selenium</groupId>-->
<!-- <artifactId>selenium-json</artifactId>-->
<!-- <version>4.0.0-alpha-5</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-remote-driver</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-htmlunit-driver</artifactId>
<version>2.52.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.seleniumhq.selenium</groupId>-->
<!-- <artifactId>selenium-devtools</artifactId>-->
<!-- <version>4.0.0-alpha-5</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.seleniumhq.selenium</groupId>-->
<!-- <artifactId>selenium-htmlunit-driver</artifactId>-->
<!-- <version>2.52.0</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.squareup.okhttp3</groupId>-->
<!-- <artifactId>okhttp</artifactId>-->
<!-- <version>4.5.0</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.seleniumhq.selenium</groupId>-->
<!-- <artifactId>selenium-htmlunit-driver</artifactId>-->
<!-- <version></version>-->
<!-- </dependency>-->
<!-- test scope only -->
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>shade</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

View File

@ -0,0 +1,12 @@
package io.nosqlbench.driver.web;
import io.nosqlbench.engine.api.activityapi.core.ActivityType;
public class NBWebDriver implements ActivityType<WebDriverActivity> {
@Override
public String getName() {
return null;
}
}

View File

@ -0,0 +1,12 @@
package io.nosqlbench.driver.web;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.engine.api.activityimpl.SimpleActivity;
public class WebDriverActivity extends SimpleActivity{
public WebDriverActivity(ActivityDef activityDef) {
super(activityDef);
}
}

View File

@ -0,0 +1,41 @@
package io.nosqlbench.driver.web;
import io.nosqlbench.engine.api.activityapi.core.Action;
import io.nosqlbench.engine.api.activityapi.core.ActionDispenser;
import io.nosqlbench.engine.api.activityapi.core.Activity;
import io.nosqlbench.engine.api.activityapi.core.ActivityType;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.nb.api.annotations.Service;
@Service(ActivityType.class)
public class WebDriverActivityType implements ActivityType<WebDriverActivity> {
@Override
public String getName() {
return "webdriver";
}
@Override
public WebDriverActivity getActivity(ActivityDef activityDef) {
return new WebDriverActivity(activityDef);
}
@Override
public ActionDispenser getActionDispenser(WebDriverActivity activity) {
return new WebDriverActionDispenser(activity);
}
private static class WebDriverActionDispenser implements ActionDispenser {
private final Activity activity;
private WebDriverActionDispenser(Activity activity) {
this.activity = activity;
}
@Override
public Action getAction(int slot) {
return new WebDriverAsyncAction((WebDriverActivity) activity, slot);
}
}
}

View File

@ -0,0 +1,29 @@
package io.nosqlbench.driver.web;
import io.nosqlbench.engine.api.activityapi.core.BaseAsyncAction;
import io.nosqlbench.engine.api.activityapi.core.ops.fluent.opfacets.TrackedOp;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.function.LongFunction;
/**
* Holds the definition and tracking state for a web driver command.
*/
public class WebDriverAsyncAction extends BaseAsyncAction<WebDriverCmdState,WebDriverActivity> {
public WebDriverAsyncAction(WebDriverActivity activity, int slot) {
super(activity,slot);
}
@Override
public void startOpCycle(TrackedOp<WebDriverCmdState> opc) {
WebDriver driver = new ChromeDriver();
driver.get("http://docs.nosqlbench.io/");
}
@Override
public LongFunction<WebDriverCmdState> getOpInitFunction() {
return (cycle) -> new WebDriverCmdState(this,cycle);
}
}

View File

@ -0,0 +1,13 @@
package io.nosqlbench.driver.web;
public class WebDriverCmdState {
private final WebDriverAsyncAction action;
private final long cycle;
public WebDriverCmdState(WebDriverAsyncAction action, long cycle) {
this.action = action;
this.cycle = cycle;
}
}

View File

@ -0,0 +1,63 @@
package io.nosqlbench.driver.web;
import io.nosqlbench.nb.api.testutils.Perf;
import org.junit.Ignore;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.remote.RemoteWebElement;
/**
* References:
* <UL>
* <LI>https://www.guru99.com/selenium-with-htmlunit-driver-phantomjs.html</LI>
* <LI></LI>
* </UL>
*/
public class ExampleWebScript {
@Test
@Ignore
public void getDocsSiteChromeDriver() {
System.setProperty("webdriver.http.factory", "okhttp");
WebDriver driver = new ChromeDriver();
Perf perf = new Perf("chrome");
int ops = 100;
try (Perf.Time time = perf.start("chrome",ops)) {
for (int i = 1; i <= ops; i++) {
System.out.print(".");
if ((i%10)==0) { System.out.println(i); }
driver.get("http://localhost:6081");
}
}
System.out.println("!");
System.out.println(perf.toString());
// driver.get("http://docs.nosqlbench.io/");
driver.close();
}
@Test
@Ignore
public void getDocSiteWebHtml() {
// System.setProperty("webdriver.http.factory", "okhttp");
WebDriver driver = new HtmlUnitDriver(false);
Perf perf = new Perf("htmlunit");
int ops = 100;
try (Perf.Time time = perf.start("htmlunit",ops)) {
for (int i = 1; i <= ops; i++) {
System.out.print(".");
if ((i%10)==0) { System.out.println(i); }
driver.get("http://localhost:6081");
}
}
System.out.println("!");
System.out.println(perf.toString());
// driver.get("http://docs.nosqlbench.io/");
driver.close();
}
}

View File

@ -22,10 +22,8 @@ import io.nosqlbench.engine.api.activityapi.core.ops.fluent.opfacets.TrackedOp;
import java.util.function.LongFunction;
/**
* <p>An AsyncAction allows an activity type to implement asynchronous
* An AsyncAction allows an activity type to implement asynchronous
* operations within each thread.
* </p>
*
*/
public interface AsyncAction<D> extends Action {
@ -64,33 +62,4 @@ public interface AsyncAction<D> extends Action {
*/
boolean enqueue(TrackedOp<D> opc);
// /**
// * Await completion of all pending operations for this thread.
// * If all tasks are already complete when this is called, then it
// * should return immediately.
// * @param timeout Timeout in milliseconds
// * @return true, if all tasks pending for this thread are completed.
// */
// boolean awaitCompletion(long timeout);
// /**
// * Once constructed, all async actions are expected to provide a tracker
// * object which can be used to register callback for operational events,
// * as well as to provide a diagnostic view of what is happening with
// * the number of pending operations per thread.
// * @return An async operations tracker
// */
// OpTracker<D> getTracker();
// /**
// * When the activity needs to create a new op context which tracks all
// * things interesting for the operation, it will call this method.
// * The payload type D determines any and all of what an async action
// * may know about an op.
// *
// * @return A new op state of parameterized type D
// */
// D allocateOpData(long cycle);
}

View File

@ -18,9 +18,9 @@
package io.nosqlbench.engine.api.activityapi.ratelimits;
import io.nosqlbench.engine.api.metrics.DeltaHdrHistogramReservoir;
import io.nosqlbench.testutils.Bounds;
import io.nosqlbench.testutils.Perf;
import io.nosqlbench.testutils.Result;
import io.nosqlbench.nb.api.testutils.Bounds;
import io.nosqlbench.nb.api.testutils.Perf;
import io.nosqlbench.nb.api.testutils.Result;
import java.util.ArrayList;
import java.util.Arrays;

View File

@ -18,8 +18,8 @@
package io.nosqlbench.engine.api.activityapi.ratelimits;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.testutils.Perf;
import io.nosqlbench.testutils.Result;
import io.nosqlbench.nb.api.testutils.Perf;
import io.nosqlbench.nb.api.testutils.Result;
import org.junit.Ignore;
import org.junit.Test;

View File

@ -18,7 +18,7 @@
package io.nosqlbench.engine.api.activityapi.ratelimits;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.testutils.Perf;
import io.nosqlbench.nb.api.testutils.Perf;
import org.junit.Ignore;
import org.junit.Test;

View File

@ -18,7 +18,7 @@
package io.nosqlbench.engine.api.activityapi.ratelimits;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.testutils.Perf;
import io.nosqlbench.nb.api.testutils.Perf;
import org.junit.Ignore;
import org.junit.Test;

View File

@ -18,7 +18,7 @@
package io.nosqlbench.engine.api.activityapi.ratelimits;
import io.nosqlbench.engine.api.activityimpl.ActivityDef;
import io.nosqlbench.testutils.Result;
import io.nosqlbench.nb.api.testutils.Result;
import org.junit.Ignore;
import org.junit.Test;

View File

@ -15,9 +15,23 @@
* /
*/
package io.nosqlbench.testutils;
package io.nosqlbench.nb.api.testutils;
/**
* Easily step from one value to the next according to a modified
* logarithmic sequence that makes it easy to pick useful testing
* boundaries.
*
* With levels per magnitude at 1, the progression goes in powers
* of 10. With any higher value than 1, each magnitude is divided
* into equal parts. For example, starting at 10 with 2 levels per magnitude,
* you get 50, 100, 500, 1000, 5000, and so on when you ask for
* the next higher bound.
*
*
*/
public class Bounds {
private final int levelsPerMagnitude;
private long currentValue;

View File

@ -15,7 +15,7 @@
* /
*/
package io.nosqlbench.testutils;
package io.nosqlbench.nb.api.testutils;
import java.util.ArrayList;
import java.util.Comparator;
@ -179,4 +179,28 @@ public class Perf implements Iterable<Result> {
public Iterator<Result> iterator() {
return results.iterator();
}
public Time start(String name, long ops) {
return new Time(this, name, ops);
}
public static class Time implements AutoCloseable {
private final Perf perf;
private final long start;
private String name;
private long ops;
public Time(Perf perf, String name, long ops) {
this.name = name;
this.ops = ops;
this.start = System.nanoTime();
this.perf = perf;
}
@Override
public void close() {
long end = System.nanoTime();
perf.add(name,start,end,ops);
}
}
}

View File

@ -15,7 +15,7 @@
* /
*/
package io.nosqlbench.testutils;
package io.nosqlbench.nb.api.testutils;
import java.util.ArrayList;
import java.util.List;

View File

@ -15,7 +15,7 @@
* /
*/
package io.nosqlbench.testutils;
package io.nosqlbench.nb.api.testutils;
import org.junit.Test;

View File

@ -15,7 +15,7 @@
* /
*/
package io.nosqlbench.testutils;
package io.nosqlbench.nb.api.testutils;
import org.junit.Test;

190
pom.xml
View File

@ -1,112 +1,114 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>nosqlbench</artifactId>
<packaging>pom</packaging>
<artifactId>nosqlbench</artifactId>
<packaging>pom</packaging>
<parent>
<artifactId>mvn-defaults</artifactId>
<groupId>io.nosqlbench</groupId>
<version>3.12.83-SNAPSHOT</version>
<relativePath>mvn-defaults</relativePath>
</parent>
<parent>
<artifactId>mvn-defaults</artifactId>
<groupId>io.nosqlbench</groupId>
<version>3.12.83-SNAPSHOT</version>
<relativePath>mvn-defaults</relativePath>
</parent>
<name>${project.artifactId}</name>
<url>http://nosqlbench.io/</url>
<description>A reusable machine pattern for building dynamic load
testing systems
</description>
<name>${project.artifactId}</name>
<url>http://nosqlbench.io/</url>
<description>A reusable machine pattern for building dynamic load
testing systems
</description>
<modules>
<modules>
<!-- project level defaults -->
<module>mvn-defaults</module>
<!-- web apps and service hooks -->
<module>docsys</module>
<module>nb-api</module>
<!-- project level defaults -->
<module>mvn-defaults</module>
<!-- web apps and service hooks -->
<module>docsys</module>
<module>nb-api</module>
<!-- ENGINE MODULES -->
<module>engine-api</module>
<module>engine-core</module>
<module>engine-cli</module>
<module>engine-extensions</module>
<module>engine-docker</module>
<module>engine-docs</module>
<!-- ENGINE MODULES -->
<module>engine-api</module>
<module>engine-core</module>
<module>engine-cli</module>
<module>engine-extensions</module>
<module>engine-docker</module>
<module>engine-docs</module>
<!-- a binary (appimage) build option for nb -->
<module>nb</module>
<module>activitytype-diag</module>
<module>activitytype-stdout</module>
<module>activitytype-tcp</module>
<module>activitytype-http</module>
<module>activitytype-cql</module>
<module>activitytype-cqlverify</module>
<!-- a binary (appimage) build option for nb -->
<module>nb</module>
<module>activitytype-diag</module>
<module>activitytype-stdout</module>
<module>activitytype-tcp</module>
<module>activitytype-http</module>
<module>activitytype-cql</module>
<module>activitytype-cqlverify</module>
<module>driver-web</module>
<!-- VIRTDATA MODULES -->
<!-- VIRTDATA MODULES -->
<module>virtdata-api</module>
<module>virtdata-lang</module>
<module>virtdata-realdata</module>
<module>virtdata-lib-basics</module>
<module>virtdata-lib-random</module>
<module>virtdata-lib-curves4</module>
<module>virtdata-lib-realer</module>
<module>virtdata-api</module>
<module>virtdata-lang</module>
<module>virtdata-realdata</module>
<module>virtdata-lib-basics</module>
<module>virtdata-lib-random</module>
<module>virtdata-lib-curves4</module>
<module>virtdata-lib-realer</module>
<module>virtdata-userlibs</module>
<module>virtdata-userlibs</module>
</modules>
</modules>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<build>
<plugins>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<configuration>
<useReleaseProfile>true</useReleaseProfile>
<releaseProfiles>release</releaseProfiles>
<autoVersionSubmodules>true</autoVersionSubmodules>
</configuration>
</plugin>
</plugins>
</build>
<build>
<plugins>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<configuration>
<useReleaseProfile>true</useReleaseProfile>
<releaseProfiles>release</releaseProfiles>
<autoVersionSubmodules>true</autoVersionSubmodules>
</configuration>
</plugin>
</plugins>
</build>
<developers>
<developer>
<name>Jonathan Shook</name>
<email>jshook@gmail.com</email>
<organization>nosqlbench.io</organization>
<organizationUrl>http://nosqlbench.io/</organizationUrl>
</developer>
<developer>
<name>Sebastián Estévez</name>
<email>estevezsebastian@gmail.com</email>
<organization>nosqlbench.io</organization>
<organizationUrl>http://nosqlbench.io/</organizationUrl>
</developer>
</developers>
<developers>
<developer>
<name>Jonathan Shook</name>
<email>jshook@gmail.com</email>
<organization>nosqlbench.io</organization>
<organizationUrl>http://nosqlbench.io/</organizationUrl>
</developer>
<developer>
<name>Sebastián Estévez</name>
<email>estevezsebastian@gmail.com</email>
<organization>nosqlbench.io</organization>
<organizationUrl>http://nosqlbench.io/</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/nosqlbench/nosqlbench.git
</connection>
<developerConnection>
scm:git:https://github.com/nosqlbench/nosqlbench.git
</developerConnection>
<url>scm:git:git@github.com:nosqlbench/nosqlbench.git</url>
<tag>HEAD</tag>
</scm>
<scm>
<connection>scm:git:https://github.com/nosqlbench/nosqlbench.git
</connection>
<developerConnection>
scm:git:https://github.com/nosqlbench/nosqlbench.git
</developerConnection>
<url>scm:git:git@github.com:nosqlbench/nosqlbench.git</url>
<tag>HEAD</tag>
</scm>
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>