package org.jacorb.test.bugs.bug969; import static org.junit.Assert.assertTrue; import java.util.Properties; import org.jacorb.orb.CDRInputStream; import org.jacorb.orb.CDROutputStream; import org.jacorb.test.harness.ORBTestCase; import org.junit.Assert; import org.junit.Test; public class CodesetByteTest extends ORBTestCase { @Override protected void patchORBProperties(Properties props) throws Exception { props.setProperty("jacorb.codeset", "on"); props.setProperty("jacorb.native_char_codeset", "UTF8"); } @Test public void testCDRWith4Byte() throws Exception { CDROutputStream cdrOutputStream = new CDROutputStream(orb); // Using DESERET SMALL LETTER ER // http://www.charbase.com/10449-unicode-deseret-small-letter-er String source = "\ud801\udc49"; byte[] sourceMatch = { (byte) 0xf0, (byte) 0x90, (byte) 0x91, (byte) 0x89 }; assertTrue(length(source) == sourceMatch.length); assertTrue(length(source) == source.getBytes(getORB().getTCSDefault().getName()).length); cdrOutputStream.write_string(source); byte[] bufferCopy = cdrOutputStream.getBufferCopy(); byte[] toMatch = new byte[sourceMatch.length]; System.arraycopy(bufferCopy, 4, toMatch, 0, sourceMatch.length); assertTrue("Buffer size should be 9", bufferCopy.length == (4 + 1 + length(source))); CDRInputStream cdrin = (CDRInputStream) cdrOutputStream.create_input_stream(); String result = cdrin.read_string(); assertTrue("Strings should match", source.equals(result)); Assert.assertArrayEquals(sourceMatch, result.getBytes("utf-8")); Assert.assertArrayEquals(sourceMatch, toMatch); cdrOutputStream.close(); } /** * Return length of bytes in the given string * * http://stackoverflow.com/questions/8511490/calculating-length-in-utf-8-of * -java-string-without-actually-encoding-it * * @param sequence * @return */ public static int length(CharSequence sequence) { int count = 0; for (int i = 0, len = sequence.length(); i < len; i++) { char ch = sequence.charAt(i); if (ch <= 0x7F) { count++; } else if (ch <= 0x7FF) { count += 2; } else if (Character.isHighSurrogate(ch)) { count += 4; ++i; } else { count += 3; } } return count; } }