13c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller/* 23c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * Copyright (C) 2014 Square, Inc. 33c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * 43c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * Licensed under the Apache License, Version 2.0 (the "License"); 53c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * you may not use this file except in compliance with the License. 63c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * You may obtain a copy of the License at 73c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * 83c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * http://www.apache.org/licenses/LICENSE-2.0 93c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * 103c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * Unless required by applicable law or agreed to in writing, software 113c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * distributed under the License is distributed on an "AS IS" BASIS, 123c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * See the License for the specific language governing permissions and 143c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * limitations under the License. 153c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller */ 163c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerpackage com.squareup.okhttp.benchmarks; 173c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller 183c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.io.IOException; 193c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.io.InputStream; 203c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.net.URL; 213c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.util.concurrent.LinkedBlockingQueue; 223c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.util.concurrent.ThreadPoolExecutor; 233c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.util.concurrent.TimeUnit; 243c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller 253c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller/** Any HTTP client with a blocking API. */ 263c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerabstract class SynchronousHttpClient implements HttpClient { 273c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller ThreadPoolExecutor executor; 283c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller int targetBacklog; 293c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller 303c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller @Override public void prepare(Benchmark benchmark) { 313c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller this.targetBacklog = benchmark.targetBacklog; 323c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller executor = new ThreadPoolExecutor(benchmark.concurrencyLevel, benchmark.concurrencyLevel, 333c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller 1, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); 343c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller } 353c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller 363c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller @Override public void enqueue(URL url) { 373c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller executor.execute(request(url)); 383c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller } 393c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller 403c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller @Override public boolean acceptingJobs() { 413c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller return executor.getQueue().size() < targetBacklog; 423c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller } 433c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller 443c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller static long readAllAndClose(InputStream in) throws IOException { 453c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller byte[] buffer = new byte[1024]; 463c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller long total = 0; 473c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller for (int count; (count = in.read(buffer)) != -1; ) { 483c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller total += count; 493c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller } 503c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller in.close(); 513c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller return total; 523c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller } 533c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller 543c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller abstract Runnable request(URL url); 553c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller} 56