/* * Sakuli - Testing and Monitoring-Tool for Websites and common UIs. * * Copyright 2013 - 2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sakuli.integration.ui; import javafx.application.Platform; import javafx.concurrent.Task; import javafx.embed.swing.JFXPanel; import javafx.stage.Stage; import javafx.stage.WindowEvent; import org.sakuli.actions.environment.Environment; import org.sakuli.integration.IntegrationTest; import org.sakuli.integration.ui.app.UiTestApplication; import org.sakuli.integration.ui.app.UiTestEvent; import org.sakuli.javaDSL.AbstractSakuliTest; import org.sakuli.javaDSL.TestCaseInitParameter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeMethod; import java.util.Map; /** * Represents an abstract representation of UI (user interface) integration test for Sakuli. There should be tested, if * all graphical actions will work correctly. * * @author tschneck Date: 08.05.2014 */ public abstract class AbstractUiTestApplicationIT extends AbstractSakuliTest implements IntegrationTest { public static final String IMAGE_LIB_FOLDER_NAME = "image_lib"; protected static Map<UiTestEvent, Integer> eventCounter; protected final Logger logger = LoggerFactory.getLogger(this.getClass()); protected Environment env; @Override protected TestCaseInitParameter getTestCaseInitParameter() throws Exception { return new TestCaseInitParameter(getUniqueTestCaseId(), IMAGE_LIB_FOLDER_NAME); } @BeforeMethod(alwaysRun = true) @Override public void initTcStep() throws Exception { super.initTcStep(); env = new Environment(); } @AfterSuite(alwaysRun = true) @Override public void tearDown() throws Exception { Platform.exit(); super.tearDown(); } protected void stopUiApplication(final Stage stage) { logger.info("............................STOP UI-App"); Platform.runLater(new Task<Boolean>() { @Override protected Boolean call() throws Exception { if (Platform.isFxApplicationThread()) { logger.info("fire WINDOW_CLOSE_REQUEST to FX-THREAD!"); fireEvent(new WindowEvent(stage, WindowEvent.WINDOW_CLOSE_REQUEST)); return true; } logger.error("cloud not close - NO FX-THREAD!"); return false; } }); } /** * @return a unique ID from. */ protected String getUniqueTestCaseId() { return this.getClass().getSimpleName() + System.nanoTime(); } /** * Starts the example {@link UiTestApplication} */ protected Stage startUiApplication() { logger.info("............................START"); final UiTestApplication uiTestApplication = new UiTestApplication(); new JFXPanel(); Platform.runLater(uiTestApplication); return UiTestApplication.stage; } /** * add 1 to the current count of the assigned {@link UiTestEvent}. * * @param testEvent test event to count */ synchronized protected void countEvent(UiTestEvent testEvent) { Integer count = 1; if (eventCounter.containsKey(testEvent)) { count = eventCounter.get(testEvent) + 1; } logger.info("set CLICK-COUNT to {}", count); eventCounter.put(testEvent, count); } /** * @return the counter of the assigned {@link UiTestEvent}. */ synchronized protected int getEventCount(UiTestEvent testEvent) { if (eventCounter.containsKey(testEvent)) { return eventCounter.get(testEvent); } return 0; } }