blob: bbfe8d26a0709570374d611e00f4528271d6538d [file] [log] [blame]
/*
* 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.
*
*/
/*
* AT&T - PROPRIETARY
* THIS FILE CONTAINS PROPRIETARY INFORMATION OF
* AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN
* ACCORDANCE WITH APPLICABLE AGREEMENTS.
*
* Copyright (c) 2013 AT&T Knowledge Ventures
* Unpublished and Not for Publication
* All Rights Reserved
*/
package org.apache.openaz.xacml.pdp.std.dom;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.openaz.xacml.api.Response;
import org.apache.openaz.xacml.std.dom.DOMResponse;
import org.junit.Test;
/**
* Tests for handling the XML version of the XACML Response object. TO RUN - use jUnit In Eclipse select this
* file or the enclosing directory, right-click and select Run As/JUnit Test Normally the Response is
* generated by the PDP and returned through the RESTful interface as JSON. Testing of the XML interface is
* minimal and not complete.
*/
public class DOMResponseConformanceTest {
// where to find the conformance test XML files
private final String CONFORMANCE_DIRECTORY_PATH = "testsets/conformance/xacml3.0-ct-v.0.4";
// The request object output from each test conversion from JSON string
Response response;
// Load the Conformance test responses into Response objects, generate the output XML for that Response
// and compare with the original files.
@Test
public void testDOMResponse() {
List<File> filesInDirectory = null;
File conformanceDirectory = null;
File currentFile = null;
try {
conformanceDirectory = new File(CONFORMANCE_DIRECTORY_PATH);
filesInDirectory = getRequestsInDirectory(conformanceDirectory);
} catch (Exception e) {
fail("Unable to set up Conformance tests for dir '" + conformanceDirectory.getAbsolutePath()
+ "' e=" + e);
}
// run through each XML file
// - load the file from XML into an internal Response object
// - generate the XML representation from that Response object
// - reload the file into a String
// - compare the 2 XML strings
Response xmlResponse = null;
try {
for (File f : filesInDirectory) {
currentFile = f;
// // This is a simple way to select just one file for debugging - comment out when not being
// used
// if ( ! f.getName().equals("IID302Response.xml")) { continue; }
// during debugging it is helpful to know what file it is starting to work on
// System.out.println("starting file="+currentFile.getName());
BufferedReader br = new BufferedReader(new FileReader(f));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
br.close();
String xmlFromFile = sb.toString();
try {
// load XML into a Response object
xmlResponse = DOMResponse.load(xmlFromFile);
} catch (Exception e) {
// if XML does not load, just note it and continue with next file
System.out.println("XML file did not load: '" + f.getName() + " e=" + e);
continue;
}
// System.out.println(xmlFromFile);
// create String version from the Response object
String xmlResponseString = DOMResponse.toString(xmlResponse, false);
// Comparing the string directly to the String from the file is difficult.
// We can minimize the problems with newlines and whitespace, but we have other issues with
// how various object values are represented.
// For instance, and input double of "23.50" is output as "23.5" which is the same value but
// not identical strings.
// Therefore we take the XML output and use it to create a new Response object, then compare
// the two objects.
// System.out.println(xmlResponseString);
Response reGeneratedResponse = DOMResponse.load(xmlResponseString);
if (!xmlResponse.equals(reGeneratedResponse)) {
String normalizedFromFile = xmlFromFile.replaceAll("\\r|\\n", "");
normalizedFromFile = normalizedFromFile.replaceAll("\\s+", " ");
normalizedFromFile = normalizedFromFile.replaceAll(">\\s*<", "><");
System.out.println("File=" + normalizedFromFile);
System.out.println("Gend=" + xmlResponseString);
System.out.println(DOMResponse.toString(xmlResponse, true));
fail("Output string did not re-generate eqivilent object.");
}
// // Normally whitespace is significant in XML.
// // However in this case we are generating an XML string for output and comparing it to a
// hand-made file.
// // The file may contain extra newlines or fewer spaces then our prettyPrinted output
// version.
// // Therefore we do the comparison on the un-prettyPrinted generated string.
// // To do this we have to remove the extra whitespace from the version read from the file.
// String normalizedFromFile = xmlFromFile.replaceAll("\\r|\\n", "");
// normalizedFromFile = normalizedFromFile.replaceAll("\\s+", " ");
// normalizedFromFile = normalizedFromFile.replaceAll(">\\s*<", "><");
//
// if ( ! xmlResponseString.equals(normalizedFromFile)) {
// System.out.println("file="+normalizedFromFile+"\ngend="+xmlResponseString);
// fail("file not same as generated string: " + f.getName()+ "\nFile="+xmlFromFile +
// "\nString="+xmlResponseString);
// }
}
} catch (Exception e) {
fail("Failed test with '" + currentFile.getName() + "', e=" + e);
}
}
//
// HELPER to get list of all Request files in the given directory
//
private List<File> getRequestsInDirectory(File directory) {
List<File> fileList = new ArrayList<File>();
File[] fileArray = directory.listFiles();
for (File f : fileArray) {
if (f.isDirectory()) {
List<File> subDirList = getRequestsInDirectory(f);
fileList.addAll(subDirList);
}
if (f.getName().endsWith("Response.xml")) {
fileList.add(f);
}
}
return fileList;
}
}
/*
* Place to edit long strings output during tests
*/