197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes/*
297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * Copyright (C) 2010 Google Inc.
397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes *
497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * you may not use this file except in compliance with the License.
697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * You may obtain a copy of the License at
797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes *
897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0
997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes *
1097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * Unless required by applicable law or agreed to in writing, software
1197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
1297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * See the License for the specific language governing permissions and
1497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * limitations under the License.
1597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes */
1697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
1797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughespackage benchmarks.regression;
1897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
1997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport com.google.caliper.Param;
2097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport com.google.caliper.SimpleBenchmark;
2197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport java.io.IOException;
2297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport java.io.InputStream;
2397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport java.io.OutputStream;
2497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport java.net.InetAddress;
2597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport java.net.Socket;
2697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport java.net.URL;
2797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport javax.net.SocketFactory;
2897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport javax.net.ssl.SSLContext;
2997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
3097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughespublic class SSLSocketBenchmark extends SimpleBenchmark {
3197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
3297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    private static final int BUFFER_SIZE = 8192;
3397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
3497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    final byte[] buffer = new byte[BUFFER_SIZE];
3597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
3697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    @Param private WebSite webSite;
3797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
3897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    public enum WebSite {
3997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        DOCS("https://docs.google.com"),
4097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        MAIL("https://mail.google.com"),
4197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        SITES("https://sites.google.com"),
4297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        WWW("https://www.google.com");
4397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        final InetAddress host;
4497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        final int port;
4597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        final byte[] request;
4697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        WebSite(String uri) {
4797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            try {
4897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                URL url = new URL(uri);
4997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
5097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                this.host = InetAddress.getByName(url.getHost());
5197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
5297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                int p = url.getPort();
5397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                String portString;
5497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                if (p == -1) {
5597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                    this.port = 443;
5697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                    portString = "";
5797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                } else {
5897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                    this.port = p;
5997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                    portString = ":" + port;
6097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                }
6197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
6297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                this.request = ("GET " + uri + " HTTP/1.0\r\n"
6397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                                + "Host: " + host + portString + "\r\n"
6497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                                +"\r\n").getBytes();
6597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
6697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            } catch (IOException e) {
6797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                throw new RuntimeException(e);
6897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            }
6997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
7097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    }
7197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
7297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    @Param private Implementation implementation;
7397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
7497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    public enum Implementation { OPENSSL, HARMONY };
7597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
7697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    private SocketFactory sf;
7797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
7897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    @Override protected void setUp() throws Exception {
7997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        SSLContext sslContext;
8097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        switch (implementation) {
8197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            case OPENSSL:
8297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                sslContext = SSLContext.getInstance("SSL", "AndroidOpenSSL");
8397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                break;
8497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            case HARMONY:
8597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                sslContext = SSLContext.getInstance("SSL", "HarmonyJSSE");
8697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                break;
8797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            default:
8897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                throw new RuntimeException(implementation.toString());
8997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
9097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        sslContext.init(null, null, null);
9197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        this.sf = sslContext.getSocketFactory();
9297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    }
9397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
9497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    public void time(int reps) throws Exception {
9597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        for (int i = 0; i < reps; ++i) {
9697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            Socket s = sf.createSocket(webSite.host, webSite.port);
9797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            OutputStream out = s.getOutputStream();
9897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            out.write(webSite.request);
9997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            InputStream in = s.getInputStream();
10097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            while (true) {
10197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                int n = in.read(buffer);
10297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                if (n == -1) {
10397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                    break;
10497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                }
10597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            }
10697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            in.close();
10797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
10897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    }
10997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes}
110