1dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes/*
2dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  this work for additional information regarding copyright ownership.
5dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  (the "License"); you may not use this file except in compliance with
7dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  the License.  You may obtain a copy of the License at
8dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *
9dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *
11dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  Unless required by applicable law or agreed to in writing, software
12dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  See the License for the specific language governing permissions and
15dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  limitations under the License.
16dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes */
17dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
18e5fea3d504609d22337a5311d3ce0e72314bceeeNarayan Kamathpackage org.apache.harmony.tests.java.nio;
19dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
20dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.File;
21dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.FileInputStream;
22dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.FileOutputStream;
23dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.IOException;
24dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.RandomAccessFile;
25dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.BufferUnderflowException;
26dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.ByteBuffer;
27dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.IntBuffer;
28dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.MappedByteBuffer;
29dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.FileChannel;
30dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.NonWritableChannelException;
31dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.FileChannel.MapMode;
32dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
33dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport junit.framework.TestCase;
34dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
35dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughespublic class MappedByteBufferTest extends TestCase {
36dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
37dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    File tmpFile, emptyFile;
38dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
39dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
40dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * A regression test for failing to correctly set capacity of underlying
41dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * wrapped buffer from a mapped byte buffer.
42dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
43dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testasIntBuffer() throws IOException {
44dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Map file
45dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileInputStream fis = new FileInputStream(tmpFile);
46dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileChannel fc = fis.getChannel();
47dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MappedByteBuffer mmb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc
48dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .size());
49dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int len = mmb.capacity();
50dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals("Got wrong number of bytes", 46, len); //$NON-NLS-1$
51dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
52dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Read in our 26 bytes
53dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < 26; i++) {
54dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            byte b = mmb.get();
55dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals("Got wrong byte value", (byte) 'A' + i, b); //$NON-NLS-1$
56dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
57dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
58dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Now convert to an IntBuffer to read our ints
59dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        IntBuffer ibuffer = mmb.asIntBuffer();
60dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < 5; i++) {
61dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            int val = ibuffer.get();
62dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals("Got wrong int value", i + 1, val); //$NON-NLS-1$
63dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
64dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        fc.close();
65dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
66dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
67dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
68dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Regression for HARMONY-6315 - FileChannel.map throws IOException
69dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * when called with size 0
70dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     *
71dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @throws IOException
72dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
73dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testEmptyBuffer() throws IOException {
74dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    	// Map empty file
75dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileInputStream fis = new FileInputStream(emptyFile);
76dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileChannel fc = fis.getChannel();
77dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MappedByteBuffer mmb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
78dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
79dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // check non-null
80dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull("MappedByteBuffer created from empty file should not be null",
81dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        		mmb);
82dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
83dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // check capacity is 0
84dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int len = mmb.capacity();
85dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals("MappedByteBuffer created from empty file should have 0 capacity",
86dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        		0, len);
87dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
88dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse("MappedByteBuffer from empty file shouldn't be backed by an array ",
89dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        		mmb.hasArray());
90dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
91dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try
92dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        {
93dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        	byte b = mmb.get();
94dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        	fail("Calling MappedByteBuffer.get() on empty buffer should throw a BufferUnderflowException");
95dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
96dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        catch (BufferUnderflowException e)
97dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        {
98dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        	// expected behaviour
99dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
100dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
101dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // test expected exceptions thrown
102dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try
103dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        {
104dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        	mmb = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size());
105dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        	fail("Expected NonWritableChannelException to be thrown");
106dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
107dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        catch (NonWritableChannelException e)
108dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        {
109dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        	// expected behaviour
110dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
111dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try
112dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        {
113dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        	mmb = fc.map(FileChannel.MapMode.PRIVATE, 0, fc.size());
114dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        	fail("Expected NonWritableChannelException to be thrown");
115dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
116dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        catch (NonWritableChannelException e)
117dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        {
118dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        	// expected behaviour
119dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
120dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        fc.close();
121dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
122dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
123dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
124dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests {@link java.nio.MappedByteBuffer#force()}
125dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
126dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_force() throws IOException {
127dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // buffer was not mapped in read/write mode
128dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileInputStream fileInputStream = new FileInputStream(tmpFile);
129dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileChannel fileChannelRead = fileInputStream.getChannel();
130dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MappedByteBuffer mmbRead = fileChannelRead.map(MapMode.READ_ONLY, 0,
131dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fileChannelRead.size());
132dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
133dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mmbRead.force();
134dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
135dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileInputStream inputStream = new FileInputStream(tmpFile);
136dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileChannel fileChannelR = inputStream.getChannel();
137dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MappedByteBuffer resultRead = fileChannelR.map(MapMode.READ_ONLY, 0,
138dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fileChannelR.size());
139dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
140dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        //If this buffer was not mapped in read/write mode, then invoking this method has no effect.
141dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(
142dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                "Invoking force() should have no effect when this buffer was not mapped in read/write mode",
143dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                mmbRead, resultRead);
144dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
145dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Buffer was mapped in read/write mode
146dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        RandomAccessFile randomFile = new RandomAccessFile(tmpFile, "rw");
147dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileChannel fileChannelReadWrite = randomFile.getChannel();
148dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MappedByteBuffer mmbReadWrite = fileChannelReadWrite.map(
149dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                FileChannel.MapMode.READ_WRITE, 0, fileChannelReadWrite.size());
150dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
151dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mmbReadWrite.put((byte) 'o');
152dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mmbReadWrite.force();
153dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
154dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        RandomAccessFile random = new RandomAccessFile(tmpFile, "rw");
155dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileChannel fileChannelRW = random.getChannel();
156dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MappedByteBuffer resultReadWrite = fileChannelRW.map(
157dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                FileChannel.MapMode.READ_WRITE, 0, fileChannelRW.size());
158dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
159dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Invoking force() will change the buffer
160dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(mmbReadWrite.equals(resultReadWrite));
161dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
162dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        fileChannelRead.close();
163dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        fileChannelR.close();
164dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        fileChannelReadWrite.close();
165dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        fileChannelRW.close();
166dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
167dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
168dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
169dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests {@link java.nio.MappedByteBuffer#load()}
170dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
171dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_load() throws IOException {
172dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileInputStream fileInputStream = new FileInputStream(tmpFile);
173dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileChannel fileChannelRead = fileInputStream.getChannel();
174dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MappedByteBuffer mmbRead = fileChannelRead.map(MapMode.READ_ONLY, 0,
175dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fileChannelRead.size());
176dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
177dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(mmbRead, mmbRead.load());
178dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
179dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        RandomAccessFile randomFile = new RandomAccessFile(tmpFile, "rw");
180dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileChannel fileChannelReadWrite = randomFile.getChannel();
181dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MappedByteBuffer mmbReadWrite = fileChannelReadWrite.map(
182dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                FileChannel.MapMode.READ_WRITE, 0, fileChannelReadWrite.size());
183dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
184dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(mmbReadWrite, mmbReadWrite.load());
185dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
186dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        fileChannelRead.close();
187dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        fileChannelReadWrite.close();
188dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
189dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
190dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    protected void setUp() throws IOException {
191dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Create temp file with 26 bytes and 5 ints
192dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tmpFile = File.createTempFile("harmony", "test");  //$NON-NLS-1$//$NON-NLS-2$
193dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tmpFile.deleteOnExit();
194dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileOutputStream fileOutputStream = new FileOutputStream(tmpFile);
195dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileChannel fileChannel = fileOutputStream.getChannel();
196dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(26 + 20);
197dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < 26; i++) {
198dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            byteBuffer.put((byte) ('A' + i));
199dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
200dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < 5; i++) {
201dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            byteBuffer.putInt(i + 1);
202dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
203dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byteBuffer.rewind();
204dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        fileChannel.write(byteBuffer);
205dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        fileChannel.close();
206dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        fileOutputStream.close();
207dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
208dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        emptyFile = File.createTempFile("harmony", "test");  //$NON-NLS-1$//$NON-NLS-2$
209dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        emptyFile.deleteOnExit();
210dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
211dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
212dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_position() throws IOException {
213dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        File tmp = File.createTempFile("hmy", "tmp");
214dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tmp.deleteOnExit();
215dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        RandomAccessFile f = new RandomAccessFile(tmp, "rw");
216dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileChannel ch = f.getChannel();
217dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MappedByteBuffer mbb = ch.map(MapMode.READ_WRITE, 0L, 100L);
218dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ch.close();
219dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
220dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mbb.putInt(1, 1);
221dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mbb.position(50);
222dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mbb.putInt(50);
223dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
224dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mbb.flip();
225dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mbb.get();
226dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(1, mbb.getInt());
227dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
228dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mbb.position(50);
229dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(50, mbb.getInt());
230dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
231dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes}
232