< prev index next >

test/jdk/java/foreign/TestNative.java

Print this page

  7  *  published by the Free Software Foundation.
  8  *
  9  *  This code is distributed in the hope that it will be useful, but WITHOUT
 10  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  *  version 2 for more details (a copy is included in the LICENSE file that
 13  *  accompanied this code).
 14  *
 15  *  You should have received a copy of the GNU General Public License version
 16  *  2 along with this work; if not, write to the Free Software Foundation,
 17  *  Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  *   Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  *  or visit www.oracle.com if you need additional information or have any
 21  *  questions.
 22  *
 23  */
 24 
 25 /*
 26  * @test
 27  * @enablePreview
 28  * @requires jdk.foreign.linker != "UNSUPPORTED"
 29  * @run testng/othervm --enable-native-access=ALL-UNNAMED TestNative
 30  */
 31 
 32 import java.lang.foreign.*;
 33 import java.lang.foreign.MemoryLayout.PathElement;
 34 
 35 import org.testng.annotations.DataProvider;
 36 import org.testng.annotations.Test;
 37 
 38 import java.lang.invoke.VarHandle;
 39 import java.nio.Buffer;
 40 import java.nio.ByteBuffer;
 41 import java.nio.ByteOrder;
 42 import java.nio.CharBuffer;
 43 import java.nio.DoubleBuffer;
 44 import java.nio.FloatBuffer;
 45 import java.nio.IntBuffer;
 46 import java.nio.LongBuffer;
 47 import java.nio.ShortBuffer;
 48 import java.util.function.BiConsumer;

191         assertEquals(addr.get(JAVA_INT, 0), 42);
192         freeMemory(addr);
193     }
194 
195     @Test
196     public void testBadResize() {
197         try (Arena arena = Arena.ofConfined()) {
198             MemorySegment segment = arena.allocate(4, 1);
199             assertThrows(IllegalArgumentException.class, () -> segment.reinterpret(-1));
200             assertThrows(IllegalArgumentException.class, () -> segment.reinterpret(-1, Arena.ofAuto(), null));
201         }
202     }
203 
204     static {
205         System.loadLibrary("NativeAccess");
206     }
207 
208     @DataProvider(name = "nativeAccessOps")
209     public Object[][] nativeAccessOps() {
210         Consumer<MemorySegment> byteInitializer =
211                 (base) -> initBytes(base, bytes, (addr, pos) -> byteHandle.set(addr, pos, (byte)(long)pos));
212         Consumer<MemorySegment> charInitializer =
213                 (base) -> initBytes(base, chars, (addr, pos) -> charHandle.set(addr, pos, (char)(long)pos));
214         Consumer<MemorySegment> shortInitializer =
215                 (base) -> initBytes(base, shorts, (addr, pos) -> shortHandle.set(addr, pos, (short)(long)pos));
216         Consumer<MemorySegment> intInitializer =
217                 (base) -> initBytes(base, ints, (addr, pos) -> intHandle.set(addr, pos, (int)(long)pos));
218         Consumer<MemorySegment> floatInitializer =
219                 (base) -> initBytes(base, floats, (addr, pos) -> floatHandle.set(addr, pos, (float)(long)pos));
220         Consumer<MemorySegment> longInitializer =
221                 (base) -> initBytes(base, longs, (addr, pos) -> longHandle.set(addr, pos, (long)pos));
222         Consumer<MemorySegment> doubleInitializer =
223                 (base) -> initBytes(base, doubles, (addr, pos) -> doubleHandle.set(addr, pos, (double)(long)pos));
224 
225         Consumer<MemorySegment> byteChecker =
226                 (base) -> checkBytes(base, bytes, byteHandle::get, bb -> bb, TestNative::getByteBuffer, TestNative::getByteRaw);
227         Consumer<MemorySegment> charChecker =
228                 (base) -> checkBytes(base, chars, charHandle::get, ByteBuffer::asCharBuffer, TestNative::getCharBuffer, TestNative::getCharRaw);
229         Consumer<MemorySegment> shortChecker =
230                 (base) -> checkBytes(base, shorts, shortHandle::get, ByteBuffer::asShortBuffer, TestNative::getShortBuffer, TestNative::getShortRaw);
231         Consumer<MemorySegment> intChecker =
232                 (base) -> checkBytes(base, ints, intHandle::get, ByteBuffer::asIntBuffer, TestNative::getIntBuffer, TestNative::getIntRaw);
233         Consumer<MemorySegment> floatChecker =
234                 (base) -> checkBytes(base, floats, floatHandle::get, ByteBuffer::asFloatBuffer, TestNative::getFloatBuffer, TestNative::getFloatRaw);
235         Consumer<MemorySegment> longChecker =
236                 (base) -> checkBytes(base, longs, longHandle::get, ByteBuffer::asLongBuffer, TestNative::getLongBuffer, TestNative::getLongRaw);
237         Consumer<MemorySegment> doubleChecker =
238                 (base) -> checkBytes(base, doubles, doubleHandle::get, ByteBuffer::asDoubleBuffer, TestNative::getDoubleBuffer, TestNative::getDoubleRaw);
239 
240         return new Object[][]{
241                 {byteChecker, byteInitializer, bytes},
242                 {charChecker, charInitializer, chars},
243                 {shortChecker, shortInitializer, shorts},
244                 {intChecker, intInitializer, ints},
245                 {floatChecker, floatInitializer, floats},
246                 {longChecker, longInitializer, longs},
247                 {doubleChecker, doubleInitializer, doubles}
248         };
249     }
250 
251     @DataProvider(name = "buffers")
252     public Object[][] buffers() {
253         return new Object[][] {
254                 { (Function<ByteBuffer, Buffer>)bb -> bb, 1 },
255                 { (Function<ByteBuffer, Buffer>)ByteBuffer::asCharBuffer, 2 },
256                 { (Function<ByteBuffer, Buffer>)ByteBuffer::asShortBuffer, 2 },
257                 { (Function<ByteBuffer, Buffer>)ByteBuffer::asIntBuffer, 4 },
258                 { (Function<ByteBuffer, Buffer>)ByteBuffer::asFloatBuffer, 4 },

  7  *  published by the Free Software Foundation.
  8  *
  9  *  This code is distributed in the hope that it will be useful, but WITHOUT
 10  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  *  version 2 for more details (a copy is included in the LICENSE file that
 13  *  accompanied this code).
 14  *
 15  *  You should have received a copy of the GNU General Public License version
 16  *  2 along with this work; if not, write to the Free Software Foundation,
 17  *  Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  *   Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  *  or visit www.oracle.com if you need additional information or have any
 21  *  questions.
 22  *
 23  */
 24 
 25 /*
 26  * @test


 27  * @run testng/othervm --enable-native-access=ALL-UNNAMED TestNative
 28  */
 29 
 30 import java.lang.foreign.*;
 31 import java.lang.foreign.MemoryLayout.PathElement;
 32 
 33 import org.testng.annotations.DataProvider;
 34 import org.testng.annotations.Test;
 35 
 36 import java.lang.invoke.VarHandle;
 37 import java.nio.Buffer;
 38 import java.nio.ByteBuffer;
 39 import java.nio.ByteOrder;
 40 import java.nio.CharBuffer;
 41 import java.nio.DoubleBuffer;
 42 import java.nio.FloatBuffer;
 43 import java.nio.IntBuffer;
 44 import java.nio.LongBuffer;
 45 import java.nio.ShortBuffer;
 46 import java.util.function.BiConsumer;

189         assertEquals(addr.get(JAVA_INT, 0), 42);
190         freeMemory(addr);
191     }
192 
193     @Test
194     public void testBadResize() {
195         try (Arena arena = Arena.ofConfined()) {
196             MemorySegment segment = arena.allocate(4, 1);
197             assertThrows(IllegalArgumentException.class, () -> segment.reinterpret(-1));
198             assertThrows(IllegalArgumentException.class, () -> segment.reinterpret(-1, Arena.ofAuto(), null));
199         }
200     }
201 
202     static {
203         System.loadLibrary("NativeAccess");
204     }
205 
206     @DataProvider(name = "nativeAccessOps")
207     public Object[][] nativeAccessOps() {
208         Consumer<MemorySegment> byteInitializer =
209                 (base) -> initBytes(base, bytes, (addr, pos) -> byteHandle.set(addr, 0L, pos, (byte)(long)pos));
210         Consumer<MemorySegment> charInitializer =
211                 (base) -> initBytes(base, chars, (addr, pos) -> charHandle.set(addr, 0L, pos, (char)(long)pos));
212         Consumer<MemorySegment> shortInitializer =
213                 (base) -> initBytes(base, shorts, (addr, pos) -> shortHandle.set(addr, 0L, pos, (short)(long)pos));
214         Consumer<MemorySegment> intInitializer =
215                 (base) -> initBytes(base, ints, (addr, pos) -> intHandle.set(addr, 0L, pos, (int)(long)pos));
216         Consumer<MemorySegment> floatInitializer =
217                 (base) -> initBytes(base, floats, (addr, pos) -> floatHandle.set(addr, 0L, pos, (float)(long)pos));
218         Consumer<MemorySegment> longInitializer =
219                 (base) -> initBytes(base, longs, (addr, pos) -> longHandle.set(addr, 0L, pos, (long)pos));
220         Consumer<MemorySegment> doubleInitializer =
221                 (base) -> initBytes(base, doubles, (addr, pos) -> doubleHandle.set(addr, 0L, pos, (double)(long)pos));
222 
223         Consumer<MemorySegment> byteChecker =
224                 (base) -> checkBytes(base, bytes, (addr, pos) -> byteHandle.get(addr, 0L, pos), bb -> bb, TestNative::getByteBuffer, TestNative::getByteRaw);
225         Consumer<MemorySegment> charChecker =
226                 (base) -> checkBytes(base, chars, (addr, pos) -> charHandle.get(addr, 0L, pos), ByteBuffer::asCharBuffer, TestNative::getCharBuffer, TestNative::getCharRaw);
227         Consumer<MemorySegment> shortChecker =
228                 (base) -> checkBytes(base, shorts, (addr, pos) -> shortHandle.get(addr, 0L, pos), ByteBuffer::asShortBuffer, TestNative::getShortBuffer, TestNative::getShortRaw);
229         Consumer<MemorySegment> intChecker =
230                 (base) -> checkBytes(base, ints, (addr, pos) -> intHandle.get(addr, 0L, pos), ByteBuffer::asIntBuffer, TestNative::getIntBuffer, TestNative::getIntRaw);
231         Consumer<MemorySegment> floatChecker =
232                 (base) -> checkBytes(base, floats, (addr, pos) -> floatHandle.get(addr, 0L, pos), ByteBuffer::asFloatBuffer, TestNative::getFloatBuffer, TestNative::getFloatRaw);
233         Consumer<MemorySegment> longChecker =
234                 (base) -> checkBytes(base, longs, (addr, pos) -> longHandle.get(addr, 0L, pos), ByteBuffer::asLongBuffer, TestNative::getLongBuffer, TestNative::getLongRaw);
235         Consumer<MemorySegment> doubleChecker =
236                 (base) -> checkBytes(base, doubles, (addr, pos) -> doubleHandle.get(addr, 0L, pos), ByteBuffer::asDoubleBuffer, TestNative::getDoubleBuffer, TestNative::getDoubleRaw);
237 
238         return new Object[][]{
239                 {byteChecker, byteInitializer, bytes},
240                 {charChecker, charInitializer, chars},
241                 {shortChecker, shortInitializer, shorts},
242                 {intChecker, intInitializer, ints},
243                 {floatChecker, floatInitializer, floats},
244                 {longChecker, longInitializer, longs},
245                 {doubleChecker, doubleInitializer, doubles}
246         };
247     }
248 
249     @DataProvider(name = "buffers")
250     public Object[][] buffers() {
251         return new Object[][] {
252                 { (Function<ByteBuffer, Buffer>)bb -> bb, 1 },
253                 { (Function<ByteBuffer, Buffer>)ByteBuffer::asCharBuffer, 2 },
254                 { (Function<ByteBuffer, Buffer>)ByteBuffer::asShortBuffer, 2 },
255                 { (Function<ByteBuffer, Buffer>)ByteBuffer::asIntBuffer, 4 },
256                 { (Function<ByteBuffer, Buffer>)ByteBuffer::asFloatBuffer, 4 },
< prev index next >