Index: src/test/java/org/apache/jackrabbit/oak/plugins/name/NameValidatorTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/test/java/org/apache/jackrabbit/oak/plugins/name/NameValidatorTest.java (revision a80aafa644af318426a6b7f44b66b42875579510) +++ src/test/java/org/apache/jackrabbit/oak/plugins/name/NameValidatorTest.java (revision ) @@ -18,11 +18,13 @@ import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; import java.util.Collections; import org.apache.jackrabbit.oak.api.CommitFailedException; import org.apache.jackrabbit.oak.spi.commit.Validator; +import org.apache.jackrabbit.util.Text; import org.junit.Test; public class NameValidatorTest { @@ -66,6 +68,11 @@ } @Test + public void testSpace() throws CommitFailedException { + validator.childNodeAdded("some space", EMPTY_NODE); + } + + @Test public void testValidPrefix() throws CommitFailedException { validator.childNodeAdded("valid:name", EMPTY_NODE); } @@ -90,9 +97,66 @@ validator.childNodeAdded("name", EMPTY_NODE); } - @Test(expected = CommitFailedException.class) - public void testNameWithLineBreaks() throws Exception{ - validator.childNodeAdded("name\tx", EMPTY_NODE); + @Test + public void testForbidWhitespace() throws Exception{ + char[] whitespace = new char[] {'\t', '\n', '\r'}; + + for (char c : whitespace) { + // leading + try { + validator.childNodeAdded(c + "name", EMPTY_NODE); + fail("leading whitespace character " + toUnicode(c) + " was not prevented."); + } catch (CommitFailedException expected) {} + + // inside + try { + validator.childNodeAdded("name" + c + "name", EMPTY_NODE); + fail("inner whitespace character " + toUnicode(c) + " was not prevented."); + } catch (CommitFailedException expected) {} + + // trailing + try { + validator.childNodeAdded("name" + c, EMPTY_NODE); + fail("trailing whitespace character " + toUnicode(c) + " was not prevented."); + } catch (CommitFailedException expected) {} + } + } + + @Test + public void testAllowSpaces() throws Exception{ + char[] spaces = new char[] { + ' ', // regular space + // CJK space chars: + '\u00a0', // no-break space + '\u3000', // ideographic (full-width) space + }; + + for (char c : spaces) { + // inside: ok + validator.childNodeAdded("name" + c + "name", EMPTY_NODE); + + // leading: not allowed + try { + validator.childNodeAdded(c + "name", EMPTY_NODE); + fail("leading space character " + toUnicode(c) + " was allowed"); + } catch (CommitFailedException expected) {} + + // trailing: not allowed + try { + validator.childNodeAdded("name" + c, EMPTY_NODE); + fail("trailing space character " + toUnicode(c) + " was allowed"); + } catch (CommitFailedException expected) {} + } + } + + protected String toUnicode(char c) { + return String.format("\\u%04x", (int)c); + } + + @Test + public void testEscape() throws Exception { + String name = Text.escapeIllegalJcrChars("name\u3000foo"); + validator.childNodeAdded(name, EMPTY_NODE); } @Test