diff --git a/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/AbstractLoadGeneratorStarter.java b/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/AbstractLoadGeneratorStarter.java index ffebb0e1..e63f3123 100644 --- a/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/AbstractLoadGeneratorStarter.java +++ b/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/AbstractLoadGeneratorStarter.java @@ -18,6 +18,16 @@ package org.mortbay.jetty.load.generator.starter; +import java.io.InputStream; +import java.io.Reader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; + import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; @@ -35,278 +45,172 @@ import org.mortbay.jetty.load.generator.LoadGenerator; import org.mortbay.jetty.load.generator.Resource; -import java.io.InputStream; -import java.io.Reader; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; - -/** - * - */ -public abstract class AbstractLoadGeneratorStarter -{ - - private Logger logger = Log.getLogger( getClass() ); - +public abstract class AbstractLoadGeneratorStarter { + private Logger logger = Log.getLogger(getClass()); private LoadGeneratorStarterArgs starterArgs; - private ExecutorService executorService; - private Resource resource; - private Request.Listener[] listeners; - public AbstractLoadGeneratorStarter( LoadGeneratorStarterArgs runnerArgs ) - { + public AbstractLoadGeneratorStarter(LoadGeneratorStarterArgs runnerArgs) { this.starterArgs = runnerArgs; } - public void run() - throws Exception - { - - LoadGenerator.Builder loadGeneratorBuilder = new LoadGenerator.Builder() // - .host( starterArgs.getHost() ) // - .iterationsPerThread( starterArgs.getRunIteration() ) // - .usersPerThread( starterArgs.getUsers() ) // - .resourceRate( starterArgs.getTransactionRate() ) // - .httpClientTransportBuilder( getHttpClientTransportBuilder() ) // - .sslContextFactory( sslContextFactory() ) // - .warmupIterationsPerThread( starterArgs.getWarmupNumber() ) // - .scheme( starterArgs.getScheme() ); // - - Resource resourceProfile = getResource( loadGeneratorBuilder ); - - loadGeneratorBuilder.resource( resourceProfile ); - - if ( starterArgs.getPort() > 0 ) - { - loadGeneratorBuilder.port( starterArgs.getPort() ); - } - - if ( starterArgs.getThreads() > 0 ) - { - loadGeneratorBuilder.threads( starterArgs.getThreads() ); - } - - if ( starterArgs.getMaxRequestsQueued() > 0 ) - { - loadGeneratorBuilder.maxRequestsQueued( starterArgs.getMaxRequestsQueued() ); - } - - if ( getExecutorService() != null ) - { - loadGeneratorBuilder.executor( getExecutorService() ); + public void run() throws Exception { + LoadGenerator.Builder builder = new LoadGenerator.Builder(); + Resource resource = getResource(builder); + builder.threads(starterArgs.getThreads()) + .warmupIterationsPerThread(starterArgs.getWarmupIterations()) + .iterationsPerThread(starterArgs.getIterations()) + .usersPerThread(starterArgs.getUsers()) + .channelsPerUser(starterArgs.getChannelsPerUser()) + .resource(resource) + .resourceRate(starterArgs.getResourceRate()) + .httpClientTransportBuilder(httpClientTransportBuilder()) + .sslContextFactory(sslContextFactory()) + .scheme(starterArgs.getScheme()) + .host(starterArgs.getHost()) + .port(starterArgs.getPort()) + .maxRequestsQueued(starterArgs.getMaxRequestsQueued()); + + long runFor = starterArgs.getRunningTime(); + if (runFor > 0) { + builder = builder.runFor(runFor, starterArgs.getRunningTimeUnit()); } - if ( starterArgs.getRunningTime() > 0 ) - { - loadGeneratorBuilder.runFor( starterArgs.getRunningTime(), starterArgs.getRunningTimeUnit() ); + ExecutorService executor = getExecutorService(); + if (executor != null) { + builder = builder.executor(executor); } - for ( Resource.Listener listener : getResourceListeners() ) - { - loadGeneratorBuilder.resourceListener( listener ); + for (Resource.Listener listener : getResourceListeners()) { + builder = builder.resourceListener(listener); } - for ( Request.Listener listener : getListeners() ) - { - loadGeneratorBuilder.requestListener( listener ); + for (Request.Listener listener : getRequestListeners()) { + builder = builder.requestListener(listener); } - for ( LoadGenerator.Listener listener : getLoadGeneratorListeners() ) - { - loadGeneratorBuilder.listener( listener ); + for (LoadGenerator.Listener listener : getLoadGeneratorListeners()) { + builder = builder.listener(listener); } - if ( starterArgs.getChannelPerUser() > 0 ) - { - loadGeneratorBuilder.channelsPerUser( starterArgs.getChannelPerUser() ); - } - - LoadGenerator loadGenerator = loadGeneratorBuilder.build(); - logger.info( "loadgenerator.config: {}", loadGenerator.getConfig().toString() ); + LoadGenerator loadGenerator = builder.build(); + logger.info("load generator config: {}", loadGenerator.getConfig()); + logger.info("load generation begin"); CompletableFuture cf = loadGenerator.begin(); - cf.join(); - logger.info( "load test done" ); - } - - public void displayStats( LoadGenerator loadGenerator ) - throws Exception - { - writeStats( loadGenerator ); - } - - - protected void writeStats( LoadGenerator loadGenerator ) - throws Exception - { - if ( starterArgs.getStatsFile() != null // -// && StringUtil.isNotBlank( loadGenerator.getEndStatsResponse() ) ) - ) - { - Path path = Paths.get( starterArgs.getStatsFile() ); - if ( Files.notExists( path ) ) - { - Files.createFile( path ); + cf.whenComplete((x, f) -> { + if (f == null) { + logger.info("load generation complete"); + } else { + logger.info("load generation failure", f); } - -// Files.write( path, loadGenerator.getEndStatsResponse().getBytes() ); - - } + }).join(); } - protected LoadGenerator.Listener[] getLoadGeneratorListeners() - { + protected LoadGenerator.Listener[] getLoadGeneratorListeners() { return new LoadGenerator.Listener[0]; } - protected Resource.Listener[] getResourceListeners() - { + protected Resource.Listener[] getResourceListeners() { return new Resource.Listener[0]; } - protected Request.Listener[] getListeners() - { + protected Request.Listener[] getRequestListeners() { return listeners == null ? new Request.Listener[0] : this.listeners; } - protected void setListeners( Request.Listener[] listeners ) - { + protected void setRequestListeners(Request.Listener[] listeners) { this.listeners = listeners; } - public ExecutorService getExecutorService() - { + public ExecutorService getExecutorService() { return executorService; } - public void setExecutorService( ExecutorService executor ) - { + public void setExecutorService(ExecutorService executor) { this.executorService = executor; } - public AbstractLoadGeneratorStarter executorService( ExecutorService executor ) - { - this.executorService = executor; - return this; - } - - public Resource getResource( LoadGenerator.Builder loadGeneratorBuilder ) - throws Exception - { - if ( resource != null ) - { + public Resource getResource(LoadGenerator.Builder builder) throws Exception { + if (resource != null) { return resource; } - if ( starterArgs.getProfileJsonPath() != null ) - { - Path profilePath = Paths.get( starterArgs.getProfileJsonPath() ); - if ( Files.exists( profilePath ) ) - { - return resource = evaluateJson( profilePath ); + String jsonPath = starterArgs.getResourceJSONPath(); + if (jsonPath != null) { + Path path = Paths.get(jsonPath); + if (Files.exists(path)) { + return resource = evaluateJSON(path); } } - if ( starterArgs.getProfileXmlPath() != null ) - { - Path profilePath = Paths.get( starterArgs.getProfileXmlPath() ); - try (InputStream inputStream = Files.newInputStream( profilePath )) - { - return resource = (Resource) new XmlConfiguration( inputStream ).configure(); + String xmlPath = starterArgs.getResourceXMLPath(); + if (xmlPath != null) { + Path path = Paths.get(xmlPath); + try (InputStream inputStream = Files.newInputStream(path)) { + return resource = (Resource)new XmlConfiguration(inputStream).configure(); } } - if ( starterArgs.getProfileGroovyPath() != null ) - { - Path profilePath = Paths.get( starterArgs.getProfileGroovyPath() ); - - try (Reader reader = Files.newBufferedReader( profilePath )) - { - Map context = new HashMap<>( ); - context.put( "loadGeneratorBuilder", loadGeneratorBuilder ); - return resource = (Resource) evaluateScript( reader, context ); + String groovyPath = starterArgs.getResourceGroovyPath(); + if (groovyPath != null) { + Path path = Paths.get(groovyPath); + try (Reader reader = Files.newBufferedReader(path)) { + Map context = new HashMap<>(); + context.put("loadGeneratorBuilder", builder); + return resource = (Resource)evaluateGroovy(reader, context); } } - throw new IllegalArgumentException( "not resource profile file defined" ); + throw new IllegalArgumentException("resource not defined"); } - protected static Resource evaluateJson( Path profilePath ) - throws Exception - { + protected static Resource evaluateJSON(Path profilePath) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.disable( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES ); - return objectMapper.readValue( profilePath.toFile(), Resource.class ); - + objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + return objectMapper.readValue(profilePath.toFile(), Resource.class); } - protected static String writeAsJsonTmp( Resource resource ) - throws Exception - { + protected static String writeAsJsonTmp(Resource resource) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.disable( SerializationFeature.FAIL_ON_EMPTY_BEANS ); - Path tmpPath = Files.createTempFile( "profile", ".tmp" ); - objectMapper.writeValue( tmpPath.toFile(), resource ); + objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + Path tmpPath = Files.createTempFile("profile", ".tmp"); + objectMapper.writeValue(tmpPath.toFile(), resource); return tmpPath.toString(); } - protected static Object evaluateScript( Reader script, Map context ) - throws Exception - { - CompilerConfiguration config = new CompilerConfiguration( CompilerConfiguration.DEFAULT ); - config.setDebug( true ); - config.setVerbose( true ); - Binding binding = new Binding( context ); - - GroovyShell interpreter = new GroovyShell(binding, config ); - - - return interpreter.evaluate( script ); + protected static Object evaluateGroovy(Reader script, Map context) throws Exception { + CompilerConfiguration config = new CompilerConfiguration(CompilerConfiguration.DEFAULT); + config.setDebug(true); + config.setVerbose(true); + Binding binding = new Binding(context); + GroovyShell interpreter = new GroovyShell(binding, config); + return interpreter.evaluate(script); } - public void setResource( Resource resource ) - { - this.resource = resource; - } - - public HTTPClientTransportBuilder getHttpClientTransportBuilder() - { - int transactionRate = getStarterArgs().getTransactionRate(); - switch ( getStarterArgs().getTransport() ) - { + public HTTPClientTransportBuilder httpClientTransportBuilder() { + LoadGeneratorStarterArgs.Transport transport = getStarterArgs().getTransport(); + switch (transport) { case HTTP: - case HTTPS: - { - return new HTTP1ClientTransportBuilder().selectors( getStarterArgs().getSelectors() ); + case HTTPS: { + return new HTTP1ClientTransportBuilder().selectors(getStarterArgs().getSelectors()); } case H2C: - case H2: - { - return new HTTP2ClientTransportBuilder().selectors( getStarterArgs().getSelectors() ); + case H2: { + return new HTTP2ClientTransportBuilder().selectors(getStarterArgs().getSelectors()); } - default: - { - // nothing this weird case already handled by #provideClientTransport + default: { + throw new IllegalArgumentException("unsupported transport " + transport); } - } - throw new IllegalArgumentException( "unknown getHttpClientTransportBuilder" ); } - public SslContextFactory sslContextFactory() - { + public SslContextFactory sslContextFactory() { // FIXME make this more configurable - SslContextFactory sslContextFactory = new SslContextFactory( true ); + SslContextFactory sslContextFactory = new SslContextFactory(true); return sslContextFactory; } - public LoadGeneratorStarterArgs getStarterArgs() - { + public LoadGeneratorStarterArgs getStarterArgs() { return starterArgs; } } diff --git a/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/JenkinsRemoteStarter.java b/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/JenkinsRemoteStarter.java index d94a88db..46a7a032 100644 --- a/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/JenkinsRemoteStarter.java +++ b/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/JenkinsRemoteStarter.java @@ -18,15 +18,6 @@ package org.mortbay.jetty.load.generator.starter; -import com.beust.jcommander.JCommander; -import org.eclipse.jetty.client.api.Request; -import org.eclipse.jetty.util.log.Log; -import org.eclipse.jetty.util.log.Logger; -import org.mortbay.jetty.load.generator.LoadGenerator; -import org.mortbay.jetty.load.generator.Resource; -import org.mortbay.jetty.load.generator.listeners.QpsListenerDisplay; -import org.mortbay.jetty.load.generator.listeners.RequestQueuedListenerDisplay; - import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FilterInputStream; @@ -38,84 +29,80 @@ import java.util.List; import java.util.concurrent.TimeUnit; +import com.beust.jcommander.JCommander; +import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; +import org.mortbay.jetty.load.generator.LoadGenerator; +import org.mortbay.jetty.load.generator.Resource; +import org.mortbay.jetty.load.generator.listeners.QpsListenerDisplay; +import org.mortbay.jetty.load.generator.listeners.RequestQueuedListenerDisplay; + /** * Class to start remote process for Jenkins */ -public class JenkinsRemoteStarter -{ - - private static final Logger LOGGER = Log.getLogger( JenkinsRemoteStarter.class ); +public class JenkinsRemoteStarter { + private static final Logger LOGGER = Log.getLogger(JenkinsRemoteStarter.class); + private static List nodeListeners; - public static List nodeListeners; - - public static List getNodeListeners() - { + public static List getNodeListeners() { return nodeListeners; } - public static void setNodeListeners( List nodeListeners ) - { + public static void setNodeListeners(List nodeListeners) { JenkinsRemoteStarter.nodeListeners = nodeListeners; } public static List loadGeneratorListeners; - public static List getLoadGeneratorListeners() - { + public static List getLoadGeneratorListeners() { return loadGeneratorListeners; } - public static void setLoadGeneratorListeners( List loadGeneratorListeners ) - { + public static void setLoadGeneratorListeners(List loadGeneratorListeners) { JenkinsRemoteStarter.loadGeneratorListeners = loadGeneratorListeners; } - public static void main( String... args) throws Exception { + public static void main(String... args) throws Exception { String slaveAgentSocket = args[0]; int i = slaveAgentSocket.indexOf(':'); - if (i > 0) - { - main( slaveAgentSocket.substring( 0, i ), Integer.parseInt( slaveAgentSocket.substring( i + 1 ) ) ); + if (i > 0) { + main(slaveAgentSocket.substring(0, i), Integer.parseInt(slaveAgentSocket.substring(i + 1))); } else { - main( null, Integer.parseInt( slaveAgentSocket ) ); + main(null, Integer.parseInt(slaveAgentSocket)); } } - public static void main( String agentIp, int tcpPort) throws Exception { - - - final Socket s = new Socket( agentIp, tcpPort); + public static void main(String agentIp, int tcpPort) throws Exception { + final Socket s = new Socket(agentIp, tcpPort); ClassLoader classLoader = JenkinsRemoteStarter.class.getClassLoader(); - Class remotingLauncher = classLoader.loadClass("hudson.remoting.Launcher"); + Class remotingLauncher = classLoader.loadClass("hudson.remoting.Launcher"); - remotingLauncher.getMethod("main", // - new Class[] { InputStream.class, OutputStream.class }).invoke( // - null, // - new Object[] { // + remotingLauncher.getMethod("main", + new Class[]{InputStream.class, OutputStream.class}).invoke( + null, // do partial close, since socket.getInputStream and // getOutputStream doesn't do it by - new BufferedInputStream( // - new FilterInputStream( s.getInputStream()) { // - public void close() throws IOException { // - s.shutdownInput(); // - } // - }), // - new BufferedOutputStream( // - new RealFilterOutputStream( s.getOutputStream()) { // - public void close() throws IOException { // - s.shutdownOutput(); // - } // - }) }); // + new BufferedInputStream( + new FilterInputStream(s.getInputStream()) { + public void close() throws IOException { + s.shutdownInput(); + } + }), + new BufferedOutputStream( + new RealFilterOutputStream(s.getOutputStream()) { + public void close() throws IOException { + s.shutdownOutput(); + } + }) + ); System.exit(0); } - - static class RealFilterOutputStream - extends FilterOutputStream - { - public RealFilterOutputStream( OutputStream core ) { + static class RealFilterOutputStream extends FilterOutputStream { + public RealFilterOutputStream(OutputStream core) { super(core); } @@ -132,78 +119,61 @@ public void close() throws IOException { } } - - public static void launch( List argsList ) - throws Exception - { - - final String[] args = argsList.toArray( new String[argsList.size()] ); + public static void launch(List argsList) throws Exception { + final String[] args = argsList.toArray(new String[argsList.size()]); LoadGeneratorStarterArgs runnerArgs = new LoadGeneratorStarterArgs(); - try - { - JCommander jCommander = new JCommander( runnerArgs, args ); - if ( runnerArgs.isHelp() ) - { + try { + JCommander jCommander = new JCommander(runnerArgs, args); + if (runnerArgs.isHelp()) { jCommander.usage(); - System.exit( 0 ); + System.exit(0); } - } - catch ( Exception e ) - { - new JCommander( runnerArgs ).usage(); + } catch (Exception e) { + new JCommander(runnerArgs).usage(); } - try - { - LoadGeneratorStarter runner = new LoadGeneratorStarter( runnerArgs ) - { + try { + LoadGeneratorStarter runner = new LoadGeneratorStarter(runnerArgs) { QpsListenerDisplay qpsListenerDisplay = - new QpsListenerDisplay( 10, 30, TimeUnit.SECONDS ); + new QpsListenerDisplay(10, 30, TimeUnit.SECONDS); private RequestQueuedListenerDisplay requestQueuedListenerDisplay = // - // FIXME those values need to be configurable!! // - new RequestQueuedListenerDisplay(10, 30, TimeUnit.SECONDS); + // FIXME those values need to be configurable!! // + new RequestQueuedListenerDisplay(10, 30, TimeUnit.SECONDS); @Override - protected Resource.Listener[] getResourceListeners() - { + protected Resource.Listener[] getResourceListeners() { return nodeListeners.toArray(new Resource.Listener[nodeListeners.size()]); } @Override - protected LoadGenerator.Listener[] getLoadGeneratorListeners() - { - loadGeneratorListeners.add( qpsListenerDisplay ); - loadGeneratorListeners.add( requestQueuedListenerDisplay ); - return loadGeneratorListeners.toArray( new LoadGenerator.Listener[loadGeneratorListeners.size()] ); + protected LoadGenerator.Listener[] getLoadGeneratorListeners() { + loadGeneratorListeners.add(qpsListenerDisplay); + loadGeneratorListeners.add(requestQueuedListenerDisplay); + return loadGeneratorListeners.toArray(new LoadGenerator.Listener[loadGeneratorListeners.size()]); } @Override - protected Request.Listener[] getListeners() - { + protected Request.Listener[] getRequestListeners() { return new Request.Listener[]{qpsListenerDisplay, requestQueuedListenerDisplay}; } }; - LOGGER.info( "start LoadGenerator to " + runnerArgs.getHost() // - + ", runningTime: " + runnerArgs.getRunningTime() // - + ", runningTimeUnit: " + runnerArgs.getRunningTimeUnit() // - + ", runIterations: " + runnerArgs.getRunIteration()); + LOGGER.info("start LoadGenerator to " + runnerArgs.getHost() // + + ", runningTime: " + runnerArgs.getRunningTime() // + + ", runningTimeUnit: " + runnerArgs.getRunningTimeUnit() // + + ", runIterations: " + runnerArgs.getIterations()); runner.run(); - LOGGER.info( "LoadGenerator stopped" ); + LOGGER.info("LoadGenerator stopped"); - } - catch ( Exception e ) - { + } catch (Exception e) { e.printStackTrace(); - new JCommander( runnerArgs ).usage(); - System.exit( 1 ); + new JCommander(runnerArgs).usage(); + System.exit(1); } - } - } diff --git a/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarter.java b/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarter.java index e983e2bd..adfa820c 100644 --- a/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarter.java +++ b/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarter.java @@ -18,6 +18,9 @@ package org.mortbay.jetty.load.generator.starter; +import java.text.SimpleDateFormat; +import java.util.concurrent.TimeUnit; + import com.beust.jcommander.JCommander; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.util.log.Log; @@ -26,131 +29,101 @@ import org.mortbay.jetty.load.generator.listeners.CollectorInformations; import org.mortbay.jetty.load.generator.listeners.report.GlobalSummaryListener; -import java.text.SimpleDateFormat; -import java.util.concurrent.TimeUnit; - -/** - * - */ -public class LoadGeneratorStarter - extends AbstractLoadGeneratorStarter -{ - - private static final Logger LOGGER = Log.getLogger( LoadGeneratorStarter.class ); +public class LoadGeneratorStarter extends AbstractLoadGeneratorStarter { + private static final Logger LOGGER = Log.getLogger(LoadGeneratorStarter.class); - public LoadGeneratorStarter( LoadGeneratorStarterArgs runnerArgs ) - { - super( runnerArgs ); + public LoadGeneratorStarter(LoadGeneratorStarterArgs runnerArgs) { + super(runnerArgs); } - public static void main( String[] args ) - throws Exception - { - + public static void main(String[] args) throws Exception { LoadGeneratorStarterArgs runnerArgs = new LoadGeneratorStarterArgs(); - try - { - JCommander jCommander = new JCommander( runnerArgs, args ); - if ( runnerArgs.isHelp() ) - { + try { + JCommander jCommander = new JCommander(runnerArgs, args); + if (runnerArgs.isHelp()) { jCommander.usage(); return; } - } - catch ( Exception e ) - { + } catch (Exception e) { e.printStackTrace(); - new JCommander( runnerArgs ).usage(); + new JCommander(runnerArgs).usage(); return; } - try - { + try { GlobalSummaryListener globalSummaryListener = new GlobalSummaryListener(); - LoadGeneratorStarter runner = new LoadGeneratorStarter( runnerArgs ) - { + LoadGeneratorStarter runner = new LoadGeneratorStarter(runnerArgs) { @Override - protected Resource.Listener[] getResourceListeners() - { - return new Resource.Listener[]{ globalSummaryListener }; + protected Resource.Listener[] getResourceListeners() { + return new Resource.Listener[]{globalSummaryListener}; } @Override - protected Request.Listener[] getListeners() - { - return new Request.Listener[]{ globalSummaryListener }; + protected Request.Listener[] getRequestListeners() { + return new Request.Listener[]{globalSummaryListener}; } }; runner.run(); - if ( runnerArgs.isDisplayStatsAtEnd() ) - { - runner.displayGlobalSummaryListener( globalSummaryListener ); + if (runnerArgs.isDisplayStats()) { + runner.displayGlobalSummaryListener(globalSummaryListener); } - } - catch ( Exception e ) - { - LOGGER.info( "error happened", e ); - new JCommander( runnerArgs ).usage(); + } catch (Exception e) { + LOGGER.info("error happened", e); + new JCommander(runnerArgs).usage(); } } - - public void displayGlobalSummaryListener( GlobalSummaryListener globalSummaryListener ) - { - - SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss z" ); + public void displayGlobalSummaryListener(GlobalSummaryListener globalSummaryListener) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss z"); CollectorInformations latencyTimeSummary = - new CollectorInformations( globalSummaryListener.getLatencyTimeHistogram() // - .getIntervalHistogram() ); + new CollectorInformations(globalSummaryListener.getLatencyTimeHistogram() // + .getIntervalHistogram()); long totalRequestCommitted = globalSummaryListener.getRequestCommitTotal(); long start = latencyTimeSummary.getStartTimeStamp(); long end = latencyTimeSummary.getEndTimeStamp(); - LOGGER.info( "" ); - LOGGER.info( "" ); - LOGGER.info( "----------------------------------------------------" ); - LOGGER.info( "-------- Latency Time Summary ---------------" ); - LOGGER.info( "----------------------------------------------------" ); - LOGGER.info( "total count:" + latencyTimeSummary.getTotalCount() ); - LOGGER.info( "maxLatency:" // - + fromNanostoMillis( latencyTimeSummary.getMaxValue() ) ); - LOGGER.info( "minLatency:" // - + fromNanostoMillis( latencyTimeSummary.getMinValue() ) ); - LOGGER.info( "aveLatency:" // - + fromNanostoMillis( Math.round( latencyTimeSummary.getMean() ) ) ); - LOGGER.info( "50Latency:" // - + fromNanostoMillis( latencyTimeSummary.getValue50() ) ); - LOGGER.info( "90Latency:" // - + fromNanostoMillis( latencyTimeSummary.getValue90() ) ); - LOGGER.info( "stdDeviation:" // - + fromNanostoMillis( Math.round( latencyTimeSummary.getStdDeviation() ) ) ); - LOGGER.info( "start: {}, end: {}", // - simpleDateFormat.format( latencyTimeSummary.getStartTimeStamp() ), // - simpleDateFormat.format( latencyTimeSummary.getEndTimeStamp() ) ); - LOGGER.info( "----------------------------------------------------" ); - LOGGER.info( "----------- Estimated QPS ------------------" ); - LOGGER.info( "----------------------------------------------------" ); - long timeInSeconds = TimeUnit.SECONDS.convert( end - start, TimeUnit.MILLISECONDS ); + LOGGER.info(""); + LOGGER.info(""); + LOGGER.info("----------------------------------------------------"); + LOGGER.info("-------- Latency Time Summary ---------------"); + LOGGER.info("----------------------------------------------------"); + LOGGER.info("total count:" + latencyTimeSummary.getTotalCount()); + LOGGER.info("maxLatency:" // + + nanosToMillis(latencyTimeSummary.getMaxValue())); + LOGGER.info("minLatency:" // + + nanosToMillis(latencyTimeSummary.getMinValue())); + LOGGER.info("aveLatency:" // + + nanosToMillis(Math.round(latencyTimeSummary.getMean()))); + LOGGER.info("50Latency:" // + + nanosToMillis(latencyTimeSummary.getValue50())); + LOGGER.info("90Latency:" // + + nanosToMillis(latencyTimeSummary.getValue90())); + LOGGER.info("stdDeviation:" // + + nanosToMillis(Math.round(latencyTimeSummary.getStdDeviation()))); + LOGGER.info("start: {}, end: {}", // + simpleDateFormat.format(latencyTimeSummary.getStartTimeStamp()), // + simpleDateFormat.format(latencyTimeSummary.getEndTimeStamp())); + LOGGER.info("----------------------------------------------------"); + LOGGER.info("----------- Estimated QPS ------------------"); + LOGGER.info("----------------------------------------------------"); + long timeInSeconds = TimeUnit.SECONDS.convert(end - start, TimeUnit.MILLISECONDS); long qps = totalRequestCommitted / timeInSeconds; - LOGGER.info( "estimated QPS : " + qps ); - LOGGER.info( "----------------------------------------------------" ); - LOGGER.info( "response 1xx family: " + globalSummaryListener.getResponses1xx().longValue() ); - LOGGER.info( "response 2xx family: " + globalSummaryListener.getResponses2xx().longValue() ); - LOGGER.info( "response 3xx family: " + globalSummaryListener.getResponses3xx().longValue() ); - LOGGER.info( "response 4xx family: " + globalSummaryListener.getResponses4xx().longValue() ); - LOGGER.info( "response 5xx family: " + globalSummaryListener.getResponses5xx().longValue() ); - LOGGER.info( "" ); - + LOGGER.info("estimated QPS : " + qps); + LOGGER.info("----------------------------------------------------"); + LOGGER.info("response 1xx family: " + globalSummaryListener.getResponses1xx().longValue()); + LOGGER.info("response 2xx family: " + globalSummaryListener.getResponses2xx().longValue()); + LOGGER.info("response 3xx family: " + globalSummaryListener.getResponses3xx().longValue()); + LOGGER.info("response 4xx family: " + globalSummaryListener.getResponses4xx().longValue()); + LOGGER.info("response 5xx family: " + globalSummaryListener.getResponses5xx().longValue()); + LOGGER.info(""); } - static long fromNanostoMillis( long nanosValue ) - { - return TimeUnit.MILLISECONDS.convert( nanosValue, TimeUnit.NANOSECONDS ); + static long nanosToMillis(long nanosValue) { + return TimeUnit.NANOSECONDS.toMillis(nanosValue); } - } diff --git a/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarterArgs.java b/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarterArgs.java index 889aea8a..0953e81b 100644 --- a/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarterArgs.java +++ b/jetty-load-generator-starter/src/main/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarterArgs.java @@ -18,153 +18,113 @@ package org.mortbay.jetty.load.generator.starter; -import java.util.Map; import java.util.concurrent.TimeUnit; -import com.beust.jcommander.DynamicParameter; import com.beust.jcommander.Parameter; -import com.beust.jcommander.internal.Maps; -/** - * - */ -public class LoadGeneratorStarterArgs -{ +public class LoadGeneratorStarterArgs { + @Parameter(names = {"--threads", "-t"}, description = "LoadGenerator threads") + private int threads = 1; - @Parameter( names = { "--profile-xml-path", "-pxp" }, description = "Path to profile xml file" ) - private String profileXmlPath; + @Parameter(names = {"--warmup-iterations", "-wi"}, description = "Warmup iterations per thread") + private int warmupIterations; - @Parameter( names = { "--profile-json-path", "-pjp" }, description = "Path to profile json file" ) - private String profileJsonPath; + @Parameter(names = {"--iterations", "-i"}, description = "Iterations per thread") + private int iterations = 1; - @Parameter( names = { "--profile-groovy-path", "-pgp" }, description = "Path to profile groovy file" ) - private String profileGroovyPath; - - @Parameter( names = { "--host", "-h" }, description = "Target host" ) - private String host = "localhost"; + @Parameter(names = {"--running-time", "-rt"}, description = "LoadGenerator Running Time") + private long runningTime = -1; - @Parameter( names = { "--port", "-p" }, description = "Target port" ) - private int port = 8080; + @Parameter(names = {"--running-time-unit", "-rtu"}, description = "LoadGenerator Running Time Unit (h/m/s/ms)") + private String runningTimeUnit = "s"; - @Parameter( names = { "--users", "-u" }, description = "Simulated users number" ) + @Parameter(names = {"--users", "-u"}, description = "Users per thread") private int users = 1; - @Parameter( names = { "--transaction-rate", "-tr" }, description = "Transaction rate / second" ) - private int transactionRate = 1; + @Parameter(names = {"--channels-per-user", "-cpu"}, description = "Channels/Connections per user") + private int channelsPerUser = 128; - @Parameter( names = { "--transport", "-t" }, description = "Transport (http, https, h2, h2c, fcgi)" ) - private String transport = "http"; + @Parameter(names = {"--resource-xml-path", "-rxp"}, description = "Path to resource XML file") + private String resourceXMLPath; - @Parameter( names = { "--selectors", "-s" }, description = "HttpClientTransport selectors" ) - private int selectors = 1; + @Parameter(names = {"--resource-json-path", "-rjp"}, description = "Path to resource JSON file") + private String resourceJSONPath; - @Parameter( names = { "--threads" }, description = "LoadGenerator threads" ) - private int threads = 0; + @Parameter(names = {"--resource-groovy-path", "-rgp"}, description = "Path to resource Groovy file") + private String resourceGroovyPath; - @Parameter( names = { "--running-time", "-rt" }, description = "Running Time" ) - private long runningTime = -1; + @Parameter(names = {"--resource-rate", "-rr"}, description = "Resource rate / second") + private int resourceRate = 1; - @Parameter( names = { "--running-time-unit", "-rtu" }, description = "Running Time Unit (h/m/s/ms)" ) - private String runningTimeUnit = "s"; + @Parameter(names = {"--scheme", "-s"}, description = "Target scheme (http/https)") + private String scheme = "http"; - @Parameter( names = { "--running-iteration", "-ri" }, description = "Iteration number to run" ) - private int runIteration; + @Parameter(names = {"--host", "-h"}, description = "Target host") + private String host = "localhost"; - @Parameter( names = { "--report-host", "-rh" }, description = "Report host" ) - private String reportHost = "localhost"; + @Parameter(names = {"--port", "-p"}, description = "Target port") + private int port = 8080; - @Parameter( names = { "--scheme" }, description = "Scheme (http/https)" ) - private String scheme = "http"; + @Parameter(names = {"--transport", "-tr"}, description = "Transport (http, https, h2, h2c)") + private String transport = "http"; - @Parameter( names = { "--report-port", "-rp" }, description = "Report port" ) - private int reportPort; + @Parameter(names = {"--selectors"}, description = "Number of NIO selectors") + private int selectors = 1; - @Parameter( names = { "--no-interrupt", "-notint"}, description = "Not Interrupt Loadgenerator after run" ) - private boolean notInterrupt = false; + @Parameter(names = {"--max-requests-queued", "-mrq"}, description = "Max Requests Queued") + private int maxRequestsQueued = 1024; - @Parameter( names = { "--stats-to-file", "-stf" }, description = "Write stats to this file" ) + @Parameter(names = {"--stats-file", "-sf"}, description = "Statistics output file") private String statsFile; - @DynamicParameter(names = "-D", description = "Dynamic parameters go here") - public Map params = Maps.newHashMap(); + @Parameter(names = {"--display-stats", "-ds"}, description = "Display statistics") + private boolean displayStats; - @Parameter( names = { "--help"}, description = "Display help" ) + @Parameter(names = {"--help"}, description = "Displays usage") private boolean help; - @Parameter( names = { "--display-stats-end", "-dse"}, description = "Display stats at the end" ) - private boolean displayStatsAtEnd; - - @Parameter( names = { "--collect-server-stats", "-css"}, description = "Collect server stats on remote StatisticsServlet" ) - private boolean collectServerStats; - - @Parameter( names = { "--warmup-number", "-wn" }, description = "Warm up number to run" ) - private int warmupNumber; - - @Parameter( names = { "--max-requests-queued", "-mrq" }, description = "Max Requests Queued" ) - private int maxRequestsQueued = -1; - - @Parameter( names = { "--channel-per-user", "-cpu" }, description = "Connections per user" ) - private int channelPerUser = -1; - - public LoadGeneratorStarterArgs() - { - // no op - } - - public String getProfileXmlPath() - { - return profileXmlPath; + public String getResourceXMLPath() { + return resourceXMLPath; } - public void setProfileXmlPath( String profileXmlPath ) - { - this.profileXmlPath = profileXmlPath; + public void setResourceXMLPath(String resourceXMLPath) { + this.resourceXMLPath = resourceXMLPath; } - public String getHost() - { + public String getHost() { return host; } - public void setHost( String host ) - { + public void setHost(String host) { this.host = host; } - public int getPort() - { + public int getPort() { return port; } - public void setPort( int port ) - { + public void setPort(int port) { this.port = port; } - public int getUsers() - { + public int getUsers() { return users; } - public void setUsers( int users ) - { + public void setUsers(int users) { this.users = users; } - public int getTransactionRate() - { - return transactionRate; + public int getResourceRate() { + return resourceRate; } - public void setTransactionRate( int transactionRate ) - { - this.transactionRate = transactionRate; + public void setResourceRate(int resourceRate) { + this.resourceRate = resourceRate; } - public Transport getTransport() - { - switch ( this.transport ) - { + public Transport getTransport() { + switch (this.transport) { case "http": return Transport.HTTP; case "https": @@ -174,48 +134,40 @@ public Transport getTransport() case "h2c": return Transport.H2C; default: - throw new IllegalArgumentException( transport + " is not recognized" ); + throw new IllegalArgumentException("unsupported transport " + transport); } } - public void setTransport( String transport ) - { + public void setTransport(String transport) { this.transport = transport != null ? transport.toLowerCase() : ""; } - public int getSelectors() - { + public int getSelectors() { return selectors; } - public void setSelectors( int selectors ) - { + public void setSelectors(int selectors) { this.selectors = selectors; } - public boolean isHelp() - { + public boolean isHelp() { return help; } - public void setHelp( boolean help ) - { + public void setHelp(boolean help) { this.help = help; } - public long getRunningTime() - { + public long getRunningTime() { return runningTime; } - public void setRunningTime( long runningTime ) - { + public void setRunningTime(long runningTime) { this.runningTime = runningTime; } - public TimeUnit getRunningTimeUnit() - { - switch ( this.runningTimeUnit ) { + public TimeUnit getRunningTimeUnit() { + switch (this.runningTimeUnit) { case "m": case "minutes": case "MINUTES": @@ -233,178 +185,92 @@ public TimeUnit getRunningTimeUnit() case "MILLISECONDS": return TimeUnit.MILLISECONDS; default: - throw new IllegalArgumentException( runningTimeUnit + " is not recognized" ); + throw new IllegalArgumentException(runningTimeUnit + " is not recognized"); } } - public int getRunIteration() - { - return runIteration; - } - - public void setRunIteration( int runIteration ) - { - this.runIteration = runIteration; - } - - public void setRunningTimeUnit( String runningTimeUnit ) - { + public void setRunningTimeUnit(String runningTimeUnit) { this.runningTimeUnit = runningTimeUnit; } - public String getProfileJsonPath() - { - return profileJsonPath; - } - - public void setProfileJsonPath( String profileJsonPath ) - { - this.profileJsonPath = profileJsonPath; - } - - public String getReportHost() - { - return reportHost; - } - - public void setReportHost( String reportHost ) - { - this.reportHost = reportHost; - } - - public int getReportPort() - { - return reportPort; + public int getIterations() { + return iterations; } - public void setReportPort( int reportPort ) - { - this.reportPort = reportPort; + public void setIterations(int iterations) { + this.iterations = iterations; } - public boolean isNotInterrupt() - { - return notInterrupt; + public String getResourceJSONPath() { + return resourceJSONPath; } - public void setNotInterrupt( boolean notInterrupt ) - { - this.notInterrupt = notInterrupt; + public void setResourceJSONPath(String resourceJSONPath) { + this.resourceJSONPath = resourceJSONPath; } - public String getStatsFile() - { + public String getStatsFile() { return statsFile; } - public void setStatsFile( String statsFile ) - { + public void setStatsFile(String statsFile) { this.statsFile = statsFile; } - public Map getParams() - { - return params; - } - - public String getProfileGroovyPath() - { - return profileGroovyPath; + public String getResourceGroovyPath() { + return resourceGroovyPath; } - public void setProfileGroovyPath( String profileGroovyPath ) - { - this.profileGroovyPath = profileGroovyPath; + public void setResourceGroovyPath(String resourceGroovyPath) { + this.resourceGroovyPath = resourceGroovyPath; } - public void setParams( Map params ) - { - this.params = params; + public boolean isDisplayStats() { + return displayStats; } - public boolean isDisplayStatsAtEnd() - { - return displayStatsAtEnd; + public void setDisplayStats(boolean displayStats) { + this.displayStats = displayStats; } - public void setDisplayStatsAtEnd( boolean displayStatsAtEnd ) - { - this.displayStatsAtEnd = displayStatsAtEnd; + public int getWarmupIterations() { + return warmupIterations; } - public boolean isCollectServerStats() - { - return collectServerStats; + public void setWarmupIterations(int warmupIterations) { + this.warmupIterations = warmupIterations; } - public void setCollectServerStats( boolean collectServerStats ) - { - this.collectServerStats = collectServerStats; - } - - public int getWarmupNumber() - { - return warmupNumber; - } - - public void setWarmupNumber( int warmupNumber ) - { - this.warmupNumber = warmupNumber; - } - - public String getScheme() - { + public String getScheme() { return scheme; } - public void setScheme( String scheme ) - { + public void setScheme(String scheme) { this.scheme = scheme; } - public int getMaxRequestsQueued() - { + public int getMaxRequestsQueued() { return maxRequestsQueued; } - public void setMaxRequestsQueued( int maxRequestsQueued ) - { + public void setMaxRequestsQueued(int maxRequestsQueued) { this.maxRequestsQueued = maxRequestsQueued; } - public int getThreads() - { + public int getThreads() { return threads; } - public void setThreads( int threads ) - { + public void setThreads(int threads) { this.threads = threads; } - public int getChannelPerUser() - { - return channelPerUser; - } - - public void setChannelPerUser( int channelPerUser ) - { - this.channelPerUser = channelPerUser; + public int getChannelsPerUser() { + return channelsPerUser; } - @Override - public String toString() - { - return "LoadGeneratorStarterArgs{" + "profileXmlPath='" + profileXmlPath + '\'' + ", profileJsonPath='" - + profileJsonPath + '\'' + ", profileGroovyPath='" + profileGroovyPath + '\'' + ", host='" + host + '\'' - + ", port=" + port + ", users=" + users + ", transactionRate=" + transactionRate + ", transport='" - + transport + '\'' + ", selectors=" + selectors + ", threads=" + threads + ", runningTime=" + runningTime - + ", runningTimeUnit='" + runningTimeUnit + '\'' + ", runIteration=" + runIteration + ", reportHost='" - + reportHost + '\'' + ", scheme='" + scheme + '\'' + ", reportPort=" + reportPort + ", notInterrupt=" - + notInterrupt + ", statsFile='" + statsFile + '\'' + ", params=" + params + ", help=" + help - + ", displayStatsAtEnd=" + displayStatsAtEnd + ", collectServerStats=" + collectServerStats - + ", warmupNumber=" + warmupNumber + ", maxRequestsQueued=" + maxRequestsQueued + ", channelPerUser=" - + channelPerUser + '}'; + public void setChannelsPerUser(int channelsPerUser) { + this.channelsPerUser = channelsPerUser; } public enum Transport { diff --git a/jetty-load-generator-starter/src/test/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarterTest.java b/jetty-load-generator-starter/src/test/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarterTest.java index c3e969a0..c10b801e 100644 --- a/jetty-load-generator-starter/src/test/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarterTest.java +++ b/jetty-load-generator-starter/src/test/java/org/mortbay/jetty/load/generator/starter/LoadGeneratorStarterTest.java @@ -16,6 +16,21 @@ package org.mortbay.jetty.load.generator.starter; +import java.io.IOException; +import java.io.Reader; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import com.beust.jcommander.JCommander; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.server.HttpConfiguration; @@ -23,7 +38,6 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.handler.StatisticsHandler; -import org.eclipse.jetty.server.session.SessionHandler; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.StatisticsServlet; @@ -37,230 +51,159 @@ import org.junit.Test; import org.mortbay.jetty.load.generator.Resource; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.io.IOException; -import java.io.Reader; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Locale; -import java.util.concurrent.atomic.AtomicInteger; +public class LoadGeneratorStarterTest { + private static final Logger LOGGER = Log.getLogger(LoadGeneratorStarterTest.class); -/** - * - */ -public class LoadGeneratorStarterTest -{ - private static final Logger LOGGER = Log.getLogger( LoadGeneratorStarterTest.class); - - Server server; - - ServerConnector connector; - - StatisticsHandler statisticsHandler = new StatisticsHandler(); - - TestHandler testHandler; + private Server server; + private ServerConnector connector; + private StatisticsHandler statisticsHandler = new StatisticsHandler(); + private TestServlet testServlet; @Before - public void startJetty() - throws Exception - { + public void startJetty() throws Exception { QueuedThreadPool serverThreads = new QueuedThreadPool(); - serverThreads.setName( "server" ); - server = new Server( serverThreads ); - connector = new ServerConnector( server, new HttpConnectionFactory( new HttpConfiguration() ) ); - server.addConnector( connector ); - - server.setHandler( statisticsHandler ); - - ServletContextHandler statsContext = new ServletContextHandler( statisticsHandler, "/" ); - - statsContext.addServlet( new ServletHolder( new StatisticsServlet() ), "/stats" ); - - testHandler = new TestHandler(); - testHandler.server = server; - - statsContext.addServlet( new ServletHolder( testHandler ), "/" ); - - statsContext.setSessionHandler( new SessionHandler() ); - + serverThreads.setName("server"); + server = new Server(serverThreads); + connector = new ServerConnector(server, new HttpConnectionFactory(new HttpConfiguration())); + server.addConnector(connector); + server.setHandler(statisticsHandler); + ServletContextHandler statsContext = new ServletContextHandler(statisticsHandler, "/"); + statsContext.addServlet(new ServletHolder(new StatisticsServlet()), "/stats"); + testServlet = new TestServlet(); + testServlet.server = server; + statsContext.addServlet(new ServletHolder(testServlet), "/"); server.start(); - } @After - public void stopJetty() - throws Exception - { - if (server.isRunning()) - { + public void stopJetty() throws Exception { + if (server != null) { server.stop(); } } @Test - public void simpletest() - throws Exception - { - + public void simpleTest() throws Exception { List args = new ArrayList<>(); - args.add( "--warmup-number" ); - args.add( "10" ); - args.add( "-h" ); - args.add( "localhost" ); - args.add( "--port" ); - args.add( Integer.toString( connector.getLocalPort() ) ); - args.add( "--running-time" ); - args.add( "10" ); - args.add( "--running-time-unit" ); - args.add( "s" ); - args.add( "--transaction-rate" ); - args.add( "3" ); - args.add( "--transport" ); - args.add( "http" ); - args.add( "--users" ); - args.add( "3" ); - args.add( "--profile-groovy-path" ); - args.add( "src/test/resources/loadgenerator_profile.groovy" ); - LoadGeneratorStarter.main( args.toArray( new String[args.size()] ) ); - int getNumber = testHandler.getNumber.get(); - LOGGER.debug( "received get: {}", getNumber ); - Assert.assertTrue( "getNumber return: " + getNumber, getNumber > 10 ); + args.add("--warmup-iterations"); + args.add("10"); + args.add("-h"); + args.add("localhost"); + args.add("--port"); + args.add(Integer.toString(connector.getLocalPort())); + args.add("--running-time"); + args.add("10"); + args.add("--running-time-unit"); + args.add("s"); + args.add("--resource-rate"); + args.add("3"); + args.add("--transport"); + args.add("http"); + args.add("--users"); + args.add("3"); + args.add("--resource-groovy-path"); + args.add("src/test/resources/tree_resources.groovy"); + LoadGeneratorStarter.main(args.toArray(new String[args.size()])); + int getNumber = testServlet.getNumber.get(); + LOGGER.debug("received get: {}", getNumber); + Assert.assertTrue("getNumber return: " + getNumber, getNumber > 10); } - @Test - public void fail_fast() - throws Exception - { - + public void failFast() throws Exception { List args = new ArrayList<>(); - args.add( "--warmup-number" ); - args.add( "10" ); - args.add( "-h" ); - args.add( "localhost" ); - args.add( "--port" ); - args.add( Integer.toString( connector.getLocalPort() ) ); - args.add( "--running-time" ); - args.add( "10" ); - args.add( "--running-time-unit" ); - args.add( "s" ); - args.add( "--transaction-rate" ); - args.add( "3" ); - args.add( "--transport" ); - args.add( "http" ); - args.add( "--users" ); - args.add( "1" ); - args.add( "--profile-groovy-path" ); - args.add( "src/test/resources/single_resource.groovy" ); + args.add("--warmup-iterations"); + args.add("10"); + args.add("-h"); + args.add("localhost"); + args.add("--port"); + args.add(Integer.toString(connector.getLocalPort())); + args.add("--running-time"); + args.add("10"); + args.add("--running-time-unit"); + args.add("s"); + args.add("--resource-rate"); + args.add("3"); + args.add("--transport"); + args.add("http"); + args.add("--users"); + args.add("1"); + args.add("--resource-groovy-path"); + args.add("src/test/resources/single_resource.groovy"); LoadGeneratorStarterArgs runnerArgs = new LoadGeneratorStarterArgs(); - new JCommander( runnerArgs, args.toArray( new String[args.size()] ) ); + new JCommander(runnerArgs, args.toArray(new String[args.size()])); - AtomicInteger onFailure = new AtomicInteger( 0 ), onCommit = new AtomicInteger( 0 ); + AtomicInteger onFailure = new AtomicInteger(0), onCommit = new AtomicInteger(0); Request.Listener.Adapter adapter = new Request.Listener.Adapter() { @Override - public void onFailure( Request request, Throwable failure ) - { - LOGGER.info( "fail: {}", onFailure.incrementAndGet() ); + public void onFailure(Request request, Throwable failure) { + LOGGER.info("fail: {}", onFailure.incrementAndGet()); } @Override - public void onCommit( Request request ) - { - LOGGER.info( "onCommit: {}", onCommit.incrementAndGet() ); + public void onCommit(Request request) { + LOGGER.info("onCommit: {}", onCommit.incrementAndGet()); } }; - LoadGeneratorStarter runner = new LoadGeneratorStarter( runnerArgs ); - runner.setListeners( new Request.Listener[] { adapter } ); + LoadGeneratorStarter runner = new LoadGeneratorStarter(runnerArgs); + runner.setRequestListeners(new Request.Listener[]{adapter}); boolean exception = false; - try - { + try { runner.run(); - } - catch ( Exception e ) - { + } catch (Exception e) { exception = true; } - LOGGER.info( "onFailure: {}, onCommit: {}", onFailure, onCommit); - Assert.assertTrue("not in exception", exception ); - int getNumber = testHandler.getNumber.get(); - LOGGER.debug( "received get: {}", getNumber ); - Assert.assertTrue( "getNumber return: " + getNumber, getNumber == 5 ); - Assert.assertTrue( onFailure.get() < 10 ); + LOGGER.info("onFailure: {}, onCommit: {}", onFailure, onCommit); + Assert.assertTrue("not in exception", exception); + int getNumber = testServlet.getNumber.get(); + LOGGER.debug("received get: {}", getNumber); + Assert.assertTrue("getNumber return: " + getNumber, getNumber == 5); + Assert.assertTrue(onFailure.get() < 10); } @Test - public void json_serial_deserial_from_groovy() - throws Exception - { - try (Reader reader = Files.newBufferedReader( Paths.get( "src/test/resources/loadgenerator_profile.groovy" ) )) - { - Resource resource = (Resource) AbstractLoadGeneratorStarter.evaluateScript( reader, Collections.emptyMap() ); - String path = AbstractLoadGeneratorStarter.writeAsJsonTmp( resource ); - Resource fromJson = AbstractLoadGeneratorStarter.evaluateJson( Paths.get( path ) ); - Assert.assertEquals( resource.descendantCount(), fromJson.descendantCount() ); + public void json_serial_deserial_from_groovy() throws Exception { + try (Reader reader = Files.newBufferedReader(Paths.get("src/test/resources/tree_resources.groovy"))) { + Resource resource = (Resource)AbstractLoadGeneratorStarter.evaluateGroovy(reader, Collections.emptyMap()); + String path = AbstractLoadGeneratorStarter.writeAsJsonTmp(resource); + Resource fromJson = AbstractLoadGeneratorStarter.evaluateJSON(Paths.get(path)); + Assert.assertEquals(resource.descendantCount(), fromJson.descendantCount()); } } - static class TestHandler - extends HttpServlet - { - - AtomicInteger getNumber = new AtomicInteger( 0 ), postNumber = new AtomicInteger( 0 ); - - Server server; + private static class TestServlet extends HttpServlet { + private AtomicInteger getNumber = new AtomicInteger(0); + private AtomicInteger postNumber = new AtomicInteger(0); + private Server server; @Override - protected void service( HttpServletRequest request, HttpServletResponse response ) - throws ServletException, IOException - { - - String method = request.getMethod().toUpperCase( Locale.ENGLISH ); - - HttpSession httpSession = request.getSession(); - - switch ( method ) - { - case "GET": - { - String fail = request.getParameter( "fail" ); - if (fail != null) - { - if ( getNumber.get() >= Integer.parseInt( fail ) ) - { - try - { + protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String method = request.getMethod().toUpperCase(Locale.ENGLISH); + switch (method) { + case "GET": { + String fail = request.getParameter("fail"); + if (fail != null) { + if (getNumber.get() >= Integer.parseInt(fail)) { + try { server.stop(); - } - catch ( Exception e ) - { - throw new RuntimeException( e.getMessage(), e ); + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); } } } - response.getOutputStream().write( "Jetty rocks!!".getBytes() ); + response.getOutputStream().write("Jetty rocks!!".getBytes()); response.flushBuffer(); - getNumber.addAndGet( 1 ); + getNumber.addAndGet(1); break; } - case "POST": - { - IO.copy( request.getInputStream(), response.getOutputStream() ); - postNumber.addAndGet( 1 ); + case "POST": { + IO.copy(request.getInputStream(), response.getOutputStream()); + postNumber.addAndGet(1); break; } } - } } - - } diff --git a/jetty-load-generator-starter/src/test/resources/loadgenerator_profile.groovy b/jetty-load-generator-starter/src/test/resources/tree_resources.groovy similarity index 100% rename from jetty-load-generator-starter/src/test/resources/loadgenerator_profile.groovy rename to jetty-load-generator-starter/src/test/resources/tree_resources.groovy