/*
* @(#)BasicGroupTest.java
*
* Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistribution in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for use in
* the design, construction, operation or maintenance of any nuclear facility.
*/
package com.sun.xacml.test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.sun.xacml.PDP;
/**
* A basic implementation of a group of tests.
*
* @author Seth Proctor
*/
public class BasicGroupTest implements Test {
// the name of this test
private String name;
// whether this test is experimental
private boolean experimental;
// the tests contained in this group
private List<Test> tests;
/**
* Constructor that accepts all the required values
*
* @param name
* the name of this group
* @param experimental
* true if this is an experimental group
* @param tests
* the groups of tests
*/
public BasicGroupTest(String name, boolean experimental, List<Test> tests) {
this.name = name;
this.experimental = experimental;
this.tests = tests;
}
/**
* Creates an instance of a group of tests from its XML representation.
*
* @param root
* the root of the XML-encoded data for this group
* @param pdp
* the <code>PDP</code> used by any sub-tests
* @param module
* the module used for any policies loaded by sub-tests
*/
public static BasicGroupTest getInstance(Node root, PDP pdp, TestPolicyFinderModule module) {
NamedNodeMap map = root.getAttributes();
// the name is required
String name = map.getNamedItem("name").getNodeValue();
// the experimental tag isn't
boolean experimental = false;
Node attrNode = map.getNamedItem("experimental");
if (attrNode == null)
experimental = false;
else
experimental = attrNode.getNodeValue().equals("true");
// now get all the elements
NodeList children = root.getChildNodes();
ArrayList<Test> tests = new ArrayList<Test>();
for (int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
String nodeName = child.getNodeName();
// if we find another group or an individual test, load it
if (nodeName.equals("group"))
tests.add(BasicGroupTest.getInstance(child, pdp, module));
else if (nodeName.equals("test"))
tests.add(BasicTest.getInstance(child, pdp, module));
}
// create the new group
return new BasicGroupTest(name, experimental, tests);
}
public String getName() {
return name;
}
public boolean isErrorExpected() {
return false;
}
public boolean isExperimental() {
return experimental;
}
/**
* Returns the tests contained in this group.
*
* @return a <code>List</code> of <code>Test</code>s
*/
public List<Test> getTests() {
return tests;
}
public int run(String testPrefix) {
Iterator<Test> it = tests.iterator();
int errorCount = 0;
System.out.println("Running group " + name);
while (it.hasNext())
errorCount += it.next().run(testPrefix + name);
System.out.println("Finished group " + name + " [failures: " + errorCount + "]");
return errorCount;
}
}