/** * Copyright 2015 Nabarun Mondal * 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 com.noga.njexl.testing.ui; import com.noga.njexl.lang.JexlContext; import com.noga.njexl.lang.JexlEngine; import com.noga.njexl.lang.Script; import com.noga.njexl.testing.TestAssert; import com.noga.njexl.testing.TestSuite; import com.noga.njexl.testing.TestSuiteRunner; import java.io.File; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * Created by noga on 17/04/15. */ public class WebSuiteRunner extends TestSuiteRunner { public final WebTestSuite webTestSuite ; public XSelenium xSelenium ; protected Script before; protected Script script ; protected Script after; protected TestAssert testAssert; protected JexlContext jexlContext ; protected HashMap<String,Object> functions; protected JexlContext getContext(){ JexlContext context = com.noga.njexl.lang.Main.getContext(); context.set(Script.ARGS, new Object[]{}); context.set(XSelenium.SELENIUM_VAR, xSelenium); context.set(Script.ARGS, new Object[]{}); context.set(TestAssert.ASSERT_VAR, testAssert); return context; } protected HashMap<String,Object> getFunctions(){ HashMap<String,Object> functions = com.noga.njexl.lang.Main.getFunction(jexlContext); functions.put(XSelenium.SELENIUM_NS, xSelenium); functions.put(TestAssert.ASSERT_NS, testAssert); return functions ; } public WebSuiteRunner(String file, Map<String,String> variables) throws Exception { super(variables); webTestSuite = WebTestSuite.loadFrom(file,variables); } public WebSuiteRunner(String file) throws Exception { this(file, Collections.EMPTY_MAP); } /** * Sets up variable for local context * @param local the local context * @param runEvent run event, which encapsulates the data source */ public void setLocalContext(JexlContext local, TestRunEvent runEvent){ String[] columns = runEvent.table.row(0); String[] values = runEvent.table.row(runEvent.row); // put into context for ( int i = 0 ; i < columns.length;i++ ){ local.set(columns[i],values[i]); } } @Override protected TestSuite testSuite() { return webTestSuite; } @Override protected void prepare() throws Exception { if (webTestSuite.remoteConfig.isEmpty() ){ xSelenium = XSelenium.selenium(webTestSuite.webApp.url, webTestSuite.browserType ); }else{ xSelenium = XSelenium.selenium(webTestSuite.webApp.url, webTestSuite.remoteConfig ); } testAssert = new TestAssert(); testAssert.eventListeners.add(xSelenium); testAssert.eventListeners.addAll(reporters); } @Override protected TestSuite.Application application() { return webTestSuite.webApp ; } @Override protected String logLocation(String base, TestSuite.Feature feature) { String loc = webTestSuite.webApp.logs + "/" + base +"/" + feature.name ; File file = new File(loc); if ( !file.exists() ){ file.mkdirs(); } if ( xSelenium != null ) { xSelenium.screenShotDir(loc); } return loc; } @Override protected void afterFeature(TestSuite.Feature feature) throws Exception { jexlContext = null; functions.clear(); functions = null; before = null; script = null; after = null; } protected void createScripts(JexlEngine engine, TestSuite.Feature feature) throws Exception{ if ( !feature.script.isEmpty() ) { String scriptLocation = webTestSuite.webApp.scriptDir + "/" + feature.script; script = engine.importScript(scriptLocation); }if ( !feature.beforeScript.isEmpty() ) { String scriptLocation = webTestSuite.webApp.scriptDir + "/" + feature.beforeScript; before = engine.importScript(scriptLocation); }if ( !feature.afterScript.isEmpty() ) { String scriptLocation = webTestSuite.webApp.scriptDir + "/" + feature.afterScript; after = engine.importScript(scriptLocation); } } @Override protected void beforeFeature(TestSuite.Feature feature) throws Exception { jexlContext = getContext(); functions = getFunctions(); JexlEngine engine = new JexlEngine(); engine.setFunctions(functions); createScripts(engine,feature); } @Override protected TestRunEvent runTest(TestRunEvent runEvent) throws Exception { testAssert.clearError(); JexlContext local = jexlContext.copy(); setLocalContext(local,runEvent); // set output if need be? runEvent.runObject = script.execute(local); if (testAssert.hasError()){ runEvent.type = TestRunEventType.ERROR_TEST ; }else { runEvent.type = TestRunEventType.OK_TEST; } return runEvent ; } @Override protected void shutdown() throws Exception { xSelenium.close(); xSelenium = null; testAssert.eventListeners.clear(); testAssert = null; } }