/* * Copyright (C) 2011 lightcouch.org * * Licensed 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. */ package org.lightcouch.tests; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.lightcouch.CouchDbClient; import org.lightcouch.CouchDbProperties; /** * {@link CouchDbClient} load test. * * <p> Unignore test then run: <tt>$ mvn test -Dtest=org.lightcouch.tests.CouchDbClientLoadTest</tt> * * @author ahmed * */ @Ignore public class CouchDbClientLoadTest { private static CouchDbClient dbClient; private static final int NUM_THREADS = 500; private static final int DOCS_PER_THREAD = 10; /** client max connections */ private static final int MAX_CONNECTIONS = 20; @BeforeClass public static void setUpClass() { CouchDbProperties properties = new CouchDbProperties() .setDbName("lightcouch-db-load") .setCreateDbIfNotExist(true) .setProtocol("http") .setHost("127.0.0.1") .setPort(5984) .setMaxConnections(MAX_CONNECTIONS); dbClient = new CouchDbClient(properties); } @AfterClass public static void tearDownClass() { dbClient.shutdown(); } @Test public void clientsLoadTest() { System.out.println("Load Test Started ..."); ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS); StopWatch.start(); for (int i = 0; i < NUM_THREADS; i++) { executor.execute(new MyRunnable()); } executor.shutdown(); do { /* waiting */ } while (!executor.isTerminated()); final long elapsed = StopWatch.stop(); final long seconds = elapsed / 1000; final int totalDocs = NUM_THREADS * DOCS_PER_THREAD; printResult(elapsed, seconds, totalDocs); } private class MyRunnable implements Runnable { public void run() { for (int i = 0; i < DOCS_PER_THREAD; i++) { dbClient.save(new Foo()); } } } // private void printResult(long elapsed, long seconds, int totalDocs) { final StringBuilder sb = new StringBuilder(); sb.append("Load Test Completed:"); sb.append("\n* Thread count: " + NUM_THREADS); sb.append("\n* Docs per thread: " + DOCS_PER_THREAD); sb.append("\n* Saved total new documents: " + totalDocs); sb.append(String.format("\n* Elapsed time: %s seconds, %s ms.", seconds, elapsed - (seconds * 1000))); sb.append("\n* Average persist time / document: " + (elapsed / totalDocs) + " ms."); System.out.println(sb); } // not thread safe static final class StopWatch { private StopWatch() {} private static long start; private static long stop; public static void start() { start = System.currentTimeMillis(); stop = 0; } public static long stop() { stop = System.currentTimeMillis(); long value = stop - start; start = 0; return value; } } }