Package com.barchart.udt.ccc

Source Code of com.barchart.udt.ccc.TestUDPBlast

package com.barchart.udt.ccc;

import static org.junit.Assert.*;
import static util.UnitHelp.*;

import java.net.InetSocketAddress;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import util.TestAny;

import com.barchart.udt.FactoryUDT;
import com.barchart.udt.MonitorUDT;
import com.barchart.udt.OptionUDT;
import com.barchart.udt.SocketUDT;
import com.barchart.udt.TypeUDT;

public class TestUDPBlast extends TestAny {

  @Before
  public void setUp() throws Exception {
  }

  @After
  public void tearDown() throws Exception {
  }

  /**
   * This test uses the {@link OptionUDT#UDT_CC} option using the
   * {@link UDPBlast} custom congestion control algorithm limiting bandwidth
   * to 50Mbs between localhost
   */
  @Test
  public void test() throws Exception {

    // UDT has roughly 7% congestion control overhead
    // so we need to take that into account if you want
    // to limit wire speed
    final double maxBW = 50 * 0.93;
    log.info("Attempting to rate limit using custom CCC UDPBlast class");

    final SocketUDT serverSocket = new SocketUDT(TypeUDT.STREAM);
    final InetSocketAddress serverAddress = localSocketAddress();
    serverSocket.bind(serverAddress);
    serverSocket.listen(1);
    assertTrue(serverSocket.isBound());

    final SocketUDT clientSocket = new SocketUDT(TypeUDT.STREAM);

    clientSocket.setOption(OptionUDT.UDT_CC, new FactoryUDT<UDPBlast>(
        UDPBlast.class));

    final InetSocketAddress clientAddress = localSocketAddress();

    clientSocket.bind(clientAddress);
    clientSocket.setSoLinger(false, 0);
    assertTrue(clientSocket.isBound());

    clientSocket.connect(serverAddress);
    assertTrue(clientSocket.isConnected());

    final SocketUDT acceptSocket = serverSocket.accept();
    assertTrue(acceptSocket.isConnected());

    final Object obj = clientSocket.getOption(OptionUDT.UDT_CC);

    assertTrue("UDT_CC Object is of unexpected type",
        obj instanceof UDPBlast);

    final UDPBlast objCCC = (UDPBlast) obj;
    objCCC.setRate((int) maxBW);

    final byte[] data = new byte[65536];
    final long start = System.currentTimeMillis();
    long interval = System.currentTimeMillis();
    double maxMbs = -1;

    while ((System.currentTimeMillis() - start) < 15000) {

      clientSocket.send(data);
      acceptSocket.receive(data);

      if (System.currentTimeMillis() - interval > 1000) {

        interval = System.currentTimeMillis();

        clientSocket.updateMonitor(true);

        final MonitorUDT mon = clientSocket.monitor();

        log.info(String.format("Current Rate: %.2f Mbs",
            mon.mbpsSendRate()));

        maxMbs = mon.mbpsSendRate() * 0.93;

      }

    }

    // check we are within 10% of our desired rate
    assertTrue("Max bandwidth exceeded limit",
        maxMbs < (maxBW + (maxBW * 0.1)));

    clientSocket.close();
    acceptSocket.close();
    serverSocket.close();

  }

TOP

Related Classes of com.barchart.udt.ccc.TestUDPBlast

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.