blob: 81013a5a7bdeb7c473cae16ee64b0ecc5a27ca1b [file] [log] [blame]
/*
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package catalog;
import javax.xml.catalog.CatalogResolver;
import org.testng.Assert;
/*
* Utilities for checking catalog resolution.
*/
class ResolutionChecker {
/* ********** Checks normal resolution ********** */
/*
* Checks the resolution result for specified external identifier.
*/
static void checkExtIdResolution(CatalogResolver resolver,
String publicId, String systemId, String matchedUri) {
Assert.assertEquals(
resolver.resolveEntity(publicId, getNotSpecified(systemId)).getSystemId(),
matchedUri);
}
/*
* Checks the resolution result for specified system identifier.
*/
static void checkSysIdResolution(CatalogResolver resolver,
String systemId, String matchedUri) {
checkExtIdResolution(resolver, null, systemId, matchedUri);
}
/*
* Checks the resolution result for specified public identifier.
*/
static void checkPubIdResolution(CatalogResolver resolver,
String publicId, String matchedUri) {
checkExtIdResolution(resolver, publicId, null, matchedUri);
}
/*
* Checks the resolution result for specified URI references
* with the specified base location.
*/
static void checkUriResolution(CatalogResolver resolver,
String href, String base, String matchedUri) {
Assert.assertEquals(resolver.resolve(href, base).getSystemId(),
matchedUri);
}
/*
* Checks the resolution result for specified URI references.
*/
static void checkUriResolution(CatalogResolver resolver,
String href, String matchedUri) {
checkUriResolution(resolver, href, null, matchedUri);
}
/* ********** Checks no match is found ********** */
/*
* With strict resolution, if no match is found,
* CatalogResolver should throw CatalogException.
*/
static void checkNoMatch(CatalogResolver resolver) {
resolver.resolveEntity("-//EXTID//DTD NOMATCH DOCNOMATCH XML//EN",
"http://extId/noMatch/docNoMatch.dtd");
}
/*
* With strict resolution, if no match is found,
* CatalogResolver should throw CatalogException.
*/
static void checkNoUriMatch(CatalogResolver resolver) {
resolver.resolve("http://uri/noMatch/docNoMatch.dtd", getNotSpecified(null));
}
/* ********** Checks expected exception ********** */
/*
* Checks the expected exception during the resolution for specified
* external identifier.
*/
static <T extends Throwable> void expectExceptionOnExtId(
CatalogResolver resolver, String publicId, String systemId,
Class<T> expectedExceptionClass) {
expectThrows(expectedExceptionClass, () -> {
resolver.resolveEntity(publicId, getNotSpecified(systemId));
});
}
/*
* Checks the expected exception during the resolution for specified
* system identifier.
*/
static <T extends Throwable> void expectExceptionOnSysId(
CatalogResolver resolver, String systemId,
Class<? extends Throwable> expectedExceptionClass) {
expectExceptionOnExtId(resolver, null, systemId,
expectedExceptionClass);
}
/*
* Checks the expected exception during the resolution for specified
* public identifier.
*/
static <T extends Throwable> void expectExceptionOnPubId(
CatalogResolver resolver, String publicId,
Class<T> expectedExceptionClass) {
expectExceptionOnExtId(resolver, publicId, null,
expectedExceptionClass);
}
/*
* Checks the expected exception during the resolution for specified
* URI reference with a specified base location.
*/
static <T extends Throwable> void expectExceptionOnUri(
CatalogResolver resolver, String href, String base,
Class<T> expectedExceptionClass) {
expectThrows(expectedExceptionClass, () -> {
resolver.resolve(href, base);
});
}
/*
* Checks the expected exception during the resolution for specified
* URI reference without any specified base location.
*/
static <T extends Throwable> void expectExceptionOnUri(
CatalogResolver resolver, String href,
Class<T> expectedExceptionClass) {
expectExceptionOnUri(resolver, href, null, expectedExceptionClass);
}
// The TestNG distribution in current JTREG build doesn't support
// method Assert.expectThrows().
private static <T extends Throwable> T expectThrows(Class<T> throwableClass,
ThrowingRunnable runnable) {
try {
runnable.run();
} catch (Throwable t) {
if (throwableClass.isInstance(t)) {
return throwableClass.cast(t);
} else {
String mismatchMessage = String.format(
"Expected %s to be thrown, but %s was thrown",
throwableClass.getSimpleName(),
t.getClass().getSimpleName());
throw new AssertionError(mismatchMessage, t);
}
}
String message = String.format(
"Expected %s to be thrown, but nothing was thrown",
throwableClass.getSimpleName());
throw new AssertionError(message);
}
/*
* SystemId can never be null in XML. For publicId tests, if systemId is null,
* it will be considered as not-specified instead. A non-existent systemId
* is returned to make sure there's no match by the systemId.
*/
private static String getNotSpecified(String systemId) {
if (systemId == null) {
return "not-specified-systemId.dtd";
}
return systemId;
}
private interface ThrowingRunnable {
void run() throws Throwable;
}
}