This is an automated email from the ASF dual-hosted git repository. reschke pushed a commit to branch OAK-12082 in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
commit 0932df92054cffa490650efcf2e71e759fb54458 Author: Julian Reschke <[email protected]> AuthorDate: Thu Jan 29 17:09:52 2026 +0100 OAK-12082: add test coverage for org.apache.jackrabbit.oak.jcr.xml.BufferedStringValue --- .../oak/jcr/xml/BufferedStringValueTest.java | 271 +++++++++++++++++++++ 1 file changed, 271 insertions(+) diff --git a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/xml/BufferedStringValueTest.java b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/xml/BufferedStringValueTest.java new file mode 100644 index 0000000000..9a134cf80d --- /dev/null +++ b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/xml/BufferedStringValueTest.java @@ -0,0 +1,271 @@ +/* + * 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. + */ +package org.apache.jackrabbit.oak.jcr.xml; + +import org.apache.jackrabbit.oak.api.Type; +import org.apache.jackrabbit.util.Base64; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import javax.jcr.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.Calendar; + +import static org.junit.Assert.assertEquals; + +public class BufferedStringValueTest { + + private BufferedStringValue bufferedStringValue; + + // minimal for test usage + private ValueFactory vf = new ValueFactory() { + @Override + public Value createValue(String s) { + return null; + } + + @Override + public Value createValue(String s, int i) throws ValueFormatException { + return null; + } + + @Override + public Value createValue(long l) { + return null; + } + + @Override + public Value createValue(double v) { + return null; + } + + @Override + public Value createValue(BigDecimal bigDecimal) { + return null; + } + + @Override + public Value createValue(boolean b) { + return null; + } + + @Override + public Value createValue(Calendar calendar) { + return null; + } + + @Override + public Value createValue(InputStream inputStream) { + try { + byte[] data = inputStream.readAllBytes(); + return new Value() { + @Override + public String getString() throws ValueFormatException, IllegalStateException, RepositoryException { + return new String(data, StandardCharsets.UTF_8); + } + + @Override + public InputStream getStream() throws RepositoryException { + return new ByteArrayInputStream(data); + } + + @Override + public Binary getBinary() throws RepositoryException { + return null; + } + + @Override + public long getLong() throws ValueFormatException, RepositoryException { + return 0; + } + + @Override + public double getDouble() throws ValueFormatException, RepositoryException { + return 0; + } + + @Override + public BigDecimal getDecimal() throws ValueFormatException, RepositoryException { + return null; + } + + @Override + public Calendar getDate() throws ValueFormatException, RepositoryException { + return null; + } + + @Override + public boolean getBoolean() throws ValueFormatException, RepositoryException { + return false; + } + + @Override + public int getType() { + return 0; + } + }; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public Value createValue(Binary binary) { + return null; + } + + @Override + public Value createValue(Node node) throws RepositoryException { + return null; + } + + @Override + public Value createValue(Node node, boolean b) throws RepositoryException { + return null; + } + + @Override + public Binary createBinary(InputStream inputStream) throws RepositoryException { + return null; + } + }; + + + @Before + public void setUp() throws Exception { + bufferedStringValue = new BufferedStringValue(vf, null, false); + } + + @After + public void shutdown() throws Exception { + bufferedStringValue.dispose(); + } + + @Test + public void length() throws IOException { + String s = "Hello, World!"; + bufferedStringValue.append(s.toCharArray(), 0, s.length()); + assertEquals(s.length(), bufferedStringValue.length()); + } + + @Test + public void getString() throws IOException { + String s = "foobar"; + bufferedStringValue.append(s.toCharArray(), 0, s.length()); + assertEquals(s, bufferedStringValue.getString()); + } + + @Test + public void getStringBase64() throws IOException { + bufferedStringValue.dispose(); + // with base64 + bufferedStringValue = new BufferedStringValue(null, null, true); + String s = "Zm9vYg=="; + bufferedStringValue.append(s.toCharArray(), 0, s.length()); + assertEquals("foob", bufferedStringValue.getString()); + } + + @Test + public void getStringBase64NoPadding() throws IOException { + bufferedStringValue.dispose(); + // with base64 + bufferedStringValue = new BufferedStringValue(null, null, true); + String s = "Zm9vYg"; + bufferedStringValue.append(s.toCharArray(), 0, s.length()); + // BUG in Base64 class! + assertEquals(Base64.decode(s), bufferedStringValue.getString()); + } + + @Test + public void reader() throws IOException { + String s = "Hello, World!"; + bufferedStringValue.append(s.toCharArray(), 0, s.length()); + Reader reader = bufferedStringValue.reader(); + char[] chars = new char[s.length()]; + reader.read(chars); + assertEquals(s, String.valueOf(chars)); + } + + @Test + public void testBigAsString() throws IOException { + StringBuilder sb = new StringBuilder(); + String s = "Hello, World!"; + int limit = 1014 * 1024; // 1M + while (sb.length() < limit) { + sb.append(s); + } + String test = sb.toString(); + bufferedStringValue.append(test.toCharArray(), 0, test.length()); + assertEquals(test, bufferedStringValue.getString()); + } + + @Test + public void testBigAsReader() throws IOException { + StringBuilder sb = new StringBuilder(); + String s = "Hello, World!"; + int limit = 1014 * 1024; // 1M + while (sb.length() < limit) { + sb.append(s); + } + String test = sb.toString(); + bufferedStringValue.append(test.toCharArray(), 0, test.length()); + assertEquals(test, bufferedStringValue.getString()); + + Reader reader = bufferedStringValue.reader(); + char[] chars = new char[test.length()]; + reader.read(chars); + assertEquals(test, String.valueOf(chars)); + } + + @Test + public void testBase64Big() throws IOException { + bufferedStringValue.dispose(); + // with base64 + bufferedStringValue = new BufferedStringValue(null, null, true); + StringBuilder sb = new StringBuilder(); + String s = "Foo Bar Qux"; + int limit = 1014 * 1024; // 1M + while (sb.length() < limit) { + sb.append(s); + } + String test = java.util.Base64.getEncoder().encodeToString(sb.toString().getBytes()); + bufferedStringValue.append(test.toCharArray(), 0, test.length()); + assertEquals(sb.toString(), bufferedStringValue.getString()); + } + + @Test + public void testBigAsValue() throws IOException, RepositoryException { + // with base64 + bufferedStringValue = new BufferedStringValue(vf, null, true); + StringBuilder sb = new StringBuilder(); + String s = "Foo Bar Qux"; + int limit = 1014 * 1024; // 1M + while (sb.length() < limit) { + sb.append(s); + } + String test = java.util.Base64.getEncoder().encodeToString(sb.toString().getBytes()); + bufferedStringValue.append(test.toCharArray(), 0, test.length()); + Value x = bufferedStringValue.getValue(PropertyType.BINARY); + assertEquals(sb.toString(), x.getString()); + } +} \ No newline at end of file
