Package org.jboss.seam.test.functional.seamgen

Source Code of org.jboss.seam.test.functional.seamgen.SeamGenTest

/*
* JBoss, Home of Professional Open Source
* Copyright 2008, Red Hat Middleware LLC, 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.jboss.seam.test.functional.seamgen;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.StringTokenizer;

import org.jboss.seam.test.functional.seamgen.utils.SeamGenAdapter;
import org.openqa.selenium.server.RemoteControlConfiguration;
import org.openqa.selenium.server.SeleniumServer;
import org.testng.Assert;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;

/**
* Base class for seam-gen functional tests.
*
* @author Jozef Hartinger
*/
public class SeamGenTest
{
  
   protected static SeamGenAdapter seamGen;
   protected static Properties seamGenProperties;
   protected static Properties ftestProperties = new Properties();
  
   protected static String SEAM_DIR;
   protected static String SEAM_FTEST_PROPERTIES_FILE;
   protected static String SEAMGEN_BUILDFILE;
   protected static String SEAMGEN_PROPERTIES_FILE;
   protected static String WORKSPACE;
   protected static String ANT_EXECUTABLE;

   // container specific properties
   protected static String CONTAINER;
   protected static String CONTAINER_LOCATION;
   protected static int DEPLOY_TIMEOUT;
  
   protected static boolean ICEFACES;
   protected static boolean WAR;
  
   protected static boolean DELETE_PROJECT;
  
   protected static String TEST_SEAMGEN_PROPERTIES_FILE;
  
   // Selenium related constants
   protected static String SELENIUM_HOST;
   protected static String SELENIUM_BROWSER;
   protected static String SELENIUM_BROWSER_URL;
   protected static int SELENIUM_SERVER_PORT;
   protected static String SELENIUM_SPEED;
   protected static String SELENIUM_TIMEOUT;
   protected static long SELENIUM_ICEFACES_WAIT_TIME;
   protected static String SELENIUM_SERVER_ARGS;
  
   protected static String OUTPUT_DIR;
  
   // Test application specific constants
   protected static String APP_NAME;
   protected static String HOME_PAGE;
  
   // Selenium server instance
   protected static SeleniumServer seleniumServer;
  
   @BeforeSuite
   @Parameters("seam.dir")
   public void beforeSuite(@Optional(".") String seamDir) throws Exception
   {
      // Seam location
      SEAM_DIR = seamDir;
     
      // ftest configuration file
      String relativeLocation = System.getProperty("ftest.config.location");
      if (relativeLocation.equals("${ftest.config.location}"))
      {
         SEAM_FTEST_PROPERTIES_FILE = SEAM_DIR + "/src/test/ftest/ftest.properties";
      }
      else
      {
         SEAM_FTEST_PROPERTIES_FILE = SEAM_DIR + "/" + relativeLocation;
      }
      SEAMGEN_BUILDFILE = SEAM_DIR + "/seam-gen/build.xml";
      SEAMGEN_PROPERTIES_FILE = SEAM_DIR + "/seam-gen/build.properties";
      OUTPUT_DIR = SEAM_DIR + "/test-output/functional-framework/";
     
      loadFtestProperties();
      createOutputDir();
      startSeleniumServer();
   }
  
   @AfterSuite
   public void afterSuite()
   {
      seleniumServer.stop();
   }
  
   @BeforeTest
   @Parameters( { "icefaces", "type", "suffix", "explode" })
   public void setUp(@Optional("false") boolean icefaces, @Optional("ear") String type, @Optional("") String suffix, @Optional("true") boolean explode) throws Exception
   {
      ICEFACES = icefaces;
      WAR = type.equalsIgnoreCase("war");
      APP_NAME = "seamGenTestApp" + (ICEFACES ? "Ice" : "Rich") + (WAR ? "War" : "Ear") + (explode ? "E" : "D") + suffix;
      HOME_PAGE = "/" + APP_NAME + "/home.seam";
     
      setSeamGenProperties();
     
      seamGen = new SeamGenAdapter(ANT_EXECUTABLE, SEAMGEN_BUILDFILE);
      seamGen.setExplode(explode);
     
   }
  
   @AfterTest
   public void tearDown()
   {
      if (DELETE_PROJECT)
      {
         seamGen.deleteProject();
      }
      else
      {
         seamGen.undeploy();
      }
   }
  
   private void loadFtestProperties() throws FileNotFoundException, IOException
   {
      // load general properties
      ftestProperties.load(new FileInputStream(SEAM_FTEST_PROPERTIES_FILE));
     
      WORKSPACE = getProperty(ftestProperties,"workspace.home");
      ANT_EXECUTABLE = getProperty(ftestProperties, "ant.exec", "ant");
     
      // container specific
      CONTAINER = getProperty(ftestProperties, "container", "jboss5");
      CONTAINER_LOCATION = getProperty(ftestProperties, CONTAINER + ".home");
      DEPLOY_TIMEOUT = Integer.parseInt(getProperty(ftestProperties, CONTAINER + ".deploy.waittime")) * 1000; // miliseconds
      DELETE_PROJECT = Boolean.valueOf(getProperty(ftestProperties, "seamgen.delete.project", "false"));
     
      // load selenium constants
      SELENIUM_HOST = getProperty(ftestProperties, "selenium.host");
      SELENIUM_BROWSER = getProperty(ftestProperties, "selenium.browser");
      SELENIUM_BROWSER_URL = getProperty(ftestProperties, "selenium.browser.url");
      SELENIUM_SERVER_PORT = Integer.parseInt(getProperty(ftestProperties, "selenium.server.port"));
      SELENIUM_SPEED = getProperty(ftestProperties, "selenium.speed");
      SELENIUM_TIMEOUT = getProperty(ftestProperties, "selenium.timeout");
      SELENIUM_ICEFACES_WAIT_TIME = Long.valueOf(getProperty(ftestProperties, "selenium.icefaces.wait.time", "2000"));
      SELENIUM_SERVER_ARGS = getProperty(ftestProperties, "selenium.server.cmd.args", "");
   }
  
   /**
    * Gets property from properties in safe manner, property must be present in bundle,
    * otherwise test fails.
    * @param properties Property bundle
    * @param key Key
    * @return Value of property or default value
    */
   private String getProperty(Properties properties, String key) {
      return getProperty(properties, key, null);
   }
  
   /**
    * Gets property from properties in safe manner
    * @param properties Property bundle
    * @param key Key
    * @param defaultValue Default value, if property not found,
    * if @{code null}, property must be present in bundle otherwise test fails
    * @return Value of property or default value
    */
   private String getProperty(Properties properties, String key, String defaultValue) {
      String value = properties.getProperty(key);
      if(value==null && defaultValue==null) {
         Assert.fail("Property " + key +" is not set");
      }
     
      return (value!=null) ? value : defaultValue;
   }
  
   private void setSeamGenProperties()
   {
      seamGenProperties = new Properties();
     
      String[] propertiesToCopy = { "database.type", "database.exists", "database.drop", "driver.jar", "driver.license.jar", "hibernate.connection.username", "hibernate.connection.password", "hibernate.connection.driver_class", "hibernate.connection.dataSource_class", "hibernate.cache.provider_class", "hibernate.default_catalog.null", "hibernate.default_schema.null", "hibernate.dialect", "hibernate.connection.url", "model.package", "action.package", "test.package", "richfaces.skin", "icefaces.home", "jboss.domain" };
     
      for (String property : propertiesToCopy)
      {
         if (ftestProperties.get(property) != null)
         {
            seamGenProperties.put(property, ftestProperties.get(property));
         }
      }
     
      // override with ftest.properties
      seamGenProperties.put("workspace.home", WORKSPACE);
      seamGenProperties.put("jboss.home", CONTAINER_LOCATION);
      seamGenProperties.put("icefaces", ICEFACES ? "y" : "n");
      seamGenProperties.put("project.type", WAR ? "war" : "ear");
      seamGenProperties.put("project.name", APP_NAME);
   }
  
   /**
    * Parses some of Selenium command line arguments stated in ftest.properties.
    * There is not orthogonality between arguments of command line and
    * Java configuration interface, so some arguments cannot be set by this method
    * @param rcc RC configuration to be modified
    */
   private void setSeleniumServerProperties(RemoteControlConfiguration rcc)
   {
      StringTokenizer parameters = new StringTokenizer(SELENIUM_SERVER_ARGS, " ");
      try
      {
         while (parameters.hasMoreTokens())
         {
            String cmd = parameters.nextToken();
            if ("-firefoxProfileTemplate".equals(cmd))
            {
               rcc.setFirefoxProfileTemplate(new File(parameters.nextToken()));
            }
            else if("-log".equals(cmd)) {
               rcc.setLogOutFileName(parameters.nextToken());
            }
            /*else if("-singleWindow".equals(cmd)) {
               rcc.setMultiWindow(false);
            }*/
            else if("-avoidProxy".equals(cmd)) {
               rcc.setHonorSystemProxy(false);
            }
            else if("-profilesLocation".equals(cmd)) {
               rcc.setProfilesLocation(new File(parameters.nextToken()));
            }
            else if("-trustAllSSLCertificates".equals(cmd)){
               rcc.setTrustAllSSLCertificates(true);
            }
            else if("-interactive".equals(cmd)){
               rcc.setInteractive(true);
            }
            else if("-userExtensions".equals(cmd)){
               rcc.setUserExtensions(new File(parameters.nextToken()));
            }
            // injection modes
            else if("-proxyInjectionMode".equals(cmd)){
               rcc.setProxyInjectionModeArg(true);
            }
            else if("-dontInjectRegex".equals(cmd) && rcc.getProxyInjectionModeArg()) {
               rcc.setDontInjectRegex(parameters.nextToken());
            }
            else if("-userJsInjection".equals(cmd) && rcc.getProxyInjectionModeArg()) {
               rcc.setUserJSInjection(true);
            }
            else if("-ensureCleanSession".equals(cmd)) {
               rcc.setReuseBrowserSessions(false);
            }
            else {
               System.err.println("Unknown selenium server argument: " + cmd);
            }
         }
      }
      catch (NoSuchElementException nsee)
      {
         System.err.println("Invalid command line arguments in selenium.server.cmd.args (" + SELENIUM_SERVER_ARGS + ")");
      }
      catch (NullPointerException ioe)
      {
         System.err.println("Unable to open empty filename in selenium.server.cmd.args (" + SELENIUM_SERVER_ARGS+")");
      }
     
   }
  
   private void startSeleniumServer() throws Exception
   {
      RemoteControlConfiguration rcc = new RemoteControlConfiguration();
      rcc.setPort(SELENIUM_SERVER_PORT);
      rcc.setLogOutFileName(OUTPUT_DIR + "/selenium-server.log");
      setSeleniumServerProperties(rcc);
      seleniumServer = new SeleniumServer(rcc);
      seleniumServer.start();
   }
  
   private void createOutputDir()
   {
      File dir = new File(OUTPUT_DIR);
      if (!dir.exists())
      {
         dir.mkdir();
      }
   } 
}
TOP

Related Classes of org.jboss.seam.test.functional.seamgen.SeamGenTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.