/* * JBoss, Home of Professional Open Source. * * Copyright 2012 Red Hat, Inc. and/or its affiliates, and individual * contributors as indicated by the @author tags. * * Licensed 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.xnio; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.charset.Charset; import org.junit.Test; /** * Test for {@link ByteString}. * * @author <a href="mailto:flavia.rainone@jboss.com">Flavia Rainone</a> * */ public class ByteStringTestCase { @Test public void outOfBoundsByteString() { final byte[] bytes = "illegal".getBytes(); Exception exception = null; try { ByteString.copyOf(bytes, 2, 6); } catch (IndexOutOfBoundsException e) { exception = e; } assertNull(exception); exception = null; try { ByteString.copyOf(bytes, -2, 5); } catch (IndexOutOfBoundsException e) { exception = e; } assertNotNull(exception); exception = null; try { ByteString.copyOf(bytes, 2, -5); } catch (IllegalArgumentException e) { exception = e; } assertNotNull(exception); } @Test public void bytesRetrieval() { final ByteString byteString = ByteString.of("bytes retrieval".getBytes()); final byte[] bytes1 = byteString.getBytes(); assertEquals(15, bytes1.length); checkEqual("bytes retrieval", bytes1); final byte[] bytes2 = new byte[byteString.length()]; byteString.getBytes(bytes2); checkEqual("bytes retrieval", bytes2); final byte[] bytes3 = new byte[5]; byteString.getBytes(bytes3); checkEqual("bytes", bytes3); final byte[] bytes4 = new byte[0]; byteString.getBytes(bytes4); final byte[] bytes5 = new byte[20]; byteString.getBytes(bytes5); checkEqual("bytes retrieval", bytes5, 0); final byte[] bytes6 = new byte[10]; byteString.getBytes(bytes6, 9); assertEquals('b', bytes6[9]); final byte[] bytes7 = new byte[30]; byteString.getBytes(bytes7, 10); checkEqual("bytes retrieval", bytes7, 10); final byte[] bytes8 = new byte[15]; byteString.getBytes(bytes8, 3, 6); checkEqual("bytes ", bytes8, 3); } @Test public void substring() throws UnsupportedEncodingException { final ByteString byteString = ByteString.getBytes("abcdeftextghijk", Charset.defaultCharset()); assertEquals("abcdeftextghijk", byteString.toString("UTF-8")); assertEquals(15, byteString.length()); final ByteString byteStringSuffix = byteString.substring(6); assertEquals("textghijk", byteStringSuffix.toString("UTF-8")); assertEquals(9, byteStringSuffix.length()); final ByteString byteStringInnerText = byteString.substring(6, 4); assertEquals("text", byteStringInnerText.toString("UTF-8")); assertEquals(4, byteStringInnerText.length()); IndexOutOfBoundsException expected = null; try { byteString.substring(5, 11); } catch (IndexOutOfBoundsException e) { expected = e; } assertNotNull(expected); } @Test public void compareTo() { final ByteString byteString1 = ByteString.getBytes("abcde", Charset.defaultCharset()); final ByteString byteString2 = ByteString.getBytes("abcde", Charset.defaultCharset()); assertEquals(0, byteString1.compareTo(byteString1)); assertEquals(0, byteString2.compareTo(byteString2)); assertEquals(0, byteString1.compareTo(byteString2)); assertEquals(0, byteString2.compareTo(byteString1)); final ByteString byteString3 = ByteString.getBytes("abcdefgh", Charset.defaultCharset()); assertTrue(byteString3.compareTo(byteString1) > 0); assertTrue(byteString1.compareTo(byteString3) < 0); final ByteString byteString4 = ByteString.getBytes("fghij", Charset.defaultCharset()); assertTrue(byteString4.compareTo(byteString1) > 0); assertTrue(byteString1.compareTo(byteString4) < 0); assertTrue(byteString3.compareTo(byteString4) < 0); assertTrue(byteString4.compareTo(byteString3) > 0); } @Test public void equality() throws UnsupportedEncodingException { final ByteBuffer byteBuffer = ByteBuffer.allocate(5); byteBuffer.put("abcde".getBytes()).flip(); final ByteString[] equalByteStrings = { ByteString.of("abcde".getBytes()), ByteString.copyOf("abcde".getBytes(), 0, 5), ByteString.copyOf("#@$abcde".getBytes(), 3, 5), ByteString.copyOf("abcdefghij".getBytes(), 0, 5), ByteString.copyOf("12345abcde67890".getBytes(), 5, 5), ByteString.getBytes("abcde", "UTF-8"), ByteString.getBytes("abcde", Charset.defaultCharset()), ByteString.getBytes(byteBuffer), null, null, null}; byteBuffer.limit(4); byteBuffer.position(0); final ByteString[] differentByteStrings = {ByteString.of("abcdef".getBytes()), ByteString.of("xyzabcde".getBytes()), ByteString.of("yzabcdefg".getBytes()), ByteString.copyOf(new byte[0], 0, 0), ByteString.getBytes("12345", "UTF-8"), ByteString.getBytes("abcda", Charset.defaultCharset()), ByteString.getBytes(byteBuffer)}; // "abcd" equalByteStrings[8] = differentByteStrings[0].substring(0, 5); equalByteStrings[9] = differentByteStrings[1].substring(3); equalByteStrings[10] = differentByteStrings[2].substring(2, 5); checkAllAreEqual(equalByteStrings); for (ByteString byteString: differentByteStrings) { checkAllAreNotEqual(byteString, differentByteStrings); } assertFalse(equalByteStrings[0].equals("abcde")); } @Test public void readAndWriteByteString() throws IOException, ClassNotFoundException { final ByteString byteString1 = ByteString.getBytes("", Charset.defaultCharset()); final ByteString byteString2 = ByteString.getBytes("read me", Charset.defaultCharset()); final ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream(); final ObjectOutput output = new ObjectOutputStream(new BufferedOutputStream(byteOutputStream)); try{ output.writeObject(byteString1); output.writeObject(byteString2); } finally{ output.close(); } final ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteOutputStream.toByteArray()); final ObjectInput input = new ObjectInputStream(new BufferedInputStream(byteInputStream)); final ByteString recoveredByteString1, recoveredByteString2; try{ recoveredByteString1 = (ByteString) input.readObject(); recoveredByteString2 = (ByteString) input.readObject(); } finally{ input.close(); } assertEquals(byteString1, recoveredByteString1); assertEquals(byteString2, recoveredByteString2); } private static void checkEqual(String message, byte[] bytes) { assertArrayEquals(bytes, message.getBytes()); } private static void checkEqual(String message, byte[] bytes, int offset) { String finalMessage = ""; for (int i = 0; i < offset; i++) { finalMessage += '\0'; } finalMessage += message; for (int i = offset + message.length(); i < bytes.length; i++) { finalMessage += '\0'; } checkEqual(finalMessage, bytes); } private void checkAllAreEqual(ByteString...byteStrings) { for (ByteString byteString: byteStrings) { for (ByteString compareTo: byteStrings) { assertEquals(byteString, compareTo); // two calls to hashCode must return the same result assertEquals(byteString.hashCode(), byteString.hashCode()); assertEquals(compareTo.hashCode(), compareTo.hashCode()); // if byteString equals to compareTo, they must have the same hashCode assertEquals(byteString.hashCode(), compareTo.hashCode()); } } } private void checkAllAreNotEqual(ByteString firstByteString, ByteString...byteStrings) { ByteString byteString = firstByteString; int i = -1; do { for (ByteString compareTo: byteStrings) { if (byteString != compareTo) { assertFalse(byteString.toString() + " is equal to " + compareTo, byteString.equals((Object)compareTo)); assertFalse(byteString.toString() + " is equal to " + compareTo, byteString.equals(compareTo)); // two calls to hashCode must return the same result assertEquals(byteString.hashCode(), byteString.hashCode()); assertEquals(compareTo.hashCode(), compareTo.hashCode()); } } } while(++i < byteStrings.length && (byteString = byteStrings[i]) != null); } }