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