TestCLI.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:16k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.cli;
  19. import java.io.File;
  20. import java.util.ArrayList;
  21. import javax.xml.parsers.SAXParser;
  22. import javax.xml.parsers.SAXParserFactory;
  23. import junit.framework.TestCase;
  24. import org.apache.commons.logging.Log;
  25. import org.apache.commons.logging.LogFactory;
  26. import org.apache.hadoop.cli.util.CLITestData;
  27. import org.apache.hadoop.cli.util.CommandExecutor;
  28. import org.apache.hadoop.cli.util.ComparatorBase;
  29. import org.apache.hadoop.cli.util.ComparatorData;
  30. import org.apache.hadoop.cli.util.CLITestData.TestCmd;
  31. import org.apache.hadoop.cli.util.CLITestData.TestCmd.CommandType;
  32. import org.apache.hadoop.conf.Configuration;
  33. import org.apache.hadoop.fs.FileSystem;
  34. import org.apache.hadoop.hdfs.DistributedFileSystem;
  35. import org.apache.hadoop.hdfs.MiniDFSCluster;
  36. import org.apache.hadoop.mapred.JobConf;
  37. import org.apache.hadoop.mapred.MiniMRCluster;
  38. import org.apache.hadoop.security.authorize.HadoopPolicyProvider;
  39. import org.apache.hadoop.security.authorize.PolicyProvider;
  40. import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;
  41. import org.apache.hadoop.util.StringUtils;
  42. import org.xml.sax.Attributes;
  43. import org.xml.sax.SAXException;
  44. import org.xml.sax.helpers.DefaultHandler;
  45. /**
  46.  * Tests for the Command Line Interface (CLI)
  47.  */
  48. public class TestCLI extends TestCase {
  49.   private static final Log LOG =
  50.     LogFactory.getLog(TestCLI.class.getName());
  51.   
  52.   // In this mode, it runs the command and compares the actual output
  53.   // with the expected output  
  54.   public static final String TESTMODE_TEST = "test"; // Run the tests
  55.   
  56.   // If it is set to nocompare, run the command and do not compare.
  57.   // This can be useful populate the testConfig.xml file the first time
  58.   // a new command is added
  59.   public static final String TESTMODE_NOCOMPARE = "nocompare";
  60.   public static final String TEST_CACHE_DATA_DIR =
  61.     System.getProperty("test.cache.data", "build/test/cache");
  62.   
  63.   //By default, run the tests. The other mode is to run the commands and not
  64.   // compare the output
  65.   public static String testMode = TESTMODE_TEST;
  66.   
  67.   // Storage for tests read in from the config file
  68.   static ArrayList<CLITestData> testsFromConfigFile = null;
  69.   static ArrayList<ComparatorData> testComparators = null;
  70.   static String testConfigFile = "testConf.xml";
  71.   String thisTestCaseName = null;
  72.   static ComparatorData comparatorData = null;
  73.   
  74.   private static Configuration conf = null;
  75.   private static MiniDFSCluster dfsCluster = null;
  76.   private static DistributedFileSystem dfs = null;
  77.   private static MiniMRCluster mrCluster = null;
  78.   private static String namenode = null;
  79.   private static String jobtracker = null;
  80.   private static String clitestDataDir = null;
  81.   private static String username = null;
  82.   
  83.   /**
  84.    * Read the test config file - testConfig.xml
  85.    */
  86.   private void readTestConfigFile() {
  87.     
  88.     if (testsFromConfigFile == null) {
  89.       boolean success = false;
  90.       testConfigFile = TEST_CACHE_DATA_DIR + File.separator + testConfigFile;
  91.       try {
  92.         SAXParser p = (SAXParserFactory.newInstance()).newSAXParser();
  93.         p.parse(testConfigFile, new TestConfigFileParser());
  94.         success = true;
  95.       } catch (Exception e) {
  96.         LOG.info("File: " + testConfigFile + " not found");
  97.         success = false;
  98.       }
  99.       assertTrue("Error reading test config file", success);
  100.     }
  101.   }
  102.   
  103.   /*
  104.    * Setup
  105.    */
  106.   public void setUp() throws Exception {
  107.     // Read the testConfig.xml file
  108.     readTestConfigFile();
  109.     
  110.     // Start up the mini dfs cluster
  111.     boolean success = false;
  112.     conf = new Configuration();
  113.     conf.setClass(PolicyProvider.POLICY_PROVIDER_CONFIG,
  114.                   HadoopPolicyProvider.class, PolicyProvider.class);
  115.     conf.setBoolean(ServiceAuthorizationManager.SERVICE_AUTHORIZATION_CONFIG, 
  116.                     true);
  117.     dfsCluster = new MiniDFSCluster(conf, 1, true, null);
  118.     namenode = conf.get("fs.default.name", "file:///");
  119.     clitestDataDir = new File(TEST_CACHE_DATA_DIR).
  120.       toURI().toString().replace(' ', '+');
  121.     username = System.getProperty("user.name");
  122.     FileSystem fs = dfsCluster.getFileSystem();
  123.     assertTrue("Not a HDFS: "+fs.getUri(),
  124.                fs instanceof DistributedFileSystem);
  125.     dfs = (DistributedFileSystem) fs;
  126.     
  127.      // Start up mini mr cluster
  128.     JobConf mrConf = new JobConf(conf);
  129.     mrCluster = new MiniMRCluster(1, dfsCluster.getFileSystem().getUri().toString(), 1, 
  130.                            null, null, mrConf);
  131.     jobtracker = mrCluster.createJobConf().get("mapred.job.tracker", "local");
  132.     success = true;
  133.     assertTrue("Error setting up Mini DFS & MR clusters", success);
  134.   }
  135.   
  136.   /**
  137.    * Tear down
  138.    */
  139.   public void tearDown() throws Exception {
  140.     boolean success = false;
  141.     mrCluster.shutdown();
  142.     
  143.     dfs.close();
  144.     dfsCluster.shutdown();
  145.     success = true;
  146.     Thread.sleep(2000);
  147.     assertTrue("Error tearing down Mini DFS & MR clusters", success);
  148.     
  149.     displayResults();
  150.   }
  151.   
  152.   /**
  153.    * Expand the commands from the test config xml file
  154.    * @param cmd
  155.    * @return String expanded command
  156.    */
  157.   private String expandCommand(final String cmd) {
  158.     String expCmd = cmd;
  159.     expCmd = expCmd.replaceAll("NAMENODE", namenode);
  160.     expCmd = expCmd.replaceAll("JOBTRACKER", jobtracker);
  161.     expCmd = expCmd.replaceAll("CLITEST_DATA", clitestDataDir);
  162.     expCmd = expCmd.replaceAll("USERNAME", username);
  163.     
  164.     return expCmd;
  165.   }
  166.   
  167.   /**
  168.    * Display the summarized results
  169.    */
  170.   private void displayResults() {
  171.     LOG.info("Detailed results:");
  172.     LOG.info("----------------------------------n");
  173.     
  174.     for (int i = 0; i < testsFromConfigFile.size(); i++) {
  175.       CLITestData td = testsFromConfigFile.get(i);
  176.       
  177.       boolean testResult = td.getTestResult();
  178.       
  179.       // Display the details only if there is a failure
  180.       if (!testResult) {
  181.         LOG.info("-------------------------------------------");
  182.         LOG.info("                    Test ID: [" + (i + 1) + "]");
  183.         LOG.info("           Test Description: [" + td.getTestDesc() + "]");
  184.         LOG.info("");
  185.         ArrayList<TestCmd> testCommands = td.getTestCommands();
  186.         for (TestCmd cmd : testCommands) {
  187.           LOG.info("              Test Commands: [" + 
  188.                    expandCommand(cmd.getCmd()) + "]");
  189.         }
  190.         LOG.info("");
  191.         ArrayList<TestCmd> cleanupCommands = td.getCleanupCommands();
  192.         for (TestCmd cmd : cleanupCommands) {
  193.           LOG.info("           Cleanup Commands: [" +
  194.                    expandCommand(cmd.getCmd()) + "]");
  195.         }
  196.         LOG.info("");
  197.         ArrayList<ComparatorData> compdata = td.getComparatorData();
  198.         for (ComparatorData cd : compdata) {
  199.           boolean resultBoolean = cd.getTestResult();
  200.           LOG.info("                 Comparator: [" + 
  201.                    cd.getComparatorType() + "]");
  202.           LOG.info("         Comparision result:   [" + 
  203.                    (resultBoolean ? "pass" : "fail") + "]");
  204.           LOG.info("            Expected output:   [" + 
  205.                    cd.getExpectedOutput() + "]");
  206.           LOG.info("              Actual output:   [" + 
  207.                    cd.getActualOutput() + "]");
  208.         }
  209.         LOG.info("");
  210.       }
  211.     }
  212.     
  213.     LOG.info("Summary results:");
  214.     LOG.info("----------------------------------n");
  215.     
  216.     boolean overallResults = true;
  217.     int totalPass = 0;
  218.     int totalFail = 0;
  219.     int totalComparators = 0;
  220.     for (int i = 0; i < testsFromConfigFile.size(); i++) {
  221.       CLITestData td = testsFromConfigFile.get(i);
  222.       totalComparators += 
  223.        testsFromConfigFile.get(i).getComparatorData().size();
  224.       boolean resultBoolean = td.getTestResult();
  225.       if (resultBoolean) {
  226.         totalPass ++;
  227.       } else {
  228.         totalFail ++;
  229.       }
  230.       overallResults &= resultBoolean;
  231.     }
  232.     
  233.     
  234.     LOG.info("               Testing mode: " + testMode);
  235.     LOG.info("");
  236.     LOG.info("             Overall result: " + 
  237.      (overallResults ? "+++ PASS +++" : "--- FAIL ---"));
  238.     LOG.info("               # Tests pass: " + totalPass +
  239.      " (" + (100 * totalPass / (totalPass + totalFail)) + "%)");
  240.     LOG.info("               # Tests fail: " + totalFail + 
  241.      " (" + (100 * totalFail / (totalPass + totalFail)) + "%)");
  242.     LOG.info("         # Validations done: " + totalComparators + 
  243.      " (each test may do multiple validations)");
  244.     
  245.     LOG.info("");
  246.     LOG.info("Failing tests:");
  247.     LOG.info("--------------");
  248.     int i = 0;
  249.     boolean foundTests = false;
  250.     for (i = 0; i < testsFromConfigFile.size(); i++) {
  251.       boolean resultBoolean = testsFromConfigFile.get(i).getTestResult();
  252.       if (!resultBoolean) {
  253.         LOG.info((i + 1) + ": " + 
  254.          testsFromConfigFile.get(i).getTestDesc());
  255.         foundTests = true;
  256.       }
  257.     }
  258.     if (!foundTests) {
  259.      LOG.info("NONE");
  260.     }
  261.     
  262.     foundTests = false;
  263.     LOG.info("");
  264.     LOG.info("Passing tests:");
  265.     LOG.info("--------------");
  266.     for (i = 0; i < testsFromConfigFile.size(); i++) {
  267.       boolean resultBoolean = testsFromConfigFile.get(i).getTestResult();
  268.       if (resultBoolean) {
  269.         LOG.info((i + 1) + ": " + 
  270.          testsFromConfigFile.get(i).getTestDesc());
  271.         foundTests = true;
  272.       }
  273.     }
  274.     if (!foundTests) {
  275.      LOG.info("NONE");
  276.     }
  277.     assertTrue("One of the tests failed. " +
  278.      "See the Detailed results to identify " +
  279.      "the command that failed", overallResults);
  280.     
  281.   }
  282.   
  283.   /**
  284.    * Compare the actual output with the expected output
  285.    * @param compdata
  286.    * @return
  287.    */
  288.   private boolean compareTestOutput(ComparatorData compdata) {
  289.     // Compare the output based on the comparator
  290.     String comparatorType = compdata.getComparatorType();
  291.     Class<?> comparatorClass = null;
  292.     
  293.     // If testMode is "test", then run the command and compare the output
  294.     // If testMode is "nocompare", then run the command and dump the output.
  295.     // Do not compare
  296.     
  297.     boolean compareOutput = false;
  298.     
  299.     if (testMode.equals(TESTMODE_TEST)) {
  300.       try {
  301.      // Initialize the comparator class and run its compare method
  302.         comparatorClass = Class.forName("org.apache.hadoop.cli.util." + 
  303.           comparatorType);
  304.         ComparatorBase comp = (ComparatorBase) comparatorClass.newInstance();
  305.         compareOutput = comp.compare(CommandExecutor.getLastCommandOutput(), 
  306.           compdata.getExpectedOutput());
  307.       } catch (Exception e) {
  308.         LOG.info("Error in instantiating the comparator" + e);
  309.       }
  310.     }
  311.     
  312.     return compareOutput;
  313.   }
  314.   
  315.   /***********************************
  316.    ************* TESTS
  317.    *********************************/
  318.   
  319.   public void testAll() {
  320.     LOG.info("TestAll");
  321.     
  322.     // Run the tests defined in the testConf.xml config file.
  323.     for (int index = 0; index < testsFromConfigFile.size(); index++) {
  324.       
  325.       CLITestData testdata = (CLITestData) testsFromConfigFile.get(index);
  326.    
  327.       // Execute the test commands
  328.       ArrayList<TestCmd> testCommands = testdata.getTestCommands();
  329.       for (TestCmd cmd : testCommands) {
  330.       try {
  331.         CommandExecutor.executeCommand(cmd, namenode, jobtracker);
  332.       } catch (Exception e) {
  333.         fail(StringUtils.stringifyException(e));
  334.       }
  335.       }
  336.       
  337.       boolean overallTCResult = true;
  338.       // Run comparators
  339.       ArrayList<ComparatorData> compdata = testdata.getComparatorData();
  340.       for (ComparatorData cd : compdata) {
  341.         final String comptype = cd.getComparatorType();
  342.         
  343.         boolean compareOutput = false;
  344.         
  345.         if (! comptype.equalsIgnoreCase("none")) {
  346.           compareOutput = compareTestOutput(cd);
  347.           overallTCResult &= compareOutput;
  348.         }
  349.         
  350.         cd.setExitCode(CommandExecutor.getLastExitCode());
  351.         cd.setActualOutput(CommandExecutor.getLastCommandOutput());
  352.         cd.setTestResult(compareOutput);
  353.       }
  354.       testdata.setTestResult(overallTCResult);
  355.       
  356.       // Execute the cleanup commands
  357.       ArrayList<TestCmd> cleanupCommands = testdata.getCleanupCommands();
  358.       for (TestCmd cmd : cleanupCommands) {
  359.       try { 
  360.         CommandExecutor.executeCommand(cmd, namenode, jobtracker);
  361.       } catch (Exception e) {
  362.         fail(StringUtils.stringifyException(e));
  363.       }
  364.       }
  365.     }
  366.   }
  367.   
  368.   /*
  369.    * Parser class for the test config xml file
  370.    */
  371.   static class TestConfigFileParser extends DefaultHandler {
  372.     String charString = null;
  373.     CLITestData td = null;
  374.     ArrayList<TestCmd> testCommands = null;
  375.     ArrayList<TestCmd> cleanupCommands = null;
  376.     
  377.     @Override
  378.     public void startDocument() throws SAXException {
  379.       testsFromConfigFile = new ArrayList<CLITestData>();
  380.     }
  381.     
  382.     @Override
  383.     public void startElement(String uri, 
  384.      String localName, 
  385.      String qName, 
  386.      Attributes attributes) throws SAXException {
  387.       if (qName.equals("test")) {
  388.         td = new CLITestData();
  389.       } else if (qName.equals("test-commands")) {
  390.         testCommands = new ArrayList<TestCmd>();
  391.       } else if (qName.equals("cleanup-commands")) {
  392.         cleanupCommands = new ArrayList<TestCmd>();
  393.       } else if (qName.equals("comparators")) {
  394.         testComparators = new ArrayList<ComparatorData>();
  395.       } else if (qName.equals("comparator")) {
  396.         comparatorData = new ComparatorData();
  397.       }
  398.       charString = "";
  399.     }
  400.     
  401.     @Override
  402.     public void endElement(String uri, 
  403.      String localName, 
  404.      String qName) throws SAXException {
  405.       if (qName.equals("description")) {
  406.         td.setTestDesc(charString);
  407.       } else if (qName.equals("test-commands")) {
  408.         td.setTestCommands(testCommands);
  409.         testCommands = null;
  410.       } else if (qName.equals("cleanup-commands")) {
  411.         td.setCleanupCommands(cleanupCommands);
  412.         cleanupCommands = null;
  413.       } else if (qName.equals("command")) {
  414.         if (testCommands != null) {
  415.           testCommands.add(new TestCmd(charString, CommandType.FS));
  416.         } else if (cleanupCommands != null) {
  417.           cleanupCommands.add(new TestCmd(charString, CommandType.FS));
  418.         }
  419.       } else if (qName.equals("dfs-admin-command")) {
  420.           if (testCommands != null) {
  421.               testCommands.add(new TestCmd(charString,CommandType.DFSADMIN));
  422.             } else if (cleanupCommands != null) {
  423.               cleanupCommands.add(new TestCmd(charString, CommandType.DFSADMIN));
  424.             } 
  425.       } else if (qName.equals("mr-admin-command")) {
  426.         if (testCommands != null) {
  427.             testCommands.add(new TestCmd(charString,CommandType.MRADMIN));
  428.           } else if (cleanupCommands != null) {
  429.             cleanupCommands.add(new TestCmd(charString, CommandType.MRADMIN));
  430.           } 
  431.       } else if (qName.equals("comparators")) {
  432.         td.setComparatorData(testComparators);
  433.       } else if (qName.equals("comparator")) {
  434.         testComparators.add(comparatorData);
  435.       } else if (qName.equals("type")) {
  436.         comparatorData.setComparatorType(charString);
  437.       } else if (qName.equals("expected-output")) {
  438.         comparatorData.setExpectedOutput(charString);
  439.       } else if (qName.equals("test")) {
  440.         testsFromConfigFile.add(td);
  441.         td = null;
  442.       } else if (qName.equals("mode")) {
  443.         testMode = charString;
  444.         if (!testMode.equals(TESTMODE_NOCOMPARE) &&
  445.             !testMode.equals(TESTMODE_TEST)) {
  446.           testMode = TESTMODE_TEST;
  447.         }
  448.       }
  449.     }
  450.     
  451.     @Override
  452.     public void characters(char[] ch, 
  453.      int start, 
  454.      int length) throws SAXException {
  455.       String s = new String(ch, start, length);
  456.       charString += s;
  457.     }
  458.   }
  459. }