package com.limegroup.gnutella.util; import java.io.IOException; import java.io.OutputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.util.Random; import junit.framework.Test; /** * Tests BandwidthThrottle and ThrottledOutputStream. */ public class BandwidthThrottleTest extends com.limegroup.gnutella.util.BaseTestCase { public BandwidthThrottleTest(String name) { super(name); } /** Time per test. */ final int TIME=1000; //1 second /** bytesSent should be the desired value + or - FUDGE_FACTOR */ final float FUDGE_FACTOR=0.12f; //12 percent BandwidthThrottle throttle; Random random; long startTime; long stopTime; int bytesSent; /** The following are not used for testBandwidthThrottle */ PipedOutputStream pout; PipedInputStream pin; OutputStream out; public static Test suite() { return buildTestSuite(BandwidthThrottleTest.class); } protected void setUp() { throttle=new BandwidthThrottle(0); //Each test sets rate random=new Random(); startTime=System.currentTimeMillis(); bytesSent=0; try { pout=new PipedOutputStream(); pin=new PipedInputStream(pout); out=new ThrottledOutputStream(pout, throttle); } catch (IOException e) { fail("Couldn't set up stream", e); } stopTime=startTime+TIME; //Do this last, since time matters } //////////////////////////////////////////////////////////////// public void testBandwidthThrottle() { final int RATE=100; //Slow, 100 bytes/second throttle.setRate(RATE); final int BYTES=TIME/1000*RATE; while (System.currentTimeMillis()<stopTime) { int bytesToSend=random.nextInt(15); //more or less than N bytesSent+=throttle.request(bytesToSend); } assertLessThan("Wrong number of bytes: "+bytesSent, FUDGE_FACTOR*BYTES, Math.abs(bytesSent-BYTES)); } public void testThrottledOutputStreamByte() throws Exception { final int RATE=20000; //Fast! 10KB/second throttle.setRate(RATE); final int BYTES=TIME/1000*RATE; //200 bytes while (System.currentTimeMillis()<stopTime) { byte b=(byte)random.nextInt(); out.write(b); assertTrue("Bad byte", (byte)pin.read()==b); bytesSent++; } assertLessThan("Wrong number of bytes: "+bytesSent, FUDGE_FACTOR*BYTES, Math.abs(bytesSent-BYTES)); } public void testThrottledOutputStreamBytes() throws Exception { final int RATE=1000; //Medium fast throttle.setRate(RATE); final int BYTES=TIME/1000*RATE; byte[] buf=new byte[150]; while (System.currentTimeMillis()<stopTime) { random.nextBytes(buf); int n=random.nextInt(buf.length); out.write(buf, 0, n); for (int i=0; i<n; i++) assertTrue("Bad byte", (byte)pin.read()==buf[i]); bytesSent+=n; } assertLessThan("Wrong number of bytes: "+bytesSent, FUDGE_FACTOR*BYTES, Math.abs(bytesSent-BYTES)); } public void testThrottledOutputStreamBytes2() throws Exception { final int RATE=1000; //Medium fast throttle.setRate(RATE); final int BYTES=TIME/1000*RATE; byte[] buf=new byte[150]; while (System.currentTimeMillis()<stopTime) { random.nextBytes(buf); out.write(buf); for (int i=0; i<buf.length;i++) assertTrue("Bad byte", (byte)pin.read()==buf[i]); bytesSent+=buf.length; } assertLessThan("Wrong number of bytes: "+bytesSent, FUDGE_FACTOR*BYTES, Math.abs(bytesSent-BYTES)); } //TODO: test fairness when sharing one throttle among multiple streams }