You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gh...@apache.org on 2006/07/10 12:16:37 UTC

svn commit: r420476 - in /incubator/harmony/enhanced/classlib/trunk/modules: luni/src/main/java/org/apache/harmony/luni/platform/ luni/src/main/native/luni/linux/ luni/src/main/native/luni/windows/ nio/src/main/java/org/apache/harmony/nio/internal/ nio...

Author: gharley
Date: Mon Jul 10 03:16:25 2006
New Revision: 420476

URL: http://svn.apache.org/viewvc?rev=420476&view=rev
Log:
HARMONY 808 : [nio] mmap native codes are not implemented in Harmony

Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/platform/OSMemory.java
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/linux/OSMemory.c
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/linux/OSMemoryLinux32.c
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/windows/OSMemory.c
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/windows/OSMemoryWin32.c
    incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/FileChannelImpl.java
    incubator/harmony/enhanced/classlib/trunk/modules/nio/src/test/java/common/org/apache/harmony/tests/java/nio/channels/FileChannelTest.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/platform/OSMemory.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/platform/OSMemory.java?rev=420476&r1=420475&r2=420476&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/platform/OSMemory.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/platform/OSMemory.java Mon Jul 10 03:16:25 2006
@@ -17,8 +17,6 @@
 
 import java.io.IOException;
 
-import org.apache.harmony.luni.util.NotYetImplementedException;
-
 
 /**
  * This class enables direct access to OS memory.
@@ -539,12 +537,11 @@
 
 	public PlatformAddress mmap(long fileDescriptor, long alignment, long size,
 			int mapMode) throws IOException {
-		throw new NotYetImplementedException();
-//		long address = mmapImpl(fileDescriptor, alignment, size, mapMode);
-//		if (address == -1) {
-//			throw new IOException();
-//		}
-//		return PlatformAddress.on(address, true);
+		long address = mmapImpl(fileDescriptor, alignment, size, mapMode);
+		if (address == -1) {
+			throw new IOException();
+		}
+		return PlatformAddress.on(address, true);
 	}
 
 	private native void unmapImpl(long addr);

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/linux/OSMemory.c
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/linux/OSMemory.c?rev=420476&r1=420475&r2=420476&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/linux/OSMemory.c (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/linux/OSMemory.c Mon Jul 10 03:16:25 2006
@@ -161,59 +161,3 @@
 {
   *(jdouble *) ((IDATA) address) = value;
 }
-
-
-/*
- * Class:     org_apache_harmony_luni_platform_OSMemory
- * Method:    unmapImpl
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_org_apache_harmony_luni_platform_OSMemory_unmapImpl
-  (JNIEnv * env, jobject thiz, jlong fd)
-{
-  PORT_ACCESS_FROM_ENV (env);
-  hymmap_unmap_file((void *)fd);
-}
-
-/*
- * Class:     org_apache_harmony_luni_platform_OSMemory
- * Method:    mmapImpl
- * Signature: (JJJI)J
- */
-JNIEXPORT jlong JNICALL Java_org_apache_harmony_luni_platform_OSMemory_mmapImpl
-  (JNIEnv * env, jobject thiz, jlong fd, jlong alignment, jlong size, jint mmode)
-{
-  PORT_ACCESS_FROM_ENV (env);
-  void *mapAddress = NULL;
-  int prot, flags;
-		  
-  // Convert from Java mapping mode to port library mapping mode.
-  switch (mmode)
-    {
-      case org_apache_harmony_luni_platform_IMemorySystem_MMAP_READ_ONLY:
-	prot = PROT_READ;
-	flags = MAP_SHARED;
-        break;
-      case org_apache_harmony_luni_platform_IMemorySystem_MMAP_READ_WRITE:
-	prot = PROT_READ|PROT_WRITE;
-	flags = MAP_SHARED;
-        break;
-      case org_apache_harmony_luni_platform_IMemorySystem_MMAP_WRITE_COPY:
-	prot = PROT_READ|PROT_WRITE;
-	flags = MAP_PRIVATE;
-        break;
-      default:
-        return -1;
-    }
-
-//TODO: how to unmap
- // mapAddress = hymmap_map_filehandler(fd, &mapAddress, mapmode, (IDATA)alignment, (IDATA)size);
-
-   mapAddress = mmap(0,size, prot, flags,fd,alignment);
-  if (mapAddress == NULL)
-    {
-      return -1;
-    }
-  return (jlong) mapAddress;
-}
-

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/linux/OSMemoryLinux32.c
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/linux/OSMemoryLinux32.c?rev=420476&r1=420475&r2=420476&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/linux/OSMemoryLinux32.c (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/linux/OSMemoryLinux32.c Mon Jul 10 03:16:25 2006
@@ -23,6 +23,7 @@
 #include <unistd.h>
 #include "vmi.h"
 #include "OSMemory.h"
+#include "IMemorySystem.h"
 
 #define	OS_JNI(func) JNICALL Java_org_apache_harmony_luni_platform_OSMemory_##func
 
@@ -101,3 +102,54 @@
   (JNIEnv * env, jobject thiz, jlong addr, jlong size){
   return msync((void *)addr, size, MS_SYNC);
 };
+
+/*
+ * Class:     org_apache_harmony_luni_platform_OSMemory
+ * Method:    unmapImpl
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_org_apache_harmony_luni_platform_OSMemory_unmapImpl
+  (JNIEnv * env, jobject thiz, jlong fd)
+{
+ //FIXME: need buffer size to unmap
+}
+
+/*
+ * Class:     org_apache_harmony_luni_platform_OSMemory
+ * Method:    mmapImpl
+ * Signature: (JJJI)J
+ */
+JNIEXPORT jlong JNICALL Java_org_apache_harmony_luni_platform_OSMemory_mmapImpl
+  (JNIEnv * env, jobject thiz, jlong fd, jlong alignment, jlong size, jint mmode)
+{
+  PORT_ACCESS_FROM_ENV (env);
+  void *mapAddress = NULL;
+  int prot, flags;
+		  
+  // Convert from Java mapping mode to port library mapping mode.
+  switch (mmode)
+    {
+      case org_apache_harmony_luni_platform_IMemorySystem_MMAP_READ_ONLY:
+	prot = PROT_READ;
+	flags = MAP_SHARED;
+        break;
+      case org_apache_harmony_luni_platform_IMemorySystem_MMAP_READ_WRITE:
+	prot = PROT_READ|PROT_WRITE;
+	flags = MAP_SHARED;
+        break;
+      case org_apache_harmony_luni_platform_IMemorySystem_MMAP_WRITE_COPY:
+	prot = PROT_READ|PROT_WRITE;
+	flags = MAP_PRIVATE;
+        break;
+      default:
+        return -1;
+    }
+
+  mapAddress = mmap(0, (size_t)(size&0x7fffffff), prot, flags,fd,(off_t)(alignment&0x7fffffff));
+  if (mapAddress == MAP_FAILED)
+    {
+      return -1;
+    }
+  return (jlong) mapAddress;
+}
+

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/windows/OSMemory.c
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/windows/OSMemory.c?rev=420476&r1=420475&r2=420476&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/windows/OSMemory.c (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/windows/OSMemory.c Mon Jul 10 03:16:25 2006
@@ -180,55 +180,3 @@
 {
   *(jdouble *) address = value;
 }
-
-/*
- * Class:     org_apache_harmony_luni_platform_OSMemory
- * Method:    unmapImpl
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_org_apache_harmony_luni_platform_OSMemory_unmapImpl
-  (JNIEnv * env, jobject thiz, jlong fd)
-{
-  PORT_ACCESS_FROM_ENV (env);
-  hymmap_unmap_file((void *)fd);
-}
-
-/*
- * Class:     org_apache_harmony_luni_platform_OSMemory
- * Method:    mmapImpl
- * Signature: (JJJI)J
- */
-JNIEXPORT jlong JNICALL Java_org_apache_harmony_luni_platform_OSMemory_mmapImpl
-  (JNIEnv * env, jobject thiz, jlong fd, jlong alignment, jlong size, jint mmode)
-{
-  PORT_ACCESS_FROM_ENV (env);
-  void *mapAddress = NULL;
-  I_32 mapmode = 0;
-
-  // Convert from Java mapping mode to port library mapping mode.
-  /* TPE - removed until portlib fixed
-    switch (mmode)
-    {
-      case org_apache_harmony_luni_platform_IMemorySystem_MMAP_READ_ONLY:
-        mapmode = HYPORT_MMAP_CAPABILITY_READ;
-        break;
-      case org_apache_harmony_luni_platform_IMemorySystem_MMAP_READ_WRITE:
-        mapmode = HYPORT_MMAP_CAPABILITY_READ|HYPORT_MMAP_CAPABILITY_WRITE;
-        break;
-      case org_apache_harmony_luni_platform_IMemorySystem_MMAP_WRITE_COPY:
-        mapmode = HYPORT_MMAP_CAPABILITY_COPYONWRITE;
-        break;
-      default:
-        return -1;
-    }
-
-     hymmap_map_filehandler((void *)fd, &mapAddress, mapmode, (IDATA)alignment, (IDATA)size);
-  */
-
-  if (mapAddress == NULL)
-    {
-      return -1;
-    }
-  
-  return (jlong) mapAddress;
-}

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/windows/OSMemoryWin32.c
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/windows/OSMemoryWin32.c?rev=420476&r1=420475&r2=420476&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/windows/OSMemoryWin32.c (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/native/luni/windows/OSMemoryWin32.c Mon Jul 10 03:16:25 2006
@@ -21,6 +21,7 @@
 #include <string.h>
 #include <windows.h>
 #include "OSMemory.h"
+#include "IMemorySystem.h"
 
 JNIEXPORT jboolean JNICALL Java_org_apache_harmony_luni_platform_OSMemory_isLittleEndianImpl
   (JNIEnv * env, jclass clazz)
@@ -93,3 +94,60 @@
     return (jint)FlushViewOfFile((void *)addr, (SIZE_T)size);
   }
 
+/*
+ * Class:     org_apache_harmony_luni_platform_OSMemory
+ * Method:    unmapImpl
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_org_apache_harmony_luni_platform_OSMemory_unmapImpl
+  (JNIEnv * env, jobject thiz, jlong fd)
+{
+  UnmapViewOfFile ((HANDLE)fd);
+}
+
+/*
+ * Class:     org_apache_harmony_luni_platform_OSMemory
+ * Method:    mmapImpl
+ * Signature: (JJJI)J
+ */
+JNIEXPORT jlong JNICALL Java_org_apache_harmony_luni_platform_OSMemory_mmapImpl
+  (JNIEnv * env, jobject thiz, jlong fd, jlong alignment, jlong size, jint mmode)
+{
+  void *mapAddress = NULL;
+  int mapmode = 0;
+  int protect = 0;
+  HANDLE mapping;
+
+  switch (mmode)
+  {
+    case org_apache_harmony_luni_platform_IMemorySystem_MMAP_READ_ONLY:
+      mapmode = FILE_MAP_READ;
+      protect = PAGE_READONLY;
+      break;
+    case org_apache_harmony_luni_platform_IMemorySystem_MMAP_READ_WRITE:
+      mapmode = FILE_MAP_WRITE;
+      protect = PAGE_READWRITE;
+      break;
+    case org_apache_harmony_luni_platform_IMemorySystem_MMAP_WRITE_COPY:
+      mapmode = FILE_MAP_COPY;
+      protect = PAGE_WRITECOPY;
+      break;
+    default:
+      return -1;
+  }
+
+  mapping = CreateFileMapping ((HANDLE)fd, NULL, protect, 0, 0, NULL);
+  if (mapping == NULL)
+    {
+      return -1;
+    }
+  mapAddress = MapViewOfFile (mapping, mapmode, (DWORD)((alignment>>0x20)&0x7fffffff), (DWORD)(alignment&0xffffffff), (SIZE_T)(size&0xffffffff));
+  CloseHandle (mapping);
+
+  if (mapAddress == NULL)
+    {
+      return -1;
+    }
+  
+  return (jlong) mapAddress;
+}

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/FileChannelImpl.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/FileChannelImpl.java?rev=420476&r1=420475&r2=420476&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/FileChannelImpl.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/FileChannelImpl.java Mon Jul 10 03:16:25 2006
@@ -188,6 +188,9 @@
 
     protected final MappedByteBuffer mapImpl(int mapMode, long position,
             long size) throws IOException {
+        if (position + size > size()) {
+            fileSystem.truncate(handle, position + size);
+        }
         long alignment = position - position % NATIVE_PAGE_SIZE;
         int offset = (int) (position - alignment);
         PlatformAddress address = memorySystem.mmap(handle, alignment, size

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio/src/test/java/common/org/apache/harmony/tests/java/nio/channels/FileChannelTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/nio/src/test/java/common/org/apache/harmony/tests/java/nio/channels/FileChannelTest.java?rev=420476&r1=420475&r2=420476&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/nio/src/test/java/common/org/apache/harmony/tests/java/nio/channels/FileChannelTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/nio/src/test/java/common/org/apache/harmony/tests/java/nio/channels/FileChannelTest.java Mon Jul 10 03:16:25 2006
@@ -21,8 +21,11 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.RandomAccessFile;
+import java.io.UnsupportedEncodingException;
+import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.nio.MappedByteBuffer;
+import java.nio.ReadOnlyBufferException;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.FileChannel;
 import java.nio.channels.FileLock;
@@ -31,13 +34,14 @@
 import java.nio.channels.OverlappingFileLockException;
 import java.nio.channels.ReadableByteChannel;
 import java.nio.channels.WritableByteChannel;
+import java.nio.channels.FileChannel.MapMode;
 import java.util.Arrays;
 
 import junit.framework.TestCase;
 
 public class FileChannelTest extends TestCase {
 
-    private static final String CONTENT = "MYTESTSTRING";
+    private static final String CONTENT = "it is content of a string for test";
 
     private static final int CONTENT_LENGTH = CONTENT.length();
 
@@ -61,6 +65,16 @@
     private FileInputStream fis;
 
     private FileLock fileLock;
+    
+    private static final byte[] TEST_BYTES;
+
+    static {
+        try {
+            TEST_BYTES = "test".getBytes("iso8859-1");
+        } catch (UnsupportedEncodingException e) {
+            throw new Error(e);
+        }
+    }
 
     protected void setUp() throws Exception {
         fileOfReadOnlyFileChannel = File.createTempFile(
@@ -506,17 +520,17 @@
         int truncateLength = CONTENT_LENGTH + 2;
         assertEquals(readWriteFileChannel, readWriteFileChannel
                 .truncate(truncateLength));
-        assertEquals(CONTENT_LENGTH, fileOfReadWriteFileChannel.length());
+        assertEquals(CONTENT_LENGTH, readWriteFileChannel.size());
 
         truncateLength = CONTENT_LENGTH;
         assertEquals(readWriteFileChannel, readWriteFileChannel
                 .truncate(truncateLength));
-        assertEquals(CONTENT_LENGTH, fileOfReadWriteFileChannel.length());
+        assertEquals(CONTENT_LENGTH, readWriteFileChannel.size());
 
         truncateLength = CONTENT_LENGTH / 2;
         assertEquals(readWriteFileChannel, readWriteFileChannel
                 .truncate(truncateLength));
-        assertEquals(truncateLength, fileOfReadWriteFileChannel.length());
+        assertEquals(truncateLength, readWriteFileChannel.size());
     }
 
     /**
@@ -971,6 +985,249 @@
         // Below assertion fails on RI. RI behaviour is counter to spec.
         assertEquals(10, f.getChannel().position());
     }
+    
+
+    /**
+     * @tests java.nio.channels.FileChannel#map(MapMode,long,long)
+     */
+    public void test_map_AbnormalMode() throws IOException {
+        try {
+            writeOnlyFileChannel.map(MapMode.READ_ONLY, 0, CONTENT_LENGTH);
+            fail("should throw NonReadableChannelException.");
+        } catch (NonReadableChannelException ex) {
+            // expected;
+        }
+        try {
+            writeOnlyFileChannel.map(MapMode.READ_WRITE, 0, CONTENT_LENGTH);
+            fail("should throw NonReadableChannelException.");
+        } catch (NonReadableChannelException ex) {
+            // expected;
+        }
+        try {
+            writeOnlyFileChannel.map(MapMode.PRIVATE, 0, CONTENT_LENGTH);
+            fail("should throw NonReadableChannelException.");
+        } catch (NonReadableChannelException ex) {
+            // expected;
+        }
+        writeOnlyFileChannel.close();
+        try {
+            writeOnlyFileChannel.map(MapMode.READ_WRITE, 0, -1);
+            fail("should throw ClosedChannelExeption.");
+        } catch (ClosedChannelException ex) {
+            // expected;
+        }
+
+        try {
+            readOnlyFileChannel.map(MapMode.READ_WRITE, 0, CONTENT_LENGTH);
+            fail("should throw NonWritableChannelException .");
+        } catch (NonWritableChannelException ex) {
+            // expected;
+        }
+        try {
+            readOnlyFileChannel.map(MapMode.PRIVATE, 0, CONTENT_LENGTH);
+            fail("should throw NonWritableChannelException .");
+        } catch (NonWritableChannelException ex) {
+            // expected;
+        }
+        try {
+            readOnlyFileChannel.map(MapMode.READ_WRITE, -1, CONTENT_LENGTH);
+            fail("should throw IAE.");
+        } catch (IllegalArgumentException ex) {
+            // expected;
+        }
+        try {
+            readOnlyFileChannel.map(MapMode.READ_WRITE, 0, -1);
+            fail("should throw IAE.");
+        } catch (IllegalArgumentException ex) {
+            // expected;
+        }
+
+        try {
+            readOnlyFileChannel.map(MapMode.READ_ONLY, 0, CONTENT_LENGTH + 1);
+            fail("should throw IOException.");
+        } catch (IOException ex) {
+            // expected;
+        }
+        try {
+            readOnlyFileChannel.map(MapMode.READ_ONLY, 2, CONTENT_LENGTH - 1);
+            fail("should throw IOException.");
+        } catch (IOException ex) {
+            // expected;
+        }
+
+        readOnlyFileChannel.close();
+        try {
+            readOnlyFileChannel.map(MapMode.READ_WRITE, 0, -1);
+            fail("should throw ClosedChannelExeption.");
+        } catch (ClosedChannelException ex) {
+            // expected;
+        }
+        try {
+            readOnlyFileChannel.map(MapMode.READ_ONLY, 2, CONTENT_LENGTH - 1);
+            fail("should throw IOException.");
+        } catch (IOException ex) {
+            // expected;
+        }
+
+        readWriteFileChannel.close();
+        try {
+            readWriteFileChannel.map(MapMode.READ_WRITE, 0, -1);
+            fail("should throw ClosedChannelExeption.");
+        } catch (ClosedChannelException ex) {
+            // expected;
+        }
+    }
+    
+    /**
+     * @tests java.nio.channels.FileChannel#map(MapMode,long,long)
+     */
+    public void test_map_ReadOnly_CloseChannel() throws IOException {
+        // close channel has no effect on map if mapped
+        assertEquals(0, readWriteFileChannel.size());
+        MappedByteBuffer mapped = readWriteFileChannel.map(MapMode.READ_ONLY,
+                0, CONTENT_LENGTH);
+        assertEquals(CONTENT_LENGTH, readWriteFileChannel.size());
+        readOnlyFileChannel.close();
+        assertEquals(CONTENT_LENGTH, mapped.limit());
+    }
+
+    /**
+     * @tests java.nio.channels.FileChannel#map(MapMode,long,long)
+     */
+    public void test_map_Private_CloseChannel() throws IOException {
+        MappedByteBuffer mapped = readWriteFileChannel.map(MapMode.PRIVATE, 0,
+                CONTENT_LENGTH);
+        readWriteFileChannel.close();
+        mapped.put(TEST_BYTES);
+        assertEquals(CONTENT_LENGTH, mapped.limit());
+        assertEquals("test".length(), mapped.position());
+    }
+
+    /**
+     * @tests java.nio.channels.FileChannel#map(MapMode,long,long)
+     */
+    public void test_map_ReadOnly() throws IOException {
+        MappedByteBuffer mapped = null;
+        // try put something to readonly map
+        writeDataToFile(fileOfReadOnlyFileChannel);
+        mapped = readOnlyFileChannel.map(MapMode.READ_ONLY, 0, CONTENT_LENGTH);
+        try {
+            mapped.put(TEST_BYTES);
+            fail("should throw ReadOnlyBufferException.");
+        } catch (ReadOnlyBufferException ex) {
+            // expected;
+        }
+        assertEquals(CONTENT_LENGTH, mapped.limit());
+        assertEquals(CONTENT_LENGTH, mapped.capacity());
+        assertEquals(0, mapped.position());
+
+        // try to get a readonly map from read/write channel
+        writeDataToFile(fileOfReadWriteFileChannel);
+        mapped = readWriteFileChannel.map(MapMode.READ_ONLY, 0, CONTENT
+                .length());
+        assertEquals(CONTENT_LENGTH, mapped.limit());
+        assertEquals(CONTENT_LENGTH, mapped.capacity());
+        assertEquals(0, mapped.position());
+
+        // map not change channel's position
+        assertEquals(0, readOnlyFileChannel.position());
+        assertEquals(0, readWriteFileChannel.position());
+    }
+
+    /**
+     * @tests java.nio.channels.FileChannel#map(MapMode,long,long)
+     */
+    public void test_map_ReadOnly_NonZeroPosition() throws IOException {
+        this.writeDataToFile(fileOfReadOnlyFileChannel);
+        MappedByteBuffer mapped = readOnlyFileChannel.map(MapMode.READ_ONLY,
+                10, CONTENT_LENGTH - 10);
+        assertEquals(CONTENT_LENGTH - 10, mapped.limit());
+        assertEquals(CONTENT_LENGTH - 10, mapped.capacity());
+        assertEquals(0, mapped.position());
+    }
+
+    /**
+     * @tests java.nio.channels.FileChannel#map(MapMode,long,long)
+     */
+    public void test_map_Private() throws IOException {
+        this.writeDataToFile(fileOfReadWriteFileChannel);
+        MappedByteBuffer mapped = readWriteFileChannel.map(MapMode.PRIVATE, 0,
+                CONTENT_LENGTH);
+        assertEquals(CONTENT_LENGTH, mapped.limit());
+        // test copy on write if private
+        ByteBuffer returnByPut = mapped.put(TEST_BYTES);
+        assertSame(returnByPut, mapped);
+        ByteBuffer checkBuffer = ByteBuffer.allocate(CONTENT_LENGTH);
+        mapped.force();
+        readWriteFileChannel.read(checkBuffer);
+        assertEquals(CONTENT, new String(checkBuffer.array(), "iso8859-1"));
+
+        // test overflow
+        try {
+            mapped.put(("test" + CONTENT).getBytes("iso8859-1"));
+            fail("should throw BufferOverflowException.");
+        } catch (BufferOverflowException ex) {
+            // expected;
+        }
+    }
+
+    /**
+     * @tests java.nio.channels.FileChannel#map(MapMode,long,long)
+     */
+    public void test_map_Private_NonZeroPosition() throws IOException {
+        MappedByteBuffer mapped = readWriteFileChannel.map(MapMode.PRIVATE, 10,
+                CONTENT_LENGTH - 10);
+        assertEquals(CONTENT_LENGTH - 10, mapped.limit());
+        assertEquals(CONTENT_LENGTH - 10, mapped.capacity());
+        assertEquals(0, mapped.position());
+    }
+
+    /**
+     * @tests java.nio.channels.FileChannel#map(MapMode,long,long)
+     */
+    public void test_map_ReadWrite() throws IOException {
+        MappedByteBuffer mapped = null;
+        writeDataToFile(fileOfReadWriteFileChannel);
+        mapped = readWriteFileChannel.map(MapMode.READ_WRITE, 0, CONTENT
+                .length());
+
+        // put something will change its channel
+        ByteBuffer returnByPut = mapped.put(TEST_BYTES);
+        assertSame(returnByPut, mapped);
+        String checkString = "test" + CONTENT.substring(4);
+        ByteBuffer checkBuffer = ByteBuffer.allocate(CONTENT_LENGTH);
+        mapped.force();
+        readWriteFileChannel.position(0);
+        readWriteFileChannel.read(checkBuffer);
+        assertEquals(checkString, new String(checkBuffer.array(), "iso8859-1"));
+
+        try {
+            mapped.put(("test" + CONTENT).getBytes("iso8859-1"));
+            fail("should throw BufferOverflowException.");
+        } catch (BufferOverflowException ex) {
+            // expected;
+        }
+    }
+
+    /**
+     * @tests java.nio.channels.FileChannel#map(MapMode,long,long)
+     */
+    public void test_map_ReadWrite_NonZeroPosition() throws IOException {
+        // test position non-zero
+        writeDataToFile(fileOfReadWriteFileChannel);
+        MappedByteBuffer mapped = readWriteFileChannel.map(MapMode.READ_WRITE,
+                10, CONTENT_LENGTH - 10);
+        assertEquals(CONTENT_LENGTH - 10, mapped.limit());
+        assertEquals(CONTENT.length() - 10, mapped.capacity());
+        assertEquals(0, mapped.position());
+        mapped.put(TEST_BYTES);
+        ByteBuffer checkBuffer = ByteBuffer.allocate(CONTENT_LENGTH);
+        readWriteFileChannel.read(checkBuffer);
+        String expected = CONTENT.substring(0, 10) + "test"
+                + CONTENT.substring(10 + "test".length());
+        assertEquals(expected, new String(checkBuffer.array(), "iso8859-1"));
+    }
+
 
     private class MockFileChannel extends FileChannel {