Package org.ajax4jsf.component

Source Code of org.ajax4jsf.component.QueueSizeTest$SequenceGenerator

/**
* License Agreement.
*
*  JBoss RichFaces - Ajax4jsf Component Library
*
* Copyright (C) 2007  Exadel, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
*/

package org.ajax4jsf.component;

import java.text.NumberFormat;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.UUID;

import org.mozilla.javascript.NativeArray;
import org.mozilla.javascript.ScriptableObject;



/**
* @author Nick Belaevski
* @since 3.3.0
*/

public class QueueSizeTest extends AbstractQueueComponentTest {

  public QueueSizeTest(String name) {
    super(name);
  }

  private static final int numberOfEvents = 250;
 
  private static abstract interface SequenceGenerator<T> {
    public abstract T next();
  }
 
  protected TestsResult simulate(int numberOfEvents,
      SequenceGenerator<Integer> userDelayGenerator,
      SequenceGenerator<Integer> processTimeGenerator,
      SequenceGenerator<String> requestIdGenerator) throws Exception {
   
    NumberFormat numberFormat = NumberFormat.getInstance();
    numberFormat.setGroupingUsed(false);
    numberFormat.setMinimumIntegerDigits(String.valueOf(numberOfEvents).length());
   
    renderView("/queue-size.xhtml");
 
    ParametersBuilder parametersBuilder = createAjaxParameters().eventsQueue("defaultSizeQueue");

    int time = 0;
   
    for (int i = 0; i < numberOfEvents; i++) {
      int userDelay = userDelayGenerator.next();
      int requestTime = processTimeGenerator.next();
     
      time += userDelay;
      ajax(time, numberFormat.format(i), parametersBuilder.similarityGroupingId(requestIdGenerator.next()).
          requestTime(requestTime));
   
    }

    TestsResult result = getTestsResult();
    return result;
  }
 
  protected void checkQueueOrdering(TestsResult result) throws Exception {
    double time = 0;
    String lastRequestId = "";
   
    List<RequestData> dataList = result.getDataList();
    Iterator<RequestData> itr = dataList.iterator();
    while (itr.hasNext()) {
      RequestData data = itr.next();

      assertTrue(data.getStartTime() >= time);
      assertTrue(data.getEndTime() >= data.getStartTime());
      assertTrue(data.getData().compareTo(lastRequestId) > 0);
     
      lastRequestId = data.getData();
      time = data.getEndTime();
    }
  }
 
  private static final class UUIDGenerator implements SequenceGenerator<String> {

    public String next() {
      return UUID.randomUUID().toString();
    }
   
  }
 
  private static final class RandomSequenceGenerator implements SequenceGenerator<Integer> {

    private int offset;
   
    private int limit;
   
    public RandomSequenceGenerator(int minimum, int maximum) {
      super();
     
      this.limit = maximum - minimum;
      this.offset = minimum;
    }

    private Random random = new Random();
   
    public Integer next() {
      return random.nextInt(this.limit) + this.offset;
    }
   
  }
 
  public void testUnlimitedOverload() throws Exception {
    TestsResult result = simulate(numberOfEvents,
      new RandomSequenceGenerator(5, 100),
      new RandomSequenceGenerator(50, 300),
      new UUIDGenerator()
    );
   
    checkQueueOrdering(result);
    assertEquals(numberOfEvents, result.getDataList().size());
  }
 
  public void testUnlimitedUnderload() throws Exception {
    TestsResult result = simulate(numberOfEvents,
      new RandomSequenceGenerator(50, 300),
      new RandomSequenceGenerator(5, 100),
      new UUIDGenerator()
    );

    checkQueueOrdering(result);
    assertEquals(numberOfEvents, result.getDataList().size());
  }

  private static final class TableRequestIdGenerator implements SequenceGenerator<String> {
    private static final String[] requestIds = new String[] {
      "aaa", "bbb", "ccc", "ddd", "eee", "fff" 
    };

    private Random random = new Random();
   
    private String lastValue;
   
    private int uniqueIdsCounter = 0;
   
    public String next() {
      String newValue = requestIds[random.nextInt(requestIds.length)];
   
      if (!newValue.equals(lastValue)) {
        lastValue = newValue;
        uniqueIdsCounter++;
      }

      return newValue;
    }
   
    public int getUniqueIdsCounter() {
      return uniqueIdsCounter;
    }
  };

 
  public void testUnlimitedEmulateUser() throws Exception {
    TableRequestIdGenerator requestIdGenerator = new TableRequestIdGenerator();
   
    TestsResult result = simulate(numberOfEvents,
      new RandomSequenceGenerator(5, 100),
      new RandomSequenceGenerator(5, 100),
      requestIdGenerator
    );

    checkQueueOrdering(result);
    assertTrue(requestIdGenerator.getUniqueIdsCounter() <= result.getDataList().size());
    assertTrue(result.getDataList().size() <= numberOfEvents);
  }
 
  protected TestsResult checkQueue(String queueName) throws Exception {
    renderView("/queue-size.xhtml");
   
    ParametersBuilder parametersBuilder = createAjaxParameters().eventsQueue(queueName).
      requestDelay(300).requestTime(300);
   
    ajax(0, "a", parametersBuilder.similarityGroupingId("a"));
    ajax(100, "b", parametersBuilder.similarityGroupingId("b"));
    ajax(200, "c", parametersBuilder.similarityGroupingId("c"));
    ajax(300, "d", parametersBuilder.similarityGroupingId("d"));
    ajax(500, "e", parametersBuilder.similarityGroupingId("e"));
    ajax(600, "f", parametersBuilder.similarityGroupingId("f"));
   
    TestsResult result = getTestsResult();
    return result;
  }
 
  protected TestsResult checkSingleQueue(String queueName) throws Exception {
    renderView("/queue-size.xhtml");
   
    ParametersBuilder parametersBuilder = createAjaxParameters().eventsQueue(queueName).
      requestTime(300).requestDelay(200);

    ajax(0, "a", parametersBuilder.similarityGroupingId("a"));
    ajax(100, "b", parametersBuilder.similarityGroupingId("b"));
    ajax(400, "c", parametersBuilder.similarityGroupingId("c"));
    ajax(500, "d", parametersBuilder.similarityGroupingId("d"));
    ajax(700, "e", parametersBuilder.similarityGroupingId("e"));
   
    ajax(9800, "f", parametersBuilder.similarityGroupingId("f").requestTime(1000));
    ajax(10100, "g", parametersBuilder.similarityGroupingId("f").requestTime(1500));
   
    TestsResult result = getTestsResult();
    return result;
  }
 
  public void testDropNext() throws Exception {
    TestsResult result = checkQueue("dropNextQueue");
    List<RequestData> dataList = result.getDataList();
   
    for (RequestData requestData : dataList) {
      System.out.println("  " + requestData);
    }
    System.out.println();
   
    assertEquals(4, dataList.size());

    checkRequestData(dataList.get(0), "a", 100, 400, false);
    checkRequestData(dataList.get(1), "c", 400, 700, false);
    checkRequestData(dataList.get(2), "e", 700, 1000, false);
    checkRequestData(dataList.get(3), "f", 1000, 1300, false);
  }
 
  public void testDropNew() throws Exception {
    TestsResult result = checkQueue("dropNewQueue");
    List<RequestData> dataList = result.getDataList();

    for (RequestData requestData : dataList) {
      System.out.println("  " + requestData);
    }
    System.out.println();
   
    assertEquals(4, dataList.size());

    checkRequestData(dataList.get(0), "a", 100, 400, false);
    checkRequestData(dataList.get(1), "b", 400, 700, false);
    checkRequestData(dataList.get(2), "c", 700, 1000, false);
    checkRequestData(dataList.get(3), "e", 1000, 1300, false);
  }

  public void testFireNext() throws Exception {
    TestsResult result = checkQueue("fireNextQueue");
    List<RequestData> dataList = result.getDataList();

    for (RequestData requestData : dataList) {
      System.out.println("  " + requestData);
    }
    System.out.println();
 
    assertEquals(6, dataList.size());

    checkRequestData(dataList.get(0), "a", 100, 400, false);
    checkRequestData(dataList.get(1), "b", 300, 600, false);
    checkRequestData(dataList.get(2), "c", 400, 700, false);
    checkRequestData(dataList.get(3), "d", 600, 900, false);
    checkRequestData(dataList.get(4), "e", 700, 1000, false);
    checkRequestData(dataList.get(5), "f", 1000, 1300, false);
  }
 
  public void testFireNew() throws Exception {
    TestsResult result = checkQueue("fireNewQueue");
    List<RequestData> dataList = result.getDataList();

    for (RequestData requestData : dataList) {
      System.out.println("  " + requestData);
    }
    System.out.println();
 
    assertEquals(6, dataList.size());

    checkRequestData(dataList.get(0), "a", 100, 400, false);
    checkRequestData(dataList.get(1), "d", 300, 600, false);
    checkRequestData(dataList.get(2), "b", 400, 700, false);
    checkRequestData(dataList.get(3), "f", 600, 900, false);
    checkRequestData(dataList.get(4), "c", 700, 1000, false);
    checkRequestData(dataList.get(5), "e", 1000, 1300, false);
  }
 
  public void testDropNextSingle() throws Exception {
    TestsResult result = checkSingleQueue("dropNextQueueSingle");
    List<RequestData> dataList = result.getDataList();
   
    for (RequestData requestData : dataList) {
      System.out.println("  " + requestData);
    }
    System.out.println();
   
    assertEquals(3, dataList.size());

    checkRequestData(dataList.get(0), "b", 300, 600, false);
    checkRequestData(dataList.get(1), "e", 900, 1200, false);
    checkRequestData(dataList.get(2), "f", 10000, 11000, false);
  }
 
  public void testDropNewSingle() throws Exception {
    TestsResult result = checkSingleQueue("dropNewQueueSingle");
    List<RequestData> dataList = result.getDataList();
   
    for (RequestData requestData : dataList) {
      System.out.println("  " + requestData);
    }
    System.out.println();
   
    assertEquals(3, dataList.size());

    checkRequestData(dataList.get(0), "a", 100, 400, false);
    checkRequestData(dataList.get(1), "d", 700, 1000, false);
    checkRequestData(dataList.get(2), "f", 10000, 11000, false);
  }
 
  public void testFireNextSingle() throws Exception {
    TestsResult result = checkSingleQueue("fireNextQueueSingle");
    List<RequestData> dataList = result.getDataList();
   
    for (RequestData requestData : dataList) {
      System.out.println("  " + requestData);
    }
    System.out.println();
   
    assertEquals(7, dataList.size());

    checkRequestData(dataList.get(0), "a", 100, 400, false);
    checkRequestData(dataList.get(1), "b", 300, 600, false);
    checkRequestData(dataList.get(2), "c", 400, 700, false);
    checkRequestData(dataList.get(3), "d", 500, 800, false);
    checkRequestData(dataList.get(4), "e", 900, 1200, false);

    checkRequestData(dataList.get(5), "f", 10000, 11000, false);
    checkRequestData(dataList.get(6), "g", 10100, 11600, false);
  }
 
  public void testFireNewSingle() throws Exception {
    TestsResult result = checkSingleQueue("fireNewQueueSingle");
    List<RequestData> dataList = result.getDataList();
   
    for (RequestData requestData : dataList) {
      System.out.println("  " + requestData);
    }
    System.out.println();
   
    assertEquals(7, dataList.size());

    checkRequestData(dataList.get(0), "b", 100, 400, false);
    checkRequestData(dataList.get(1), "a", 100, 400, false);
    checkRequestData(dataList.get(2), "c", 400, 700, false);
    checkRequestData(dataList.get(3), "e", 700, 1000, false);
    checkRequestData(dataList.get(4), "d", 700, 1000, false);

    checkRequestData(dataList.get(5), "f", 10000, 11000, false);
    checkRequestData(dataList.get(6), "g", 10100, 11600, false);
  }
 
  public void testOnSizeExceeded() throws Exception {
    renderView("/queue-size.xhtml");
 
    for (int i = 0; i <= 3; i++) {
      clickOnTime(i, "form:button" + i);
    }
   
    TestsResult result = getTestsResult();
    List<RequestData> dataList = result.getDataList();
   
    assertEquals(2, dataList.size());
   
    //dropNext is default
    checkRequestData(dataList.get(0), "form:button0", 0, DEFAULT_REQUEST_TIME, false);
    checkRequestData(dataList.get(1), "form:button3", DEFAULT_REQUEST_TIME, DEFAULT_REQUEST_TIME * 2, false);
 
    NativeArray handlersData = (NativeArray) executeJavaScript("defaultExceededQueueResults");
    assertEquals(2, handlersData.getLength());
   
    ScriptableObject firstHandlerData = (ScriptableObject) handlersData.get(0, handlersData);
    Double firstEventTime = (Double) firstHandlerData.get("_time", firstHandlerData);
    assertEquals(2d, firstEventTime);
   
    ScriptableObject secondHandlerData = (ScriptableObject) handlersData.get(1, handlersData);
    Double secondEventTime = (Double) secondHandlerData.get("_time", secondHandlerData);
    assertEquals(3d, secondEventTime);
  }
 
  public void testSingleSizedQueueIgnoreDupResponses() throws Exception {
    renderView("/queue-size.xhtml");
   
    ParametersBuilder parametersBuilder = createAjaxParameters().eventsQueue("singleSizedDefaultQueue").
      requestDelay(0);
   
    ajax(0, "a", parametersBuilder);
    ajax(500, "b", parametersBuilder);
 
    TestsResult result = getTestsResult();
    List<RequestData> list = result.getDataList();
    assertEquals(1, list.size());
   
    checkRequestData(list.get(0), "a", 0, DEFAULT_REQUEST_TIME, false);
 
    NativeArray handlersData = (NativeArray) executeJavaScript("defaultSingleSizedQueueResults");
    assertEquals(1, handlersData.getLength());
   
    assertEquals("a", handlersData.get(0, handlersData));
  }
}
TOP

Related Classes of org.ajax4jsf.component.QueueSizeTest$SequenceGenerator

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.