Fix byte ordering in ByteBufferAsXBuffer

 X: Short, Long, Double, Float, Int, Char

When a readOnlyBuffer is created from ByteBufferAsXBuffer, the order of
underlying bytebuffer is set to default(Big Endian). Therefore, when the
buffer queries the underlying bytebuffer without explicitly setting the
byteOrder, it returns result in the default order, i.e., BigEndian.

Test: cts-tradefed run cts -m CtsLibcoreTestCases \
       libcore.java.nio.BufferTest#test_ByteBufferAsXBuffer_ByteOrder

Bug: 32655865

(cherry-picked from commit cdf4dbb3c1ee370333fdfa628def46a4250c292d)

Change-Id: Iaa6fc72feb7d11bfe9c59ed2c7e00a26d31117bd
diff --git a/luni/src/test/java/libcore/java/nio/BufferTest.java b/luni/src/test/java/libcore/java/nio/BufferTest.java
index 3ef549b..9a2cb12 100644
--- a/luni/src/test/java/libcore/java/nio/BufferTest.java
+++ b/luni/src/test/java/libcore/java/nio/BufferTest.java
@@ -1365,4 +1365,68 @@
         d.put(1, (double)1);
         b.limit(0);  d.put(1, (double)1);
     }
+
+    // http://b/32655865
+    public void test_ByteBufferAsXBuffer_ByteOrder() {
+        ByteBuffer byteBuffer = ByteBuffer.allocate(10);
+        // Fill a ByteBuffer with different bytes that make it easy to tell byte ordering issues.
+        for (int i = 0; i < 10; i++) {
+            byteBuffer.put((byte)i);
+        }
+        byteBuffer.rewind();
+        // Obtain a big-endian and little-endian copy of the source array.
+        ByteBuffer bigEndian = byteBuffer.duplicate().order(ByteOrder.BIG_ENDIAN);
+        ByteBuffer littleEndian = byteBuffer.duplicate().order(ByteOrder.LITTLE_ENDIAN);
+
+        // Check each type longer than a byte to confirm the ordering differs.
+        // asXBuffer.
+        assertFalse(bigEndian.asShortBuffer().get() == littleEndian.asShortBuffer().get());
+        assertFalse(bigEndian.asIntBuffer().get() == littleEndian.asIntBuffer().get());
+        assertFalse(bigEndian.asLongBuffer().get() == littleEndian.asLongBuffer().get());
+        assertFalse(bigEndian.asDoubleBuffer().get() == littleEndian.asDoubleBuffer().get());
+        assertFalse(bigEndian.asCharBuffer().get() == littleEndian.asCharBuffer().get());
+        assertFalse(bigEndian.asFloatBuffer().get() == littleEndian.asFloatBuffer().get());
+
+        // asXBuffer().asReadOnlyBuffer()
+        assertFalse(bigEndian.asShortBuffer().asReadOnlyBuffer().get() ==
+                littleEndian.asShortBuffer().asReadOnlyBuffer().get());
+        assertFalse(bigEndian.asIntBuffer().asReadOnlyBuffer().get() ==
+                littleEndian.asIntBuffer().asReadOnlyBuffer().get());
+        assertFalse(bigEndian.asLongBuffer().asReadOnlyBuffer().get() ==
+                littleEndian.asLongBuffer().asReadOnlyBuffer().get());
+        assertFalse(bigEndian.asDoubleBuffer().asReadOnlyBuffer().get() ==
+                littleEndian.asDoubleBuffer().asReadOnlyBuffer().get());
+        assertFalse(bigEndian.asCharBuffer().asReadOnlyBuffer().get() ==
+                littleEndian.asCharBuffer().asReadOnlyBuffer().get());
+        assertFalse(bigEndian.asFloatBuffer().asReadOnlyBuffer().get() ==
+                littleEndian.asFloatBuffer().asReadOnlyBuffer().get());
+
+        // asXBuffer().duplicate()
+        assertFalse(bigEndian.asShortBuffer().duplicate().get() ==
+                littleEndian.asShortBuffer().duplicate().get());
+        assertFalse(bigEndian.asIntBuffer().duplicate().get() ==
+                littleEndian.asIntBuffer().duplicate().get());
+        assertFalse(bigEndian.asLongBuffer().duplicate().get() ==
+                littleEndian.asLongBuffer().duplicate().get());
+        assertFalse(bigEndian.asDoubleBuffer().duplicate().get() ==
+                littleEndian.asDoubleBuffer().duplicate().get());
+        assertFalse(bigEndian.asCharBuffer().duplicate().get() ==
+                littleEndian.asCharBuffer().duplicate().get());
+        assertFalse(bigEndian.asFloatBuffer().duplicate().get() ==
+                littleEndian.asFloatBuffer().duplicate().get());
+
+        // asXBuffer().slice()
+        assertFalse(bigEndian.asShortBuffer().slice().get() ==
+                littleEndian.asShortBuffer().slice().get());
+        assertFalse(bigEndian.asIntBuffer().slice().get() ==
+                littleEndian.asIntBuffer().slice().get());
+        assertFalse(bigEndian.asLongBuffer().slice().get() ==
+                littleEndian.asLongBuffer().slice().get());
+        assertFalse(bigEndian.asDoubleBuffer().slice().get() ==
+                littleEndian.asDoubleBuffer().slice().get());
+        assertFalse(bigEndian.asCharBuffer().slice().get() ==
+                littleEndian.asCharBuffer().slice().get());
+        assertFalse(bigEndian.asFloatBuffer().slice().get() ==
+                littleEndian.asFloatBuffer().slice().get());
+    }
 }
diff --git a/ojluni/src/main/java/java/nio/ByteBufferAsCharBuffer.java b/ojluni/src/main/java/java/nio/ByteBufferAsCharBuffer.java
index 0b2c18b..c94bc37 100644
--- a/ojluni/src/main/java/java/nio/ByteBufferAsCharBuffer.java
+++ b/ojluni/src/main/java/java/nio/ByteBufferAsCharBuffer.java
@@ -49,6 +49,7 @@
         if (bb instanceof DirectByteBuffer) {
             this.address = bb.address + off;
         }
+        this.bb.order(order);
         this.order = order;
         offset = off;
     }
diff --git a/ojluni/src/main/java/java/nio/ByteBufferAsDoubleBuffer.java b/ojluni/src/main/java/java/nio/ByteBufferAsDoubleBuffer.java
index 8ffbac5..f9c13fa 100644
--- a/ojluni/src/main/java/java/nio/ByteBufferAsDoubleBuffer.java
+++ b/ojluni/src/main/java/java/nio/ByteBufferAsDoubleBuffer.java
@@ -50,6 +50,7 @@
         if (bb instanceof DirectByteBuffer) {
             this.address = bb.address + off;
         }
+        this.bb.order(order);
         this.order = order;
         offset = off;
     }
diff --git a/ojluni/src/main/java/java/nio/ByteBufferAsFloatBuffer.java b/ojluni/src/main/java/java/nio/ByteBufferAsFloatBuffer.java
index dd16388..667c8bd 100644
--- a/ojluni/src/main/java/java/nio/ByteBufferAsFloatBuffer.java
+++ b/ojluni/src/main/java/java/nio/ByteBufferAsFloatBuffer.java
@@ -49,6 +49,7 @@
         if (bb instanceof DirectByteBuffer) {
             this.address = bb.address + off;
         }
+        this.bb.order(order);
         this.order = order;
         offset = off;
     }
diff --git a/ojluni/src/main/java/java/nio/ByteBufferAsIntBuffer.java b/ojluni/src/main/java/java/nio/ByteBufferAsIntBuffer.java
index 48eff4b..275f37e 100644
--- a/ojluni/src/main/java/java/nio/ByteBufferAsIntBuffer.java
+++ b/ojluni/src/main/java/java/nio/ByteBufferAsIntBuffer.java
@@ -49,6 +49,7 @@
         if (bb instanceof DirectByteBuffer) {
             this.address = bb.address + off;
         }
+        this.bb.order(order);
         this.order = order;
         offset = off;
     }
diff --git a/ojluni/src/main/java/java/nio/ByteBufferAsLongBuffer.java b/ojluni/src/main/java/java/nio/ByteBufferAsLongBuffer.java
index b2d377b..1ea65e3 100644
--- a/ojluni/src/main/java/java/nio/ByteBufferAsLongBuffer.java
+++ b/ojluni/src/main/java/java/nio/ByteBufferAsLongBuffer.java
@@ -49,6 +49,7 @@
         if (bb instanceof DirectByteBuffer) {
             this.address = bb.address + off;
         }
+        this.bb.order(order);
         this.order = order;
         offset = off;
     }
diff --git a/ojluni/src/main/java/java/nio/ByteBufferAsShortBuffer.java b/ojluni/src/main/java/java/nio/ByteBufferAsShortBuffer.java
index 6527308..90aec35 100644
--- a/ojluni/src/main/java/java/nio/ByteBufferAsShortBuffer.java
+++ b/ojluni/src/main/java/java/nio/ByteBufferAsShortBuffer.java
@@ -49,6 +49,7 @@
         if (bb instanceof DirectByteBuffer) {
             this.address = bb.address + off;
         }
+        this.bb.order(order);
         this.order = order;
         offset = off;
     }