1 /*
   2  * Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   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 /* Type-specific source code for unit test
  25  *
  26  * Regenerate the BasicX classes via genBasic.sh whenever this file changes.
  27  * We check in the generated source files so that the test tree can be used
  28  * independently of the rest of the source tree.
  29  */
  30 
  31 // -- This file was mechanically generated: Do not edit! -- //
  32 
  33 
  34 import java.io.IOException;
  35 import java.io.UncheckedIOException;
  36 
  37 import java.nio.*;
  38 
  39 import java.nio.channels.FileChannel;
  40 import java.nio.file.Files;
  41 import java.nio.file.Path;
  42 import java.util.Random;
  43 
  44 
  45 
  46 public class BasicByte
  47     extends Basic
  48 {
  49 
  50     private static final byte[] VALUES = {
  51         Byte.MIN_VALUE,
  52         (byte) -1,
  53         (byte) 0,
  54         (byte) 1,
  55         Byte.MAX_VALUE,
  56 
  57 
  58 
  59 
  60 
  61 
  62 
  63 
  64 
  65 
  66 
  67 
  68     };
  69 
  70     private static void relGet(ByteBuffer b) {
  71         int n = b.capacity();
  72         for (int i = 0; i < n; i++)
  73             ck(b, (long)b.get(), (long)((byte)ic(i)));
  74         b.rewind();
  75     }
  76 
  77     private static void relGet(ByteBuffer b, int start) {
  78         int n = b.remaining();
  79         for (int i = start; i < n; i++)
  80             ck(b, (long)b.get(), (long)((byte)ic(i)));
  81         b.rewind();
  82     }
  83 
  84     private static void absGet(ByteBuffer b) {
  85         int n = b.capacity();
  86         for (int i = 0; i < n; i++)
  87             ck(b, (long)b.get(), (long)((byte)ic(i)));
  88         b.rewind();
  89     }
  90 
  91     private static void bulkGet(ByteBuffer b) {
  92         int n = b.capacity();
  93         byte[] a = new byte[n + 7];
  94         b.get(a, 7, n);
  95         for (int i = 0; i < n; i++) {
  96             ck(b, (long)a[i + 7], (long)((byte)ic(i)));
  97         }
  98     }
  99 
 100     private static void absBulkGet(ByteBuffer b) {
 101         int n = b.capacity();
 102         int len = n - 7*2;
 103         byte[] a = new byte[n + 7];
 104         b.position(42);
 105         b.get(7, a, 7, len);
 106         ck(b, b.position() == 42);
 107         for (int i = 0; i < len; i++) {
 108             ck(b, (long)a[i + 7], (long)((byte)ic(i)));
 109         }
 110     }
 111 
 112     private static void relPut(ByteBuffer b) {
 113         int n = b.capacity();
 114         b.clear();
 115         for (int i = 0; i < n; i++)
 116             b.put((byte)ic(i));
 117         b.flip();
 118     }
 119 
 120     private static void absPut(ByteBuffer b) {
 121         int n = b.capacity();
 122         b.clear();
 123         for (int i = 0; i < n; i++)
 124             b.put(i, (byte)ic(i));
 125         b.limit(n);
 126         b.position(0);
 127     }
 128 
 129     private static void bulkPutArray(ByteBuffer b) {
 130         int n = b.capacity();
 131         b.clear();
 132         byte[] a = new byte[n + 7];
 133         for (int i = 0; i < n; i++)
 134             a[i + 7] = (byte)ic(i);
 135         b.put(a, 7, n);
 136         b.flip();
 137     }
 138 
 139     private static void bulkPutBuffer(ByteBuffer b) {
 140         int n = b.capacity();
 141         b.clear();
 142         ByteBuffer c = ByteBuffer.allocate(n + 7);
 143         c.position(7);
 144         for (int i = 0; i < n; i++)
 145             c.put((byte)ic(i));
 146         c.flip();
 147         c.position(7);
 148         b.put(c);
 149         b.flip();
 150         try {
 151             b.put(b);
 152             fail("IllegalArgumentException expected for put into same buffer");
 153         } catch (IllegalArgumentException e) {
 154             if (e.getMessage() == null) {
 155                 fail("Non-null IllegalArgumentException message expected from"
 156                      + " put into same buffer");
 157             }
 158         }
 159     }
 160 
 161     private static void absBulkPutArray(ByteBuffer b) {
 162         int n = b.capacity();
 163         b.clear();
 164         int lim = n - 7;
 165         int len = lim - 7;
 166         b.limit(lim);
 167         byte[] a = new byte[len + 7];
 168         for (int i = 0; i < len; i++)
 169             a[i + 7] = (byte)ic(i);
 170         b.position(42);
 171         b.put(7, a, 7, len);
 172         ck(b, b.position() == 42);
 173     }
 174 
 175     //6231529
 176     private static void callReset(ByteBuffer b) {
 177         b.position(0);
 178         b.mark();
 179 
 180         b.duplicate().reset();
 181         b.asReadOnlyBuffer().reset();
 182     }
 183 
 184 
 185 
 186 
 187 
 188 
 189 
 190 
 191 
 192 
 193 
 194 
 195 
 196 
 197 
 198 
 199 
 200 
 201 
 202 
 203 
 204 
 205 
 206 
 207 
 208 
 209 
 210 
 211 
 212 
 213 
 214 
 215 
 216 
 217 
 218 
 219 
 220 
 221 
 222 
 223 
 224     private static void checkSlice(ByteBuffer b, ByteBuffer slice) {
 225         ck(slice, 0, slice.position());
 226         ck(slice, b.remaining(), slice.limit());
 227         ck(slice, b.remaining(), slice.capacity());
 228         if (b.isDirect() != slice.isDirect())
 229             fail("Lost direction", slice);
 230         if (b.isReadOnly() != slice.isReadOnly())
 231             fail("Lost read-only", slice);
 232     }
 233 
 234 
 235 
 236     private static void checkBytes(ByteBuffer b, byte[] bs) {
 237         int n = bs.length;
 238         int p = b.position();
 239         if (b.order() == ByteOrder.BIG_ENDIAN) {
 240             for (int i = 0; i < n; i++) {
 241                 ck(b, b.get(), bs[i]);
 242             }
 243         } else {
 244             for (int i = n - 1; i >= 0; i--) {
 245                 ck(b, b.get(), bs[i]);
 246             }
 247         }
 248         b.position(p);
 249     }
 250 
 251     private static void compact(Buffer b) {
 252         try {
 253             Class<?> cl = b.getClass();
 254             java.lang.reflect.Method m = cl.getDeclaredMethod("compact");
 255             m.setAccessible(true);
 256             m.invoke(b);
 257         } catch (Exception e) {
 258             fail(e.getMessage(), b);
 259         }
 260     }
 261 
 262     private static void checkInvalidMarkException(final Buffer b) {
 263         tryCatch(b, InvalidMarkException.class, () -> {
 264                 b.mark();
 265                 compact(b);
 266                 b.reset();
 267             });
 268     }
 269 
 270     private static void testViews(int level, ByteBuffer b, boolean direct) {
 271 
 272         ShortBuffer sb = b.asShortBuffer();
 273         BasicShort.test(level, sb, direct);
 274         checkBytes(b, new byte[] { 0, (byte)ic(0) });
 275         checkInvalidMarkException(sb);
 276 
 277         CharBuffer cb = b.asCharBuffer();
 278         BasicChar.test(level, cb, direct);
 279         checkBytes(b, new byte[] { 0, (byte)ic(0) });
 280         checkInvalidMarkException(cb);
 281 
 282         IntBuffer ib = b.asIntBuffer();
 283         BasicInt.test(level, ib, direct);
 284         checkBytes(b, new byte[] { 0, 0, 0, (byte)ic(0) });
 285         checkInvalidMarkException(ib);
 286 
 287         LongBuffer lb = b.asLongBuffer();
 288         BasicLong.test(level, lb, direct);
 289         checkBytes(b, new byte[] { 0, 0, 0, 0, 0, 0, 0, (byte)ic(0) });
 290         checkInvalidMarkException(lb);
 291 
 292         FloatBuffer fb = b.asFloatBuffer();
 293         BasicFloat.test(level, fb, direct);
 294         checkBytes(b, new byte[] { 0x42, (byte)0xc2, 0, 0 });
 295         checkInvalidMarkException(fb);
 296 
 297         DoubleBuffer db = b.asDoubleBuffer();
 298         BasicDouble.test(level, db, direct);
 299         checkBytes(b, new byte[] { 0x40, 0x58, 0x40, 0, 0, 0, 0, 0 });
 300         checkInvalidMarkException(db);
 301     }
 302 
 303     private static void testHet(int level, ByteBuffer b) {
 304 
 305         int p = b.position();
 306         b.limit(b.capacity());
 307         show(level, b);
 308         out.print("    put:");
 309 
 310         b.putChar((char)1);
 311         b.putChar((char)Character.MAX_VALUE);
 312         out.print(" char");
 313 
 314         b.putShort((short)1);
 315         b.putShort((short)Short.MAX_VALUE);
 316         out.print(" short");
 317 
 318         b.putInt(1);
 319         b.putInt(Integer.MAX_VALUE);
 320         out.print(" int");
 321 
 322         b.putLong((long)1);
 323         b.putLong((long)Long.MAX_VALUE);
 324         out.print(" long");
 325 
 326         b.putFloat((float)1);
 327         b.putFloat((float)Float.MIN_VALUE);
 328         b.putFloat((float)Float.MAX_VALUE);
 329         out.print(" float");
 330 
 331         b.putDouble((double)1);
 332         b.putDouble((double)Double.MIN_VALUE);
 333         b.putDouble((double)Double.MAX_VALUE);
 334         out.print(" double");
 335 
 336         out.println();
 337         b.limit(b.position());
 338         b.position(p);
 339         show(level, b);
 340         out.print("    get:");
 341 
 342         ck(b, b.getChar(), 1);
 343         ck(b, b.getChar(), Character.MAX_VALUE);
 344         out.print(" char");
 345 
 346         ck(b, b.getShort(), 1);
 347         ck(b, b.getShort(), Short.MAX_VALUE);
 348         out.print(" short");
 349 
 350         ck(b, b.getInt(), 1);
 351         ck(b, b.getInt(), Integer.MAX_VALUE);
 352         out.print(" int");
 353 
 354         ck(b, b.getLong(), 1);
 355         ck(b, b.getLong(), Long.MAX_VALUE);
 356         out.print(" long");
 357 
 358         ck(b, (long)b.getFloat(), 1);
 359         ck(b, (long)b.getFloat(), (long)Float.MIN_VALUE);
 360         ck(b, (long)b.getFloat(), (long)Float.MAX_VALUE);
 361         out.print(" float");
 362 
 363         ck(b, (long)b.getDouble(), 1);
 364         ck(b, (long)b.getDouble(), (long)Double.MIN_VALUE);
 365         ck(b, (long)b.getDouble(), (long)Double.MAX_VALUE);
 366         out.print(" double");
 367 
 368         out.println();
 369 
 370     }
 371 
 372     private static void testAlign(final ByteBuffer b, boolean direct) {
 373         // index out-of bounds
 374         catchIllegalArgument(b, () -> b.alignmentOffset(-1, (short) 1));
 375 
 376         // unit size values
 377         catchIllegalArgument(b, () -> b.alignmentOffset(0, (short) 0));
 378         for (int us = 1; us < 65; us++) {
 379             int _us = us;
 380             if ((us & (us - 1)) != 0) {
 381                 // unit size not a power of two
 382                 catchIllegalArgument(b, () -> b.alignmentOffset(0, _us));
 383             } else {
 384                 if (direct || us <= 8) {
 385                     b.alignmentOffset(0, us);
 386                 } else {
 387                     // unit size > 8 with non-direct buffer
 388                     tryCatch(b, UnsupportedOperationException.class,
 389                             () -> b.alignmentOffset(0, _us));
 390                 }
 391             }
 392         }
 393 
 394         // Probe for long misalignment at index zero for a newly created buffer
 395         ByteBuffer empty =
 396                 direct ? ByteBuffer.allocateDirect(0) : ByteBuffer.allocate(0);
 397         int longMisalignmentAtZero = empty.alignmentOffset(0, 8);
 398 
 399         if (direct) {
 400             // Freshly created direct byte buffers should be aligned at index 0
 401             // for ref and primitive values (see Unsafe.allocateMemory)
 402             if (longMisalignmentAtZero != 0) {
 403                 fail("Direct byte buffer misaligned at index 0"
 404                         + " for ref and primitive values "
 405                         + longMisalignmentAtZero);
 406             }
 407         } else {
 408             // For heap byte buffers misalignment may occur on 32-bit systems
 409             // where Unsafe.ARRAY_BYTE_BASE_OFFSET % 8 == 4 and not 0
 410             // Note the GC will preserve alignment of the base address of the
 411             // array
 412             if (jdk.internal.misc.Unsafe.ARRAY_BYTE_BASE_OFFSET % 8
 413                     != longMisalignmentAtZero) {
 414                 fail("Heap byte buffer misaligned at index 0"
 415                         + " for ref and primitive values "
 416                         + longMisalignmentAtZero);
 417             }
 418         }
 419 
 420         // Ensure test buffer is correctly aligned at index 0
 421         if (b.alignmentOffset(0, 8) != longMisalignmentAtZero)
 422             fail("Test input buffer not correctly aligned at index 0", b);
 423 
 424         // Test misalignment values
 425         for (int us : new int[]{1, 2, 4, 8}) {
 426             for (int i = 0; i < us * 2; i++) {
 427                 int am = b.alignmentOffset(i, us);
 428                 int expectedAm = (longMisalignmentAtZero + i) % us;
 429 
 430                 if (am != expectedAm) {
 431                     String f = "b.alignmentOffset(%d, %d) == %d incorrect, expected %d";
 432                     fail(String.format(f, i, us, am, expectedAm));
 433                 }
 434             }
 435         }
 436 
 437         // Created aligned slice to test against
 438         int ap = 8 - longMisalignmentAtZero;
 439         int al = b.limit() - b.alignmentOffset(b.limit(), 8);
 440         ByteBuffer ab = b.position(ap).limit(al).
 441                 slice();
 442         if (ab.limit() == 0) {
 443             fail("Test input buffer not sufficiently sized to cover" +
 444                     " an aligned region for all values", b);
 445         }
 446         if (ab.alignmentOffset(0, 8) != 0)
 447             fail("Aligned test input buffer not correctly aligned at index 0", ab);
 448 
 449         for (int us : new int[]{1, 2, 4, 8}) {
 450             for (int p = 1; p < 16; p++) {
 451                 int l = ab.limit() - p;
 452 
 453                 ByteBuffer as = ab.slice().position(p).limit(l).
 454                         alignedSlice(us);
 455 
 456                 ck(as, 0, as.position());
 457                 ck(as, as.capacity(), as.limit());
 458                 if (b.isDirect() != as.isDirect())
 459                     fail("Lost direction", as);
 460                 if (b.isReadOnly() != as.isReadOnly())
 461                     fail("Lost read-only", as);
 462 
 463                 if (as.alignmentOffset(0, us) != 0)
 464                     fail("Buffer not correctly aligned at index 0", as);
 465 
 466                 if (as.alignmentOffset(as.limit(), us) != 0)
 467                     fail("Buffer not correctly aligned at limit", as);
 468 
 469                 int p_mod = ab.alignmentOffset(p, us);
 470                 int l_mod = ab.alignmentOffset(l, us);
 471                 // Round up position
 472                 p = (p_mod > 0) ? p + (us - p_mod) : p;
 473                 // Round down limit
 474                 l = l - l_mod;
 475 
 476                 int ec = l - p;
 477                 if (as.limit() != ec) {
 478                     fail("Buffer capacity incorrect, expected: " + ec, as);
 479                 }
 480             }
 481         }
 482 
 483         // mapped buffers
 484         try {
 485             for (MappedByteBuffer bb : mappedBuffers()) {
 486                 try {
 487                     int offset = bb.alignmentOffset(1, 4);
 488                     ck(bb, offset >= 0);
 489                 } catch (UnsupportedOperationException e) {
 490                     System.out.println("Not applicable, UOE thrown: ");
 491                 }
 492             }
 493         } catch (IOException e) {
 494             throw new UncheckedIOException(e);
 495         }
 496 
 497         // alignment identities
 498         final int maxPow2 = 12;
 499         ByteBuffer bb = ByteBuffer.allocateDirect(1 << maxPow2); // cap 4096
 500 
 501         Random rnd = new Random();
 502         long seed = rnd.nextLong();
 503         rnd = new Random(seed);
 504 
 505         for (int i = 0; i < 100; i++) {
 506             // 1 == 2^0 <= unitSize == 2^k <= bb.capacity()/2
 507             int unitSize = 1 << rnd.nextInt(maxPow2);
 508             // 0 <= index < 2*unitSize
 509             int index = rnd.nextInt(unitSize << 1);
 510             int value = bb.alignmentOffset(index, unitSize);
 511             try {
 512                 if (value < 0 || value >= unitSize) {
 513                     throw new RuntimeException(value + " < 0 || " +
 514                         value + " >= " + unitSize);
 515                 }
 516                 if (value <= index &&
 517                     bb.alignmentOffset(index - value, unitSize) != 0)
 518                     throw new RuntimeException("Identity 1");
 519                 if (bb.alignmentOffset(index + (unitSize - value),
 520                     unitSize) != 0)
 521                     throw new RuntimeException("Identity 2");
 522             } catch (RuntimeException re) {
 523                 System.err.format("seed %d, index %d, unitSize %d, value %d%n",
 524                     seed, index, unitSize, value);
 525                 throw re;
 526             }
 527         }
 528     }
 529 
 530     private static MappedByteBuffer[] mappedBuffers() throws IOException {
 531         return new MappedByteBuffer[]{
 532                 createMappedBuffer(new byte[]{0, 1, 2, 3}),
 533                 createMappedBuffer(new byte[]{0, 1, 2, -3,
 534                     45, 6, 7, 78, 3, -7, 6, 7, -128, 127}),
 535         };
 536     }
 537 
 538     private static MappedByteBuffer createMappedBuffer(byte[] contents)
 539         throws IOException {
 540         Path tempFile = Files.createTempFile("mbb", null);
 541         tempFile.toFile().deleteOnExit();
 542         Files.write(tempFile, contents);
 543         try (FileChannel fc = FileChannel.open(tempFile)) {
 544             MappedByteBuffer map =
 545                 fc.map(FileChannel.MapMode.READ_ONLY, 0, contents.length);
 546             map.load();
 547             return map;
 548         }
 549     }
 550 
 551 
 552     private static void fail(String problem,
 553                              ByteBuffer xb, ByteBuffer yb,
 554                              byte x, byte y) {
 555         fail(problem + String.format(": x=%s y=%s", x, y), xb, yb);
 556     }
 557 
 558     private static void catchNullArgument(Buffer b, Runnable thunk) {
 559         tryCatch(b, NullPointerException.class, thunk);
 560     }
 561 
 562     private static void catchIllegalArgument(Buffer b, Runnable thunk) {
 563         tryCatch(b, IllegalArgumentException.class, thunk);
 564     }
 565 
 566     private static void catchReadOnlyBuffer(Buffer b, Runnable thunk) {
 567         tryCatch(b, ReadOnlyBufferException.class, thunk);
 568     }
 569 
 570     private static void catchIndexOutOfBounds(Buffer b, Runnable thunk) {
 571         tryCatch(b, IndexOutOfBoundsException.class, thunk);
 572     }
 573 
 574     private static void catchIndexOutOfBounds(byte[] t, Runnable thunk) {
 575         tryCatch(t, IndexOutOfBoundsException.class, thunk);
 576     }
 577 
 578     private static void tryCatch(Buffer b, Class<?> ex, Runnable thunk) {
 579         boolean caught = false;
 580         try {
 581             thunk.run();
 582         } catch (Throwable x) {
 583             if (ex.isAssignableFrom(x.getClass())) {
 584                 caught = true;
 585             } else {
 586                 String s = x.getMessage();
 587                 if (s == null)
 588                     s = x.getClass().getName();
 589                 fail(s + " not expected");
 590             }
 591         }
 592         if (!caught) {
 593             fail(ex.getName() + " not thrown", b);
 594         }
 595     }
 596 
 597     private static void tryCatch(byte[] t, Class<?> ex, Runnable thunk) {
 598         tryCatch(ByteBuffer.wrap(t), ex, thunk);
 599     }
 600 
 601     public static void test(int level, final ByteBuffer b, boolean direct) {
 602 
 603         show(level, b);
 604 
 605         if (direct != b.isDirect())
 606             fail("Wrong direction", b);
 607 
 608         // Gets and puts
 609 
 610         relPut(b);
 611         relGet(b);
 612         absGet(b);
 613         bulkGet(b);
 614 
 615         absPut(b);
 616         relGet(b);
 617         absGet(b);
 618         bulkGet(b);
 619 
 620         bulkPutArray(b);
 621         relGet(b);
 622 
 623         bulkPutBuffer(b);
 624         relGet(b);
 625 
 626         absBulkPutArray(b);
 627         absBulkGet(b);
 628 
 629 
 630 
 631 
 632 
 633 
 634 
 635 
 636 
 637 
 638 
 639 
 640 
 641 
 642 
 643 
 644 
 645 
 646 
 647 
 648 
 649 
 650 
 651 
 652 
 653 
 654 
 655 
 656 
 657 
 658 
 659 
 660 
 661 
 662 
 663 
 664 
 665         // Compact
 666 
 667         relPut(b);
 668         b.position(13);
 669         b.compact();
 670         b.flip();
 671         relGet(b, 13);
 672 
 673         // Exceptions
 674 
 675         relPut(b);
 676         b.limit(b.capacity() / 2);
 677         b.position(b.limit());
 678 
 679         tryCatch(b, BufferUnderflowException.class, () -> b.get());
 680         tryCatch(b, BufferOverflowException.class, () -> b.put((byte)42));
 681         // The index must be non-negative and less than the buffer's limit.
 682         catchIndexOutOfBounds(b, () -> b.get(b.limit()));
 683         catchIndexOutOfBounds(b, () -> b.get(-1));
 684         catchIndexOutOfBounds(b, () -> b.put(b.limit(), (byte)42));
 685         tryCatch(b, InvalidMarkException.class,
 686                 () -> b.position(0).mark().compact().reset());
 687 
 688         try {
 689             b.position(b.limit() + 1);
 690             fail("IllegalArgumentException expected for position beyond limit");
 691         } catch (IllegalArgumentException e) {
 692             if (e.getMessage() == null) {
 693                 fail("Non-null IllegalArgumentException message expected for"
 694                      + " position beyond limit");
 695             }
 696         }
 697 
 698         try {
 699             b.position(-1);
 700             fail("IllegalArgumentException expected for negative position");
 701         } catch (IllegalArgumentException e) {
 702             if (e.getMessage() == null) {
 703                 fail("Non-null IllegalArgumentException message expected for"
 704                      + " negative position");
 705             }
 706         }
 707 
 708         try {
 709             b.limit(b.capacity() + 1);
 710             fail("IllegalArgumentException expected for limit beyond capacity");
 711         } catch (IllegalArgumentException e) {
 712             if (e.getMessage() == null) {
 713                 fail("Non-null IllegalArgumentException message expected for"
 714                      + " limit beyond capacity");
 715             }
 716         }
 717 
 718         try {
 719             b.limit(-1);
 720             fail("IllegalArgumentException expected for negative limit");
 721         } catch (IllegalArgumentException e) {
 722             if (e.getMessage() == null) {
 723                 fail("Non-null IllegalArgumentException message expected for"
 724                      + " negative limit");
 725             }
 726         }
 727 
 728         // Exceptions in absolute bulk and slice operations
 729 
 730         catchNullArgument(b, () -> b.get(7, null, 0, 42));
 731         catchNullArgument(b, () -> b.put(7, (byte[])null, 0, 42));
 732 
 733         byte[] tmpa = new byte[42];
 734         catchIndexOutOfBounds(b, () -> b.get(7, tmpa, -1, 42));
 735         catchIndexOutOfBounds(b, () -> b.get(7, tmpa, 42, 1));
 736         catchIndexOutOfBounds(b, () -> b.get(7, tmpa, 41, -1));
 737         catchIndexOutOfBounds(b, () -> b.get(-1, tmpa, 0, 1));
 738         catchIndexOutOfBounds(b, () -> b.get(b.limit(), tmpa, 0, 1));
 739         catchIndexOutOfBounds(b, () -> b.get(b.limit() - 41, tmpa, 0, 42));
 740 
 741         catchIndexOutOfBounds(b, () -> b.put(7, tmpa, -1, 42));
 742         catchIndexOutOfBounds(b, () -> b.put(7, tmpa, 42, 1));
 743         catchIndexOutOfBounds(b, () -> b.put(7, tmpa, 41, -1));
 744         catchIndexOutOfBounds(b, () -> b.put(-1, tmpa, 0, 1));
 745         catchIndexOutOfBounds(b, () -> b.put(b.limit(), tmpa, 0, 1));
 746         catchIndexOutOfBounds(b, () -> b.put(b.limit() - 41, tmpa, 0, 42));
 747 
 748         catchIndexOutOfBounds(b, () -> b.slice(-1, 7));
 749         catchIndexOutOfBounds(b, () -> b.slice(b.limit() + 1, 7));
 750         catchIndexOutOfBounds(b, () -> b.slice(0, -1));
 751         catchIndexOutOfBounds(b, () -> b.slice(7, b.limit() - 7 + 1));
 752 
 753         // Values
 754 
 755         b.clear();
 756         b.put((byte)0);
 757         b.put((byte)-1);
 758         b.put((byte)1);
 759         b.put(Byte.MAX_VALUE);
 760         b.put(Byte.MIN_VALUE);
 761 
 762 
 763 
 764 
 765 
 766 
 767 
 768 
 769 
 770 
 771 
 772 
 773 
 774 
 775 
 776 
 777 
 778         b.flip();
 779         ck(b, b.get(), 0);
 780         ck(b, b.get(), (byte)-1);
 781         ck(b, b.get(), 1);
 782         ck(b, b.get(), Byte.MAX_VALUE);
 783         ck(b, b.get(), Byte.MIN_VALUE);
 784 
 785 
 786 
 787 
 788 
 789 
 790 
 791 
 792 
 793 
 794 
 795 
 796 
 797 
 798 
 799 
 800 
 801 
 802 
 803 
 804 
 805 
 806 
 807 
 808 
 809 
 810 
 811         // Comparison
 812         b.rewind();
 813         ByteBuffer b2 = ByteBuffer.allocate(b.capacity());
 814         b2.put(b);
 815         b2.flip();
 816         b.position(2);
 817         b2.position(2);
 818         if (!b.equals(b2)) {
 819             for (int i = 2; i < b.limit(); i++) {
 820                 byte x = b.get(i);
 821                 byte y = b2.get(i);
 822                 if (x != y
 823 
 824 
 825 
 826 
 827 
 828 
 829                     ) {
 830                     out.println("[" + i + "] " + x + " != " + y);
 831                 }
 832             }
 833             fail("Identical buffers not equal", b, b2);
 834         }
 835         if (b.compareTo(b2) != 0) {
 836             fail("Comparison to identical buffer != 0", b, b2);
 837         }
 838         b.limit(b.limit() + 1);
 839         b.position(b.limit() - 1);
 840         b.put((byte)99);
 841         b.rewind();
 842         b2.rewind();
 843         if (b.equals(b2))
 844             fail("Non-identical buffers equal", b, b2);
 845         if (b.compareTo(b2) <= 0)
 846             fail("Comparison to shorter buffer <= 0", b, b2);
 847         b.limit(b.limit() - 1);
 848 
 849         b.put(2, (byte)42);
 850         if (b.equals(b2))
 851             fail("Non-identical buffers equal", b, b2);
 852         if (b.compareTo(b2) <= 0)
 853             fail("Comparison to lesser buffer <= 0", b, b2);
 854 
 855         // Check equals and compareTo with interesting values
 856         for (byte x : VALUES) {
 857             ByteBuffer xb = ByteBuffer.wrap(new byte[] { x });
 858             if (xb.compareTo(xb) != 0) {
 859                 fail("compareTo not reflexive", xb, xb, x, x);
 860             }
 861             if (!xb.equals(xb)) {
 862                 fail("equals not reflexive", xb, xb, x, x);
 863             }
 864             for (byte y : VALUES) {
 865                 ByteBuffer yb = ByteBuffer.wrap(new byte[] { y });
 866                 if (xb.compareTo(yb) != - yb.compareTo(xb)) {
 867                     fail("compareTo not anti-symmetric",
 868                          xb, yb, x, y);
 869                 }
 870                 if ((xb.compareTo(yb) == 0) != xb.equals(yb)) {
 871                     fail("compareTo inconsistent with equals",
 872                          xb, yb, x, y);
 873                 }
 874                 if (xb.compareTo(yb) != Byte.compare(x, y)) {
 875 
 876 
 877 
 878 
 879 
 880 
 881                     fail("Incorrect results for ByteBuffer.compareTo",
 882                          xb, yb, x, y);
 883                 }
 884                 if (xb.equals(yb) != ((x == y) || ((x != x) && (y != y)))) {
 885                     fail("Incorrect results for ByteBuffer.equals",
 886                          xb, yb, x, y);
 887                 }
 888             }
 889         }
 890 
 891         // Sub, dup
 892 
 893         relPut(b);
 894         relGet(b.duplicate());
 895         b.position(13);
 896         relGet(b.duplicate(), 13);
 897         relGet(b.duplicate().slice(), 13);
 898         relGet(b.slice(), 13);
 899         relGet(b.slice().duplicate(), 13);
 900 
 901         // Slice
 902 
 903         b.position(5);
 904         ByteBuffer sb = b.slice();
 905         checkSlice(b, sb);
 906         b.position(0);
 907         ByteBuffer sb2 = sb.slice();
 908         checkSlice(sb, sb2);
 909 
 910         if (!sb.equals(sb2))
 911             fail("Sliced slices do not match", sb, sb2);
 912         if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) {
 913             fail("Array offsets do not match: "
 914                  + sb.arrayOffset() + " != " + sb2.arrayOffset(), sb, sb2);
 915         }
 916 
 917         int bPos = b.position();
 918         int bLim = b.limit();
 919 
 920         b.position(7);
 921         b.limit(42);
 922         ByteBuffer rsb = b.slice();
 923         b.position(0);
 924         b.limit(b.capacity());
 925         ByteBuffer asb = b.slice(7, 35);
 926         checkSlice(rsb, asb);
 927 
 928         b.position(bPos);
 929         b.limit(bLim);
 930 
 931 
 932 
 933         // Views
 934 
 935         b.clear();
 936         b.order(ByteOrder.BIG_ENDIAN);
 937         testViews(level + 1, b, direct);
 938 
 939         for (int i = 1; i <= 9; i++) {
 940             b.position(i);
 941             show(level + 1, b);
 942             testViews(level + 2, b, direct);
 943         }
 944 
 945         b.position(0);
 946         b.order(ByteOrder.LITTLE_ENDIAN);
 947         testViews(level + 1, b, direct);
 948 
 949         // Heterogeneous accessors
 950 
 951         b.order(ByteOrder.BIG_ENDIAN);
 952         for (int i = 0; i <= 9; i++) {
 953             b.position(i);
 954             testHet(level + 1, b);
 955         }
 956         b.order(ByteOrder.LITTLE_ENDIAN);
 957         b.position(3);
 958         testHet(level + 1, b);
 959 
 960 
 961 
 962         // Read-only views
 963 
 964         b.rewind();
 965         final ByteBuffer rb = b.asReadOnlyBuffer();
 966         if (!b.equals(rb))
 967             fail("Buffer not equal to read-only view", b, rb);
 968         show(level + 1, rb);
 969 
 970         catchReadOnlyBuffer(b, () -> relPut(rb));
 971         catchReadOnlyBuffer(b, () -> absPut(rb));
 972         catchReadOnlyBuffer(b, () -> bulkPutArray(rb));
 973         catchReadOnlyBuffer(b, () -> bulkPutBuffer(rb));
 974         catchReadOnlyBuffer(b, () -> absBulkPutArray(rb));
 975 
 976         // put(ByteBuffer) should not change source position
 977         final ByteBuffer src = ByteBuffer.allocate(1);
 978         catchReadOnlyBuffer(b, () -> rb.put(src));
 979         ck(src, src.position(), 0);
 980 
 981         catchReadOnlyBuffer(b, () -> rb.compact());
 982 
 983 
 984 
 985         catchReadOnlyBuffer(b, () -> rb.putChar((char)1));
 986         catchReadOnlyBuffer(b, () -> rb.putChar(0, (char)1));
 987         catchReadOnlyBuffer(b, () -> rb.putShort((short)1));
 988         catchReadOnlyBuffer(b, () -> rb.putShort(0, (short)1));
 989         catchReadOnlyBuffer(b, () -> rb.putInt(1));
 990         catchReadOnlyBuffer(b, () -> rb.putInt(0, 1));
 991         catchReadOnlyBuffer(b, () -> rb.putLong((long)1));
 992         catchReadOnlyBuffer(b, () -> rb.putLong(0, (long)1));
 993         catchReadOnlyBuffer(b, () -> rb.putFloat((float)1));
 994         catchReadOnlyBuffer(b, () -> rb.putFloat(0, (float)1));
 995         catchReadOnlyBuffer(b, () -> rb.putDouble((double)1));
 996         catchReadOnlyBuffer(b, () -> rb.putDouble(0, (double)1));
 997 
 998 
 999 
1000 
1001 
1002 
1003 
1004 
1005 
1006 
1007 
1008         if (rb.getClass().getName().startsWith("java.nio.Heap")) {
1009             catchReadOnlyBuffer(b, () -> rb.array());
1010             catchReadOnlyBuffer(b, () -> rb.arrayOffset());
1011             if (rb.hasArray()) {
1012                 fail("Read-only heap buffer's backing array is accessible", rb);
1013             }
1014         }
1015 
1016         // Bulk puts from read-only buffers
1017 
1018         b.clear();
1019         rb.rewind();
1020         b.put(rb);
1021 
1022 
1023         // For byte buffers, test both the direct and non-direct cases
1024         ByteBuffer ob
1025             = (b.isDirect()
1026                ? ByteBuffer.allocate(rb.capacity())
1027                : ByteBuffer.allocateDirect(rb.capacity()));
1028         rb.rewind();
1029         ob.put(rb);
1030 
1031 
1032         relPut(b);                       // Required by testViews
1033 
1034 
1035         // Test alignment
1036 
1037         testAlign(b, direct);
1038 
1039     }
1040 
1041 
1042 
1043 
1044 
1045 
1046 
1047 
1048 
1049 
1050 
1051 
1052 
1053 
1054 
1055 
1056 
1057 
1058 
1059 
1060 
1061 
1062 
1063 
1064 
1065 
1066 
1067 
1068 
1069 
1070 
1071 
1072 
1073 
1074 
1075 
1076 
1077 
1078 
1079 
1080 
1081 
1082 
1083 
1084 
1085 
1086 
1087 
1088 
1089 
1090 
1091     public static void test(final byte [] ba) {
1092         int offset = 47;
1093         int length = 900;
1094         final ByteBuffer b = ByteBuffer.wrap(ba, offset, length);
1095         show(0, b);
1096         ck(b, b.capacity(), ba.length);
1097         ck(b, b.position(), offset);
1098         ck(b, b.limit(), offset + length);
1099 
1100         // The offset must be non-negative and no larger than <array.length>.
1101         catchIndexOutOfBounds(ba, () -> ByteBuffer.wrap(ba, -1, ba.length));
1102         catchIndexOutOfBounds(ba, () -> ByteBuffer.wrap(ba, ba.length + 1, ba.length));
1103         catchIndexOutOfBounds(ba, () -> ByteBuffer.wrap(ba, 0, -1));
1104         catchIndexOutOfBounds(ba, () -> ByteBuffer.wrap(ba, 0, ba.length + 1));
1105 
1106         // A NullPointerException will be thrown if the array is null.
1107         tryCatch(ba, NullPointerException.class,
1108                 () -> ByteBuffer.wrap((byte []) null, 0, 5));
1109         tryCatch(ba, NullPointerException.class,
1110                 () -> ByteBuffer.wrap((byte []) null));
1111     }
1112 
1113     private static void testAllocate() {
1114         // An IllegalArgumentException will be thrown for negative capacities.
1115         catchIllegalArgument((Buffer) null, () -> ByteBuffer.allocate(-1));
1116         try {
1117             ByteBuffer.allocate(-1);
1118         } catch (IllegalArgumentException e) {
1119             if (e.getMessage() == null) {
1120                 fail("Non-null IllegalArgumentException message expected for"
1121                      + " attempt to allocate negative capacity buffer");
1122             }
1123         }
1124 
1125         catchIllegalArgument((Buffer) null, () -> ByteBuffer.allocateDirect(-1));
1126         try {
1127             ByteBuffer.allocateDirect(-1);
1128         } catch (IllegalArgumentException e) {
1129             if (e.getMessage() == null) {
1130                 fail("Non-null IllegalArgumentException message expected for"
1131                      + " attempt to allocate negative capacity direct buffer");
1132             }
1133         }
1134 
1135     }
1136 
1137     public static void test() {
1138         testAllocate();
1139         test(0, ByteBuffer.allocate(7 * 1024), false);
1140         test(0, ByteBuffer.wrap(new byte[7 * 1024], 0, 7 * 1024), false);
1141         test(new byte[1024]);
1142 
1143         ByteBuffer b = ByteBuffer.allocateDirect(7 * 1024);
1144         for (b.position(0); b.position() < b.limit(); )
1145             ck(b, b.get(), 0);
1146         test(0, b, true);
1147 
1148 
1149 
1150 
1151 
1152         callReset(ByteBuffer.allocate(10));
1153 
1154 
1155 
1156 
1157 
1158     }
1159 
1160 }