/******************************************************************************* * JBoss, Home of Professional Open Source * Copyright 2010-2014, 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.showcase.poll; import static org.jboss.arquillian.graphene.Graphene.waitAjax; import static org.junit.Assert.assertTrue; import java.sql.Time; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebElement; import org.richfaces.showcase.AbstractWebDriverTest; /** * @author <a href="mailto:jhuska@redhat.com">Juraj Huska</a> */ public class AbstractPollTest extends AbstractWebDriverTest { /** * Initialize GregorianCalendar with time which is give from dateRetriever * * @param dateRetriever TextRetriever from which the calendar with specific time will be inicialized */ public GregorianCalendar initializeCalendarFromDateRetriever(String date) { String[] serverDateParsed = date.split(":"); String hours = serverDateParsed[1].substring(serverDateParsed[1].length() - 2, serverDateParsed[1].length()); String minutes = serverDateParsed[2]; String seconds = serverDateParsed[3].substring(0, 2); GregorianCalendar calendar = new GregorianCalendar(); calendar.setTime(Time.valueOf(hours.trim() + ":" + minutes + ":" + seconds)); return calendar; } /** * Computes deviation between two times, consider possibility of minute changing * * @param calendarInitial the calendar with specific time which was before calendarAfterPool * @param calendarAfterServerAction the calendar with specific time which was after calendarInitial */ public Integer computeDeviation(GregorianCalendar calendarInitial, GregorianCalendar calendarAfterServerAction) { int secondsInitial = calendarInitial.get(Calendar.SECOND); int secondsAfterServerAction = calendarAfterServerAction.get(Calendar.SECOND); // if there is more than one minute or one hour or deviation is return // error value -1 if (secondsAfterServerAction == secondsInitial) { return -1; } else if ((calendarAfterServerAction.get(Calendar.MINUTE) - calendarInitial.get(Calendar.MINUTE)) >= 2) { return -1; } else if ((calendarAfterServerAction.get(Calendar.HOUR) - calendarInitial.get(Calendar.HOUR)) >= 2) { return -1; } int deviation = -1; if (secondsAfterServerAction < secondsInitial) { deviation = secondsAfterServerAction + (60 - secondsInitial); } else { deviation = secondsAfterServerAction - secondsInitial; } return deviation; } /** * Waits for particular server action, gets the deviation between two states(before particular server action and after), * checks that the deviation is not zero or bigger than one hour or one minute * * @param dateRetriever retriever which points to the server date * @return deviation between two states of rendered server date(before particular server action and after) */ public Integer waitForServerActionAndReturnDeviation(WebElement dateElement, String whatServerAction) { String date = dateElement.getText(); GregorianCalendar calendarInitial = initializeCalendarFromDateRetriever(date); waitAjax(webDriver).withTimeout(30, TimeUnit.SECONDS).until().element(dateElement).text().not().equalTo(date); GregorianCalendar calendarAfterPush = initializeCalendarFromDateRetriever(dateElement.getText()); assertTrue("The time after " + whatServerAction + "is before the initial time! You are returning to the past!", calendarAfterPush.after(calendarInitial)); Integer deviation = computeDeviation(calendarInitial, calendarAfterPush); assertTrue("Deviaton: " + deviation + " between two " + whatServerAction + "s/es is either too " + "big (more than one minute/hour) or too small(zero)", deviation > 0); return deviation; } }