blob: 9e7474108724686c1021359f8bf20672e2c94d5a [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.test.conformance;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.openaz.xacml.api.Request;
import org.apache.openaz.xacml.api.Response;
import org.apache.openaz.xacml.api.pdp.PDPEngine;
import org.apache.openaz.xacml.api.pdp.PDPEngineFactory;
import org.apache.openaz.xacml.api.pdp.ScopeResolver;
import org.apache.openaz.xacml.std.dom.DOMProperties;
import org.apache.openaz.xacml.std.dom.DOMRequest;
import org.apache.openaz.xacml.std.dom.DOMResponse;
import org.apache.openaz.xacml.util.FactoryException;
/**
* ConformanceTestEngine handles the creation of the PDPEngine for a ConformanceTest instance.
*/
public class ConformanceTestEngine {
private Log logger = LogFactory.getLog(ConformanceTestEngine.class);
private PDPEngineFactory pdpEngineFactory;
private ScopeResolver scopeResolver;
private boolean lenientRequests;
private boolean lenientPolicies;
private int iterations = 1;
// total of all first calls to decide()
private long firstDecideTime;
private int numberOfFirstDecides = 0;
// total of all non-first-calls to decide()
private long decideTimeMultiple;
// total of average time each test case uses for a Request
// (sum of : for each test case, average of all non-first-call calls to decide() )
private long avgDecideTimeMultiple = 0;
protected PDPEngineFactory getPDPEngineFactory() throws FactoryException {
if (this.pdpEngineFactory == null) {
this.pdpEngineFactory = PDPEngineFactory.newInstance();
this.pdpEngineFactory.setScopeResolver(this.scopeResolver);
}
return this.pdpEngineFactory;
}
public ConformanceTestEngine(ScopeResolver scopeResolverIn, boolean lenientRequestsIn,
boolean lenientPoliciesIn, int iterationsIn) {
this.scopeResolver = scopeResolverIn;
this.lenientRequests = lenientRequestsIn;
this.lenientPolicies = lenientPoliciesIn;
this.iterations = iterationsIn;
}
public ConformanceTestResult run(ConformanceTest conformanceTest) {
if (conformanceTest.getRequest() == null || conformanceTest.getResponse() == null
|| conformanceTest.getRepository() == null) {
logger.error("Incomplete Conformance Test: " + conformanceTest.getTestName());
}
PDPEngineFactory thisPDPEngineFactory = null;
try {
thisPDPEngineFactory = this.getPDPEngineFactory();
} catch (FactoryException ex) {
return new ConformanceTestResult(conformanceTest, ex);
}
ConformanceTestResult conformanceTestResult = new ConformanceTestResult(conformanceTest, iterations);
/*
* Load the request
*/
Request request = null;
boolean isLenient = DOMProperties.isLenient();
try {
DOMProperties.setLenient(this.lenientRequests);
try {
request = DOMRequest.load(conformanceTest.getRequest());
conformanceTestResult.setRequest(request);
} catch (Exception ex) {
logger.error("Exception loading Request file "
+ conformanceTest.getRequest().getAbsolutePath(), ex);
conformanceTestResult.setError(ex);
return conformanceTestResult;
}
/*
* Load the expected response
*/
Response response = null;
try {
response = DOMResponse.load(conformanceTest.getResponse());
conformanceTestResult.setExpectedResponse(response);
} catch (Exception ex) {
logger.error("Exception loading Response file "
+ conformanceTest.getResponse().getAbsolutePath(), ex);
conformanceTestResult.setError(ex);
return conformanceTestResult;
}
/*
* Set up the configuration for the policy finder
*/
conformanceTest.getRepository().setXACMLProperties();
DOMProperties.setLenient(this.lenientPolicies);
/*
* Create the engine
*/
PDPEngine pdpEngine = null;
try {
// pdpEngine = thisPDPEngineFactory.newEngine(conformanceTest.getRootPolicy(),
// conformanceTest.getReferencedPolicies(), pipFinderEngine);
pdpEngine = thisPDPEngineFactory.newEngine();
} catch (Exception ex) {
logger.error("Exception getting PDP engine instance", ex);
conformanceTestResult.setError(ex);
return conformanceTestResult;
}
if (pdpEngine == null) {
logger.error("Null PDP engine");
conformanceTestResult.setError(new NullPointerException("Null engine"));
return conformanceTestResult;
}
/*
* Run the request
*/
long startTime, endTime;
long curDecideTime = this.firstDecideTime;
try {
startTime = System.nanoTime();
response = pdpEngine.decide(request);
endTime = System.nanoTime();
// System.out.println(endTime - startTime);
// add to total
this.firstDecideTime += endTime - startTime;
this.numberOfFirstDecides++;
// remember just this test
conformanceTestResult.setFirstCallTime(endTime - startTime);
conformanceTestResult.setActualResponse(response);
} catch (Exception ex) {
logger.error("Exception in decide", ex);
conformanceTestResult.setError(ex);
return conformanceTestResult;
}
if (response == null) {
logger.error("Null Response");
conformanceTestResult.setError(new NullPointerException("Null Response"));
return conformanceTestResult;
}
long localLoopTime = 0;
try {
// if user requested non-first-call calls to decide() to get performance info, run them now.
// We can ignore the result since we are only interested in how long they take to process the
// Request.
for (int i = 0; i < this.iterations; i++) {
startTime = System.nanoTime();
pdpEngine.decide(request);
endTime = System.nanoTime();
// System.out.println(endTime - startTime);
// add to the global total for all tests
this.decideTimeMultiple += (endTime - startTime);
// remember just this one test's info
localLoopTime += (endTime - startTime);
}
} catch (Exception ex) {
logger.error("Exception in iterated decide", ex);
return conformanceTestResult;
}
// add to total average for non-first-call times for all test cases
avgDecideTimeMultiple += (localLoopTime / iterations);
// System.out.println("localLoop="+localLoopTime + " it="+iterations + " avg=" +
// (localLoopTime / iterations) );
// remember average time for just this test
conformanceTestResult.setAverageTotalLoopTime(localLoopTime / iterations);
long elapsedDecideTime = this.firstDecideTime - curDecideTime;
logger.info("Decide Time: " + elapsedDecideTime + "ns");
return conformanceTestResult;
} finally {
DOMProperties.setLenient(isLenient);
}
}
public long getFirstDecideTime() {
return this.firstDecideTime;
}
public long getDecideTimeMultiple() {
return this.decideTimeMultiple;
}
public long getAvgFirstDecideTime() {
return this.firstDecideTime / numberOfFirstDecides;
}
public long getAvgDecideTimeMultiple() {
return this.avgDecideTimeMultiple / numberOfFirstDecides;
}
}