/* * 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.jboss.arquillian.graphene.Graphene.waitGui; import static org.testng.Assert.assertEquals; import java.util.concurrent.TimeUnit; import org.jboss.arquillian.drone.api.annotation.Drone; import org.jboss.arquillian.graphene.Graphene; import org.jboss.arquillian.graphene.condition.element.WebElementConditionFactory; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import com.google.common.base.Predicate; /** * @author <a href="mailto:lfryc@redhat.com">Lukas Fryc</a> * @author <a href="mailto:jpapouse@redhat.com">Jan Papousek</a> * @author <a href="mailto:jhuska@redhat.com">Juraj Huska</a> * @author <a href="mailto:jstefek@redhat.com">Jiri Stefek</a> */ public class QueueFragment { private static final String DOM_UPDATES = "domUpdates"; private static final String EVENT1_COUNT = "event1Count"; private static final String EVENT2_COUNT = "event2Count"; private static final int MAXIMUM_WAIT_TIME_IN_SECS = 7; private static final String REQUEST_COUNT = "requestCount"; private static final String SPACE = " "; private static final long serialVersionUID = 1L; @Drone private WebDriver browser; private Boolean event2Present = null; @FindBy(css = "span[id$=events1]") private WebElement events1; @FindBy(css = "span[id$=events2]") private WebElement events2; @FindBy(css = "input[id$=input1]") private WebElement input1; @FindBy(css = "input[id$=input2]") private WebElement input2; @FindBy(css = "span[id$=outtext]") private WebElement repeatedText; @FindBy(css = "span[id$=requests]") private WebElement requests; @FindBy(css = "[id$='timeWatcher:grid']") private ClientTimeWatcherFragment timeWatcher; @FindBy(css = "span[id$=updates]") private WebElement updates; public void checkDelay(int delayIndex, long expected, long tolerance) { timeWatcher.checkDelay(delayIndex, expected, tolerance); } public void checkDelayAtIndexIs(int delayIndex, long expected) { timeWatcher.checkDelayAtIndexIs(delayIndex, expected); } public void checkLastDelay(long expected, long tolerance) { timeWatcher.checkLastDelay(expected, tolerance); } public void checkLastDelay(long expected) { timeWatcher.checkLastDelay(expected); } public void checkMedian(long expected, long tolerance) { timeWatcher.checkMedian(expected, tolerance); } public void checkMedian(long expected) { timeWatcher.checkMedian(expected); } /** * Fire event(s) on specified input. * @param input input where the events be triggered on * @param countOfEvents count of events to be triggered */ public void fireEvent(final Input input, final int countOfEvents) { for (int i = 0; i < countOfEvents; i++) { if (input == Input.FIRST) { input1.sendKeys(SPACE); } else { input2.sendKeys(SPACE); } waitFor(10);// wait some time between requests } } /** * Fire event(s) on first input. * @param countOfEvents count of events to be triggered */ public void fireEvents(final int countOfEvents) { fireEvent(Input.FIRST, countOfEvents); } public Integer getDOMUpdateCount() { return getTextAsInteger(updates); } public Integer getEvent1Count() { return getTextAsInteger(events1); } public Integer getEvent2Count() { return getTextAsInteger(events2); } public WebElement getInput1() { return input1; } public WebElement getInput2() { return input2; } public String getRepeatedText() { return repeatedText.getText(); } public WebElement getRepeatedTextElement() { return repeatedText; } public Integer getRequestCount() { return getTextAsInteger(requests); } public Integer getTextAsInteger(final WebElement element) { return Integer.parseInt(element.getText()); } private boolean isEvent2Present() { if (event2Present == null) { event2Present = new WebElementConditionFactory(input2).isPresent().apply(browser); Boolean event2TimePresent = new WebElementConditionFactory(timeWatcher.getEvent2TimeElement()).isPresent().apply(browser); assertEquals(event2Present, event2TimePresent); } return event2Present; } public void resetDelays() { timeWatcher.resetDelays(); } /** * Type text to the first input. */ public void type(final String text) { input1.sendKeys(text); } public void waitAndCheckEventsCounts(final int events1, final int requests, final int domUpdates) { waitForCountToEqual(new Event1Retriever(), events1, EVENT1_COUNT); waitForCountToEqual(new RequestsRetriever(), requests, REQUEST_COUNT); waitForCountToEqual(new DOMUpdatesRetriever(), domUpdates, DOM_UPDATES); } public void waitAndCheckEventsCounts(final int events1, final int events2, final int requests, final int domUpdates) { QueueFragment.this.waitAndCheckEventsCounts(events1, requests, domUpdates); if (isEvent2Present()) { waitForCountToEqual(new Event2Retriever(), events2, EVENT2_COUNT); } } private void waitFor(long millis) { try { Thread.sleep(millis); } catch (InterruptedException ex) { } } public void waitForChange(final String oldValue, final WebElement elementToChange) { waitGui().until(new Predicate<WebDriver>() { @Override public boolean apply(WebDriver t) { return !oldValue.equals(elementToChange.getText()); } }); } private void waitForCountToEqual(final Retriever retrieveCount, final Integer eventCount, final String eventType) { Graphene.waitModel().withTimeout(MAXIMUM_WAIT_TIME_IN_SECS, TimeUnit.SECONDS).withMessage(eventType) .until(new Predicate<WebDriver>() { @Override public boolean apply(WebDriver t) { return retrieveCount.get().equals(eventCount); } }); } public void waitForDelayIs(int delayIndex, long expected) { timeWatcher.waitForDelayIs(delayIndex, expected); } public void waitForLastDelayIs(long expected) { timeWatcher.waitForLastDelayIs(expected); } public void waitForNumberOfDelaysEqualsTo(long expected) { timeWatcher.waitForNumberOfDelaysEqualsTo(expected); } public static enum Input { FIRST, SECOND } public interface Retriever { Integer get(); } public class DOMUpdatesRetriever implements Retriever { @Override public Integer get() { return getDOMUpdateCount(); } } public class Event1Retriever implements Retriever { @Override public Integer get() { return getEvent1Count(); } } public class Event2Retriever implements Retriever { @Override public Integer get() { return getEvent2Count(); } } public class RequestsRetriever implements Retriever { @Override public Integer get() { return getRequestCount(); } } }