| /* |
| * 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.mina.common; |
| |
| import junit.framework.Assert; |
| import junit.framework.TestCase; |
| |
| import java.nio.BufferOverflowException; |
| import java.nio.ByteOrder; |
| import java.nio.ReadOnlyBufferException; |
| import java.nio.charset.CharacterCodingException; |
| import java.nio.charset.Charset; |
| import java.nio.charset.CharsetDecoder; |
| import java.nio.charset.CharsetEncoder; |
| import java.util.ArrayList; |
| import java.util.Date; |
| import java.util.List; |
| |
| /** |
| * Tests {@link ByteBuffer}. |
| * |
| * @author The Apache Directory Project (mina-dev@directory.apache.org) |
| * @version $Rev$, $Date$ |
| */ |
| public class ByteBufferTest extends TestCase |
| { |
| |
| public static void main( String[] args ) |
| { |
| junit.textui.TestRunner.run( ByteBufferTest.class ); |
| } |
| |
| protected void setUp() throws Exception |
| { |
| } |
| |
| protected void tearDown() throws Exception |
| { |
| } |
| |
| public void testAllocate() throws Exception |
| { |
| for( int i = 10; i < 1048576 * 2; i = i * 11 / 10 ) // increase by 10% |
| { |
| ByteBuffer buf = ByteBuffer.allocate( i ); |
| Assert.assertEquals( 0, buf.position() ); |
| Assert.assertEquals( buf.capacity(), buf.remaining() ); |
| Assert.assertTrue( buf.capacity() >= i ); |
| Assert.assertTrue( buf.capacity() < i * 2 ); |
| } |
| } |
| |
| public void testRelease() throws Exception |
| { |
| for( int i = 10; i < 1048576 * 2; i = i * 11 / 10 ) // increase by 10% |
| { |
| ByteBuffer buf = ByteBuffer.allocate( i ); |
| Assert.assertEquals( 0, buf.position() ); |
| Assert.assertEquals( buf.capacity(), buf.remaining() ); |
| Assert.assertTrue( buf.capacity() >= i ); |
| Assert.assertTrue( buf.capacity() < i * 2 ); |
| buf.release(); |
| } |
| } |
| |
| public void testLeakageDetection() throws Exception |
| { |
| ByteBuffer buf = ByteBuffer.allocate( 1024 ); |
| buf.release(); |
| try |
| { |
| buf.release(); |
| Assert.fail( "Releasing a buffer twice should fail." ); |
| } |
| catch( IllegalStateException e ) |
| { |
| |
| } |
| } |
| |
| public void testAcquireRelease() throws Exception |
| { |
| ByteBuffer buf = ByteBuffer.allocate( 1024 ); |
| buf.acquire(); |
| buf.release(); |
| buf.acquire(); |
| buf.acquire(); |
| buf.release(); |
| buf.release(); |
| buf.release(); |
| try |
| { |
| buf.release(); |
| Assert.fail( "Releasing a buffer twice should fail." ); |
| } |
| catch( IllegalStateException e ) |
| { |
| } |
| } |
| |
| public void testAutoExpand() throws Exception |
| { |
| ByteBuffer buf = ByteBuffer.allocate( 1 ); |
| |
| buf.put( (byte) 0 ); |
| try |
| { |
| buf.put( (byte) 0 ); |
| Assert.fail(); |
| } |
| catch( BufferOverflowException e ) |
| { |
| // ignore |
| } |
| |
| buf.setAutoExpand( true ); |
| buf.put( (byte) 0 ); |
| Assert.assertEquals( 2, buf.position() ); |
| Assert.assertEquals( 2, buf.limit() ); |
| Assert.assertEquals( 2, buf.capacity() ); |
| |
| buf.setAutoExpand( false ); |
| try |
| { |
| buf.put( 3, (byte) 0 ); |
| Assert.fail(); |
| } |
| catch( IndexOutOfBoundsException e ) |
| { |
| // ignore |
| } |
| |
| buf.setAutoExpand( true ); |
| buf.put( 3, (byte) 0 ); |
| Assert.assertEquals( 2, buf.position() ); |
| Assert.assertEquals( 4, buf.limit() ); |
| Assert.assertEquals( 4, buf.capacity() ); |
| } |
| |
| public void testAutoExpandMark() throws Exception |
| { |
| ByteBuffer buf = ByteBuffer.allocate( 4 ).setAutoExpand( true ); |
| |
| buf.put( ( byte ) 0 ); |
| buf.put( ( byte ) 0 ); |
| buf.put( ( byte ) 0 ); |
| |
| // Position should be 3 when we reset this buffer. |
| buf.mark(); |
| |
| // Overflow it |
| buf.put( ( byte ) 0 ); |
| buf.put( ( byte ) 0 ); |
| |
| Assert.assertEquals( 5, buf.position() ); |
| buf.reset(); |
| Assert.assertEquals( 3, buf.position() ); |
| } |
| |
| public void testPooledProperty() throws Exception |
| { |
| ByteBuffer buf = ByteBuffer.allocate( 16 ); |
| java.nio.ByteBuffer nioBuf = buf.buf(); |
| buf.release(); |
| buf = ByteBuffer.allocate( 16 ); |
| Assert.assertSame( nioBuf, buf.buf() ); |
| buf.setPooled( false ); |
| buf.release(); |
| Assert.assertNotSame( nioBuf, ByteBuffer.allocate( 16 ).buf() ); |
| } |
| |
| public void testGetString() throws Exception |
| { |
| ByteBuffer buf = ByteBuffer.allocate( 16 ); |
| CharsetDecoder decoder; |
| |
| Charset charset = Charset.forName( "UTF-8" ); |
| buf.clear(); |
| buf.putString( "hello", charset.newEncoder() ); |
| buf.put( (byte)0 ); |
| buf.flip(); |
| Assert.assertEquals( "hello", buf.getString( charset.newDecoder() ) ); |
| |
| buf.clear(); |
| buf.putString( "hello", charset.newEncoder() ); |
| buf.flip(); |
| Assert.assertEquals( "hello", buf.getString( charset.newDecoder() ) ); |
| |
| decoder = Charset.forName( "ISO-8859-1" ).newDecoder(); |
| buf.clear(); |
| buf.put( (byte) 'A' ); |
| buf.put( (byte) 'B' ); |
| buf.put( (byte) 'C' ); |
| buf.put( (byte) 0 ); |
| |
| buf.position( 0 ); |
| Assert.assertEquals( "ABC", buf.getString( decoder ) ); |
| Assert.assertEquals( 4, buf.position() ); |
| |
| buf.position( 0 ); |
| buf.limit( 1 ); |
| Assert.assertEquals( "A", buf.getString( decoder ) ); |
| Assert.assertEquals( 1, buf.position() ); |
| |
| buf.clear(); |
| Assert.assertEquals( "ABC", buf.getString( 10, decoder ) ); |
| Assert.assertEquals( 10, buf.position() ); |
| |
| buf.clear(); |
| Assert.assertEquals( "A", buf.getString( 1, decoder ) ); |
| Assert.assertEquals( 1, buf.position() ); |
| |
| // Test a trailing garbage |
| buf.clear(); |
| buf.put( (byte) 'A' ); |
| buf.put( (byte) 'B' ); |
| buf.put( (byte) 0 ); |
| buf.put( (byte) 'C' ); |
| buf.position( 0 ); |
| Assert.assertEquals( "AB", buf.getString( 4, decoder ) ); |
| Assert.assertEquals( 4, buf.position() ); |
| |
| buf.clear(); |
| buf.fillAndReset( buf.limit() ); |
| decoder = Charset.forName( "UTF-16" ).newDecoder(); |
| buf.put( (byte) 0 ); |
| buf.put( (byte) 'A' ); |
| buf.put( (byte) 0 ); |
| buf.put( (byte) 'B' ); |
| buf.put( (byte) 0 ); |
| buf.put( (byte) 'C' ); |
| buf.put( (byte) 0 ); |
| buf.put( (byte) 0 ); |
| |
| buf.position( 0 ); |
| Assert.assertEquals( "ABC", buf.getString( decoder ) ); |
| Assert.assertEquals( 8, buf.position() ); |
| |
| buf.position( 0 ); |
| buf.limit( 2 ); |
| Assert.assertEquals( "A", buf.getString( decoder ) ); |
| Assert.assertEquals( 2, buf.position() ); |
| |
| buf.position( 0 ); |
| buf.limit( 3 ); |
| Assert.assertEquals( "A", buf.getString( decoder ) ); |
| Assert.assertEquals( 2, buf.position() ); |
| |
| buf.clear(); |
| Assert.assertEquals( "ABC", buf.getString( 10, decoder ) ); |
| Assert.assertEquals( 10, buf.position() ); |
| |
| buf.clear(); |
| Assert.assertEquals( "A", buf.getString( 2, decoder ) ); |
| Assert.assertEquals( 2, buf.position() ); |
| |
| buf.clear(); |
| try |
| { |
| buf.getString( 1, decoder ); |
| Assert.fail(); |
| } |
| catch( IllegalArgumentException e ) |
| { |
| // ignore |
| } |
| |
| // Test getting strings from an empty buffer. |
| buf.clear(); |
| buf.limit( 0 ); |
| Assert.assertEquals( "", buf.getString( decoder ) ); |
| Assert.assertEquals( "", buf.getString( 2, decoder ) ); |
| |
| // Test getting strings from non-empty buffer which is filled with 0x00 |
| buf.clear(); |
| buf.putInt( 0 ); |
| buf.clear(); |
| buf.limit( 4 ); |
| Assert.assertEquals( "", buf.getString( decoder ) ); |
| Assert.assertEquals( 2, buf.position() ); |
| Assert.assertEquals( 4, buf.limit() ); |
| |
| buf.position( 0 ); |
| Assert.assertEquals( "", buf.getString( 2, decoder ) ); |
| Assert.assertEquals( 2, buf.position() ); |
| Assert.assertEquals( 4, buf.limit() ); |
| } |
| |
| public void testGetStringWithFailure() throws Exception |
| { |
| String test = "\u30b3\u30e1\u30f3\u30c8\u7de8\u96c6"; |
| ByteBuffer buffer = ByteBuffer.wrap( test.getBytes( "Shift_JIS" ) ); |
| |
| // Make sure the limit doesn't change when an exception arose. |
| int oldLimit = buffer.limit(); |
| int oldPos = buffer.position(); |
| try |
| { |
| buffer.getString( 3, Charset.forName( "ASCII" ).newDecoder() ); |
| Assert.fail(); |
| } |
| catch( Exception e ) |
| { |
| Assert.assertEquals( oldLimit, buffer.limit() ); |
| Assert.assertEquals( oldPos, buffer.position() ); |
| } |
| |
| try |
| { |
| buffer.getString( Charset.forName( "ASCII" ).newDecoder() ); |
| Assert.fail(); |
| } |
| catch( Exception e ) |
| { |
| Assert.assertEquals( oldLimit, buffer.limit() ); |
| Assert.assertEquals( oldPos, buffer.position() ); |
| } |
| } |
| |
| public void testPutString() throws Exception |
| { |
| CharsetEncoder encoder; |
| ByteBuffer buf = ByteBuffer.allocate( 16 ); |
| encoder = Charset.forName( "ISO-8859-1" ).newEncoder(); |
| |
| buf.putString( "ABC", encoder ); |
| Assert.assertEquals( 3, buf.position() ); |
| buf.clear(); |
| Assert.assertEquals( 'A', buf.get( 0 ) ); |
| Assert.assertEquals( 'B', buf.get( 1 ) ); |
| Assert.assertEquals( 'C', buf.get( 2 ) ); |
| |
| buf.putString( "D", 5, encoder ); |
| Assert.assertEquals( 5, buf.position() ); |
| buf.clear(); |
| Assert.assertEquals( 'D', buf.get( 0 ) ); |
| Assert.assertEquals( 0, buf.get( 1 ) ); |
| |
| buf.putString( "EFG", 2, encoder ); |
| Assert.assertEquals( 2, buf.position() ); |
| buf.clear(); |
| Assert.assertEquals( 'E', buf.get( 0 ) ); |
| Assert.assertEquals( 'F', buf.get( 1 ) ); |
| Assert.assertEquals( 'C', buf.get( 2 ) ); // C may not be overwritten |
| |
| // UTF-16: We specify byte order to omit BOM. |
| encoder = Charset.forName( "UTF-16BE" ).newEncoder(); |
| buf.clear(); |
| |
| buf.putString( "ABC", encoder ); |
| Assert.assertEquals( 6, buf.position() ); |
| buf.clear(); |
| |
| Assert.assertEquals( 0, buf.get( 0 ) ); |
| Assert.assertEquals( 'A', buf.get( 1 ) ); |
| Assert.assertEquals( 0, buf.get( 2 ) ); |
| Assert.assertEquals( 'B', buf.get( 3 ) ); |
| Assert.assertEquals( 0, buf.get( 4 ) ); |
| Assert.assertEquals( 'C', buf.get( 5 ) ); |
| |
| buf.putString( "D", 10, encoder ); |
| Assert.assertEquals( 10, buf.position() ); |
| buf.clear(); |
| Assert.assertEquals( 0, buf.get( 0 ) ); |
| Assert.assertEquals( 'D', buf.get( 1 ) ); |
| Assert.assertEquals( 0, buf.get( 2 ) ); |
| Assert.assertEquals( 0, buf.get( 3 ) ); |
| |
| buf.putString( "EFG", 4, encoder ); |
| Assert.assertEquals( 4, buf.position() ); |
| buf.clear(); |
| Assert.assertEquals( 0, buf.get( 0 ) ); |
| Assert.assertEquals( 'E', buf.get( 1 ) ); |
| Assert.assertEquals( 0, buf.get( 2 ) ); |
| Assert.assertEquals( 'F', buf.get( 3 ) ); |
| Assert.assertEquals( 0, buf.get( 4 ) ); // C may not be overwritten |
| Assert.assertEquals( 'C', buf.get( 5 ) ); // C may not be overwritten |
| |
| // Test putting an emptry string |
| buf.putString( "", encoder ); |
| Assert.assertEquals( 0, buf.position() ); |
| buf.putString( "", 4, encoder ); |
| Assert.assertEquals( 4, buf.position() ); |
| Assert.assertEquals( 0, buf.get( 0 ) ); |
| Assert.assertEquals( 0, buf.get( 1 ) ); |
| } |
| |
| public void testGetPrefixedString() throws Exception |
| { |
| ByteBuffer buf = ByteBuffer.allocate( 16 ); |
| CharsetEncoder encoder; |
| CharsetDecoder decoder; |
| encoder = Charset.forName( "ISO-8859-1" ).newEncoder(); |
| decoder = Charset.forName( "ISO-8859-1" ).newDecoder(); |
| |
| buf.putShort( ( short ) 3 ); |
| buf.putString( "ABCD", encoder ); |
| buf.clear(); |
| Assert.assertEquals( "ABC", buf.getPrefixedString( decoder ) ); |
| } |
| |
| public void testPutPrefixedString() throws Exception |
| { |
| CharsetEncoder encoder; |
| ByteBuffer buf = ByteBuffer.allocate( 16 ); |
| buf.fillAndReset( buf.remaining() ); |
| encoder = Charset.forName( "ISO-8859-1" ).newEncoder(); |
| |
| // Without autoExpand |
| buf.putPrefixedString( "ABC", encoder ); |
| Assert.assertEquals( 5, buf.position() ); |
| Assert.assertEquals( 0, buf.get( 0 ) ); |
| Assert.assertEquals( 3, buf.get( 1 ) ); |
| Assert.assertEquals( 'A', buf.get( 2 ) ); |
| Assert.assertEquals( 'B', buf.get( 3 ) ); |
| Assert.assertEquals( 'C', buf.get( 4 ) ); |
| |
| buf.clear(); |
| try |
| { |
| buf.putPrefixedString( "123456789012345", encoder ); |
| Assert.fail(); |
| } |
| catch( BufferOverflowException e ) |
| { |
| // OK |
| } |
| |
| // With autoExpand |
| buf.clear(); |
| buf.setAutoExpand( true ); |
| buf.putPrefixedString( "123456789012345", encoder ); |
| Assert.assertEquals( 17, buf.position() ); |
| Assert.assertEquals( 0, buf.get( 0 ) ); |
| Assert.assertEquals( 15, buf.get( 1 ) ); |
| Assert.assertEquals( '1', buf.get( 2 ) ); |
| Assert.assertEquals( '2', buf.get( 3 ) ); |
| Assert.assertEquals( '3', buf.get( 4 ) ); |
| Assert.assertEquals( '4', buf.get( 5 ) ); |
| Assert.assertEquals( '5', buf.get( 6 ) ); |
| Assert.assertEquals( '6', buf.get( 7 ) ); |
| Assert.assertEquals( '7', buf.get( 8 ) ); |
| Assert.assertEquals( '8', buf.get( 9 ) ); |
| Assert.assertEquals( '9', buf.get( 10 ) ); |
| Assert.assertEquals( '0', buf.get( 11 ) ); |
| Assert.assertEquals( '1', buf.get( 12 ) ); |
| Assert.assertEquals( '2', buf.get( 13 ) ); |
| Assert.assertEquals( '3', buf.get( 14 ) ); |
| Assert.assertEquals( '4', buf.get( 15 ) ); |
| Assert.assertEquals( '5', buf.get( 16 ) ); |
| } |
| |
| public void testPutPrefixedStringWithPrefixLength() throws Exception |
| { |
| CharsetEncoder encoder = Charset.forName( "ISO-8859-1" ).newEncoder(); |
| ByteBuffer buf = ByteBuffer.allocate( 16 ).sweep().setAutoExpand( true ); |
| |
| buf.putPrefixedString( "A", 1, encoder ); |
| Assert.assertEquals( 2, buf.position() ); |
| Assert.assertEquals( 1, buf.get( 0 ) ); |
| Assert.assertEquals( 'A', buf.get( 1 ) ); |
| |
| buf.sweep(); |
| buf.putPrefixedString( "A", 2, encoder ); |
| Assert.assertEquals( 3, buf.position() ); |
| Assert.assertEquals( 0, buf.get( 0 ) ); |
| Assert.assertEquals( 1, buf.get( 1 ) ); |
| Assert.assertEquals( 'A', buf.get( 2 ) ); |
| |
| buf.sweep(); |
| buf.putPrefixedString( "A", 4, encoder ); |
| Assert.assertEquals( 5, buf.position() ); |
| Assert.assertEquals( 0, buf.get( 0 ) ); |
| Assert.assertEquals( 0, buf.get( 1 ) ); |
| Assert.assertEquals( 0, buf.get( 2 ) ); |
| Assert.assertEquals( 1, buf.get( 3 ) ); |
| Assert.assertEquals( 'A', buf.get( 4 ) ); |
| } |
| |
| public void testPutPrefixedStringWithPadding() throws Exception |
| { |
| CharsetEncoder encoder = Charset.forName( "ISO-8859-1" ).newEncoder(); |
| ByteBuffer buf = ByteBuffer.allocate( 16 ).sweep().setAutoExpand( true ); |
| |
| buf.putPrefixedString( "A", 1, 2, ( byte ) 32, encoder ); |
| Assert.assertEquals( 3, buf.position() ); |
| Assert.assertEquals( 2, buf.get( 0 ) ); |
| Assert.assertEquals( 'A', buf.get( 1 ) ); |
| Assert.assertEquals( ' ', buf.get( 2 ) ); |
| |
| buf.sweep(); |
| buf.putPrefixedString( "A", 1, 4, ( byte ) 32, encoder ); |
| Assert.assertEquals( 5, buf.position() ); |
| Assert.assertEquals( 4, buf.get( 0 ) ); |
| Assert.assertEquals( 'A', buf.get( 1 ) ); |
| Assert.assertEquals( ' ', buf.get( 2 ) ); |
| Assert.assertEquals( ' ', buf.get( 3 ) ); |
| Assert.assertEquals( ' ', buf.get( 4 ) ); |
| } |
| |
| public void testWideUtf8Characters() throws Exception |
| { |
| Runnable r = new Runnable() |
| { |
| public void run() |
| { |
| ByteBuffer buffer = ByteBuffer.allocate( 1 ); |
| buffer.setAutoExpand( true ); |
| |
| Charset charset = Charset.forName( "UTF-8" ); |
| |
| CharsetEncoder encoder = charset.newEncoder(); |
| |
| for( int i = 0; i < 5; i++ ) |
| { |
| try |
| { |
| buffer.putString( "\u89d2", encoder ); |
| } |
| catch( CharacterCodingException e ) |
| { |
| fail( e.getMessage() ); |
| } |
| } |
| } |
| }; |
| |
| Thread t = new Thread( r ); |
| t.setDaemon( true ); |
| t.start(); |
| |
| for( int i = 0; i < 50; i ++ ) |
| { |
| Thread.sleep( 100 ); |
| if( !t.isAlive() ) |
| { |
| break; |
| } |
| } |
| |
| if( t.isAlive() ) |
| { |
| t.interrupt(); |
| |
| fail( "Went into endless loop trying to encode character"); |
| } |
| } |
| |
| public void testObjectSerialization() throws Exception |
| { |
| ByteBuffer buf = ByteBuffer.allocate( 16 ); |
| buf.setAutoExpand( true ); |
| List o = new ArrayList(); |
| o.add( new Date() ); |
| |
| // Test writing an object. |
| buf.putObject( o ); |
| |
| // Test reading an object. |
| buf.clear(); |
| Object o2 = buf.getObject(); |
| Assert.assertEquals( o, o2 ); |
| |
| // This assertion is just to make sure that deserialization occurred. |
| Assert.assertNotSame( o, o2 ); |
| } |
| |
| public void testSweepWithZeros() throws Exception |
| { |
| ByteBuffer buf = ByteBuffer.allocate( 4 ); |
| buf.putInt( 0xdeadbeef ); |
| buf.clear(); |
| Assert.assertEquals( 0xdeadbeef, buf.getInt() ); |
| Assert.assertEquals( 4, buf.position() ); |
| Assert.assertEquals( 4, buf.limit() ); |
| |
| buf.sweep(); |
| Assert.assertEquals( 0, buf.position() ); |
| Assert.assertEquals( 4, buf.limit() ); |
| Assert.assertEquals( 0x0, buf.getInt() ); |
| } |
| |
| public void testSweepNonZeros() throws Exception |
| { |
| ByteBuffer buf = ByteBuffer.allocate( 4 ); |
| buf.putInt( 0xdeadbeef ); |
| buf.clear(); |
| Assert.assertEquals( 0xdeadbeef, buf.getInt() ); |
| Assert.assertEquals( 4, buf.position() ); |
| Assert.assertEquals( 4, buf.limit() ); |
| |
| buf.sweep( ( byte ) 0x45 ); |
| Assert.assertEquals( 0, buf.position() ); |
| Assert.assertEquals( 4, buf.limit() ); |
| Assert.assertEquals( 0x45454545, buf.getInt() ); |
| } |
| |
| public void testWrapNioBuffer() throws Exception |
| { |
| java.nio.ByteBuffer nioBuf = java.nio.ByteBuffer.allocate( 10 ); |
| nioBuf.position( 3 ); |
| nioBuf.limit( 7 ); |
| |
| ByteBuffer buf = ByteBuffer.wrap( nioBuf ); |
| Assert.assertEquals( 3, buf.position() ); |
| Assert.assertEquals( 7, buf.limit() ); |
| Assert.assertEquals( 10, buf.capacity() ); |
| } |
| |
| public void testWrapSubArray() throws Exception |
| { |
| byte[] array = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; |
| |
| ByteBuffer buf = ByteBuffer.wrap( array, 3, 4 ); |
| Assert.assertEquals( 3, buf.position() ); |
| Assert.assertEquals( 7, buf.limit() ); |
| Assert.assertEquals( 10, buf.capacity() ); |
| |
| buf.clear(); |
| Assert.assertEquals( 0, buf.position() ); |
| Assert.assertEquals( 10, buf.limit() ); |
| Assert.assertEquals( 10, buf.capacity() ); |
| } |
| |
| public void testPoolExpiration() throws Exception |
| { |
| PooledByteBufferAllocator allocator = |
| ( PooledByteBufferAllocator ) ByteBuffer.getAllocator(); |
| |
| // Make a buffer pooled. |
| ByteBuffer buf = ByteBuffer.allocate( 16 ); |
| buf.release(); |
| |
| // Let everything flushed. |
| allocator.setTimeout( 1 ); |
| Thread.sleep( 2000 ); |
| |
| // Make sure old buffers are flushed. |
| Assert.assertNotSame( buf, ByteBuffer.allocate( 16 ) ); |
| |
| // Make sure new buffers are not flushed. |
| allocator.setTimeout( 10 ); |
| buf = ByteBuffer.allocate( 16 ); |
| buf.release(); |
| Thread.sleep( 2000 ); |
| Assert.assertSame( buf.buf(), ByteBuffer.allocate( 16 ).buf() ); |
| |
| // Return to the default settings |
| allocator.setTimeout( 60 ); |
| } |
| |
| public void testAllocatorDisposal() throws Exception |
| { |
| PooledByteBufferAllocator allocator = |
| ( PooledByteBufferAllocator ) ByteBuffer.getAllocator(); |
| |
| // dispose() should fail because the allocator is in use. |
| try |
| { |
| allocator.dispose(); |
| Assert.fail(); |
| } |
| catch( IllegalStateException e ) |
| { |
| // OK |
| } |
| |
| // Change the allocator. |
| ByteBuffer.setAllocator( new PooledByteBufferAllocator() ); |
| |
| // Dispose the old allocator. |
| allocator.dispose(); |
| |
| // Allocation request to the disposed allocator should fail. |
| try |
| { |
| allocator.allocate( 16, true ); |
| Assert.fail(); |
| } |
| catch( IllegalStateException e ) |
| { |
| // OK |
| } |
| } |
| |
| public void testDuplicate() throws Exception |
| { |
| java.nio.ByteBuffer nioBuf; |
| ByteBuffer original; |
| ByteBuffer duplicate; |
| |
| // Test if the buffer is duplicated correctly. |
| original = ByteBuffer.allocate( 16 ).sweep(); |
| nioBuf = original.buf(); |
| original.position( 4 ); |
| original.limit( 10 ); |
| duplicate = original.duplicate(); |
| original.put( 4, ( byte ) 127 ); |
| Assert.assertEquals( 4, duplicate.position() ); |
| Assert.assertEquals( 10, duplicate.limit() ); |
| Assert.assertEquals( 16, duplicate.capacity() ); |
| Assert.assertNotSame( original.buf(), duplicate.buf() ); |
| Assert.assertEquals( 127, duplicate.get( 4 ) ); |
| original.release(); |
| duplicate.release(); |
| |
| //// Check if pooled correctly. |
| original = ByteBuffer.allocate( 16 ); |
| Assert.assertSame( nioBuf, original.buf() ); |
| original.release(); |
| |
| // Try to release duplicate first. |
| original = ByteBuffer.allocate( 16 ); |
| duplicate = original.duplicate(); |
| duplicate.release(); |
| original.release(); |
| |
| //// Check if pooled correctly. |
| original = ByteBuffer.allocate( 16 ); |
| Assert.assertSame( nioBuf, original.buf() ); |
| original.release(); |
| |
| // Test a duplicate of a duplicate. |
| original = ByteBuffer.allocate( 16 ); |
| duplicate = original.duplicate(); |
| ByteBuffer anotherDuplicate = duplicate.duplicate(); |
| anotherDuplicate.release(); |
| original.release(); |
| duplicate.release(); |
| try |
| { |
| duplicate.release(); |
| Assert.fail(); |
| } |
| catch( IllegalStateException e ) |
| { |
| // OK |
| } |
| try |
| { |
| anotherDuplicate.release(); |
| Assert.fail(); |
| } |
| catch( IllegalStateException e ) |
| { |
| // OK |
| } |
| |
| //// Check if pooled correctly. |
| original = ByteBuffer.allocate( 16 ); |
| Assert.assertSame( nioBuf, original.buf() ); |
| original.release(); |
| |
| |
| |
| // Try to expand. |
| try |
| { |
| original = ByteBuffer.allocate( 16 ); |
| duplicate = original.duplicate(); |
| duplicate.setAutoExpand( true ); |
| duplicate.putString( |
| "A very very very very looooooong string", |
| Charset.forName( "ISO-8859-1" ).newEncoder() ); |
| Assert.fail(); |
| } |
| catch( IllegalStateException e ) |
| { |
| // OK |
| } |
| } |
| |
| public void testSlice() throws Exception |
| { |
| ByteBuffer original; |
| ByteBuffer slice; |
| |
| // Test if the buffer is sliced correctly. |
| original = ByteBuffer.allocate( 16 ).sweep(); |
| original.position( 4 ); |
| original.limit( 10 ); |
| slice = original.slice(); |
| original.put( 4, ( byte ) 127 ); |
| Assert.assertEquals( 0, slice.position() ); |
| Assert.assertEquals( 6, slice.limit() ); |
| Assert.assertEquals( 6, slice.capacity() ); |
| Assert.assertNotSame( original.buf(), slice.buf() ); |
| Assert.assertEquals( 127, slice.get( 0 ) ); |
| original.release(); |
| slice.release(); |
| } |
| |
| public void testReadOnlyBuffer() throws Exception |
| { |
| ByteBuffer original; |
| ByteBuffer duplicate; |
| |
| // Test if the buffer is duplicated correctly. |
| original = ByteBuffer.allocate( 16 ).sweep(); |
| original.position( 4 ); |
| original.limit( 10 ); |
| duplicate = original.asReadOnlyBuffer(); |
| original.put( 4, ( byte ) 127 ); |
| Assert.assertEquals( 4, duplicate.position() ); |
| Assert.assertEquals( 10, duplicate.limit() ); |
| Assert.assertEquals( 16, duplicate.capacity() ); |
| Assert.assertNotSame( original.buf(), duplicate.buf() ); |
| Assert.assertEquals( 127, duplicate.get( 4 ) ); |
| original.release(); |
| duplicate.release(); |
| |
| // Try to expand. |
| try |
| { |
| original = ByteBuffer.allocate( 16 ); |
| duplicate = original.asReadOnlyBuffer(); |
| duplicate.putString( |
| "A very very very very looooooong string", |
| Charset.forName( "ISO-8859-1" ).newEncoder() ); |
| Assert.fail(); |
| } |
| catch( ReadOnlyBufferException e ) |
| { |
| // OK |
| } |
| } |
| |
| public void testGetUnsigned() throws Exception |
| { |
| ByteBuffer buf = ByteBuffer.allocate( 16 ); |
| buf.put( ( byte ) 0xA4 ); |
| buf.put( ( byte ) 0xD0 ); |
| buf.put( ( byte ) 0xB3 ); |
| buf.put( ( byte ) 0xCD ); |
| buf.flip(); |
| |
| buf.order( ByteOrder.LITTLE_ENDIAN ); |
| |
| buf.mark(); |
| Assert.assertEquals( 0xA4, buf.getUnsigned() ); |
| buf.reset(); |
| Assert.assertEquals( 0xD0A4, buf.getUnsignedShort() ); |
| buf.reset(); |
| Assert.assertEquals( 0xCDB3D0A4L, buf.getUnsignedInt() ); |
| } |
| } |