You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2017/08/28 15:54:08 UTC

[2/3] httpcomponents-core git commit: Folded ab module into testing

Folded ab module into testing


Project: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/commit/d9e2b62c
Tree: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/tree/d9e2b62c
Diff: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/diff/d9e2b62c

Branch: refs/heads/master
Commit: d9e2b62ca2db8eceb6d5c0b3c93d06c770587347
Parents: f888a33
Author: Oleg Kalnichevski <ol...@apache.org>
Authored: Mon Aug 28 13:53:10 2017 +0200
Committer: Oleg Kalnichevski <ol...@apache.org>
Committed: Mon Aug 28 13:53:10 2017 +0200

----------------------------------------------------------------------
 httpcore5-ab/pom.xml                            |  99 -------
 .../http/benchmark/BenchmarkConnection.java     |  66 -----
 .../core5/http/benchmark/BenchmarkWorker.java   | 282 ------------------
 .../core5/http/benchmark/CommandLineUtils.java  | 247 ----------------
 .../apache/hc/core5/http/benchmark/Config.java  | 288 -------------------
 .../http/benchmark/CountingInputStream.java     |  78 -----
 .../http/benchmark/CountingOutputStream.java    |  60 ----
 .../hc/core5/http/benchmark/DefaultHeader.java  |  40 ---
 .../hc/core5/http/benchmark/HttpBenchmark.java  | 240 ----------------
 .../core5/http/benchmark/ResultProcessor.java   | 126 --------
 .../apache/hc/core5/http/benchmark/Results.java | 133 ---------
 .../apache/hc/core5/http/benchmark/Stats.java   | 143 ---------
 .../hc/core5/http/benchmark/package-info.java   |  31 --
 .../hc/core5/http/benchmark/SmokeTest.java      |  97 -------
 httpcore5-testing/pom.xml                       |   6 +
 .../hc/core5/benchmark/BenchmarkConnection.java |  66 +++++
 .../hc/core5/benchmark/BenchmarkWorker.java     | 282 ++++++++++++++++++
 .../hc/core5/benchmark/CommandLineUtils.java    | 247 ++++++++++++++++
 .../org/apache/hc/core5/benchmark/Config.java   | 288 +++++++++++++++++++
 .../hc/core5/benchmark/CountingInputStream.java |  78 +++++
 .../core5/benchmark/CountingOutputStream.java   |  60 ++++
 .../hc/core5/benchmark/DefaultHeader.java       |  40 +++
 .../hc/core5/benchmark/HttpBenchmark.java       | 240 ++++++++++++++++
 .../hc/core5/benchmark/ResultProcessor.java     | 126 ++++++++
 .../org/apache/hc/core5/benchmark/Results.java  | 133 +++++++++
 .../org/apache/hc/core5/benchmark/Stats.java    | 143 +++++++++
 .../apache/hc/core5/benchmark/package-info.java |  31 ++
 .../hc/core5/benchmark/BenchmarkToolTest.java   |  97 +++++++
 pom.xml                                         |   1 -
 29 files changed, 1837 insertions(+), 1931 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/pom.xml
----------------------------------------------------------------------
diff --git a/httpcore5-ab/pom.xml b/httpcore5-ab/pom.xml
deleted file mode 100644
index d1e300d..0000000
--- a/httpcore5-ab/pom.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one
-   or more contributor license agreements.  See the NOTICE file
-   distributed with this work for additional information
-   regarding copyright ownership.  The ASF licenses this file
-   to you under the Apache License, Version 2.0 (the
-   "License"); you may not use this file except in compliance
-   with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing,
-   software distributed under the License is distributed on an
-   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-   KIND, either express or implied.  See the License for the
-   specific language governing permissions and limitations
-   under the License.
-   ====================================================================
-
-   This software consists of voluntary contributions made by many
-   individuals on behalf of the Apache Software Foundation.  For more
-   information on the Apache Software Foundation, please see
-   <http://www.apache.org />.
- --><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/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.httpcomponents.core5</groupId>
-    <artifactId>httpcore5-parent</artifactId>
-    <version>5.0-alpha4-SNAPSHOT</version>
-  </parent>
-  <artifactId>httpcore5-ab</artifactId>
-  <name>Apache HttpComponents Core Benchmarking Tool</name>
-  <description>
-   Apache AB clone based on HttpCore
-  </description>
-  <url>http://hc.apache.org/httpcomponents-core-ga</url>
-  <packaging>jar</packaging>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.httpcomponents.core5</groupId>
-      <artifactId>httpcore5</artifactId>
-      <version>${project.version}</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-cli</groupId>
-      <artifactId>commons-cli</artifactId>
-      <version>1.2</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.rat</groupId>
-        <artifactId>apache-rat-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>verify</phase>
-            <goals>
-              <goal>check</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>	
-    </plugins>
-  </build>
-
-  <reporting>
-    <plugins>
-
-      <plugin>
-        <artifactId>maven-project-info-reports-plugin</artifactId>
-        <version>${hc.project-info.version}</version>
-        <inherited>false</inherited>
-        <reportSets>
-          <reportSet>
-            <reports>
-              <report>dependencies</report>
-              <report>dependency-info</report>
-              <report>summary</report>
-            </reports>
-          </reportSet>
-        </reportSets>
-      </plugin>
-
-    </plugins>
-  </reporting>
-
-</project>

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/BenchmarkConnection.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/BenchmarkConnection.java b/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/BenchmarkConnection.java
deleted file mode 100644
index b5ebe5f..0000000
--- a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/BenchmarkConnection.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.hc.core5.http.benchmark;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.List;
-
-import org.apache.hc.core5.function.Supplier;
-import org.apache.hc.core5.http.Header;
-import org.apache.hc.core5.http.config.H1Config;
-import org.apache.hc.core5.http.impl.io.DefaultBHttpClientConnection;
-import org.apache.hc.core5.http.io.SessionInputBuffer;
-import org.apache.hc.core5.http.io.SessionOutputBuffer;
-
-class BenchmarkConnection extends DefaultBHttpClientConnection {
-
-    private final Stats stats;
-
-    BenchmarkConnection(final H1Config h1Config, final Stats stats) {
-        super(h1Config);
-        this.stats = stats;
-    }
-
-    @Override
-    protected OutputStream createContentOutputStream(final long len,
-                                                     final SessionOutputBuffer outbuffer,
-                                                     final OutputStream outputStream,
-                                                     final Supplier<List<? extends Header>> trailers) {
-        return new CountingOutputStream(
-                super.createContentOutputStream(len, outbuffer, outputStream, trailers),
-                this.stats);
-    }
-
-    @Override
-    protected InputStream createContentInputStream(final long len,
-                                                   final SessionInputBuffer inbuffer,
-                                                   final InputStream inputStream) {
-        return new CountingInputStream(super.createContentInputStream(len, inbuffer, inputStream), this.stats);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/BenchmarkWorker.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/BenchmarkWorker.java b/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/BenchmarkWorker.java
deleted file mode 100644
index 707adaf..0000000
--- a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/BenchmarkWorker.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.hc.core5.http.benchmark;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.Iterator;
-
-import javax.net.SocketFactory;
-
-import org.apache.hc.core5.http.ClassicHttpRequest;
-import org.apache.hc.core5.http.ClassicHttpResponse;
-import org.apache.hc.core5.http.ConnectionReuseStrategy;
-import org.apache.hc.core5.http.ContentType;
-import org.apache.hc.core5.http.Header;
-import org.apache.hc.core5.http.HttpEntity;
-import org.apache.hc.core5.http.HttpException;
-import org.apache.hc.core5.http.HttpHost;
-import org.apache.hc.core5.http.HttpStatus;
-import org.apache.hc.core5.http.HttpVersion;
-import org.apache.hc.core5.http.config.H1Config;
-import org.apache.hc.core5.http.impl.DefaultConnectionReuseStrategy;
-import org.apache.hc.core5.http.impl.io.HttpRequestExecutor;
-import org.apache.hc.core5.http.io.entity.EntityUtils;
-import org.apache.hc.core5.http.protocol.HttpCoreContext;
-import org.apache.hc.core5.http.protocol.HttpProcessor;
-import org.apache.hc.core5.http.protocol.HttpProcessorBuilder;
-import org.apache.hc.core5.http.protocol.RequestConnControl;
-import org.apache.hc.core5.http.protocol.RequestContent;
-import org.apache.hc.core5.http.protocol.RequestExpectContinue;
-import org.apache.hc.core5.http.protocol.RequestTargetHost;
-import org.apache.hc.core5.http.protocol.RequestUserAgent;
-import org.apache.hc.core5.io.ShutdownType;
-
-/**
- * Worker thread for the {@link HttpBenchmark HttpBenchmark}.
- *
- *
- * @since 4.0
- */
-class BenchmarkWorker implements Runnable {
-
-    private final byte[] buffer = new byte[4096];
-    private final HttpCoreContext context;
-    private final HttpProcessor httpProcessor;
-    private final HttpRequestExecutor httpexecutor;
-    private final ConnectionReuseStrategy connstrategy;
-    private final HttpHost host;
-    private final ClassicHttpRequest request;
-    private final Config config;
-    private final SocketFactory socketFactory;
-    private boolean shutdownSignal;
-    private final Stats stats = new Stats();
-
-    public BenchmarkWorker(
-            final HttpHost host,
-            final ClassicHttpRequest request,
-            final SocketFactory socketFactory,
-            final Config config) {
-        super();
-        this.context = new HttpCoreContext();
-        this.host = host;
-        this.request = request;
-        this.config = config;
-        final HttpProcessorBuilder builder = HttpProcessorBuilder.create()
-                .addAll(
-                        new RequestContent(),
-                        new RequestTargetHost(),
-                        new RequestConnControl(),
-                        new RequestUserAgent("HttpCore-AB/1.1"));
-        if (this.config.isUseExpectContinue()) {
-            builder.add(new RequestExpectContinue());
-        }
-        this.httpProcessor = builder.build();
-        this.httpexecutor = new HttpRequestExecutor();
-
-        this.connstrategy = DefaultConnectionReuseStrategy.INSTANCE;
-        this.socketFactory = socketFactory;
-        this.shutdownSignal = false;
-    }
-
-    @Override
-    public void run() {
-        ClassicHttpResponse response = null;
-        final HttpVersion version = config.isUseHttp1_0() ? HttpVersion.HTTP_1_0 : HttpVersion.HTTP_1_1;
-        final BenchmarkConnection conn = new BenchmarkConnection(H1Config.DEFAULT, stats);
-
-        final String scheme = this.host.getSchemeName();
-        final String hostname = this.host.getHostName();
-        int port = this.host.getPort();
-        if (port == -1) {
-            if (scheme.equalsIgnoreCase("https")) {
-                port = 443;
-            } else {
-                port = 80;
-            }
-        }
-
-        // Populate the execution context
-        context.setProtocolVersion(version);
-
-        stats.start();
-        final int count = config.getRequests();
-        for (int i = 0; i < count; i++) {
-
-            try {
-                resetHeader(request);
-                if (!conn.isOpen()) {
-
-                    final Socket socket;
-                    if (socketFactory != null) {
-                        socket = socketFactory.createSocket();
-                    } else {
-                        socket = new Socket();
-                    }
-
-                    final int timeout = config.getSocketTimeout();
-                    socket.setSoTimeout(timeout);
-                    socket.connect(new InetSocketAddress(hostname, port), timeout);
-
-                    conn.bind(socket);
-                }
-
-                try {
-                    // Prepare request
-                    this.httpexecutor.preProcess(this.request, this.httpProcessor, this.context);
-                    // Execute request and get a response
-                    response = this.httpexecutor.execute(this.request, conn, this.context);
-                    // Finalize response
-                    this.httpexecutor.postProcess(response, this.httpProcessor, this.context);
-
-                } catch (final HttpException e) {
-                    stats.incWriteErrors();
-                    if (config.getVerbosity() >= 2) {
-                        System.err.println("Failed HTTP request : " + e.getMessage());
-                    }
-                    conn.shutdown(ShutdownType.IMMEDIATE);
-                    continue;
-                }
-
-                verboseOutput(response);
-
-                if (response.getCode() == HttpStatus.SC_OK) {
-                    stats.incSuccessCount();
-                } else {
-                    stats.incFailureCount();
-                }
-
-                final HttpEntity entity = response.getEntity();
-                if (entity != null) {
-                    final ContentType ct = EntityUtils.getContentTypeOrDefault(entity);
-                    Charset charset = ct.getCharset();
-                    if (charset == null) {
-                        charset = StandardCharsets.ISO_8859_1;
-                    }
-                    long contentlen = 0;
-                    final InputStream instream = entity.getContent();
-                    int l;
-                    while ((l = instream.read(this.buffer)) != -1) {
-                        contentlen += l;
-                        if (config.getVerbosity() >= 4) {
-                            final String s = new String(this.buffer, 0, l, charset);
-                            System.out.print(s);
-                        }
-                    }
-                    instream.close();
-                    stats.setContentLength(contentlen);
-                }
-
-                if (config.getVerbosity() >= 4) {
-                    System.out.println();
-                    System.out.println();
-                }
-
-                if (!config.isKeepAlive() || !conn.isConsistent() || !this.connstrategy.keepAlive(request, response, this.context)) {
-                    conn.close();
-                } else {
-                    stats.incKeepAliveCount();
-                }
-
-            } catch (final IOException ex) {
-                stats.incFailureCount();
-                if (config.getVerbosity() >= 2) {
-                    System.err.println("I/O error: " + ex.getMessage());
-                }
-            } catch (final Exception ex) {
-                stats.incFailureCount();
-                if (config.getVerbosity() >= 2) {
-                    System.err.println("Generic error: " + ex.getMessage());
-                }
-            }
-
-            if (shutdownSignal) {
-                break;
-            }
-        }
-        stats.finish();
-
-        if (response != null) {
-            final Header header = response.getFirstHeader("Server");
-            if (header != null) {
-                stats.setServerName(header.getValue());
-            }
-        }
-
-        try {
-            conn.close();
-        } catch (final IOException ex) {
-            stats.incFailureCount();
-            if (config.getVerbosity() >= 2) {
-                System.err.println("I/O error: " + ex.getMessage());
-            }
-        }
-    }
-
-    private void verboseOutput(final ClassicHttpResponse response) {
-        if (config.getVerbosity() >= 3) {
-            System.out.println(">> " + request.getMethod() + " " + request.getRequestUri());
-            final Header[] headers = request.getAllHeaders();
-            for (final Header header : headers) {
-                System.out.println(">> " + header.toString());
-            }
-            System.out.println();
-        }
-        if (config.getVerbosity() >= 2) {
-            System.out.println(response.getCode());
-        }
-        if (config.getVerbosity() >= 3) {
-            System.out.println("<< " + response.getCode() + " " + response.getReasonPhrase());
-            final Header[] headers = response.getAllHeaders();
-            for (final Header header : headers) {
-                System.out.println("<< " + header.toString());
-            }
-            System.out.println();
-        }
-    }
-
-    private static void resetHeader(final ClassicHttpRequest request) {
-        for (final Iterator<Header> it = request.headerIterator(); it.hasNext();) {
-            final Header header = it.next();
-            if (!(header instanceof DefaultHeader)) {
-                it.remove();
-            }
-        }
-    }
-
-    public Stats getStats() {
-        return stats;
-    }
-
-    public synchronized void setShutdownSignal() {
-        this.shutdownSignal = true;
-    }
-}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/CommandLineUtils.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/CommandLineUtils.java b/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/CommandLineUtils.java
deleted file mode 100644
index 372ca49..0000000
--- a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/CommandLineUtils.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.hc.core5.http.benchmark;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.Options;
-
-public class CommandLineUtils {
-
-    private CommandLineUtils() {
-        // Do not allow utility class to be instantiated.
-    }
-
-    public static Options getOptions() {
-        final Option iopt = new Option("i", false, "Do HEAD requests instead of GET (deprecated)");
-        iopt.setRequired(false);
-
-        final Option oopt = new Option("o", false, "Use HTTP/S 1.0 instead of 1.1 (default)");
-        oopt.setRequired(false);
-
-        final Option kopt = new Option("k", false, "Enable the HTTP KeepAlive feature, " +
-            "i.e., perform multiple requests within one HTTP session. " +
-            "Default is no KeepAlive");
-        kopt.setRequired(false);
-
-        final Option uopt = new Option("u", false, "Chunk entity. Default is false");
-        uopt.setRequired(false);
-
-        final Option xopt = new Option("x", false, "Use Expect-Continue. Default is false");
-        xopt.setRequired(false);
-
-        final Option gopt = new Option("g", false, "Accept GZip. Default is false");
-        gopt.setRequired(false);
-
-        final Option nopt = new Option("n", true, "Number of requests to perform for the " +
-            "benchmarking session. The default is to just perform a single " +
-            "request which usually leads to non-representative benchmarking " +
-            "results");
-        nopt.setRequired(false);
-        nopt.setArgName("requests");
-
-        final Option copt = new Option("c", true, "Concurrency while performing the " +
-            "benchmarking session. The default is to just use a single thread/client");
-        copt.setRequired(false);
-        copt.setArgName("concurrency");
-
-        final Option popt = new Option("p", true, "File containing data to POST or PUT");
-        popt.setRequired(false);
-        popt.setArgName("Payload file");
-
-        final Option mopt = new Option("m", true, "HTTP Method. Default is POST. " +
-                "Possible options are GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE");
-        mopt.setRequired(false);
-        mopt.setArgName("HTTP method");
-
-        final Option Topt = new Option("T", true, "Content-type header to use for POST/PUT data");
-        Topt.setRequired(false);
-        Topt.setArgName("content-type");
-
-        final Option topt = new Option("t", true, "Client side socket timeout (in ms) - default 60 Secs");
-        topt.setRequired(false);
-        topt.setArgName("socket-Timeout");
-
-        final Option tlopt = new Option("l", true, "Time limit for the test to run (default is infinity)");
-        tlopt.setRequired(false);
-        tlopt.setArgName("time-limit");
-
-        final Option Hopt = new Option("H", true, "Add arbitrary header line, " +
-            "eg. 'Accept-Encoding: gzip' inserted after all normal " +
-            "header lines. (repeatable as -H \"h1: v1\",\"h2: v2\" etc)");
-        Hopt.setRequired(false);
-        Hopt.setArgName("header");
-
-        final Option vopt = new Option("v", true, "Set verbosity level - 4 and above " +
-            "prints response content, 3 and above prints " +
-            "information on headers, 2 and above prints response codes (404, 200, " +
-            "etc.), 1 and above prints warnings and info");
-        vopt.setRequired(false);
-        vopt.setArgName("verbosity");
-
-        final Option hopt = new Option("h", false, "Display usage information");
-        nopt.setRequired(false);
-
-        final Options options = new Options();
-        options.addOption(iopt);
-        options.addOption(mopt);
-        options.addOption(uopt);
-        options.addOption(xopt);
-        options.addOption(gopt);
-        options.addOption(kopt);
-        options.addOption(nopt);
-        options.addOption(copt);
-        options.addOption(popt);
-        options.addOption(Topt);
-        options.addOption(vopt);
-        options.addOption(Hopt);
-        options.addOption(hopt);
-        options.addOption(topt);
-        options.addOption(oopt);
-        options.addOption(tlopt);
-        return options;
-    }
-
-    public static void parseCommandLine(final CommandLine cmd, final Config config) {
-        if (cmd.hasOption('v')) {
-            final String s = cmd.getOptionValue('v');
-            try {
-                config.setVerbosity(Integer.parseInt(s));
-            } catch (final NumberFormatException ex) {
-                printError("Invalid verbosity level: " + s);
-            }
-        }
-
-        if (cmd.hasOption('k')) {
-            config.setKeepAlive(true);
-        }
-
-        if (cmd.hasOption('c')) {
-            final String s = cmd.getOptionValue('c');
-            try {
-                config.setThreads(Integer.parseInt(s));
-            } catch (final NumberFormatException ex) {
-                printError("Invalid number for concurrency: " + s);
-            }
-        }
-
-        if (cmd.hasOption('n')) {
-            final String s = cmd.getOptionValue('n');
-            try {
-                config.setRequests(Integer.parseInt(s));
-            } catch (final NumberFormatException ex) {
-                printError("Invalid number of requests: " + s);
-            }
-        }
-
-        if (cmd.hasOption('p')) {
-            final File file = new File(cmd.getOptionValue('p'));
-            if (!file.exists()) {
-                printError("File not found: " + file);
-            }
-            config.setPayloadFile(file);
-        }
-
-        if (cmd.hasOption('T')) {
-            config.setContentType(cmd.getOptionValue('T'));
-        }
-
-        if (cmd.hasOption('i')) {
-            config.setHeadInsteadOfGet(true);
-        }
-
-        if (cmd.hasOption('H')) {
-            final String headerStr = cmd.getOptionValue('H');
-            config.setHeaders(headerStr.split(","));
-        }
-
-        if (cmd.hasOption('t')) {
-            final String t = cmd.getOptionValue('t');
-            try {
-                config.setSocketTimeout(Integer.parseInt(t));
-            } catch (final NumberFormatException ex) {
-                printError("Invalid socket timeout: " + t);
-            }
-        }
-
-        if (cmd.hasOption('l')) {
-            final String l = cmd.getOptionValue('l');
-            try {
-                config.setTimeLimit(Integer.parseInt(l));
-            } catch (final NumberFormatException ex) {
-                printError("Invalid time limit: " + l);
-            }
-        }
-
-        if (cmd.hasOption('o')) {
-            config.setUseHttp1_0(true);
-        }
-
-        if (cmd.hasOption('m')) {
-            config.setMethod(cmd.getOptionValue('m'));
-        } else if (cmd.hasOption('p')) {
-            config.setMethod("POST");
-        }
-
-        if (cmd.hasOption('u')) {
-            config.setUseChunking(true);
-        }
-
-        if (cmd.hasOption('x')) {
-            config.setUseExpectContinue(true);
-        }
-
-        if (cmd.hasOption('g')) {
-            config.setUseAcceptGZip(true);
-        }
-
-        final String[] cmdargs = cmd.getArgs();
-        if (cmdargs.length > 0) {
-            try {
-                config.setUrl(new URL(cmdargs[0]));
-            } catch (final MalformedURLException e) {
-                printError("Invalid request URL : " + cmdargs[0]);
-            }
-        }
-    }
-
-    static void showUsage(final Options options) {
-        final HelpFormatter formatter = new HelpFormatter();
-        formatter.printHelp("HttpBenchmark [options] [http://]hostname[:port]/path?query", options);
-    }
-
-    static void printError(final String msg) {
-        System.err.println(msg);
-        showUsage(getOptions());
-        System.exit(-1);
-    }
-}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/Config.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/Config.java b/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/Config.java
deleted file mode 100644
index 75e184c..0000000
--- a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/Config.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.hc.core5.http.benchmark;
-
-import java.io.File;
-import java.net.URL;
-
-public class Config {
-
-    private URL url;
-    private int requests;
-    private int threads;
-    private boolean keepAlive;
-    private int verbosity;
-    private boolean headInsteadOfGet;
-    private boolean useHttp1_0;
-    private String contentType;
-    private String[] headers;
-    private int socketTimeout;
-    private String method = "GET";
-    private boolean useChunking;
-    private boolean useExpectContinue;
-    private boolean useAcceptGZip;
-    private File payloadFile = null;
-    private String payloadText = null;
-    private String soapAction = null;
-    private int timeLimit = -1;
-
-    private boolean disableSSLVerification = true;
-    private String trustStorePath = null;
-    private String identityStorePath = null;
-    private String trustStorePassword = null;
-    private String identityStorePassword = null;
-
-    public Config() {
-        super();
-        this.url = null;
-        this.requests = 1;
-        this.threads = 1;
-        this.keepAlive = false;
-        this.verbosity = 0;
-        this.headInsteadOfGet = false;
-        this.useHttp1_0 = false;
-        this.payloadFile = null;
-        this.payloadText = null;
-        this.contentType = null;
-        this.headers = null;
-        this.socketTimeout = 60000;
-    }
-
-    public URL getUrl() {
-        return url;
-    }
-
-    public void setUrl(final URL url) {
-        this.url = url;
-    }
-
-    public int getRequests() {
-        return requests;
-    }
-
-    public void setRequests(final int requests) {
-        this.requests = requests;
-    }
-
-    public int getThreads() {
-        return threads;
-    }
-
-    public void setThreads(final int threads) {
-        this.threads = threads;
-    }
-
-    public boolean isKeepAlive() {
-        return keepAlive;
-    }
-
-    public void setKeepAlive(final boolean keepAlive) {
-        this.keepAlive = keepAlive;
-    }
-
-    public int getVerbosity() {
-        return verbosity;
-    }
-
-    public void setVerbosity(final int verbosity) {
-        this.verbosity = verbosity;
-    }
-
-    public boolean isHeadInsteadOfGet() {
-        return headInsteadOfGet;
-    }
-
-    public void setHeadInsteadOfGet(final boolean headInsteadOfGet) {
-        this.headInsteadOfGet = headInsteadOfGet;
-        this.method = "HEAD";
-    }
-
-    public boolean isUseHttp1_0() {
-        return useHttp1_0;
-    }
-
-    public void setUseHttp1_0(final boolean useHttp1_0) {
-        this.useHttp1_0 = useHttp1_0;
-    }
-
-    public File getPayloadFile() {
-        return payloadFile;
-    }
-
-    public void setPayloadFile(final File payloadFile) {
-        this.payloadFile = payloadFile;
-    }
-
-    public String getContentType() {
-        return contentType;
-    }
-
-    public void setContentType(final String contentType) {
-        this.contentType = contentType;
-    }
-
-    public String[] getHeaders() {
-        return headers;
-    }
-
-    public void setHeaders(final String[] headers) {
-        this.headers = headers;
-    }
-
-    public int getSocketTimeout() {
-        return socketTimeout;
-    }
-
-    public void setSocketTimeout(final int socketTimeout) {
-        this.socketTimeout = socketTimeout;
-    }
-
-    public void setMethod(final String method) {
-        this.method = method;
-    }
-
-    public void setUseChunking(final boolean useChunking) {
-        this.useChunking = useChunking;
-    }
-
-    public void setUseExpectContinue(final boolean useExpectContinue) {
-        this.useExpectContinue = useExpectContinue;
-    }
-
-    public void setUseAcceptGZip(final boolean useAcceptGZip) {
-        this.useAcceptGZip = useAcceptGZip;
-    }
-
-    public String getMethod() {
-        return method;
-    }
-
-    public boolean isUseChunking() {
-        return useChunking;
-    }
-
-    public boolean isUseExpectContinue() {
-        return useExpectContinue;
-    }
-
-    public boolean isUseAcceptGZip() {
-        return useAcceptGZip;
-    }
-
-    public String getPayloadText() {
-        return payloadText;
-    }
-
-    public String getSoapAction() {
-        return soapAction;
-    }
-
-    public boolean isDisableSSLVerification() {
-        return disableSSLVerification;
-    }
-
-    public String getTrustStorePath() {
-        return trustStorePath;
-    }
-
-    public String getIdentityStorePath() {
-        return identityStorePath;
-    }
-
-    public String getTrustStorePassword() {
-        return trustStorePassword;
-    }
-
-    public String getIdentityStorePassword() {
-        return identityStorePassword;
-    }
-
-    public void setPayloadText(final String payloadText) {
-        this.payloadText = payloadText;
-    }
-
-    public void setSoapAction(final String soapAction) {
-        this.soapAction = soapAction;
-    }
-
-    public void setDisableSSLVerification(final boolean disableSSLVerification) {
-        this.disableSSLVerification = disableSSLVerification;
-    }
-
-    public void setTrustStorePath(final String trustStorePath) {
-        this.trustStorePath = trustStorePath;
-    }
-
-    public void setIdentityStorePath(final String identityStorePath) {
-        this.identityStorePath = identityStorePath;
-    }
-
-    public void setTrustStorePassword(final String trustStorePassword) {
-        this.trustStorePassword = trustStorePassword;
-    }
-
-    public void setIdentityStorePassword(final String identityStorePassword) {
-        this.identityStorePassword = identityStorePassword;
-    }
-
-    public void setTimeLimit(final int timeLimit) {
-        this.timeLimit = timeLimit;
-    }
-
-    public int getTimeLimit() {
-        return timeLimit;
-    }
-
-    public Config copy() {
-        final Config copy = new Config();
-        copy.url = this.url;
-        copy.requests = this.requests;
-        copy.threads = this.threads;
-        copy.keepAlive = this.keepAlive;
-        copy.verbosity = this.verbosity;
-        copy.headInsteadOfGet = this.headInsteadOfGet;
-        copy.useHttp1_0 = this.useHttp1_0;
-        copy.contentType = this.contentType;
-        copy.headers = this.headers;
-        copy.socketTimeout = this.socketTimeout;
-        copy.method = this.method;
-        copy.useChunking = this.useChunking;
-        copy.useExpectContinue = this.useExpectContinue;
-        copy.useAcceptGZip = this.useAcceptGZip;
-        copy.payloadFile = this.payloadFile;
-        copy.payloadText = this.payloadText;
-        copy.soapAction = this.soapAction;
-
-        copy.disableSSLVerification = this.disableSSLVerification;
-        copy.trustStorePath = this.trustStorePath;
-        copy.identityStorePath = this.identityStorePath;
-        copy.trustStorePassword = this.trustStorePassword;
-        copy.identityStorePassword = this.identityStorePassword;
-        return copy;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/CountingInputStream.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/CountingInputStream.java b/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/CountingInputStream.java
deleted file mode 100644
index 11d4eea..0000000
--- a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/CountingInputStream.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.hc.core5.http.benchmark;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-class CountingInputStream extends FilterInputStream {
-
-    private final Stats stats;
-
-    CountingInputStream(final InputStream instream, final Stats stats) {
-        super(instream);
-        this.stats = stats;
-    }
-
-    @Override
-    public int read() throws IOException {
-        final int b = this.in.read();
-        if (b != -1) {
-            this.stats.incTotalBytesRecv(1);
-        }
-        return b;
-    }
-
-    @Override
-    public int read(final byte[] b) throws IOException {
-        final int bytesRead = this.in.read(b);
-        if (bytesRead > 0) {
-            this.stats.incTotalBytesRecv(bytesRead);
-        }
-        return bytesRead;
-    }
-
-    @Override
-    public int read(final byte[] b, final int off, final int len) throws IOException {
-        final int bytesRead = this.in.read(b, off, len);
-        if (bytesRead > 0) {
-            this.stats.incTotalBytesRecv(bytesRead);
-        }
-        return bytesRead;
-    }
-
-    @Override
-    public long skip(final long n) throws IOException {
-        final long bytesRead = this.in.skip(n);
-        if (bytesRead > 0) {
-            this.stats.incTotalBytesRecv(bytesRead);
-        }
-        return bytesRead;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/CountingOutputStream.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/CountingOutputStream.java b/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/CountingOutputStream.java
deleted file mode 100644
index 91bc3e4..0000000
--- a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/CountingOutputStream.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.hc.core5.http.benchmark;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-class CountingOutputStream extends FilterOutputStream {
-
-    private final Stats stats;
-
-    CountingOutputStream(final OutputStream outstream, final Stats stats) {
-        super(outstream);
-        this.stats = stats;
-    }
-
-    @Override
-    public void write(final int b) throws IOException {
-        this.out.write(b);
-        this.stats.incTotalBytesSent(1);
-    }
-
-    @Override
-    public void write(final byte[] b) throws IOException {
-        this.out.write(b);
-        this.stats.incTotalBytesSent(b.length);
-    }
-
-    @Override
-    public void write(final byte[] b, final int off, final int len) throws IOException {
-        this.out.write(b, off, len);
-        this.stats.incTotalBytesSent(len);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/DefaultHeader.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/DefaultHeader.java b/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/DefaultHeader.java
deleted file mode 100644
index aae6a6c..0000000
--- a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/DefaultHeader.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.hc.core5.http.benchmark;
-
-import org.apache.hc.core5.http.message.BasicHeader;
-
-class DefaultHeader extends BasicHeader {
-
-    private static final long serialVersionUID = 3465786867105185103L;
-
-    public DefaultHeader(final String name, final String value) {
-        super(name, value);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/HttpBenchmark.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/HttpBenchmark.java b/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/HttpBenchmark.java
deleted file mode 100644
index 75bb08c..0000000
--- a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/HttpBenchmark.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.hc.core5.http.benchmark;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.PosixParser;
-import org.apache.hc.core5.http.Header;
-import org.apache.hc.core5.http.HeaderElements;
-import org.apache.hc.core5.http.HttpEntity;
-import org.apache.hc.core5.http.HttpHeaders;
-import org.apache.hc.core5.http.HttpHost;
-import org.apache.hc.core5.http.ClassicHttpRequest;
-import org.apache.hc.core5.http.HttpVersion;
-import org.apache.hc.core5.http.ContentType;
-import org.apache.hc.core5.http.io.entity.FileEntity;
-import org.apache.hc.core5.http.io.entity.StringEntity;
-import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
-import org.apache.hc.core5.net.URIAuthority;
-import org.apache.hc.core5.ssl.SSLContextBuilder;
-import org.apache.hc.core5.ssl.TrustStrategy;
-
-import java.io.File;
-import java.net.URL;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import javax.net.SocketFactory;
-import javax.net.ssl.SSLContext;
-
-/**
- * Main program of the HTTP benchmark.
- *
- *
- * @since 4.0
- */
-public class HttpBenchmark {
-
-    private final Config config;
-
-    public static void main(final String[] args) throws Exception {
-
-        final Options options = CommandLineUtils.getOptions();
-        final CommandLineParser parser = new PosixParser();
-        final CommandLine cmd = parser.parse(options, args);
-
-        if (args.length == 0 || cmd.hasOption('h') || cmd.getArgs().length != 1) {
-            CommandLineUtils.showUsage(options);
-            System.exit(1);
-        }
-
-        final Config config = new Config();
-        CommandLineUtils.parseCommandLine(cmd, config);
-
-        if (config.getUrl() == null) {
-            CommandLineUtils.showUsage(options);
-            System.exit(1);
-        }
-
-        final HttpBenchmark httpBenchmark = new HttpBenchmark(config);
-        httpBenchmark.execute();
-    }
-
-    public HttpBenchmark(final Config config) {
-        super();
-        this.config = config != null ? config : new Config();
-    }
-
-    private ClassicHttpRequest createRequest(final HttpHost host) {
-        final URL url = config.getUrl();
-        HttpEntity entity = null;
-
-        // Prepare requests for each thread
-        if (config.getPayloadFile() != null) {
-            final FileEntity fe = new FileEntity(config.getPayloadFile());
-            fe.setContentType(config.getContentType());
-            fe.setChunked(config.isUseChunking());
-            entity = fe;
-        } else if (config.getPayloadText() != null) {
-            final StringEntity se = new StringEntity(config.getPayloadText(),
-                    ContentType.parse(config.getContentType()));
-            se.setChunked(config.isUseChunking());
-            entity = se;
-        }
-        final ClassicHttpRequest request;
-        if ("POST".equals(config.getMethod())) {
-            final ClassicHttpRequest httppost = new BasicClassicHttpRequest("POST", url.getPath());
-            httppost.setEntity(entity);
-            request = httppost;
-        } else if ("PUT".equals(config.getMethod())) {
-            final ClassicHttpRequest httpput = new BasicClassicHttpRequest("PUT", url.getPath());
-            httpput.setEntity(entity);
-            request = httpput;
-        } else {
-            String path = url.getPath();
-            if (url.getQuery() != null && url.getQuery().length() > 0) {
-                path += "?" + url.getQuery();
-            } else if (path.trim().length() == 0) {
-                path = "/";
-            }
-            request = new BasicClassicHttpRequest(config.getMethod(), path);
-        }
-        request.setVersion(config.isUseHttp1_0() ? HttpVersion.HTTP_1_0 : HttpVersion.HTTP_1_1);
-
-        if (!config.isKeepAlive()) {
-            request.addHeader(new DefaultHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE));
-        }
-
-        final String[] headers = config.getHeaders();
-        if (headers != null) {
-            for (final String s : headers) {
-                final int pos = s.indexOf(':');
-                if (pos != -1) {
-                    final Header header = new DefaultHeader(s.substring(0, pos).trim(), s.substring(pos + 1));
-                    request.addHeader(header);
-                }
-            }
-        }
-
-        if (config.isUseAcceptGZip()) {
-            request.addHeader(new DefaultHeader("Accept-Encoding", "gzip"));
-        }
-
-        if (config.getSoapAction() != null && config.getSoapAction().length() > 0) {
-            request.addHeader(new DefaultHeader("SOAPAction", config.getSoapAction()));
-        }
-        request.setScheme(host.getSchemeName());
-        request.setAuthority(new URIAuthority(host));
-        return request;
-    }
-
-    public String execute() throws Exception {
-        final Results results = doExecute();
-        ResultProcessor.printResults(results);
-        return "";
-    }
-
-    public Results doExecute() throws Exception {
-
-        final URL url = config.getUrl();
-        final long endTime = System.currentTimeMillis() + config.getTimeLimit()*1000;
-        final HttpHost host = new HttpHost(url.getHost(), url.getPort(), url.getProtocol());
-        final ThreadPoolExecutor workerPool = new ThreadPoolExecutor(
-                config.getThreads(), config.getThreads(), 5, TimeUnit.SECONDS,
-            new LinkedBlockingQueue<Runnable>(),
-            new ThreadFactory() {
-
-                @Override
-                public Thread newThread(final Runnable r) {
-                    return new Thread(r, "ClientPool");
-                }
-
-            });
-        workerPool.prestartAllCoreThreads();
-
-        SocketFactory socketFactory = null;
-        if ("https".equals(host.getSchemeName())) {
-            final SSLContextBuilder sslContextBuilder = new SSLContextBuilder();
-            sslContextBuilder.setProtocol("SSL");
-            if (config.isDisableSSLVerification()) {
-                sslContextBuilder.loadTrustMaterial(null, new TrustStrategy() {
-
-                    @Override
-                    public boolean isTrusted(
-                            final X509Certificate[] chain, final String authType) throws CertificateException {
-                        return true;
-                    }
-
-                });
-            } else if (config.getTrustStorePath() != null) {
-                sslContextBuilder.loadTrustMaterial(
-                        new File(config.getTrustStorePath()),
-                        config.getTrustStorePassword() != null ? config.getTrustStorePassword().toCharArray() : null);
-            }
-            if (config.getIdentityStorePath() != null) {
-                sslContextBuilder.loadKeyMaterial(
-                        new File(config.getIdentityStorePath()),
-                        config.getIdentityStorePassword() != null ? config.getIdentityStorePassword().toCharArray() : null,
-                        config.getIdentityStorePassword() != null ? config.getIdentityStorePassword().toCharArray() : null);
-            }
-            final SSLContext sslContext = sslContextBuilder.build();
-            socketFactory = sslContext.getSocketFactory();
-        }
-
-        final BenchmarkWorker[] workers = new BenchmarkWorker[config.getThreads()];
-        for (int i = 0; i < workers.length; i++) {
-            workers[i] = new BenchmarkWorker(
-                    host,
-                    createRequest(host),
-                    socketFactory,
-                    config);
-            workerPool.execute(workers[i]);
-        }
-
-        while (workerPool.getCompletedTaskCount() < config.getThreads()) {
-            Thread.yield();
-            try {
-                Thread.sleep(1000);
-            } catch (final InterruptedException ignore) {
-            }
-            if (config.getTimeLimit() != -1 && System.currentTimeMillis() > endTime) {
-                for (int i = 0; i < workers.length; i++) {
-                    workers[i].setShutdownSignal();
-                }
-            }
-        }
-
-        workerPool.shutdown();
-        return ResultProcessor.collectResults(workers, host, config.getUrl().toString());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/ResultProcessor.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/ResultProcessor.java b/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/ResultProcessor.java
deleted file mode 100644
index b3dc2c9..0000000
--- a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/ResultProcessor.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.hc.core5.http.benchmark;
-
-import java.text.NumberFormat;
-
-import org.apache.hc.core5.http.HttpHost;
-
-public class ResultProcessor {
-
-    private ResultProcessor() {
-        // Do not allow utility class to be instantiated.
-    }
-
-    static NumberFormat nf2 = NumberFormat.getInstance();
-    static NumberFormat nf3 = NumberFormat.getInstance();
-    static NumberFormat nf6 = NumberFormat.getInstance();
-
-    static {
-        nf2.setMaximumFractionDigits(2);
-        nf2.setMinimumFractionDigits(2);
-        nf3.setMaximumFractionDigits(3);
-        nf3.setMinimumFractionDigits(3);
-        nf6.setMaximumFractionDigits(6);
-        nf6.setMinimumFractionDigits(6);
-    }
-
-    static Results collectResults(final BenchmarkWorker[] workers, final HttpHost host, final String uri) {
-        long totalTimeNano = 0;
-        long successCount    = 0;
-        long failureCount    = 0;
-        long writeErrors     = 0;
-        long keepAliveCount  = 0;
-        long totalBytesRcvd  = 0;
-        long totalBytesSent  = 0;
-
-        final Stats stats = workers[0].getStats();
-
-        for (final BenchmarkWorker worker : workers) {
-            final Stats s = worker.getStats();
-            totalTimeNano  += s.getDuration();
-            successCount   += s.getSuccessCount();
-            failureCount   += s.getFailureCount();
-            writeErrors    += s.getWriteErrors();
-            keepAliveCount += s.getKeepAliveCount();
-            totalBytesRcvd += s.getTotalBytesRecv();
-            totalBytesSent += s.getTotalBytesSent();
-        }
-
-        final Results results = new Results();
-        results.serverName = stats.getServerName();
-        results.hostName = host.getHostName();
-        results.hostPort = host.getPort() > 0 ? host.getPort() :
-            host.getSchemeName().equalsIgnoreCase("https") ? 443 : 80;
-        results.documentPath = uri;
-        results.contentLength = stats.getContentLength();
-        results.concurrencyLevel = workers.length;
-        results.totalTimeNano = totalTimeNano;
-        results.successCount = successCount;
-        results.failureCount = failureCount;
-        results.writeErrors = writeErrors;
-        results.keepAliveCount = keepAliveCount;
-        results.totalBytesRcvd = totalBytesRcvd;
-        results.totalBytesSent = totalBytesSent;
-        results.totalBytes = totalBytesRcvd + (totalBytesSent > 0 ? totalBytesSent : 0);
-        return results;
-    }
-
-    static void printResults(final Results results) {
-        final int threads = results.getConcurrencyLevel();
-        final double totalTimeMs  = (results.getTotalTimeNano() / threads) / 1000000; // convert nano secs to milli secs
-        final double timePerReqMs = totalTimeMs / results.getSuccessCount();
-        final double totalTimeSec = totalTimeMs / 1000;
-        final double reqsPerSec   = results.getSuccessCount() / totalTimeSec;
-
-        System.out.println("\nServer Software:\t\t" + results.getServerName());
-        System.out.println( "Server Hostname:\t\t" + results.getHostName());
-        System.out.println( "Server Port:\t\t\t" + Integer.valueOf(results.getHostPort()));
-        System.out.println( "Document Path:\t\t\t" + results.getDocumentPath());
-        System.out.println( "Document Length:\t\t" + results.getContentLength() + " bytes\n");
-        System.out.println( "Concurrency Level:\t\t" + results.getConcurrencyLevel());
-        System.out.println( "Time taken for tests:\t\t" + nf6.format(totalTimeSec) + " seconds");
-        System.out.println( "Complete requests:\t\t" + results.getSuccessCount());
-        System.out.println( "Failed requests:\t\t" + results.getFailureCount());
-        System.out.println( "Write errors:\t\t\t" + results.getWriteErrors());
-        System.out.println( "Kept alive:\t\t\t" + results.getKeepAliveCount());
-        System.out.println( "Total transferred:\t\t" + results.getTotalBytes() + " bytes");
-        System.out.println( "Requests per second:\t\t" + nf2.format(reqsPerSec) + " [#/sec] (mean)");
-        System.out.println( "Time per request:\t\t" + nf3.format(timePerReqMs
-                * results.getConcurrencyLevel()) + " [ms] (mean)");
-        System.out.println( "Time per request:\t\t" + nf3.format(timePerReqMs) +
-            " [ms] (mean, across all concurrent requests)");
-        System.out.println( "Transfer rate:\t\t\t" +
-            nf2.format(results.getTotalBytesRcvd() / 1000 / totalTimeSec) + " [Kbytes/sec] received");
-        System.out.println( "\t\t\t\t" +
-            (results.getTotalBytesSent() > 0 ? nf2.format(results.getTotalBytesSent()
-                    / 1000 / totalTimeSec) : Integer.valueOf(-1)) + " kb/s sent");
-        System.out.println( "\t\t\t\t" +
-            nf2.format(results.getTotalBytes() / 1000 / totalTimeSec) + " kb/s total");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/Results.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/Results.java b/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/Results.java
deleted file mode 100644
index 247417d..0000000
--- a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/Results.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.hc.core5.http.benchmark;
-
-/**
- * Benchmark results
- *
- * @since 4.3
- */
-public final class Results {
-
-    String serverName;
-    String hostName;
-    int hostPort;
-    String documentPath;
-    long contentLength;
-    int concurrencyLevel;
-    long totalTimeNano;
-    long successCount;
-    long failureCount;
-    long writeErrors;
-    long keepAliveCount;
-    long totalBytesRcvd;
-    long totalBytesSent;
-    long totalBytes;
-
-    Results() {
-        super();
-        this.contentLength = -1;
-    }
-
-    public String getServerName() {
-        return serverName;
-    }
-
-    public String getHostName() {
-        return hostName;
-    }
-
-    public int getHostPort() {
-        return hostPort;
-    }
-
-    public String getDocumentPath() {
-        return documentPath;
-    }
-
-    public long getContentLength() {
-        return contentLength;
-    }
-
-    public int getConcurrencyLevel() {
-        return concurrencyLevel;
-    }
-
-    public long getTotalTimeNano() {
-        return totalTimeNano;
-    }
-
-    public long getSuccessCount() {
-        return successCount;
-    }
-
-    public long getFailureCount() {
-        return failureCount;
-    }
-
-    public long getWriteErrors() {
-        return writeErrors;
-    }
-
-    public long getKeepAliveCount() {
-        return keepAliveCount;
-    }
-
-    public long getTotalBytesRcvd() {
-        return totalBytesRcvd;
-    }
-
-    public long getTotalBytesSent() {
-        return totalBytesSent;
-    }
-
-    public long getTotalBytes() {
-        return totalBytes;
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder builder = new StringBuilder();
-        builder.append("[serverName=").append(serverName)
-                .append(", hostName=").append(hostName)
-                .append(", hostPort=").append(hostPort)
-                .append(", documentPath=").append(documentPath)
-                .append(", contentLength=").append(contentLength)
-                .append(", concurrencyLevel=").append(concurrencyLevel)
-                .append(", totalTimeNano=").append(totalTimeNano)
-                .append(", successCount=").append(successCount)
-                .append(", failureCount=").append(failureCount)
-                .append(", writeErrors=").append(writeErrors)
-                .append(", keepAliveCount=").append(keepAliveCount)
-                .append(", totalBytesRcvd=").append(totalBytesRcvd)
-                .append(", totalBytesSent=").append(totalBytesSent)
-                .append(", totalBytes=").append(totalBytes)
-                .append("]");
-        return builder.toString();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/Stats.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/Stats.java b/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/Stats.java
deleted file mode 100644
index 868afb7..0000000
--- a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/Stats.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.hc.core5.http.benchmark;
-
-/**
- * Helper to gather statistics for an {@link HttpBenchmark HttpBenchmark}.
- *
- *
- * @since 4.0
- */
-public class Stats {
-
-    private long startTime = -1;    // nano seconds - does not represent an actual time
-    private long finishTime = -1;   // nano seconds - does not represent an actual time
-    private int successCount = 0;
-    private int failureCount = 0;
-    private int writeErrors = 0;
-    private int keepAliveCount = 0;
-    private String serverName = null;
-    private long totalBytesRecv = 0;
-    private long totalBytesSent = 0;
-    private long contentLength = -1;
-
-    public Stats() {
-        super();
-    }
-
-    public void start() {
-        this.startTime = System.nanoTime();
-    }
-
-    public void finish() {
-        this.finishTime = System.nanoTime();
-    }
-
-    public long getFinishTime() {
-        return this.finishTime;
-    }
-
-    public long getStartTime() {
-        return this.startTime;
-    }
-
-    /**
-     * Total execution time measured in nano seconds
-     *
-     * @return duration in nanoseconds
-     */
-    public long getDuration() {
-        // we are using System.nanoTime() and the return values could be negative
-        // but its only the difference that we are concerned about
-        return this.finishTime - this.startTime;
-    }
-
-    public void incSuccessCount() {
-        this.successCount++;
-    }
-
-    public int getSuccessCount() {
-        return this.successCount;
-    }
-
-    public void incFailureCount() {
-        this.failureCount++;
-    }
-
-    public int getFailureCount() {
-        return this.failureCount;
-    }
-
-    public void incWriteErrors() {
-        this.writeErrors++;
-    }
-
-    public int getWriteErrors() {
-        return this.writeErrors;
-    }
-
-    public void incKeepAliveCount() {
-        this.keepAliveCount++;
-    }
-
-    public int getKeepAliveCount() {
-        return this.keepAliveCount;
-    }
-
-    public long getTotalBytesRecv() {
-        return this.totalBytesRecv;
-    }
-
-    public void incTotalBytesRecv(final long n) {
-        this.totalBytesRecv += n;
-    }
-
-    public long getTotalBytesSent() {
-        return this.totalBytesSent;
-    }
-
-    public void incTotalBytesSent(final long n) {
-        this.totalBytesSent += n;
-    }
-
-    public long getContentLength() {
-        return this.contentLength;
-    }
-
-    public void setContentLength(final long contentLength) {
-        this.contentLength = contentLength;
-    }
-
-    public String getServerName() {
-        return this.serverName;
-    }
-
-    public void setServerName(final String serverName) {
-        this.serverName = serverName;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/package-info.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/package-info.java b/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/package-info.java
deleted file mode 100644
index 1ad17ba..0000000
--- a/httpcore5-ab/src/main/java/org/apache/hc/core5/http/benchmark/package-info.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-/**
- * Apache Bench (AB) clone based on HttpCore.
- */
-package org.apache.hc.core5.http.benchmark;

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-ab/src/test/java/org/apache/hc/core5/http/benchmark/SmokeTest.java
----------------------------------------------------------------------
diff --git a/httpcore5-ab/src/test/java/org/apache/hc/core5/http/benchmark/SmokeTest.java b/httpcore5-ab/src/test/java/org/apache/hc/core5/http/benchmark/SmokeTest.java
deleted file mode 100644
index cbe9684..0000000
--- a/httpcore5-ab/src/test/java/org/apache/hc/core5/http/benchmark/SmokeTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.hc.core5.http.benchmark;
-
-import java.io.IOException;
-import java.net.URL;
-
-import org.apache.hc.core5.http.ClassicHttpRequest;
-import org.apache.hc.core5.http.ClassicHttpResponse;
-import org.apache.hc.core5.http.ContentType;
-import org.apache.hc.core5.http.HttpException;
-import org.apache.hc.core5.http.HttpStatus;
-import org.apache.hc.core5.http.impl.bootstrap.HttpServer;
-import org.apache.hc.core5.http.impl.bootstrap.ServerBootstrap;
-import org.apache.hc.core5.http.io.HttpRequestHandler;
-import org.apache.hc.core5.http.io.entity.StringEntity;
-import org.apache.hc.core5.http.protocol.HttpContext;
-import org.apache.hc.core5.io.ShutdownType;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class SmokeTest {
-
-    private HttpServer server;
-
-    @Before
-    public void setup() throws Exception {
-        server = ServerBootstrap.bootstrap()
-                .register("/", new HttpRequestHandler() {
-                    @Override
-                    public void handle(
-                            final ClassicHttpRequest request,
-                            final ClassicHttpResponse response,
-                            final HttpContext context) throws HttpException, IOException {
-                        response.setCode(HttpStatus.SC_OK);
-                        response.setEntity(new StringEntity("0123456789ABCDEF", ContentType.TEXT_PLAIN));
-                    }
-                })
-                .create();
-        server.start();
-    }
-
-    @After
-    public void shutdown() throws Exception {
-        if (server != null) {
-            server.shutdown(ShutdownType.IMMEDIATE);
-        }
-    }
-
-    @Test
-    public void testBasics() throws Exception {
-        final Config config = new Config();
-        config.setKeepAlive(true);
-        config.setMethod("GET");
-        config.setUrl(new URL("http://localhost:" + server.getLocalPort() + "/"));
-        config.setThreads(3);
-        config.setRequests(100);
-        final HttpBenchmark httpBenchmark = new HttpBenchmark(config);
-        final Results results = httpBenchmark.doExecute();
-        Assert.assertNotNull(results);
-        Assert.assertEquals(16, results.getContentLength());
-        Assert.assertEquals(3, results.getConcurrencyLevel());
-        Assert.assertEquals(300, results.getKeepAliveCount());
-        Assert.assertEquals(300, results.getSuccessCount());
-        Assert.assertEquals(0, results.getFailureCount());
-        Assert.assertEquals(0, results.getWriteErrors());
-        Assert.assertEquals(300 * 16, results.getTotalBytes());
-        Assert.assertEquals(300 * 16, results.getTotalBytesRcvd());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-testing/pom.xml
----------------------------------------------------------------------
diff --git a/httpcore5-testing/pom.xml b/httpcore5-testing/pom.xml
index 0a254f4..814ff95 100644
--- a/httpcore5-testing/pom.xml
+++ b/httpcore5-testing/pom.xml
@@ -50,6 +50,12 @@
       <scope>compile</scope>
     </dependency>
     <dependency>
+      <groupId>commons-cli</groupId>
+      <artifactId>commons-cli</artifactId>
+      <version>1.2</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-api</artifactId>
       <scope>compile</scope>

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/d9e2b62c/httpcore5-testing/src/main/java/org/apache/hc/core5/benchmark/BenchmarkConnection.java
----------------------------------------------------------------------
diff --git a/httpcore5-testing/src/main/java/org/apache/hc/core5/benchmark/BenchmarkConnection.java b/httpcore5-testing/src/main/java/org/apache/hc/core5/benchmark/BenchmarkConnection.java
new file mode 100644
index 0000000..cd86cf3
--- /dev/null
+++ b/httpcore5-testing/src/main/java/org/apache/hc/core5/benchmark/BenchmarkConnection.java
@@ -0,0 +1,66 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.hc.core5.benchmark;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+import org.apache.hc.core5.function.Supplier;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.config.H1Config;
+import org.apache.hc.core5.http.impl.io.DefaultBHttpClientConnection;
+import org.apache.hc.core5.http.io.SessionInputBuffer;
+import org.apache.hc.core5.http.io.SessionOutputBuffer;
+
+class BenchmarkConnection extends DefaultBHttpClientConnection {
+
+    private final Stats stats;
+
+    BenchmarkConnection(final H1Config h1Config, final Stats stats) {
+        super(h1Config);
+        this.stats = stats;
+    }
+
+    @Override
+    protected OutputStream createContentOutputStream(final long len,
+                                                     final SessionOutputBuffer outbuffer,
+                                                     final OutputStream outputStream,
+                                                     final Supplier<List<? extends Header>> trailers) {
+        return new CountingOutputStream(
+                super.createContentOutputStream(len, outbuffer, outputStream, trailers),
+                this.stats);
+    }
+
+    @Override
+    protected InputStream createContentInputStream(final long len,
+                                                   final SessionInputBuffer inbuffer,
+                                                   final InputStream inputStream) {
+        return new CountingInputStream(super.createContentInputStream(len, inbuffer, inputStream), this.stats);
+    }
+
+}