/*
* JBoss, Home of Professional Open Source
* Copyright 2010-2016, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.richfaces.tests.metamer.ftest.a4jQueue;
import static org.richfaces.tests.metamer.ftest.a4jQueue.QueueAttributes.ignoreDupResponses;
import static org.richfaces.tests.metamer.ftest.extension.configurator.use.annotation.ValuesFrom.FROM_FIELD;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
import java.util.concurrent.TimeUnit;
import org.jboss.arquillian.graphene.Graphene;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.richfaces.tests.configurator.unstable.annotation.Unstable;
import org.richfaces.tests.metamer.ftest.AbstractWebDriverTest;
import org.richfaces.tests.metamer.ftest.annotations.IssueTracking;
import org.richfaces.tests.metamer.ftest.extension.ajaxhalter.AjaxRequestHalter;
import org.richfaces.tests.metamer.ftest.extension.ajaxhalter.Halter;
import org.richfaces.tests.metamer.ftest.extension.ajaxhalter.Halter.HaltedRequest;
import org.richfaces.tests.metamer.ftest.extension.attributes.coverage.annotations.CoversAttributes;
import org.richfaces.tests.metamer.ftest.extension.configurator.skip.On;
import org.richfaces.tests.metamer.ftest.extension.configurator.skip.annotation.Skip;
import org.richfaces.tests.metamer.ftest.extension.configurator.use.annotation.UseWithField;
import org.richfaces.tests.metamer.ftest.webdriver.Attributes;
import org.testng.annotations.Test;
/**
* @author <a href="mailto:lfryc@redhat.com">Lukas Fryc</a>
* @author <a href="mailto:jhuska@redhat.com">Juraj Huska</a>
* @author <a href="mailto:jstefek@redhat.com">Jiri Stefek</a>
*/
public class TestGlobalQueue extends AbstractWebDriverTest {
private final Attributes<QueueAttributes> attributes = getAttributes();
@FindBy(tagName = "body")
private QueueFragment queue;
private Integer requestDelay;
private Integer[] requestDelays = { 500, 1500 };
@Override
public String getComponentTestPagePath() {
return "a4jQueue/globalQueue.xhtml";
}
@Test
@Skip(On.JSF.MyFaces.class)// https://issues.jboss.org/browse/RFPL-3998
@CoversAttributes("ignoreDupResponses")
public void testIgnoreDuplicatedResponsesFalse() throws InterruptedException {
attributes.set(ignoreDupResponses, false);
Halter halter = AjaxRequestHalter.getHalter();
queue.type("a");
HaltedRequest req = halter.nextRequest().continueToPhaseAfter().opened();
queue.type("b");
req.completeRequest();
queue.waitForChange("", queue.getRepeatedTextElement());
assertEquals(queue.getRepeatedText(), "a");
halter.completeFollowingRequests(1);
queue.waitForChange("a", queue.getRepeatedTextElement());
assertEquals(queue.getRepeatedText(), "ab");
}
@Test
@Skip(On.JSF.MyFaces.class)// https://issues.jboss.org/browse/RFPL-3998
@CoversAttributes("ignoreDupResponses")
public void testIgnoreDuplicatedResponsesTrue() {
attributes.set(ignoreDupResponses, true);
Halter halter = AjaxRequestHalter.getHalter();
queue.type("c");
HaltedRequest req = halter.nextRequest().continueToPhaseAfter().opened();
queue.type("d");
req.completeRequest();
try {
queue.waitForChange("", queue.getRepeatedTextElement());
fail("should timeout here!");
} catch (Exception ignored) {
// expected timeout
}
assertEquals(queue.getRepeatedText(), "");
halter.completeFollowingRequests(1);
queue.waitForChange("", queue.getRepeatedTextElement());
assertEquals(queue.getRepeatedText(), "cd");
}
/**
* Events from one source should be stacked as occurs, while last event isn't delayed by configured requestDelay.
*/
@Test
public void testMultipleRequestsWithDelayStacking() {
long delay = 2000;
attributes.set(QueueAttributes.requestDelay, delay);
Halter halter = AjaxRequestHalter.getHalter();
queue.fireEvents(4);
queue.waitAndCheckEventsCounts(4, 1, 0);
halter.completeFollowingRequests(1);
queue.waitAndCheckEventsCounts(4, 1, 1);
queue.fireEvents(3);
queue.waitAndCheckEventsCounts(7, 2, 1);
halter.completeFollowingRequests(1);
queue.waitAndCheckEventsCounts(7, 2, 2);
}
@Test
public void testMultipleRequestsWithDelayTiming() {
long delay = 2000;
attributes.set(QueueAttributes.requestDelay, delay);
queue.fireEvents(4);
queue.waitForNumberOfDelaysEqualsTo(1);
queue.checkLastDelay(delay);
queue.checkMedian(delay);
}
/**
* When no requestDelay (0) is set, events should fire request immediately.
*
* However, when one event is waiting in queue for processing of previous request, events should be stacked.
*/
@Test
@Skip(On.JSF.MyFaces.class)// https://issues.jboss.org/browse/RFPL-3998
@IssueTracking("https://issues.jboss.org/browse/RFPL-1194")
public void testMultipleRequestsWithNoDelayStacking() {
long delay = 0;
attributes.set(QueueAttributes.requestDelay, delay);
Halter halter = AjaxRequestHalter.getHalter();
queue.fireEvents(1);
queue.waitAndCheckEventsCounts(1, 1, 0);
HaltedRequest req = halter.nextRequest().continueToPhaseAfter().opened();
queue.fireEvents(1);
queue.waitAndCheckEventsCounts(2, 1, 0);
req.completeRequest();
queue.waitAndCheckEventsCounts(2, 2, 1);
req = halter.nextRequest().continueToPhaseAfter().opened();
queue.fireEvents(4);
queue.waitAndCheckEventsCounts(6, 2, 1);
req.completeRequest();
queue.waitAndCheckEventsCounts(6, 3, 2);
req = halter.nextRequest().continueToPhaseAfter().opened();
queue.fireEvents(1);
queue.waitAndCheckEventsCounts(7, 3, 2);
req.completeRequest();
queue.waitAndCheckEventsCounts(7, 4, 3);
req = halter.nextRequest().continueToPhaseAfter().opened();
queue.waitAndCheckEventsCounts(7, 4, 3);
req.completeRequest();
queue.waitAndCheckEventsCounts(7, 4, 4);
}
@Test
public void testMultipleRequestsWithNoDelayTiming() {
long delay = 0;
attributes.set(QueueAttributes.requestDelay, delay);
queue.fireEvents(2);
queue.waitAndCheckEventsCounts(2, 2, 2);
queue.waitForNumberOfDelaysEqualsTo(2);
queue.checkLastDelay(0);
queue.checkMedian(0);
}
@Test
@CoversAttributes("rendered")
@IssueTracking("https://issues.jboss.org/browse/RF-9328")
public void testRendered() {
attsSetter()
.setAttribute(QueueAttributes.requestDelay).toValue(2000)
.setAttribute(QueueAttributes.onrequestqueue).toValue("alert('requestQueued')")
.setAttribute(QueueAttributes.onrequestdequeue).toValue("alert('requestDequeued')")
.setAttribute(QueueAttributes.rendered).toValue(false)
.asSingleAction().perform();
Graphene.guardAjax(queue).fireEvents(1);
// check that no requestDelay is applied while renderer=false
queue.checkLastDelay(0);
try {
Graphene.waitGui().withTimeout(2, TimeUnit.SECONDS).until(ExpectedConditions.alertIsPresent());
fail("No alert should be present!");
} catch (Exception e) {
//ok
}
}
/**
* Tests delay between time last event occurs and time when event triggers request (begin).
*/
@Test
@Unstable
@CoversAttributes("requestDelay")
@UseWithField(field = "requestDelay", valuesFrom = FROM_FIELD, value = "requestDelays")
public void testRequestDelay() {
attributes.set(QueueAttributes.requestDelay, requestDelay);
final int numberOfChecks = 5;
for (int i = 0; i < numberOfChecks; i++) {
Graphene.guardAjax(queue).fireEvents(1);
}
queue.waitAndCheckEventsCounts(5, 5, 5);
queue.waitForNumberOfDelaysEqualsTo(numberOfChecks);
queue.checkMedian(requestDelay);
}
}