package org.jacorb.test.orb; /* * JacORB - a free Java ORB * * Copyright (C) 2000-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.jacorb.orb.CDRInputStream; import org.jacorb.orb.CodeSet; import org.jacorb.test.harness.ORBTestCase; import org.junit.Test; import org.omg.CORBA.MARSHAL; /** * @author <a href="mailto:russell.gold@oracle.com">Russell Gold</a> */ public class CDRInputStreamTest extends ORBTestCase { /** * Verifies that the default encoding (ISO8859_1) works for char, char arrays, and strings. Reading the string * forces alignment of the 4-byte length, and ignores any null terminator. */ @Test public void testDefaultEncodingChar() throws Exception { byte[] codedText = {'a', 's', 'd', 'f', 'x', 'y', 'z', '*', 0, 0, 0, 5, 'C', 'A', 'F', 'E', 0}; CDRInputStream stream = new CDRInputStream( orb, codedText ); assertEquals( "char 1", 'a', stream.read_char() ); assertEquals( "char 2", 's', stream.read_char() ); assertEquals( "char 3", 'd', stream.read_char() ); assertEquals( "char 4", 'f', stream.read_char() ); char[] buffer = new char[4]; buffer[0] = 'w'; stream.read_char_array( buffer, 1, 3 ); assertEquals( "char array", "wxyz", new String( buffer ) ); assertEquals( "string value", "CAFE", stream.read_string() ); stream.close(); } /** * Verifies that the default encoding (UTF-16) works for wchar, wchar arrays, and wstrings * with no byte-order-marker. Reading the wstring * forces alignment of the 4-byte length. */ @Test public void testDefaultEncodingWChar() throws Exception { byte[] codedText = {2, 0x5, (byte) (0xD0 & 0xff), // Hebrew letter aleph 2, 0x30, 0x51, // Hiragana syllable ha 2, 0x30, 0x74, // Hiragana syllable pi 2, // Hebrew letter beis: length byte (byte) (0xFE & 0xff), // Big-endian indicator (byte) (0xFF & 0xff), 0x5, (byte) (0xD1 & 0xff), // UTF16 encoding (big-endian) 2, // Hebrew letter gimmel: length byte (byte) (0xFF & 0xff), // Little-endian indicator (byte) (0xFE & 0xff), (byte) (0xD2 & 0xff), 0x5, // UTF16 encoding (little-endian) 2, 0x5, (byte) (0xD3 & 0xff), // Hebrew letter dalet 45, 23, // bytes ignored by 'long' alignment 0, 0, 0, 8, // string length in bytes, not chars 0x30, (byte) (0xDF & 0xff), // Mitsubishi, in Katakana 0x30, (byte) (0xC4 & 0xff), 0x30, (byte) (0xFA & 0xff), 0x30, (byte) (0xB7 & 0xff), }; CDRInputStream stream = new CDRInputStream( orb, codedText ); assertEquals( "wchar 1", '\u05D0', stream.read_wchar() ); assertEquals( "wchar 2", '\u3051', stream.read_wchar() ); assertEquals( "wchar 3", '\u3074', stream.read_wchar() ); char[] buffer = new char[4]; buffer[0] = '\u05D0'; stream.read_wchar_array( buffer, 1, 3 ); assertEquals( "wchar array", "\u05D0\u05D1\u05D2\u05D3", new String( buffer ) ); assertEquals( "wstring value", "\u30DF\u30C4\u30FA\u30B7", stream.read_wstring() ); stream.close(); } /** * Verifies that the default encoding (UTF-16) works for wstrings in giop 1.1, which uses the length * indicator to specify the number of characters rather than bytes and require a two-byte null terminator. * Wide characters in 1.1 do not take width bytes */ @Test public void testDefaultEncodingWCharGiop1_1() throws Exception { byte[] codedText = {0, 0, 0, 5, // string length in bytes, not chars 0x30, (byte) (0xDF & 0xff), // Mitsubishi, in Katakana 0x30, (byte) (0xC4 & 0xff), 0x30, (byte) (0xFA & 0xff), 0x30, (byte) (0xB7 & 0xff), 0, 0, // two-byte null terminator 0x5, (byte) (0xD1 & 0xff), // Hebrew letter beis }; CDRInputStream stream = new CDRInputStream( orb, codedText ); stream.setGIOPMinor( 1 ); assertEquals( "wstring value", "\u30DF\u30C4\u30FA\u30B7", stream.read_wstring() ); assertEquals( "wchar 1", '\u05D1', stream.read_wchar() ); stream.close(); } /** * Verifies that the UTF-8 encoding works for strings in giop 1.1. */ @Test public void testUTF8EncodingCharGiop1_1() throws Exception { byte[] codedText = {0, 0, 0, 5, // string length in bytes, including null pointer 'a', 's', 'd', 'f', 0, // one-byte null terminator 'x' }; CDRInputStream stream = new CDRInputStream( orb, codedText ); selectCodeSets( stream, "UTF8", "UTF8" ); stream.setGIOPMinor( 1 ); assertEquals( "sstring value", "asdf", stream.read_string() ); assertEquals( "char 1", 'x', stream.read_char() ); stream.close(); } /** * Verifies that the UTF-8 works for wchar, wchar arrays, and wstrings. Reading the wstring * forces alignment of the 4-byte length. Note that byte-ordering is fixed by the encoding. */ @Test public void testUTF8EncodingWChar() throws Exception { byte[] codedText = {1, 'x', // Latin-l lowercase x 2, (byte) (0xD7 & 0xff), (byte) (0x90 & 0xff), // Hebrew letter aleph 3, (byte) (0xE3 & 0xff), (byte) (0x81 & 0xff), (byte) (0x91 & 0xff), // Hiragana syllable ha 3, (byte) (0xE3 & 0xff), (byte) (0x81 & 0xff), (byte) (0xB4 & 0xff), // Hiragana syllable pi 2, (byte) (0xD7 & 0xff), (byte) (0x91 & 0xff), // Hebrew letter beis 2, (byte) (0xD7 & 0xff), (byte) (0x92 & 0xff), // Hebrew letter gimmel 2, (byte) (0xD7 & 0xff), (byte) (0x93 & 0xff), // Hebrew letter dalet 45, 73, // bytes ignored by 'long' alignment 0, 0, 0, 12, // string length in bytes, not chars (byte) (0xE3 & 0xff), (byte) (0x83 & 0xff), (byte) (0x9F & 0xff), // Mitsubishi, in Katakana (byte) (0xE3 & 0xff), (byte) (0x83 & 0xff), (byte) (0x84 & 0xff), (byte) (0xE3 & 0xff), (byte) (0x83 & 0xff), (byte) (0xBA & 0xff), (byte) (0xE3 & 0xff), (byte) (0x82 & 0xff), (byte) (0xB7 & 0xff), }; CDRInputStream stream = new CDRInputStream( orb, codedText ); selectCodeSets( stream, "ISO8859_1", "UTF8" ); assertEquals( "wchar 1", 'x', stream.read_wchar() ); assertEquals( "wchar 2", '\u05D0', stream.read_wchar() ); assertEquals( "wchar 3", '\u3051', stream.read_wchar() ); assertEquals( "wchar 4", '\u3074', stream.read_wchar() ); char[] buffer = new char[4]; buffer[0] = '\u05D0'; stream.read_wchar_array( buffer, 1, 3 ); assertEquals( "wchar array", "\u05D0\u05D1\u05D2\u05D3", new String( buffer ) ); assertEquals( "wstring value", "\u30DF\u30C4\u30FA\u30B7", stream.read_wstring() ); stream.close(); } private void selectCodeSets( CDRInputStream stream, String charCodeSet, String wideCharCodeSet ) { stream.setCodeSet( CodeSet.getCodeSet( charCodeSet ), CodeSet.getCodeSet( wideCharCodeSet ) ); } @Test public void testFailOnNullEncodedString() throws Exception { byte[] codedText = {0,0,0,0}; CDRInputStream stream = new CDRInputStream( orb, codedText ); try { stream.read_string(); fail("Null encoded string should have failed with an exception"); } catch (MARSHAL e) { assertNotNull(e.getMessage()); assertTrue("Not a MARSHALL exception: " + e.getMessage(), e.getMessage().matches("^.*invalid string size: 0.*$")); } finally { stream.close(); } } }