// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you 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.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 s_fileName = "../metadata/adapter.xml"; public static HashMap<String, String> s_globalParameters = new HashMap<String, String>(); protected static HashMap<String, String> s_componentMap = new HashMap<String, String>(); protected static HashMap<String, ArrayList<String>> s_inputFile = new HashMap<String, ArrayList<String>>(); protected static String s_testCaseName = new String(); protected static ArrayList<String> s_keys = new ArrayList<String>(); private static ThreadLocal<Object> s_result = new ThreadLocal<Object>(); public static int s_numThreads = 1; public static boolean s_repeat = false; public static boolean s_printUrl = false; public static String s_type = "All"; public static boolean s_isSanity = false; public static boolean s_isRegression = false; private static int s_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")) { s_numThreads = Integer.parseInt(iter.next()); } // do you want to print url for all commands? if (arg.equals("-p")) { s_printUrl = true; } //type of the test: sanity, regression, all (default) if (arg.equals("-type")) { s_type = iter.next(); } if (arg.equals("-repeat")) { s_repeat = Boolean.valueOf(iter.next()); } if (arg.equals("-filename")) { s_fileName = iter.next(); } } if (s_type.equalsIgnoreCase("sanity")) s_isSanity = true; else if (s_type.equalsIgnoreCase("regression")) s_isRegression = true; try { // parse adapter.xml file to get list of tests to execute File file = new File(s_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 < s_numThreads; i++) { if (s_numThreads > 1) { s_logger.info("STARTING STRESS TEST IN " + s_numThreads + " THREADS"); } else { s_logger.info("STARTING FUNCTIONAL TEST"); } new Thread(new Runnable() { @Override public void run() { do { if (s_numThreads == 1) { try { for (String key : s_keys) { Class<?> c = Class.forName(s_componentMap.get(key)); TestCase component = (TestCase)c.newInstance(); executeTest(key, c, component); } } catch (Exception ex1) { s_logger.error(ex1); } finally { if (s_failure > 0) { System.exit(1); } } } else { Random ran = new Random(); Integer randomNumber = Math.abs(ran.nextInt(s_keys.size())); try { String key = s_keys.get(randomNumber); Class<?> c = Class.forName(s_componentMap.get(key)); TestCase component = (TestCase)c.newInstance(); executeTest(key, c, component); } catch (Exception e) { s_logger.error("Error in thread ", e); } } } while (s_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 = paramElement; NodeList itemName = itemElement.getElementsByTagName("name"); Element itemNameElement = (Element)itemName.item(0); NodeList itemVariable = itemElement.getElementsByTagName("variable"); Element itemVariableElement = (Element)itemVariable.item(0); s_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 = testElement; // get test case name NodeList testCaseNameList = itemElement.getElementsByTagName("testname"); if (testCaseNameList != null) { s_testCaseName = ((Element)testCaseNameList.item(0)).getTextContent(); } if (s_isSanity == true && !s_testCaseName.equals("SANITY TEST")) continue; else if (s_isRegression == true && !(s_testCaseName.equals("SANITY TEST") || s_testCaseName.equals("REGRESSION TEST"))) continue; // set class name NodeList className = itemElement.getElementsByTagName("class"); if ((className.getLength() == 0) || (className == null)) { s_componentMap.put(s_testCaseName, "com.cloud.test.regression.VMApiTest"); } else { String name = ((Element)className.item(0)).getTextContent(); s_componentMap.put(s_testCaseName, name); } // set input file name NodeList inputFileNameLst = itemElement.getElementsByTagName("filename"); s_inputFile.put(s_testCaseName, new ArrayList<String>()); for (int k = 0; k < inputFileNameLst.getLength(); k++) { String inputFileName = ((Element)inputFileNameLst.item(k)).getTextContent(); s_inputFile.get(s_testCaseName).add(inputFileName); } } } //If sanity test required, make sure that SANITY TEST componennt got loaded if (s_isSanity == true && s_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 (s_isRegression == true && s_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 = s_componentMap.entrySet(); Iterator<?> it = set.iterator(); while (it.hasNext()) { Map.Entry<?, ?> me = (Map.Entry<?, ?>)it.next(); String key = (String)me.getKey(); s_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(s_globalParameters); component.setParam(updateParam); // set DB ip address component.setConn(s_globalParameters.get("dbPassword")); // set commands list component.setCommands(); // set input file if (s_inputFile.get(key) != null) { component.setInputFile(s_inputFile.get(key)); } // set test case name if (key != null) { component.setTestCaseName(s_testCaseName); } // execute method s_result.set(component.executeTest()); if (s_result.get().toString().equals("false")) { s_logger.error("FAILURE!!! Test \"" + key + "\" failed\n\n\n"); s_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; } }