diff --git a/driver-web/pom.xml b/driver-web/pom.xml new file mode 100644 index 000000000..a70a93406 --- /dev/null +++ b/driver-web/pom.xml @@ -0,0 +1,136 @@ + + 4.0.0 + + driver-web + jar + + + mvn-defaults + io.nosqlbench + 3.12.83-SNAPSHOT + ../mvn-defaults + + + ${project.artifactId} + + A nosqlbench driver module; + Provides the ability to drive steps through the webdriver API. + + + + + + io.nosqlbench + engine-api + 3.12.83-SNAPSHOT + + + + + org.seleniumhq.selenium + htmlunit-driver + 2.39.0 + + + org.seleniumhq.selenium + selenium-api + 3.141.59 + + + + + + + + + + + org.seleniumhq.selenium + selenium-remote-driver + 3.141.59 + + + + org.seleniumhq.selenium + selenium-java + 3.141.59 + + + + org.seleniumhq.selenium + selenium-chrome-driver + 3.141.59 + + + + org.seleniumhq.selenium + selenium-htmlunit-driver + 2.52.0 + + + + org.apache.httpcomponents + httpclient + 4.5.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.assertj + assertj-core + test + + + + junit + junit + test + + + + + + + + shade + + false + + + + + maven-shade-plugin + + + + + + + diff --git a/driver-web/src/main/java/io/nosqlbench/driver/web/NBWebDriver.java b/driver-web/src/main/java/io/nosqlbench/driver/web/NBWebDriver.java new file mode 100644 index 000000000..42d5ec0f7 --- /dev/null +++ b/driver-web/src/main/java/io/nosqlbench/driver/web/NBWebDriver.java @@ -0,0 +1,12 @@ +package io.nosqlbench.driver.web; + +import io.nosqlbench.engine.api.activityapi.core.ActivityType; + +public class NBWebDriver implements ActivityType { + + @Override + public String getName() { + return null; + } + +} diff --git a/driver-web/src/main/java/io/nosqlbench/driver/web/WebDriverActivity.java b/driver-web/src/main/java/io/nosqlbench/driver/web/WebDriverActivity.java new file mode 100644 index 000000000..d4d591590 --- /dev/null +++ b/driver-web/src/main/java/io/nosqlbench/driver/web/WebDriverActivity.java @@ -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); + } + +} diff --git a/driver-web/src/main/java/io/nosqlbench/driver/web/WebDriverActivityType.java b/driver-web/src/main/java/io/nosqlbench/driver/web/WebDriverActivityType.java new file mode 100644 index 000000000..ebf442c84 --- /dev/null +++ b/driver-web/src/main/java/io/nosqlbench/driver/web/WebDriverActivityType.java @@ -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 { + + @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); + } + } +} diff --git a/driver-web/src/main/java/io/nosqlbench/driver/web/WebDriverAsyncAction.java b/driver-web/src/main/java/io/nosqlbench/driver/web/WebDriverAsyncAction.java new file mode 100644 index 000000000..a181502e3 --- /dev/null +++ b/driver-web/src/main/java/io/nosqlbench/driver/web/WebDriverAsyncAction.java @@ -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 { + + public WebDriverAsyncAction(WebDriverActivity activity, int slot) { + super(activity,slot); + } + + @Override + public void startOpCycle(TrackedOp opc) { + WebDriver driver = new ChromeDriver(); + driver.get("http://docs.nosqlbench.io/"); + } + + @Override + public LongFunction getOpInitFunction() { + return (cycle) -> new WebDriverCmdState(this,cycle); + } +} diff --git a/driver-web/src/main/java/io/nosqlbench/driver/web/WebDriverCmdState.java b/driver-web/src/main/java/io/nosqlbench/driver/web/WebDriverCmdState.java new file mode 100644 index 000000000..f01e0b795 --- /dev/null +++ b/driver-web/src/main/java/io/nosqlbench/driver/web/WebDriverCmdState.java @@ -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; + } +} diff --git a/driver-web/src/test/java/io/nosqlbench/driver/web/ExampleWebScript.java b/driver-web/src/test/java/io/nosqlbench/driver/web/ExampleWebScript.java new file mode 100644 index 000000000..043df7617 --- /dev/null +++ b/driver-web/src/test/java/io/nosqlbench/driver/web/ExampleWebScript.java @@ -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: + *
    + *
  • https://www.guru99.com/selenium-with-htmlunit-driver-phantomjs.html
  • + *
  • + *
+ */ +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(); + } +} diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/AsyncAction.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/AsyncAction.java index ebe74d8c5..ec30373e0 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/AsyncAction.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/core/AsyncAction.java @@ -22,10 +22,8 @@ import io.nosqlbench.engine.api.activityapi.core.ops.fluent.opfacets.TrackedOp; import java.util.function.LongFunction; /** - *

An AsyncAction allows an activity type to implement asynchronous + * An AsyncAction allows an activity type to implement asynchronous * operations within each thread. - *

- * */ public interface AsyncAction extends Action { @@ -64,33 +62,4 @@ public interface AsyncAction extends Action { */ boolean enqueue(TrackedOp 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 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); - - } diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/RateLimiterPerfTestMethods.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/RateLimiterPerfTestMethods.java index cb4211c0d..d5d32e00e 100644 --- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/RateLimiterPerfTestMethods.java +++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/RateLimiterPerfTestMethods.java @@ -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; diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestHybridRateLimiterPerf.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestHybridRateLimiterPerf.java index fb5a8f9d4..9783cce65 100644 --- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestHybridRateLimiterPerf.java +++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestHybridRateLimiterPerf.java @@ -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; diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E7.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E7.java index c59d8af12..df895e87c 100644 --- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E7.java +++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E7.java @@ -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; diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E8.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E8.java index aa7d7aa9e..6edd0fe09 100644 --- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E8.java +++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E8.java @@ -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; diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerfSingle.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerfSingle.java index 51eda2ac4..dae803a2b 100644 --- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerfSingle.java +++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerfSingle.java @@ -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; diff --git a/engine-api/src/test/java/io/nosqlbench/testutils/Bounds.java b/nb-api/src/main/java/io/nosqlbench/nb/api/testutils/Bounds.java similarity index 77% rename from engine-api/src/test/java/io/nosqlbench/testutils/Bounds.java rename to nb-api/src/main/java/io/nosqlbench/nb/api/testutils/Bounds.java index 537fa31d9..f89b082d4 100644 --- a/engine-api/src/test/java/io/nosqlbench/testutils/Bounds.java +++ b/nb-api/src/main/java/io/nosqlbench/nb/api/testutils/Bounds.java @@ -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; diff --git a/engine-api/src/test/java/io/nosqlbench/testutils/Perf.java b/nb-api/src/main/java/io/nosqlbench/nb/api/testutils/Perf.java similarity index 91% rename from engine-api/src/test/java/io/nosqlbench/testutils/Perf.java rename to nb-api/src/main/java/io/nosqlbench/nb/api/testutils/Perf.java index 2f077525d..28481f8f0 100644 --- a/engine-api/src/test/java/io/nosqlbench/testutils/Perf.java +++ b/nb-api/src/main/java/io/nosqlbench/nb/api/testutils/Perf.java @@ -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 { public Iterator 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); + } + } } diff --git a/engine-api/src/test/java/io/nosqlbench/testutils/Result.java b/nb-api/src/main/java/io/nosqlbench/nb/api/testutils/Result.java similarity index 98% rename from engine-api/src/test/java/io/nosqlbench/testutils/Result.java rename to nb-api/src/main/java/io/nosqlbench/nb/api/testutils/Result.java index 65a640831..4a48acf02 100644 --- a/engine-api/src/test/java/io/nosqlbench/testutils/Result.java +++ b/nb-api/src/main/java/io/nosqlbench/nb/api/testutils/Result.java @@ -15,7 +15,7 @@ * / */ -package io.nosqlbench.testutils; +package io.nosqlbench.nb.api.testutils; import java.util.ArrayList; import java.util.List; diff --git a/engine-api/src/test/java/io/nosqlbench/testutils/BoundsTest.java b/nb-api/src/test/java/io/nosqlbench/nb/api/testutils/BoundsTest.java similarity index 97% rename from engine-api/src/test/java/io/nosqlbench/testutils/BoundsTest.java rename to nb-api/src/test/java/io/nosqlbench/nb/api/testutils/BoundsTest.java index 6eab91e3f..8ab8aa96f 100644 --- a/engine-api/src/test/java/io/nosqlbench/testutils/BoundsTest.java +++ b/nb-api/src/test/java/io/nosqlbench/nb/api/testutils/BoundsTest.java @@ -15,7 +15,7 @@ * / */ -package io.nosqlbench.testutils; +package io.nosqlbench.nb.api.testutils; import org.junit.Test; diff --git a/engine-api/src/test/java/io/nosqlbench/testutils/PerfTest.java b/nb-api/src/test/java/io/nosqlbench/nb/api/testutils/PerfTest.java similarity index 97% rename from engine-api/src/test/java/io/nosqlbench/testutils/PerfTest.java rename to nb-api/src/test/java/io/nosqlbench/nb/api/testutils/PerfTest.java index 2a8284d73..8a7db1dd1 100644 --- a/engine-api/src/test/java/io/nosqlbench/testutils/PerfTest.java +++ b/nb-api/src/test/java/io/nosqlbench/nb/api/testutils/PerfTest.java @@ -15,7 +15,7 @@ * / */ -package io.nosqlbench.testutils; +package io.nosqlbench.nb.api.testutils; import org.junit.Test; diff --git a/pom.xml b/pom.xml index c248b8575..a9696d889 100644 --- a/pom.xml +++ b/pom.xml @@ -1,112 +1,114 @@ - - 4.0.0 + + 4.0.0 - nosqlbench - pom + nosqlbench + pom - - mvn-defaults - io.nosqlbench - 3.12.83-SNAPSHOT - mvn-defaults - + + mvn-defaults + io.nosqlbench + 3.12.83-SNAPSHOT + mvn-defaults + - ${project.artifactId} - http://nosqlbench.io/ - A reusable machine pattern for building dynamic load - testing systems - + ${project.artifactId} + http://nosqlbench.io/ + A reusable machine pattern for building dynamic load + testing systems + - + - - mvn-defaults - - docsys - nb-api + + mvn-defaults + + docsys + nb-api - - engine-api - engine-core - engine-cli - engine-extensions - engine-docker - engine-docs + + engine-api + engine-core + engine-cli + engine-extensions + engine-docker + engine-docs - - nb - activitytype-diag - activitytype-stdout - activitytype-tcp - activitytype-http - activitytype-cql - activitytype-cqlverify + + nb + activitytype-diag + activitytype-stdout + activitytype-tcp + activitytype-http + activitytype-cql + activitytype-cqlverify + driver-web - + - virtdata-api - virtdata-lang - virtdata-realdata - virtdata-lib-basics - virtdata-lib-random - virtdata-lib-curves4 - virtdata-lib-realer + virtdata-api + virtdata-lang + virtdata-realdata + virtdata-lib-basics + virtdata-lib-random + virtdata-lib-curves4 + virtdata-lib-realer - virtdata-userlibs + virtdata-userlibs - + - - - The Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - - + + + The Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + - - - - maven-release-plugin - org.apache.maven.plugins - - true - release - true - - - - + + + + maven-release-plugin + org.apache.maven.plugins + + true + release + true + + + + - - - Jonathan Shook - jshook@gmail.com - nosqlbench.io - http://nosqlbench.io/ - - - Sebastián Estévez - estevezsebastian@gmail.com - nosqlbench.io - http://nosqlbench.io/ - - + + + Jonathan Shook + jshook@gmail.com + nosqlbench.io + http://nosqlbench.io/ + + + Sebastián Estévez + estevezsebastian@gmail.com + nosqlbench.io + http://nosqlbench.io/ + + - - scm:git:https://github.com/nosqlbench/nosqlbench.git - - - scm:git:https://github.com/nosqlbench/nosqlbench.git - - scm:git:git@github.com:nosqlbench/nosqlbench.git - HEAD - + + scm:git:https://github.com/nosqlbench/nosqlbench.git + + + scm:git:https://github.com/nosqlbench/nosqlbench.git + + scm:git:git@github.com:nosqlbench/nosqlbench.git + HEAD + - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + +