/******************************************************************************* * Copyright 2014 Trevor Robinson * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.scurrilous.circe.crc; import static com.scurrilous.circe.params.CrcParameters.CRC16; import static com.scurrilous.circe.params.CrcParameters.CRC16_CCITT; import static com.scurrilous.circe.params.CrcParameters.CRC16_XMODEM; import static com.scurrilous.circe.params.CrcParameters.CRC32; import static com.scurrilous.circe.params.CrcParameters.CRC32C; import static com.scurrilous.circe.params.CrcParameters.CRC32_BZIP2; import static com.scurrilous.circe.params.CrcParameters.CRC32_POSIX; import static com.scurrilous.circe.params.CrcParameters.CRC64; import static com.scurrilous.circe.params.CrcParameters.CRC64_XZ; import static org.testng.Assert.assertEquals; import java.nio.charset.Charset; import org.testng.annotations.Test; import com.scurrilous.circe.HashProvider; import com.scurrilous.circe.IncrementalIntHash; import com.scurrilous.circe.params.CrcParameters; /** * Tests the {@link StandardCrcProvider} with various CRC algorithms. See the <a * href="http://reveng.sourceforge.net/crc-catalogue/">Catalogue of parametrised * CRC algorithms</a> for more information on these algorithms and others. */ @SuppressWarnings("javadoc") public class CRCTest { private static final HashProvider PROVIDER = new StandardCrcProvider(); private static final Charset ASCII = Charset.forName("ASCII"); private static final byte[] DIGITS = "123456789".getBytes(ASCII); @Test public void testCRC3_ROHC() { final CrcParameters CRC3_ROHC = new CrcParameters("CRC-3/ROHC", 3, 0x3, 0x7, 0, true); assertEquals(0x6, PROVIDER.getIncrementalInt(CRC3_ROHC).calculate(DIGITS)); } @Test public void testCRC5_EPC() { final CrcParameters CRC5_EPC = new CrcParameters("CRC-5/EPC", 5, 0x09, 0x09, 0, false); assertEquals(0x00, PROVIDER.getIncrementalInt(CRC5_EPC).calculate(DIGITS)); } @Test public void testCRC5_USB() { final CrcParameters CRC5_USB = new CrcParameters("CRC-5/USB", 5, 0x05, 0x1f, 0x1f, true); assertEquals(0x19, PROVIDER.getIncrementalInt(CRC5_USB).calculate(DIGITS)); } @Test public void testCRC7() { final CrcParameters CRC7 = new CrcParameters("CRC-7", 7, 0x09, 0, 0, false); assertEquals(0x75, PROVIDER.getIncrementalInt(CRC7).calculate(DIGITS)); } @Test public void testCRC7ROHC() { final CrcParameters CRC7_ROHC = new CrcParameters("CRC-7/ROHC", 7, 0x4f, 0x7f, 0, true); assertEquals(0x53, PROVIDER.getIncrementalInt(CRC7_ROHC).calculate(DIGITS)); } @Test public void testCRC8() { final CrcParameters CRC8 = new CrcParameters("CRC-8", 8, 0x07, 0, 0, false); assertEquals(0xf4, PROVIDER.getIncrementalInt(CRC8).calculate(DIGITS)); } @Test public void testCRC10() { final CrcParameters CRC10 = new CrcParameters("CRC-10", 10, 0x233, 0, 0, false); assertEquals(0x199, PROVIDER.getIncrementalInt(CRC10).calculate(DIGITS)); } @Test public void testCRC15() { final CrcParameters CRC15 = new CrcParameters("CRC-15", 15, 0x4599, 0, 0, false); assertEquals(0x059e, PROVIDER.getIncrementalInt(CRC15).calculate(DIGITS)); } @Test public void testCRC16() { assertEquals(0xbb3d, PROVIDER.getIncrementalInt(CRC16).calculate(DIGITS)); } @Test public void testCRC16_CCITT() { assertEquals(0x2189, PROVIDER.getIncrementalInt(CRC16_CCITT).calculate(DIGITS)); } @Test public void testXMODEM() { assertEquals(0x31c3, PROVIDER.getIncrementalInt(CRC16_XMODEM).calculate(DIGITS)); } @Test public void testCRC24() { final CrcParameters CRC24 = new CrcParameters("CRC-24", 24, 0x864cfb, 0xb704ce, 0, false); assertEquals(0x21cf02, PROVIDER.getIncrementalInt(CRC24).calculate(DIGITS)); } @Test public void testCRC32() { assertEquals(0xcbf43926, PROVIDER.getIncrementalInt(CRC32).calculate(DIGITS)); } @Test public void testJavaCRC32() { assertEquals(0xcbf43926, PROVIDER.getStatelessInt(CRC32).calculate(DIGITS)); } @Test public void testBZIP2() { assertEquals(0xfc891918, PROVIDER.getIncrementalInt(CRC32_BZIP2).calculate(DIGITS)); } @Test public void testCRC32C() { assertEquals(0xe3069283, PROVIDER.getIncrementalInt(CRC32C).calculate(DIGITS)); } @Test public void testCRC32D() { final CrcParameters CRC32D = new CrcParameters("CRC-32D", 32, 0xa833982b, ~0, ~0, true); assertEquals(0x87315576, PROVIDER.getIncrementalInt(CRC32D).calculate(DIGITS)); } @Test public void testPOSIX() { assertEquals(0x765e7680, PROVIDER.getIncrementalInt(CRC32_POSIX).calculate(DIGITS)); } @Test public void testCRC32Q() { final CrcParameters CRC32Q = new CrcParameters("CRC-32Q", 32, 0x814141ab, 0, 0, false); assertEquals(0x3010bf7f, PROVIDER.getIncrementalInt(CRC32Q).calculate(DIGITS)); } @Test public void testCRC64() { assertEquals(0x6c40df5f0b497347L, PROVIDER.getIncrementalLong(CRC64).calculate(DIGITS)); } @Test public void testCRC64_XZ() { assertEquals(0x995dc9bbdf1939faL, PROVIDER.getIncrementalLong(CRC64_XZ).calculate(DIGITS)); } @Test public void testCRC32CIncremental() { // reflected testIncremental(PROVIDER.getIncrementalInt(CRC32C)); } private void testIncremental(IncrementalIntHash hash) { final String data = "data"; final String combined = data + data; final int dataChecksum = hash.calculate(data.getBytes(ASCII)); final int combinedChecksum = hash.calculate(combined.getBytes(ASCII)); final int incrementalChecksum = hash.resume(dataChecksum, data.getBytes(ASCII)); assertEquals(combinedChecksum, incrementalChecksum); } }