| /* |
| * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| /** |
| * Base class for Checksum tests |
| */ |
| import java.nio.ByteBuffer; |
| import java.nio.ByteOrder; |
| import java.nio.charset.StandardCharsets; |
| import java.util.zip.Checksum; |
| |
| public class ChecksumBase { |
| |
| private static final byte[] BYTES_123456789 = "123456789".getBytes(StandardCharsets.US_ASCII); |
| |
| public static void testAll(Checksum checksum, long expected) { |
| testBytes(checksum, expected); |
| testByteArray(checksum, expected); |
| testWrappedByteBuffer(checksum, expected); |
| testReadonlyByteBuffer(checksum, expected); |
| testDirectByteBuffer(checksum, expected); |
| testByteArrayOffset(checksum, expected); |
| testDirectByteBufferOffset(checksum, expected); |
| testLittleEndianDirectByteBufferOffset(checksum, expected); |
| testWrappedByteBufferOffset(checksum, expected); |
| testLittleEndianWrappedByteBufferOffset(checksum, expected); |
| testReadonlyByteBufferOffset(checksum, expected); |
| testLittleEndianReadonlyByteBufferOffset(checksum, expected); |
| } |
| |
| private static void testBytes(Checksum checksum, long expected) { |
| checksum.reset(); |
| for (byte bits : BYTES_123456789) { |
| checksum.update(bits); |
| } |
| checkChecksum(checksum, expected); |
| } |
| |
| private static void testByteArray(Checksum checksum, long expected) { |
| checksum.reset(); |
| checksum.update(BYTES_123456789); |
| checkChecksum(checksum, expected); |
| } |
| |
| private static void testWrappedByteBuffer(Checksum checksum, long expected) { |
| checksum.reset(); |
| ByteBuffer bb = ByteBuffer.wrap(BYTES_123456789); |
| checksum.update(bb); |
| checkChecksum(checksum, expected); |
| } |
| |
| private static void testReadonlyByteBuffer(Checksum checksum, long expected) { |
| checksum.reset(); |
| ByteBuffer bb = ByteBuffer.wrap(BYTES_123456789).asReadOnlyBuffer(); |
| checksum.update(bb); |
| checkChecksum(checksum, expected); |
| } |
| |
| private static void testDirectByteBuffer(Checksum checksum, long expected) { |
| checksum.reset(); |
| ByteBuffer bb = ByteBuffer.allocateDirect(BYTES_123456789.length); |
| bb.put(BYTES_123456789); |
| bb.rewind(); |
| checksum.update(bb); |
| checkChecksum(checksum, expected); |
| } |
| |
| private static void checkChecksum(Checksum checksum, long expected) { |
| if (checksum.getValue() != expected) { |
| throw new RuntimeException("Calculated checksum result was invalid." |
| + " Expected " + Long.toHexString(expected) |
| + ", but got " + Long.toHexString(checksum.getValue()) + "."); |
| } |
| } |
| |
| private static void testByteArrayOffset(Checksum checksum, long expected) { |
| byte[] unaligned_bytes_123456789 = new byte[BYTES_123456789.length + 64]; |
| for (int i = 0; i < unaligned_bytes_123456789.length - BYTES_123456789.length; i++) { |
| checksum.reset(); |
| System.arraycopy(BYTES_123456789, 0, unaligned_bytes_123456789, i, BYTES_123456789.length); |
| checksum.update(unaligned_bytes_123456789, i, BYTES_123456789.length); |
| checkChecksumOffset(checksum, expected, i); |
| } |
| } |
| |
| private static void testDirectByteBufferOffset(Checksum checksum, long expected) { |
| byte[] unaligned_bytes_123456789 = new byte[BYTES_123456789.length + 64]; |
| for (int i = 0; i < unaligned_bytes_123456789.length - BYTES_123456789.length; i++) { |
| checksum.reset(); |
| ByteBuffer bb = ByteBuffer.allocateDirect(unaligned_bytes_123456789.length); |
| System.arraycopy(BYTES_123456789, 0, unaligned_bytes_123456789, i, BYTES_123456789.length); |
| bb.put(unaligned_bytes_123456789); |
| bb.position(i); |
| bb.limit(i + BYTES_123456789.length); |
| checksum.update(bb); |
| checkChecksumOffset(checksum, expected, i); |
| } |
| } |
| |
| private static void testLittleEndianDirectByteBufferOffset(Checksum checksum, long expected) { |
| byte[] unaligned_bytes_123456789 = new byte[BYTES_123456789.length + 64]; |
| for (int i = 0; i < unaligned_bytes_123456789.length - BYTES_123456789.length; i++) { |
| checksum.reset(); |
| ByteBuffer bb = ByteBuffer.allocateDirect(unaligned_bytes_123456789.length); |
| bb.order(ByteOrder.LITTLE_ENDIAN); |
| System.arraycopy(BYTES_123456789, 0, unaligned_bytes_123456789, i, BYTES_123456789.length); |
| bb.put(unaligned_bytes_123456789); |
| bb.position(i); |
| bb.limit(i + BYTES_123456789.length); |
| checksum.update(bb); |
| checkChecksumOffset(checksum, expected, i); |
| } |
| } |
| |
| private static void testWrappedByteBufferOffset(Checksum checksum, long expected) { |
| byte[] unaligned_bytes_123456789 = new byte[BYTES_123456789.length + 64]; |
| for (int i = 0; i < unaligned_bytes_123456789.length - BYTES_123456789.length; i++) { |
| checksum.reset(); |
| System.arraycopy(BYTES_123456789, 0, unaligned_bytes_123456789, i, BYTES_123456789.length); |
| ByteBuffer bb = ByteBuffer.wrap(unaligned_bytes_123456789); |
| bb.position(i); |
| bb.limit(i + BYTES_123456789.length); |
| checksum.update(bb); |
| checkChecksumOffset(checksum, expected, i); |
| } |
| } |
| |
| private static void testLittleEndianWrappedByteBufferOffset(Checksum checksum, long expected) { |
| byte[] unaligned_bytes_123456789 = new byte[BYTES_123456789.length + 64]; |
| for (int i = 0; i < unaligned_bytes_123456789.length - BYTES_123456789.length; i++) { |
| checksum.reset(); |
| System.arraycopy(BYTES_123456789, 0, unaligned_bytes_123456789, i, BYTES_123456789.length); |
| ByteBuffer bb = ByteBuffer.wrap(unaligned_bytes_123456789); |
| bb.order(ByteOrder.LITTLE_ENDIAN); |
| bb.position(i); |
| bb.limit(i + BYTES_123456789.length); |
| checksum.update(bb); |
| checkChecksumOffset(checksum, expected, i); |
| } |
| } |
| |
| private static void testReadonlyByteBufferOffset(Checksum checksum, long expected) { |
| byte[] unaligned_bytes_123456789 = new byte[BYTES_123456789.length + 64]; |
| for (int i = 0; i < unaligned_bytes_123456789.length - BYTES_123456789.length; i++) { |
| checksum.reset(); |
| System.arraycopy(BYTES_123456789, 0, unaligned_bytes_123456789, i, BYTES_123456789.length); |
| ByteBuffer bb = ByteBuffer.wrap(unaligned_bytes_123456789).asReadOnlyBuffer(); |
| bb.position(i); |
| bb.limit(i + BYTES_123456789.length); |
| checksum.update(bb); |
| checkChecksumOffset(checksum, expected, i); |
| } |
| } |
| |
| private static void testLittleEndianReadonlyByteBufferOffset(Checksum checksum, long expected) { |
| byte[] unaligned_bytes_123456789 = new byte[BYTES_123456789.length + 64]; |
| for (int i = 0; i < unaligned_bytes_123456789.length - BYTES_123456789.length; i++) { |
| checksum.reset(); |
| System.arraycopy(BYTES_123456789, 0, unaligned_bytes_123456789, i, BYTES_123456789.length); |
| ByteBuffer bb = ByteBuffer.wrap(unaligned_bytes_123456789).asReadOnlyBuffer(); |
| bb.order(ByteOrder.LITTLE_ENDIAN); |
| bb.position(i); |
| bb.limit(i + BYTES_123456789.length); |
| checksum.update(bb); |
| checkChecksumOffset(checksum, expected, i); |
| } |
| } |
| |
| private static void checkChecksumOffset(Checksum checksum, long expected, int offset) { |
| if (checksum.getValue() != expected) { |
| throw new RuntimeException("Calculated CRC32C result was invalid. Array offset " |
| + offset + ". Expected: " + Long.toHexString(expected) + ", Got: " |
| + Long.toHexString(checksum.getValue())); |
| } |
| } |
| } |