Author: nbelaevski
Date: 2008-11-20 19:59:48 -0500 (Thu, 20 Nov 2008)
New Revision: 11285
Modified:
trunk/ui/core/src/main/config/component/queue.xml
trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/QueueRenderer.java
trunk/ui/core/src/test/java/org/ajax4jsf/component/AbstractQueueComponentTest.java
trunk/ui/core/src/test/java/org/ajax4jsf/component/ImplicitQueuesTest.java
trunk/ui/core/src/test/java/org/ajax4jsf/component/QueueScriptedTest.java
trunk/ui/core/src/test/java/org/ajax4jsf/component/QueueSizeTest.java
trunk/ui/core/src/test/resources/org/ajax4jsf/component/queue-scripted.xhtml
trunk/ui/core/src/test/resources/org/ajax4jsf/component/queue-size.xhtml
trunk/ui/core/src/test/resources/org/ajax4jsf/component/simulation.js
Log:
a4j:queue
- latest fixes and updates
- unit tests for client-side code
Modified: trunk/ui/core/src/main/config/component/queue.xml
===================================================================
--- trunk/ui/core/src/main/config/component/queue.xml 2008-11-21 00:57:50 UTC (rev 11284)
+++ trunk/ui/core/src/main/config/component/queue.xml 2008-11-21 00:59:48 UTC (rev 11285)
@@ -80,7 +80,7 @@
<classname>java.lang.String</classname>
</property>
<property>
- <name>onSizeExceeded</name>
+ <name>onsizeexceeded</name>
<classname>java.lang.String</classname>
</property>
</component>
Modified: trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/QueueRenderer.java
===================================================================
--- trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/QueueRenderer.java 2008-11-21
00:57:50 UTC (rev 11284)
+++ trunk/ui/core/src/main/java/org/ajax4jsf/renderkit/html/QueueRenderer.java 2008-11-21
00:59:48 UTC (rev 11285)
@@ -50,17 +50,10 @@
private static final String QUEUE_ONERROR_ATTRIBUTE = "queueonerror";
private static final String[] QUEUE_ATTRIBUTES = new String[] {
- "enabled",
"size",
"sizeExceededBehavior"
};
- private static final String[] QUEUE_FUNCTION_ATTRIBUTES = new String[] {
- "onSizeExceeded",
- "onError",
- "onExpired"
- };
-
private static final String[] REQUEST_ATTRIBUTES = new String[] {
"requestDelay",
"timeout",
@@ -124,27 +117,24 @@
data.addRequestAttribute(attributeName, value);
}
}
-
- for (String attributeName : QUEUE_FUNCTION_ATTRIBUTES) {
- Object value = attributes.get(attributeName);
- if (isNotEmpty(value)) {
- //TODO nick - apply proper functions signature
- data.addQueueAttribute(attributeName, new
JSFunctionDefinition("event").addToBody(value));
- }
+
+ String onsizeexceeded = queue.getOnsizeexceeded();
+ if (isNotEmpty(onsizeexceeded)) {
+ data.addQueueAttribute("onsizeexceeded", new
JSFunctionDefinition("query", "options",
"event").addToBody(onsizeexceeded));
}
String oncomplete = queue.getOncomplete();
- if (oncomplete != null) {
+ if (isNotEmpty(oncomplete)) {
data.addRequestAttribute(QUEUE_ONCOMPLETE_ATTRIBUTE,
AjaxRendererUtils.buildAjaxOncomplete(oncomplete));
}
String onBeforeDomUpdate = queue.getOnbeforedomupdate();
- if (onBeforeDomUpdate != null) {
+ if (isNotEmpty(onBeforeDomUpdate)) {
data.addRequestAttribute(QUEUE_ONBEFOREDOMUPDATE_ATTRIBUTE,
AjaxRendererUtils.buildAjaxOnBeforeDomUpdate(onBeforeDomUpdate));
}
String onsubmit = queue.getOnsubmit();
- if (onsubmit != null) {
+ if (isNotEmpty(onsubmit)) {
JSFunctionDefinition onsubmitFunction = new
JSFunctionDefinition("request");
onsubmitFunction.addToBody(onsubmit);
@@ -152,7 +142,7 @@
}
String onerror = queue.getOnerror();
- if (onerror != null) {
+ if (isNotEmpty(onerror)) {
JSFunctionDefinition onerrorFunction = new JSFunctionDefinition("request",
"status", "message");
onerrorFunction.addToBody(onerror);
Modified:
trunk/ui/core/src/test/java/org/ajax4jsf/component/AbstractQueueComponentTest.java
===================================================================
---
trunk/ui/core/src/test/java/org/ajax4jsf/component/AbstractQueueComponentTest.java 2008-11-21
00:57:50 UTC (rev 11284)
+++
trunk/ui/core/src/test/java/org/ajax4jsf/component/AbstractQueueComponentTest.java 2008-11-21
00:59:48 UTC (rev 11285)
@@ -41,14 +41,18 @@
import javax.faces.render.Renderer;
import org.ajax4jsf.javascript.JSFunction;
+import org.ajax4jsf.javascript.JSFunctionDefinition;
+import org.ajax4jsf.javascript.JSLiteral;
import org.ajax4jsf.javascript.JSReference;
import org.ajax4jsf.javascript.ScriptUtils;
import org.ajax4jsf.renderkit.AjaxRendererUtils;
import org.ajax4jsf.renderkit.UserResourceRenderer2;
import org.ajax4jsf.renderkit.RendererUtils.HTML;
import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
+import org.mozilla.javascript.FunctionObject;
import org.mozilla.javascript.NativeArray;
import org.mozilla.javascript.NativeObject;
+import org.mozilla.javascript.ScriptableObject;
import org.mozilla.javascript.Undefined;
import com.gargoylesoftware.htmlunit.AlertHandler;
@@ -75,6 +79,8 @@
private static final String AJAX_SUBMIT = "ajaxSubmit";
+ public static final int DEFAULT_REQUEST_TIME = 1000;
+
protected HtmlPage page;
public final static class AjaxSubmitFunctionComponent extends UIComponentBase {
@@ -98,20 +104,21 @@
throws IOException {
JSFunction ajaxFunction = AjaxRendererUtils.buildAjaxFunction(component,
facesContext);
Map<String, Object> options = AjaxRendererUtils.buildEventOptions(facesContext,
component);
- options.put("requestDelay", new
JSReference("parameters.requestDelay"));
- options.put("requestId", new JSReference("parameters.requestId ||
'" + component.getClientId(facesContext) + "'"));
+ options.put("requestDelay", new
JSReference("options.requestDelay"));
+ options.put("requestId", new JSReference("options.requestId ||
'" + component.getClientId(facesContext) + "'"));
options.put("data", new JSReference("data"));
- options.put("requestTime", new JSReference("parameters.requestTime ||
1000"));
- options.put("timeout", new JSReference("parameters.timeout"));
- options.put("eventsQueue", new
JSReference("parameters.eventsQueue"));
- options.put("implicitEventsQueue", new
JSReference("parameters.implicitEventsQueue"));
+ options.put("requestTime", new
JSReference("options.requestTime"));
+ options.put("timeout", new JSReference("options.timeout"));
+ options.put("eventsQueue", new
JSReference("options.eventsQueue"));
+ options.put("implicitEventsQueue", new
JSReference("options.implicitEventsQueue"));
+ options.put("ignoreDupResponses", new
JSReference("options.ignoreDupResponses"));
ajaxFunction.addParameter(options);
ResponseWriter responseWriter = facesContext.getResponseWriter();
responseWriter.startElement(HTML.SCRIPT_ELEM, component);
responseWriter.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
- responseWriter.writeText("var " + AJAX_SUBMIT + " = function(data,
parameters) {" + ajaxFunction.toScript() + "};", null);
+ responseWriter.writeText("var " + AJAX_SUBMIT + " = function(data,
options) {" + ajaxFunction.toScript() + "};", null);
responseWriter.endElement(HTML.SCRIPT_ELEM);
}
@@ -139,7 +146,6 @@
resource = (UIResource)
application.createComponent("org.ajax4jsf.LoadScript");
resource.setSrc("resource:///org/ajax4jsf/component/simulation.js");
viewRoot.getChildren().add(resource);
-
}
@Override
@@ -164,8 +170,8 @@
return this;
}
- private String getParamatersString() {
- return ScriptUtils.toScript(parameters);
+ protected Map<String, Object> getParameters() {
+ return parameters;
}
public ParametersBuilder requestDelay(double value) {
@@ -186,6 +192,9 @@
public ParametersBuilder implicitEventsQueue(String name) {
return new ParametersBuilder(this.parameters).put("implicitEventsQueue",
name);
}
+ public ParametersBuilder ignoreDupResponses(boolean value) {
+ return new ParametersBuilder(this.parameters).put("ignoreDupResponses",
value);
+ }
}
protected ParametersBuilder createAjaxParameters() {
@@ -288,7 +297,7 @@
}
};
- protected void assertRequestData(RequestData requestData, String data,
+ protected void checkRequestData(RequestData requestData, String data,
double startTime, double endTime, boolean aborted) {
assertEquals("Data check failed for " + requestData, data,
requestData.getData());
@@ -298,22 +307,18 @@
}
- protected void ajax(String data, String parameters) {
- page.executeJavaScript("simulationContext.ajax('" + data + "',
" + parameters + ");");
+ protected void ajax(int time, String data, ParametersBuilder builder) {
+ JSFunction function = new JSFunction("simulationContext.ajax", time, data,
builder.getParameters());
+ page.executeJavaScript(function.toScript());
}
+
+ protected void executeOnTime(int time, String expression) {
+ JSFunction function = new JSFunction("simulationContext.executeOnTime",
+ time, new JSFunctionDefinition().addToBody(expression));
- protected void ajax(String data, ParametersBuilder builder) {
- ajax(data, builder.getParamatersString());
+ page.executeJavaScript(function.toScript());
}
- protected void executeAfterDelay(String expression) {
- page.executeJavaScript("simulationContext.executeAfterDelay(function(){" +
expression + "});");
- }
-
- protected void delay(int delayValue) {
- page.executeJavaScript("simulationContext.wait(" + delayValue +
");");
- }
-
protected String getRootContextPath() {
return this.getClass().getPackage().getName().replace('.', '/');
}
@@ -344,6 +349,7 @@
protected void preRenderView() throws Exception {
StringBuilder builder = new StringBuilder("<script
type='text/javascript'>");
+ builder.append("DEFAULT_REQUEST_TIME = " + DEFAULT_REQUEST_TIME +
";");
builder.append("window.simulationContext = new SimulationContext(");
builder.append(AJAX_SUBMIT);
builder.append(");</script>");
@@ -355,12 +361,48 @@
List<UIComponent> childList = facesContext.getViewRoot().getChildren();
childList.add(childList.size(), text);
}
+
+ protected void postRenderView() throws Exception {
+ ScriptableObject scriptableObject = (ScriptableObject)
this.page.executeJavaScript("window.LOG").getJavaScriptResult();
+ scriptableObject.defineProperty("out", systemOut,
ScriptableObject.READONLY);
+ }
+ private static final ScriptableObject systemOut = new ScriptableObject() {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -8574162538513136625L;
+
+ @Override
+ public String getClassName() {
+ return "systemOut";
+ }
+
+ @SuppressWarnings("unused")
+ public void println(String s) {
+ System.out.println(s);
+ }
+ };
+
+ static {
+ try {
+ systemOut.defineProperty("println",
+ new FunctionObject(null, systemOut.getClass().getMethod("println",
String.class), systemOut),
+ ScriptableObject.READONLY);
+ } catch (SecurityException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
protected HtmlPage renderView(String viewId) throws Exception {
buildView(viewId);
preRenderView();
this.page = super.renderView();
-
+ postRenderView();
+
return this.page;
}
@@ -368,6 +410,7 @@
protected HtmlPage renderView() throws Exception {
preRenderView();
this.page = super.renderView();
+ postRenderView();
return this.page;
}
@@ -423,7 +466,6 @@
public void handleAlert(Page page, String message) {
fail(message);
}
-
});
}
}
@@ -435,6 +477,9 @@
static {
ENTITIES_MAP.put("'", "\"");
ENTITIES_MAP.put(""", "'");
+ ENTITIES_MAP.put("&", "&");
+ ENTITIES_MAP.put("<", "<");
+ ENTITIES_MAP.put(">", ">");
}
private static final Pattern ENTITIES_PATTERN;
Modified: trunk/ui/core/src/test/java/org/ajax4jsf/component/ImplicitQueuesTest.java
===================================================================
--- trunk/ui/core/src/test/java/org/ajax4jsf/component/ImplicitQueuesTest.java 2008-11-21
00:57:50 UTC (rev 11284)
+++ trunk/ui/core/src/test/java/org/ajax4jsf/component/ImplicitQueuesTest.java 2008-11-21
00:59:48 UTC (rev 11285)
@@ -43,8 +43,8 @@
renderView();
- ajax("a", createAjaxParameters().requestTime(1000));
- ajax("b", createAjaxParameters().requestTime(1000));
+ ajax(0, "a", createAjaxParameters().requestTime(1000));
+ ajax(0, "b", createAjaxParameters().requestTime(1000));
TestsResult result = getTestsResult();
assertEquals(2000d, result.getCurrentTime());
@@ -53,8 +53,8 @@
public void testImplicitGlobalQueueDefault() throws Exception {
renderView();
- ajax("a", createAjaxParameters().requestTime(1000));
- ajax("b", createAjaxParameters().requestTime(1000));
+ ajax(0, "a", createAjaxParameters().requestTime(1000));
+ ajax(0, "b", createAjaxParameters().requestTime(1000));
TestsResult result = getTestsResult();
assertEquals(1000d, result.getCurrentTime());
@@ -63,11 +63,9 @@
public void testLegacyQueuesRequestDelay() throws Exception {
renderView("/queue-legacy.xhtml");
- executeAfterDelay("$('form:buttonDelayed').click()");
- delay(500);
- executeAfterDelay("$('form:buttonDelayed').click()");
- delay(250);
- executeAfterDelay("$('form:buttonDelayed').click()");
+ executeOnTime(0, "$('form:buttonDelayed').click()");
+ executeOnTime(500, "$('form:buttonDelayed').click()");
+ executeOnTime(750, "$('form:buttonDelayed').click()");
TestsResult result = getTestsResult();
List<RequestData> dataList = result.getDataList();
@@ -75,7 +73,7 @@
//request time set to 5000 in .xhtml file
RequestData data = dataList.get(0);
- assertRequestData(data, null, 1750, 6750, false);
+ checkRequestData(data, null, 1750, 6750, false);
assertEquals(6750d, result.getCurrentTime());
}
@@ -83,13 +81,9 @@
public void testLegacyQueuesIgnoreDupResponces() throws Exception {
renderView("/queue-legacy.xhtml");
- executeAfterDelay("$('form:buttonIgnoreDupResponces').click()");
- delay(500);
-
- executeAfterDelay("$('form:buttonIgnoreDupResponces').click()");
- delay(250);
-
- executeAfterDelay("$('form:buttonIgnoreDupResponces').click()");
+ executeOnTime(0, "$('form:buttonIgnoreDupResponces').click()");
+ executeOnTime(500, "$('form:buttonIgnoreDupResponces').click()");
+ executeOnTime(750, "$('form:buttonIgnoreDupResponces').click()");
executeTimer();
TestsResult result = getTestsResult();
@@ -97,9 +91,9 @@
assertEquals(3, dataList.size());
//request time set to 5000 in .xhtml file
- assertRequestData(dataList.get(0), null, 0, 5000, false);
- assertRequestData(dataList.get(1), null, 500, 5500, false);
- assertRequestData(dataList.get(2), null, 750, 5750, false);
+ checkRequestData(dataList.get(0), null, 0, 5000, false);
+ checkRequestData(dataList.get(1), null, 500, 5500, false);
+ checkRequestData(dataList.get(2), null, 750, 5750, false);
assertEquals(5750d, result.getCurrentTime());
Modified: trunk/ui/core/src/test/java/org/ajax4jsf/component/QueueScriptedTest.java
===================================================================
--- trunk/ui/core/src/test/java/org/ajax4jsf/component/QueueScriptedTest.java 2008-11-21
00:57:50 UTC (rev 11284)
+++ trunk/ui/core/src/test/java/org/ajax4jsf/component/QueueScriptedTest.java 2008-11-21
00:59:48 UTC (rev 11285)
@@ -24,6 +24,8 @@
import java.util.List;
+import org.mozilla.javascript.NativeArray;
+
/**
* @author Denis Morozov
* @author Nick Belaevski
@@ -38,18 +40,133 @@
super(name);
}
+ public void testRequestDelayDefined() throws Exception {
+ renderView(VIEW_NAME);
+
+ ParametersBuilder parametersBuilder = createAjaxParameters().
+ eventsQueue("queueRequestDelay").requestTime(5);
+
+ ajax(0, "a", parametersBuilder);
+ ajax(25, "b", parametersBuilder);
+ ajax(50, "c", parametersBuilder.requestDelay(30));
+ ajax(90, "d", parametersBuilder.requestDelay(0));
+
+ TestsResult result = getTestsResult();
+ List<RequestData> dataList = result.getDataList();
+
+ assertEquals(4, dataList.size());
+
+ checkRequestData(dataList.get(0), "a", 15, 20, false);
+ checkRequestData(dataList.get(1), "b", 40, 45, false);
+ checkRequestData(dataList.get(2), "c", 80, 85, false);
+ checkRequestData(dataList.get(3), "d", 90, 95, false);
+ }
+
+ public void testRequestDelayDefault() throws Exception {
+ renderView(VIEW_NAME);
+
+ ParametersBuilder parametersBuilder =
createAjaxParameters().eventsQueue("queueDefaults").
+ requestTime(100);
+
+ ajax(0, "a", parametersBuilder.requestDelay(100));
+ ajax(300, "b", parametersBuilder);
+
+ TestsResult result = getTestsResult();
+ List<RequestData> dataList = result.getDataList();
+
+ assertEquals(2, dataList.size());
+
+ checkRequestData(dataList.get(0), "a", 100, 200, false);
+ checkRequestData(dataList.get(1), "b", 300, 400, false);
+ }
+
+ public void testTimeout() throws Exception {
+ renderView(VIEW_NAME);
+
+ ParametersBuilder parametersBuilder = createAjaxParameters().
+ eventsQueue("queueTimeout").requestDelay(0);
+
+ ajax(0, "a", parametersBuilder.requestTime(4999));
+ ajax(10000, "b",
parametersBuilder.requestTime(5001).requestId("b"));
+ ajax(10000, "c",
parametersBuilder.requestTime(100).requestId("c"));
+ ajax(20000, "d", parametersBuilder.requestTime(10000).timeout(10000));
+ ajax(40000, "e", parametersBuilder.requestTime(10001).timeout(10000));
+
+ TestsResult result = getTestsResult();
+ List<RequestData> dataList = result.getDataList();
+
+ assertEquals(5, dataList.size());
+
+ checkRequestData(dataList.get(0), "a", 0, 4999, false);
+ checkRequestData(dataList.get(1), "b", 10000, 15000, true);
+ checkRequestData(dataList.get(2), "c", 15000, 15100, false);
+ checkRequestData(dataList.get(3), "d", 20000, 30000, false);
+ checkRequestData(dataList.get(4), "e", 40000, 50000, true);
+
+ }
+
+ public void testIgnoreDupResponses() throws Exception {
+ renderView(VIEW_NAME);
+
+ ParametersBuilder parametersBuilder = createAjaxParameters().
+ eventsQueue("queueIgnoreDupResponses").requestDelay(0).requestTime(1000);
+
+ ajax(0, "a", parametersBuilder.requestId("a"));
+ ajax(500, "b", parametersBuilder.requestId("a"));
+ ajax(2000, "c", parametersBuilder.requestId("a"));
+ ajax(2500, "d",
parametersBuilder.requestId("a").ignoreDupResponses(false));
+
+ TestsResult result = getTestsResult();
+ List<RequestData> dataList = result.getDataList();
+
+ assertEquals(4, dataList.size());
+
+ checkRequestData(dataList.get(0), "a", 0, 1000, false);
+ checkRequestData(dataList.get(1), "b", 500, 1500, false);
+
+ checkRequestData(dataList.get(2), "c", 2000, 3000, false);
+ checkRequestData(dataList.get(3), "d", 3000, 4000, false);
+
+ NativeArray array = (NativeArray)
executeJavaScript("queueIgnoreDupResponsesTest");
+ long length = array.getLength();
+ assertEquals(3, length);
+
+ assertEquals("b:1500", (String) array.get(0, array));
+ assertEquals("c:3000", (String) array.get(1, array));
+ assertEquals("d:4000", (String) array.get(2, array));
+ }
+
+ public void testIgnoreDupResponsesDefault() throws Exception {
+ renderView(VIEW_NAME);
+
+ ParametersBuilder parametersBuilder = createAjaxParameters().
+ eventsQueue("queueDefaults").requestTime(500);
+
+ ajax(0, "a", parametersBuilder);
+ ajax(250, "b", parametersBuilder);
+ ajax(750, "c", parametersBuilder.ignoreDupResponses(true));
+
+ TestsResult result = getTestsResult();
+ List<RequestData> dataList = result.getDataList();
+
+ assertEquals(3, dataList.size());
+
+ checkRequestData(dataList.get(0), "a", 0, 500, false);
+ checkRequestData(dataList.get(1), "b", 500, 1000, false);
+ checkRequestData(dataList.get(2), "c", 750, 1250, false);
+ }
+
public void testSimpleAjax() throws Exception {
renderView(VIEW_NAME);
- delay(50);
- ajax("a", createAjaxParameters().requestTime(100));
- ajax("b", createAjaxParameters().requestTime(150));
+ ajax(50, "a", createAjaxParameters().requestTime(100));
+ ajax(50, "b", createAjaxParameters().requestTime(150));
TestsResult result = getTestsResult();
List<RequestData> dataList = result.getDataList();
assertEquals(2, dataList.size());
- assertRequestData(dataList.get(0), "a", 50, 150, false);
- assertRequestData(dataList.get(1), "b", 50, 200, false);
+ checkRequestData(dataList.get(0), "a", 50, 150, false);
+ checkRequestData(dataList.get(1), "b", 50, 200, false);
assertEquals(200d, result.getCurrentTime());
}
@@ -57,33 +174,19 @@
public void testSimpleQueuedAjax() throws Exception {
renderView(VIEW_NAME);
- delay(50);
ParametersBuilder queueParameters =
createAjaxParameters().requestTime(500).eventsQueue(QUEUE_NAME);
- ajax("a", queueParameters.requestId(0));
- delay(200);
- ajax("b", queueParameters.requestId(1));
+ ajax(50, "a", queueParameters.requestId(0));
+ ajax(250, "b", queueParameters.requestId(1));
TestsResult result = getTestsResult();
List<RequestData> dataList = result.getDataList();
assertEquals(2, dataList.size());
- assertRequestData(dataList.get(0), "a", 50, 550, false);
- assertRequestData(dataList.get(1), "b", 550, 1050, false);
+ checkRequestData(dataList.get(0), "a", 50, 550, false);
+ checkRequestData(dataList.get(1), "b", 550, 1050, false);
assertEquals(1050d, result.getCurrentTime());
}
- public void testScript() throws Exception {
- renderView(VIEW_NAME);
-
- delay(500);
- ajax("a", "{requestDelay: 100, requestId: '12', requestTime:
100, eventsQueue: 'q'}");
- delay(4100);
- ajax("b", "{requestDelay: 4400, requestId: '12', requestTime:
101, timeout: 10, eventsQueue: 'q'}");
- ajax("c", "{requestDelay: 0, requestId: '123', requestTime: 1,
timeout: 10, eventsQueue: 'q'}");
-
- System.out.println(getTestsResult());
- }
-
public void testImplicitQueue() throws Exception {
renderView(VIEW_NAME);
@@ -92,18 +195,16 @@
implicitEventsQueue("myqueue").
requestTime(10);
- ajax("a", parameters);
- delay(10);
- ajax("b", parameters);
- delay(10);
- ajax("c", parameters.requestDelay(50));
+ ajax(0, "a", parameters);
+ ajax(10, "b", parameters);
+ ajax(20, "c", parameters.requestDelay(50));
TestsResult result = getTestsResult();
List<RequestData> dataList = result.getDataList();
assertEquals(1, dataList.size());
RequestData requestData = dataList.get(0);
- assertRequestData(requestData, "c", 70, 80, false);
+ checkRequestData(requestData, "c", 70, 80, false);
assertEquals(80d, result.getCurrentTime());
Modified: trunk/ui/core/src/test/java/org/ajax4jsf/component/QueueSizeTest.java
===================================================================
--- trunk/ui/core/src/test/java/org/ajax4jsf/component/QueueSizeTest.java 2008-11-21
00:57:50 UTC (rev 11284)
+++ trunk/ui/core/src/test/java/org/ajax4jsf/component/QueueSizeTest.java 2008-11-21
00:59:48 UTC (rev 11285)
@@ -21,10 +21,17 @@
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
@@ -36,14 +43,348 @@
super(name);
}
- public void testUnlimited() throws Exception {
+ 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;
- ajax("a", parametersBuilder.requestId(UUID.randomUUID().toString()));
+ for (int i = 0; i < numberOfEvents; i++) {
+ int userDelay = userDelayGenerator.next();
+ int requestTime = processTimeGenerator.next();
+
+ time += userDelay;
+ ajax(time, numberFormat.format(i),
parametersBuilder.requestId(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.requestId("a"));
+ ajax(100, "b", parametersBuilder.requestId("b"));
+ ajax(200, "c", parametersBuilder.requestId("c"));
+ ajax(300, "d", parametersBuilder.requestId("d"));
+ ajax(500, "e", parametersBuilder.requestId("e"));
+ ajax(600, "f", parametersBuilder.requestId("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.requestId("a"));
+ ajax(100, "b", parametersBuilder.requestId("b"));
+ ajax(400, "c", parametersBuilder.requestId("c"));
+ ajax(500, "d", parametersBuilder.requestId("d"));
+ ajax(700, "e", parametersBuilder.requestId("e"));
+
+ 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(2, dataList.size());
+
+ checkRequestData(dataList.get(0), "b", 300, 600, false);
+ checkRequestData(dataList.get(1), "e", 900, 1200, 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(2, dataList.size());
+
+ checkRequestData(dataList.get(0), "a", 100, 400, false);
+ checkRequestData(dataList.get(1), "d", 700, 1000, 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(5, 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);
+ }
+
+ 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(5, 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);
+ }
+
+ public void testOnSizeExceeded() throws Exception {
+ renderView("/queue-size.xhtml");
+
+ for (int i = 0; i <= 3; i++) {
+ executeOnTime(i, "document.getElementById('form:button" + i +
"').click()");
+ }
+
+ TestsResult result = getTestsResult();
+ List<RequestData> dataList = result.getDataList();
+
+ assertEquals(2, dataList.size());
+
+ //dropNext is default
+ checkRequestData(dataList.get(0), null, 0, DEFAULT_REQUEST_TIME, false);
+ checkRequestData(dataList.get(1), null, 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);
+ }
}
Modified: trunk/ui/core/src/test/resources/org/ajax4jsf/component/queue-scripted.xhtml
===================================================================
---
trunk/ui/core/src/test/resources/org/ajax4jsf/component/queue-scripted.xhtml 2008-11-21
00:57:50 UTC (rev 11284)
+++
trunk/ui/core/src/test/resources/org/ajax4jsf/component/queue-scripted.xhtml 2008-11-21
00:59:48 UTC (rev 11285)
@@ -11,8 +11,20 @@
<f:view>
<a4j:status startText="...running..." stopText="stopped"
startStyle="color: green" />
- <a4j:queue size="2" sizeExceededBehavior="fireNext"
name="testQueue" />
+ <a4j:queue name="queueDefaults" />
+ <a4j:queue name="queueRequestDelay" requestDelay="15" />
+
+ <a4j:queue name="queueTimeout" timeout="5000" />
+
+ <script type="text/javascript">
+ window.queueIgnoreDupResponsesTest = new Array();
+ </script>
+
+ <a4j:queue name="queueIgnoreDupResponses"
ignoreDupResponses="true" oncomplete="queueIgnoreDupResponsesTest.push(data
+ ':' + Timer.currentTime)" />
+
+ <a4j:queue name="testQueue" />
+
</f:view>
</body>
</html>
Modified: trunk/ui/core/src/test/resources/org/ajax4jsf/component/queue-size.xhtml
===================================================================
--- trunk/ui/core/src/test/resources/org/ajax4jsf/component/queue-size.xhtml 2008-11-21
00:57:50 UTC (rev 11284)
+++ trunk/ui/core/src/test/resources/org/ajax4jsf/component/queue-size.xhtml 2008-11-21
00:59:48 UTC (rev 11285)
@@ -6,6 +6,47 @@
<body>
<f:view>
<a4j:queue name="defaultSizeQueue" />
+
+ <a4j:queue name="dropNextQueue" sizeExceededBehavior="dropNext"
size="3" />
+ <a4j:queue name="dropNextQueueSingle"
sizeExceededBehavior="dropNext" size="1" />
+
+ <a4j:queue name="fireNextQueue" sizeExceededBehavior="fireNext"
size="3" />
+ <a4j:queue name="fireNextQueueSingle"
sizeExceededBehavior="fireNext" size="1" />
+
+ <a4j:queue name="dropNewQueue" sizeExceededBehavior="dropNew"
size="3" />
+ <a4j:queue name="dropNewQueueSingle"
sizeExceededBehavior="dropNew" size="1" />
+
+ <a4j:queue name="fireNewQueue" sizeExceededBehavior="fireNew"
size="3" />
+ <a4j:queue name="fireNewQueueSingle"
sizeExceededBehavior="fireNew" size="1" />
+
+ <script type="text/javascript">
+ defaultExceededQueueResults = new Array();
+
+ function addEventData(queue, query, options, event) {
+ if (!queue) {
+ throw "queue not defined";
+ }
+ if (!query) {
+ throw "query not defined";
+ }
+ if (!options) {
+ throw "options not defined";
+ }
+ if (!event) {
+ throw "event not defined";
+ }
+
+ defaultExceededQueueResults.push({queue: queue, query: query, options: options,
event: event, _time: Timer.currentTime});
+ }
+ </script>
+
+ <a4j:queue onsizeexceeded="addEventData(this, query, options, event)"
size="2" name="defaultExceededQueue" />
+ <h:form id="form">
+ <a4j:commandButton id="button0"
eventsQueue="defaultExceededQueue" value="button" />
+ <a4j:commandButton id="button1"
eventsQueue="defaultExceededQueue" value="button" />
+ <a4j:commandButton id="button2"
eventsQueue="defaultExceededQueue" value="button" />
+ <a4j:commandButton id="button3"
eventsQueue="defaultExceededQueue" value="button" />
+ </h:form>
</f:view>
</body>
</html>
Modified: trunk/ui/core/src/test/resources/org/ajax4jsf/component/simulation.js
===================================================================
--- trunk/ui/core/src/test/resources/org/ajax4jsf/component/simulation.js 2008-11-21
00:57:50 UTC (rev 11284)
+++ trunk/ui/core/src/test/resources/org/ajax4jsf/component/simulation.js 2008-11-21
00:59:48 UTC (rev 11285)
@@ -1,3 +1,11 @@
+LOG.LEVEL = LOG.INFO;
+LOG._logToConsole = function(message, level) {
+ //TODO deal with this nasty message
+ if (message != "No information in response about elements to replace") {
+ LOG.out.println(level.name + ': ' + message)
+ }
+};
+
var Timer = {
_eventCounter: 0,
@@ -4,7 +12,7 @@
currentTime: 0,
- maxTime: 100000,
+ maxTime: 10000000,
events: new Array(),
@@ -67,28 +75,26 @@
var SimulationContext = function(submitFunction) {
this.results = new Array();
- this.time = 0;
this.submitFunction = submitFunction;
};
-SimulationContext.prototype.wait = function(delay) {
- this.time += delay;
-};
-
SimulationContext.prototype.ajax = function() {
- var args = arguments;
+ var args = new Array();
+ for (var i = 1; i < arguments.length; i++) {
+ args.push(arguments[i]);
+ }
var _this = this;
Timer.addEventToTimer(function() {
- _this.submitFunction(args[0], args[1]);
- }, this.time);
+ _this.submitFunction.apply(this, args);
+ }, arguments[0]);
};
-SimulationContext.prototype.executeAfterDelay = function(code) {
+SimulationContext.prototype.executeOnTime = function(time, code) {
Timer.addEventToTimer(function() {
code();
- }, this.time);
+ }, time);
};
window.simulationContext = undefined;
@@ -125,6 +131,7 @@
if ("Ajax-Response" == name) {
return "true";
}
+
return "";
};
XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
@@ -140,10 +147,39 @@
_this.status = 200;
_this.statusText = "Success";
_this.readyState = window.XMLHttpRequest.DONE;
- _this.responseText = "<?xml version='1.0'?><html />";
+ var responseTextArray = new Array();
+ responseTextArray.push("<html><head></head><body>");
+ if (_this.data) {
+
+ responseTextArray.push("<span id='_ajax:data'>");
+ if (typeof _this.data == 'string') {
+ responseTextArray.push("'");
+ responseTextArray.push(_this.data);
+ responseTextArray.push("'");
+ } else {
+ responseTextArray.push(_this.data);
+ }
+ responseTextArray.push("</span>");
+ }
+ responseTextArray.push("</body></html>");
+
+ _this.responseText = responseTextArray.join('');
+
var doc = new ActiveXObject("MSXML.DOMDocument");
doc.loadXML(_this.responseText);
+
+ //hack to make it work with current HTMLUnit
+ delete doc.getElementById;
+ doc.getElementById = function(id){
+ var nodes = this.selectNodes("//*");
+ for (var i = 0; i < nodes.length; i++) {
+ if (nodes[i].getAttribute("id") == id) {
+ return nodes[i];
+ }
+ }
+ };
+
_this.responseXML = doc;
window.simulationContext.results[_this.requestId].endTime = Timer.currentTime;
@@ -157,8 +193,10 @@
var oldSubmitQuery = A4J.AJAX.SubmitQuery;
+var DEFAULT_REQUEST_TIME;
+
A4J.AJAX.SubmitQuery = function(query, options) {
- XMLHttpRequest.requestTime = options.requestTime || XMLHttpRequest.defaultRequestTime;
+ XMLHttpRequest.requestTime = options.requestTime || XMLHttpRequest.defaultRequestTime ||
DEFAULT_REQUEST_TIME;
XMLHttpRequest.data = options.data;
try {