blob: dc479f1762f6671254581afbfdef8f3ab857cdc2 [file] [log] [blame]
/*
* Copyright (c) 2016, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle
package org.eclipse.persistence.testing.sdo.helper.typehelper.define;
import commonj.sdo.DataObject;
import commonj.sdo.Property;
import commonj.sdo.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.print.attribute.standard.JobHoldUntil;
import junit.textui.TestRunner;
import org.eclipse.persistence.sdo.SDOConstants;
import org.eclipse.persistence.sdo.SDOProperty;
import org.eclipse.persistence.sdo.SDOType;
import org.eclipse.persistence.sdo.helper.SDOHelperContext;
import org.eclipse.persistence.testing.sdo.SDOTestCase;
import org.eclipse.persistence.exceptions.SDOException;
/**
* Tests validation of XML names when defining types using type helper.
*/
public class SDOTypeHelperDefineInvalidTestCases extends SDOTestCase {
private static final String VALIDATION_PROPERTY_NAME = "eclipselink.sdo.dynamic.type.names.validation";
// Lists of (some) valid characters (depending on position) valid for NCName.
//
// For reference, valid NCName is production of the following:
// Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
// NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
// NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
// Name ::= NameStartChar (NameChar)*
// NCName ::= Name - (Char* ':' Char*)
//
// Note that we need to represent characters by Strings because there are some code points
// which encode to 2 characters (surrogate pairs).
private static List<String> VALID_FIRST_CHARS = initValidFirstChars();
private static List<String> VALID_NEXT_CHARS = initValidNextChars(VALID_FIRST_CHARS);
private String systemPropertyBackup;
public SDOTypeHelperDefineInvalidTestCases(String name) {
super(name);
}
public static void main(String[] args) {
String[] arguments = { "-c", "org.eclipse.persistence.testing.sdo.helper.typehelper.define.SDOTypeHelperDefineInvalidTestCases" };
TestRunner.main(arguments);
}
@Override
public void setUp()
{
super.setUp();
systemPropertyBackup = System.getProperty(VALIDATION_PROPERTY_NAME);
if (systemPropertyBackup != null) {
System.clearProperty(VALIDATION_PROPERTY_NAME);
}
}
@Override
public void tearDown() throws Exception {
super.tearDown();
if (systemPropertyBackup == null) {
System.clearProperty(VALIDATION_PROPERTY_NAME);
} else {
System.setProperty(VALIDATION_PROPERTY_NAME, systemPropertyBackup);
}
}
public void testDefineInvalidTypeName() {
SDOHelperContext ctx = new SDOHelperContext();
DataObject typeDataObtject = ctx.getDataFactory().create(SDOConstants.SDO_URL, SDOConstants.TYPE);
typeDataObtject.set("name", "invalid due to spaces");
try {
ctx.getTypeHelper().define(typeDataObtject);
fail("IllegalArgumentException exception expected but did not occur.");
} catch (IllegalArgumentException e) {
assertNotNull("Not null cause expected.", e.getCause());
assertTrue("SDOException expected as cause.", e.getCause() instanceof SDOException);
assertEquals(SDOException.ERROR_DEFINING_TYPE_INVALID_NAME, ((SDOException)e.getCause()).getErrorCode());
}
}
public void testDefineEmptyTypeName() {
SDOHelperContext ctx = new SDOHelperContext();
DataObject typeDataObtject = ctx.getDataFactory().create(SDOConstants.SDO_URL, SDOConstants.TYPE);
typeDataObtject.set("name", "");
try {
ctx.getTypeHelper().define(typeDataObtject);
fail("IllegalArgumentException exception expected but did not occur.");
} catch (IllegalArgumentException e) {
assertNotNull("Not null cause expected.", e.getCause());
assertTrue("SDOException expected as cause.", e.getCause() instanceof SDOException);
assertEquals(SDOException.ERROR_DEFINING_TYPE_INVALID_NAME, ((SDOException)e.getCause()).getErrorCode());
}
}
public void testDefineInvalidPropertyName() {
SDOHelperContext ctx = new SDOHelperContext();
DataObject typeDataObject = ctx.getDataFactory().create(SDOConstants.SDO_URL, SDOConstants.TYPE);
typeDataObject.set("name", "ValidTypeName");
DataObject propertyDataObject = typeDataObject.createDataObject("property");
propertyDataObject.set("name", "N\u00BANF"); // invalid code point \u00BA
propertyDataObject.set("type", ctx.getTypeHelper().getType(SDOConstants.SDO_URL, SDOConstants.STRING));
try {
ctx.getTypeHelper().define(typeDataObject);
fail("IllegalArgumentException exception expected but did not occur.");
} catch (IllegalArgumentException e) {
assertNotNull("Not null cause expected.", e.getCause());
assertTrue("SDOException expected as cause.", e.getCause() instanceof SDOException);
assertEquals(SDOException.ERROR_DEFINING_PROPERTY_INVALID_NAME, ((SDOException)e.getCause()).getErrorCode());
}
}
public void testDefineInvalidPropertyTypeName() {
SDOHelperContext ctx = new SDOHelperContext();
DataObject typeDataObject = ctx.getDataFactory().create(SDOConstants.SDO_URL, SDOConstants.TYPE);
typeDataObject.set("name", "ValidPropertyName");
DataObject propertyTypeDataObject = ctx.getDataFactory().create(SDOConstants.SDO_URL, SDOConstants.TYPE);
propertyTypeDataObject.set("name", "\u036FInvalidPropertyTypeName"); // invalid code point 0x36F at index 0
DataObject propertyDataObject = typeDataObject.createDataObject("property");
propertyDataObject.set("name", "ValidPropertyName");
propertyDataObject.set("type", propertyTypeDataObject);
try {
ctx.getTypeHelper().define(typeDataObject);
fail("IllegalArgumentException exception expected but did not occur.");
} catch (IllegalArgumentException e) {
assertNotNull("Not null cause expected.", e.getCause());
assertTrue("SDOException expected as cause.", e.getCause() instanceof SDOException);
assertEquals(SDOException.ERROR_DEFINING_TYPE_INVALID_NAME, ((SDOException)e.getCause()).getErrorCode());
}
}
public void testDefineInvalidNamesWithValidationDisabled() {
System.setProperty(VALIDATION_PROPERTY_NAME, "false");
SDOHelperContext ctx = new SDOHelperContext();
DataObject typeDataObject = ctx.getDataFactory().create(SDOConstants.SDO_URL, SDOConstants.TYPE);
typeDataObject.set("name", ""); // empty is invalid
DataObject propertyTypeDataObject = ctx.getDataFactory().create(SDOConstants.SDO_URL, SDOConstants.TYPE);
propertyTypeDataObject.set("name", "\u036FInvalid\u00BAPropertyTypeName");
DataObject propertyDataObject = typeDataObject.createDataObject("property");
propertyDataObject.set("name", "Invalid Property Name");
propertyDataObject.set("type", propertyTypeDataObject);
Type type = ctx.getTypeHelper().define(typeDataObject);
assertNotNull(type);
}
public void testDefineValidNames() {
SDOHelperContext ctx = new SDOHelperContext();
DataObject typeDataObject = ctx.getDataFactory().create(SDOConstants.SDO_URL, SDOConstants.TYPE);
typeDataObject.set("name", VALID_FIRST_CHARS.get(0) + joinStrings(VALID_NEXT_CHARS));
// each valid 1st char on first position:
for (String validFirstChar : VALID_FIRST_CHARS) {
DataObject propertyDataObject = typeDataObject.createDataObject("property");
propertyDataObject.set("name", validFirstChar);
propertyDataObject.set("type", ctx.getTypeHelper().getType(SDOConstants.SDO_URL, SDOConstants.STRING));
}
Type type = ctx.getTypeHelper().define(typeDataObject);
assertNotNull(type);
}
private static List<String> initValidFirstChars() {
return Arrays.asList(
"A", "H", "Z", "_", "a", "q", "z",
"\u00C0", "\u00D0", "\u00D6",
"\u00D8", "\u00EF", "\u00F6",
"\u00F8", "\u01FF", "\u02FF",
"\u0370", "\u037A", "\u037D",
"\u037F", "\u10FF", "\u1FFF",
"\u200C", "\u200D",
"\u2070", "\u210F", "\u218F",
"\u2C00", "\u2EEE", "\u2FEF",
"\u3001", "\uD000", "\uD7FF",
"\uF900", "\uFD00", "\uFDCF",
"\uFDF0", "\uFEEE", "\uFFFD",
new StringBuilder().appendCodePoint(0x10000).toString(),
new StringBuilder().appendCodePoint(0xA0000).toString(),
new StringBuilder().appendCodePoint(0xEFFFF).toString());
}
private static List<String> initValidNextChars(List<String> validFirstChars) {
List<String> extension = Arrays.asList(
"-", ".", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"\u00B7", "\u0300", "\u0350", "\u036F", "\u203F", "\u2040");
ArrayList<String> result = new ArrayList<>(validFirstChars.size() + extension.size());
result.addAll(validFirstChars);
result.addAll(extension);
return result;
}
private static String joinStrings(List<String> strings) {
StringBuilder sb = new StringBuilder();
for(String s : strings) {
sb.append(s);
}
return sb.toString();
}
}