// Copyright 2012 Citrix Systems, Inc. Licensed under the // Apache License, Version 2.0 (the "License"); you may not use this // file except in compliance with the License. Citrix Systems, Inc. // reserves all rights not expressly granted by 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. // // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.test.regression; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class TestCaseEngine { public static final Logger s_logger = Logger.getLogger(TestCaseEngine.class .getName()); public static String fileName = "../metadata/adapter.xml"; public static HashMap<String, String> globalParameters = new HashMap<String, String>(); protected static HashMap<String, String> _componentMap = new HashMap<String, String>(); protected static HashMap<String, ArrayList<String>> _inputFile = new HashMap<String, ArrayList<String>>(); protected static String testCaseName = new String(); protected static ArrayList<String> _keys = new ArrayList<String>(); private static ThreadLocal<Object> result = new ThreadLocal<Object>(); public static int _numThreads = 1; public static boolean _repeat = false; public static boolean _printUrl = false; public static String type = "All"; public static boolean isSanity = false; public static boolean isRegression = false; private static int failure = 0; public static void main(String args[]) { // Parameters List<String> argsList = Arrays.asList(args); Iterator<String> iter = argsList.iterator(); while (iter.hasNext()) { String arg = iter.next(); // is stress? if (arg.equals("-t")) { _numThreads = Integer.parseInt(iter.next()); } // do you want to print url for all commands? if (arg.equals("-p")) { _printUrl = true; } //type of the test: sanity, regression, all (default) if (arg.equals("-type")) { type = iter.next(); } if (arg.equals("-repeat")) { _repeat = Boolean.valueOf(iter.next()); } if (arg.equals("-filename")) { fileName = iter.next(); } } if (type.equalsIgnoreCase("sanity")) isSanity = true; else if (type.equalsIgnoreCase("regression")) isRegression = true; try { // parse adapter.xml file to get list of tests to execute File file = new File(fileName); DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(file); doc.getDocumentElement().normalize(); Element root = doc.getDocumentElement(); // set global parameters setGlobalParams(root); // populate _componentMap setComponent(root); // set error to 0 by default // execute test for (int i = 0; i < _numThreads; i++) { if (_numThreads > 1) { s_logger.info("STARTING STRESS TEST IN " + _numThreads + " THREADS"); } else { s_logger.info("STARTING FUNCTIONAL TEST"); } new Thread(new Runnable() { public void run() { do { if (_numThreads == 1) { try { for (String key : _keys) { Class<?> c = Class.forName(_componentMap.get(key)); TestCase component = (TestCase) c.newInstance(); executeTest(key, c, component); } } catch (Exception ex1) { s_logger.error(ex1); } finally { if (failure > 0) { System.exit(1); } } } else { Random ran = new Random(); Integer randomNumber = (Integer) Math.abs(ran .nextInt(_keys.size())); try { String key = _keys.get(randomNumber); Class<?> c = Class.forName(_componentMap .get(key)); TestCase component = (TestCase) c .newInstance(); executeTest(key, c, component); } catch (Exception e) { s_logger.error("Error in thread ", e); } } } while (_repeat); } }).start(); } } catch (Exception exc) { s_logger.error(exc); } } public static void setGlobalParams(Element rootElement) { NodeList globalParam = rootElement.getElementsByTagName("globalparam"); Element parameter = (Element) globalParam.item(0); NodeList paramLst = parameter.getElementsByTagName("param"); for (int i = 0; i < paramLst.getLength(); i++) { Element paramElement = (Element) paramLst.item(i); if (paramElement.getNodeType() == Node.ELEMENT_NODE) { Element itemElement = (Element) paramElement; NodeList itemName = itemElement.getElementsByTagName("name"); Element itemNameElement = (Element) itemName.item(0); NodeList itemVariable = itemElement .getElementsByTagName("variable"); Element itemVariableElement = (Element) itemVariable.item(0); globalParameters.put(itemVariableElement.getTextContent(), itemNameElement.getTextContent()); } } } public static void setComponent(Element rootElement) { NodeList testLst = rootElement.getElementsByTagName("test"); for (int j = 0; j < testLst.getLength(); j++) { Element testElement = (Element) testLst.item(j); if (testElement.getNodeType() == Node.ELEMENT_NODE) { Element itemElement = (Element) testElement; // get test case name NodeList testCaseNameList = itemElement .getElementsByTagName("testname"); if (testCaseNameList != null) { testCaseName = ((Element) testCaseNameList.item(0)) .getTextContent(); } if (isSanity == true && !testCaseName.equals("SANITY TEST")) continue; else if (isRegression == true && !(testCaseName.equals("SANITY TEST") || testCaseName.equals("REGRESSION TEST"))) continue; // set class name NodeList className = itemElement.getElementsByTagName("class"); if ((className.getLength() == 0) || (className == null)) { _componentMap.put(testCaseName, "com.cloud.test.regression.VMApiTest"); } else { String name = ((Element) className.item(0)) .getTextContent(); _componentMap.put(testCaseName, name); } // set input file name NodeList inputFileNameLst = itemElement .getElementsByTagName("filename"); _inputFile.put(testCaseName, new ArrayList<String>()); for (int k = 0; k < inputFileNameLst.getLength(); k++) { String inputFileName = ((Element) inputFileNameLst.item(k)) .getTextContent(); _inputFile.get(testCaseName).add(inputFileName); } } } //If sanity test required, make sure that SANITY TEST componennt got loaded if (isSanity == true && _componentMap.size() == 0) { s_logger.error("FAILURE!!! Failed to load SANITY TEST component. Verify that the test is uncommented in adapter.xml"); System.exit(1); } if (isRegression == true && _componentMap.size() != 2) { s_logger.error("FAILURE!!! Failed to load SANITY TEST or REGRESSION TEST components. Verify that these tests are uncommented in adapter.xml"); System.exit(1); } // put all keys from _componentMap to the ArrayList Set<?> set = _componentMap.entrySet(); Iterator<?> it = set.iterator(); while (it.hasNext()) { Map.Entry<?, ?> me = (Map.Entry<?, ?>) it.next(); String key = (String) me.getKey(); _keys.add(key); } } public static boolean executeTest(String key, Class<?> c, TestCase component) { boolean finalResult = false; try { s_logger.info("Starting \"" + key + "\" test...\n\n"); // set global parameters HashMap<String, String> updateParam = new HashMap<String, String>(); updateParam.putAll(globalParameters); component.setParam(updateParam); // set DB ip address component.setConn(globalParameters.get("dbPassword")); // set commands list component.setCommands(); // set input file if (_inputFile.get(key) != null) { component.setInputFile(_inputFile.get(key)); } // set test case name if (key != null) { component.setTestCaseName(testCaseName); } // execute method result.set(component.executeTest()); if (result.get().toString().equals("false")) { s_logger.error("FAILURE!!! Test \"" + key + "\" failed\n\n\n"); failure++; } else { finalResult = true; s_logger.info("SUCCESS!!! Test \"" + key + "\" passed\n\n\n"); } } catch (Exception ex) { s_logger.error("error during test execution ", ex); } return finalResult; } }