package com.robonobo.test; import java.io.File; import java.util.Random; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.log4j.PropertyConfigurator; import com.robonobo.common.http.PreemptiveHttpClient; import com.robonobo.wang.client.WangClient; import com.robonobo.wang.client.WangConfig; import com.robonobo.wang.proto.WangProtocol.CoinListMsg; /** * Hits the wang server with many repeated withdrawal and deposit requests * * @author macavity * */ public class WangSoakTester { static final double MIN_TRANS_AMT = 0.0002d; static final double MAX_TRANS_AMT = 0.5d; static final int TRANS_PER_CLIENT = 4; int numThreads; String bankUrl; String username; String password; String floatLvl = "-6:2,-9:2,-11:2"; Log log; Random rand; private static void printUsage() { System.err.println("Usage: WangSoakTester <bank url> <email> <pwd> <num threads>"); } public static void main(String[] args) throws Exception { if (args.length != 4) { printUsage(); return; } String bankUrl = args[0]; String username = args[1]; String pwd = args[2]; int numThreads = Integer.parseInt(args[3]); WangSoakTester tester = new WangSoakTester(numThreads, bankUrl, username, pwd); tester.run(); } public WangSoakTester(int numThreads, String bankUrl, String username, String password) throws Exception { this.numThreads = numThreads; PropertyConfigurator.configureAndWatch("log4j.properties"); log = LogFactory.getLog(getClass()); this.bankUrl = bankUrl; this.username = username; this.password = password; rand = new Random(); } private void run() { log.info("Soak test starting"); for (int i = 0; i < numThreads; i++) { Thread t = new SoakTestThread(i); t.start(); } } private double getTransAmt() { double range = MAX_TRANS_AMT - MIN_TRANS_AMT; return MIN_TRANS_AMT + ((rand.nextInt(101) / 100d) * range); } class SoakTestThread extends Thread { WangConfig cfg; int num; public SoakTestThread(int num) { this.num = num; setName("SoakTestThread-" + num); cfg = new WangConfig(); cfg.setBankUrl(bankUrl); cfg.setAccountEmail(username); cfg.setAccountPwd(password); cfg.setFloatLevel(floatLvl); File coinStoreDir = new File("/tmp/wangsoak/coins-" + num); coinStoreDir.mkdirs(); cfg.setCoinStoreDir(coinStoreDir.getAbsolutePath()); } @Override public void run() { try { while (true) { log.info("Starting new client"); WangClient client = new WangClient(cfg, new PreemptiveHttpClient()); client.start(); for (int i = 0; i < TRANS_PER_CLIENT; i++) { double amt = getTransAmt(); log.info("Withdrawing " + amt); CoinListMsg coins = client.getCoins(amt); log.info("Depositing " + amt); client.putCoins(coins); } log.info("Finishing client"); client.stop(); } } catch (Exception e) { log.error("Uncaught exception", e); } } } }