changeset 23267:345f08efb500

fixed NativeFunctionInterfaceTest for locales other than en_US.UTF-8
author Doug Simon <doug.simon@oracle.com>
date Thu, 07 Jan 2016 13:57:36 +0100
parents f78e658f5c43
children 1ced4f8e6e7f
files graal/com.oracle.nfi.test/test/com/oracle/nfi/test/NativeFunctionInterfaceTest.java
diffstat 1 files changed, 41 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.nfi.test/test/com/oracle/nfi/test/NativeFunctionInterfaceTest.java	Wed Jan 06 13:57:17 2016 -0800
+++ b/graal/com.oracle.nfi.test/test/com/oracle/nfi/test/NativeFunctionInterfaceTest.java	Thu Jan 07 13:57:36 2016 +0100
@@ -92,11 +92,21 @@
         }
     }
 
-    private static void assertCStringEquals(long cString, String s) {
-        for (int i = 0; i < s.length(); i++) {
-            assertEquals(unsafe.getByte(cString + i) & 0xFF, (byte) s.charAt(i));
+    private static String readCString(long cStringAddress) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0;; i++) {
+            char c = (char) unsafe.getByte(cStringAddress + i);
+            if (c == 0) {
+                break;
+            }
+            sb.append(c);
         }
-        assertEquals(unsafe.getByte(cString + s.length()) & 0xFF, (byte) '\0');
+        return sb.toString();
+    }
+
+    private static void assertCStringEquals(long cStringAddress, String expected) {
+        String cString = readCString(cStringAddress);
+        assertEquals(expected, cString);
     }
 
     @Test
@@ -125,8 +135,7 @@
         assumeTrue(nfi.isDefaultLibrarySearchSupported());
         String formatString = "AB %f%f";
         long formatCString = writeCString(unsafe, "AB %f%f", malloc(formatString.length() + 1));
-
-        String referenceString = "AB 1.0000001.000000";
+        String referenceString = String.format(formatString, 1.0D, 1.0D);
         int bufferLength = referenceString.length() + 1;
         long buffer = malloc(bufferLength);
 
@@ -158,22 +167,23 @@
     @Test
     public void test4() {
         assumeTrue(nfi.isDefaultLibrarySearchSupported());
-        long str = malloc(49);
+        StringBuilder formatStringBuf = new StringBuilder();
         int[] val = new int[12];
         for (int i = 0; i < 12; i++) {
-            unsafe.putByte(str + 2 * i, (byte) '%');
-            unsafe.putByte(str + 2 * i + 1, (byte) 'i');
+            formatStringBuf.append("%d");
             val[i] = i;
         }
         double[] dval = new double[12];
         for (int i = 12; i < 24; i++) {
-            unsafe.putByte(str + 2 * i, (byte) '%');
-            unsafe.putByte(str + 2 * i + 1, (byte) 'f');
+            formatStringBuf.append("%f");
             dval[i - 12] = i + 0.5;
         }
-        unsafe.putByte(str + 48, (byte) '\0');
 
-        String referenceString = "0123456789101112.50000013.50000014.50000015.50000016.50000017.50000018.50000019.50000020.500000" + "21.50000022.50000023.500000";
+        String formatString = formatStringBuf.toString();
+        long formatCString = writeCString(unsafe, formatString, malloc(formatString.length() + 1));
+
+        String referenceString = String.format(formatString, val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7], val[8], val[9], val[10], val[11], dval[0], dval[1], dval[2], dval[3],
+                        dval[4], dval[5], dval[6], dval[7], dval[8], dval[9], dval[10], dval[11]);
         int bufferLength = referenceString.length() + 1;
 
         long buffer = malloc(bufferLength);
@@ -182,8 +192,8 @@
                         int.class, int.class, int.class, int.class, int.class, double.class, double.class, double.class, double.class, double.class, double.class, double.class, double.class,
                         double.class, double.class, double.class, double.class);
 
-        int result = (int) snprintf.call(buffer, bufferLength, str, val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7], val[8], val[9], val[10], val[11], dval[0], dval[1], dval[2],
-                        dval[3], dval[4], dval[5], dval[6], dval[7], dval[8], dval[9], dval[10], dval[11]);
+        int result = (int) snprintf.call(buffer, bufferLength, formatCString, val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7], val[8], val[9], val[10], val[11], dval[0], dval[1],
+                        dval[2], dval[3], dval[4], dval[5], dval[6], dval[7], dval[8], dval[9], dval[10], dval[11]);
         assertCStringEquals(buffer, referenceString);
         Assert.assertEquals(referenceString.length(), result);
     }
@@ -191,28 +201,31 @@
     @Test
     public void test5() {
         assumeTrue(nfi.isDefaultLibrarySearchSupported());
-        long str = malloc(73);
+
+        StringBuilder formatStringBuf = new StringBuilder();
+
         int[] val = new int[12];
         for (int i = 0; i < 12; i++) {
-            unsafe.putByte(str + 2 * i, (byte) '%');
-            unsafe.putByte(str + 2 * i + 1, (byte) 'i');
+            formatStringBuf.append("%d");
             val[i] = i;
         }
         double[] dval = new double[12];
         for (int i = 12; i < 24; i++) {
-            unsafe.putByte(str + 2 * i, (byte) '%');
-            unsafe.putByte(str + 2 * i + 1, (byte) 'f');
+            formatStringBuf.append("%f");
             dval[i - 12] = i + 0.5;
         }
         char[] cval = new char[12];
         for (int i = 24; i < 36; i++) {
-            unsafe.putByte(str + 2 * i, (byte) '%');
-            unsafe.putByte(str + 2 * i + 1, (byte) 'c');
+            formatStringBuf.append("%c");
             cval[i - 24] = (char) ('a' + (i - 24));
         }
-        unsafe.putByte(str + 72, (byte) '\0');
+
+        String formatString = formatStringBuf.toString();
+        long formatCString = writeCString(unsafe, formatString, malloc(formatString.length() + 1));
 
-        String referenceString = "0123456789101112.50000013.50000014.50000015.50000016.50000017.50000018.50000019.50000020.50000021.50000022.50000023.500000abcdefghijkl";
+        String referenceString = String.format(formatString, val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7], val[8], val[9], val[10], val[11], dval[0], dval[1], dval[2], dval[3],
+                        dval[4], dval[5], dval[6], dval[7], dval[8], dval[9], dval[10], dval[11], cval[0], cval[1], cval[2], cval[3], cval[4], cval[5], cval[6], cval[7], cval[8], cval[9], cval[10],
+                        cval[11]);
         int bufferLength = referenceString.length() + 1;
 
         long buffer = malloc(bufferLength);
@@ -222,9 +235,9 @@
                         double.class, double.class, double.class, double.class, char.class, char.class, char.class, char.class, char.class, char.class, char.class, char.class, char.class, char.class,
                         char.class, char.class);
 
-        int result = (int) snprintf.call(buffer, bufferLength, str, val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7], val[8], val[9], val[10], val[11], dval[0], dval[1], dval[2],
-                        dval[3], dval[4], dval[5], dval[6], dval[7], dval[8], dval[9], dval[10], dval[11], cval[0], cval[1], cval[2], cval[3], cval[4], cval[5], cval[6], cval[7], cval[8], cval[9],
-                        cval[10], cval[11]);
+        int result = (int) snprintf.call(buffer, bufferLength, formatCString, val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7], val[8], val[9], val[10], val[11], dval[0], dval[1],
+                        dval[2], dval[3], dval[4], dval[5], dval[6], dval[7], dval[8], dval[9], dval[10], dval[11], cval[0], cval[1], cval[2], cval[3], cval[4], cval[5], cval[6], cval[7], cval[8],
+                        cval[9], cval[10], cval[11]);
         assertCStringEquals(buffer, referenceString);
         Assert.assertEquals(referenceString.length(), result);
     }
@@ -254,7 +267,7 @@
         String formatString = "AB %f%f";
         long formatCString = writeCString(unsafe, "AB %f%f", malloc(formatString.length() + 1));
 
-        String expected = "AB 1.0000001.000000";
+        String expected = String.format(formatString, 1.0D, 1.0D);
         int bufferLength = expected.length() + 1;
         byte[] buffer = new byte[bufferLength];