1 // 2 // Copyright (c) 2010-2024 Antmicro 3 // 4 // This file is licensed under the MIT License. 5 // license text is available in 'licenses/MIT.txt'. 6 // 7 8 using NUnit.Framework; 9 using System; 10 11 namespace Antmicro.Renode.Utilities 12 { 13 [TestFixture] 14 public class CRCTests 15 { 16 [Test] ShouldThrowArgumentException()17 public void ShouldThrowArgumentException() 18 { 19 Assert.Throws<ArgumentException>( 20 () => { new CRCEngine(0xFF, 7, true, true, 0x00, 0x00); } 21 ); 22 Assert.Throws<ArgumentOutOfRangeException>( 23 () => { new CRCEngine(0xFF, 0, true, true, 0x00, 0x00); } 24 ); 25 Assert.Throws<ArgumentOutOfRangeException>( 26 () => { new CRCEngine(0xFF, 33, true, true, 0x00, 0x00); } 27 ); 28 } 29 30 [Test] ShouldCalculateMultipleUpdates()31 public void ShouldCalculateMultipleUpdates() 32 { 33 var crc = new CRCEngine(0x04C11DB7, 32, true, true, 0x00, 0x00); 34 crc.Update(new byte[] { }); 35 Assert.AreEqual(0x0000000, crc.Value); 36 crc.Update(new byte[] { 0x31 }); 37 Assert.AreEqual(0x51DE003A, crc.Value); 38 crc.Update(new byte[] { 0x32 }); 39 Assert.AreEqual(0xE8A5632, crc.Value); 40 } 41 42 [Test] ShouldHandleReflections()43 public void ShouldHandleReflections() 44 { 45 var crc = new CRCEngine(CRCPolynomial.CRC32, false, true, 0x00, 0x00); 46 crc.Update(new byte[] { 0x32, 0x33 }); 47 Assert.AreEqual(0xCE1E8E92, crc.Value); 48 49 crc = new CRCEngine(CRCPolynomial.CRC32, true, false, 0x00, 0x00); 50 crc.Update(new byte[] { 0x32, 0x33 }); 51 Assert.AreEqual(0xE6AC054A, crc.Value); 52 53 crc = new CRCEngine(CRCPolynomial.CRC32, false, false, 0x00, 0x00); 54 crc.Update(new byte[] { 0x32, 0x33 }); 55 Assert.AreEqual(0x49717873, crc.Value); 56 } 57 58 [Test] ShouldInitConfigProperly()59 public void ShouldInitConfigProperly() 60 { 61 var crc32 = new CRCEngine(CRCPolynomial.CRC32); 62 Assert.AreEqual(0xE8A5632, crc32.Calculate(new byte[] { 0x31, 0x32 })); 63 64 var crc16ccitt = new CRCEngine(CRCPolynomial.CRC16_CCITT); 65 Assert.AreEqual(0xBDEB, crc16ccitt.Calculate(new byte[] { 0x31, 0x32 })); 66 67 var crc16 = new CRCEngine(CRCPolynomial.CRC16); 68 Assert.AreEqual(0x4594, crc16.Calculate(new byte[] { 0x31, 0x32 })); 69 } 70 71 [Test] ShouldCalculateCRC32()72 public void ShouldCalculateCRC32() 73 { 74 var crc = new CRCEngine(CRCPolynomial.CRC32, true, true, 0xFFFFFFFF, 0xFFFFFFFF); 75 Assert.AreEqual(0xCBF43926, crc.Calculate(checkInputData)); 76 } 77 78 [Test] ShouldCalculateCRC32BZIP()79 public void ShouldCalculateCRC32BZIP() 80 { 81 var crc = new CRCEngine(CRCPolynomial.CRC32, false, false, 0xFFFFFFFF, 0xFFFFFFFF); 82 Assert.AreEqual(0xFC891918, crc.Calculate(checkInputData)); 83 } 84 85 [Test] ShouldCalculateCRC32JAMCRC()86 public void ShouldCalculateCRC32JAMCRC() 87 { 88 var crc = new CRCEngine(CRCPolynomial.CRC32, true, true, 0xFFFFFFFF, 0); 89 Assert.AreEqual(0x340BC6D9, crc.Calculate(checkInputData)); 90 } 91 92 [Test] ShouldCalculateCRC32MPEG2()93 public void ShouldCalculateCRC32MPEG2() 94 { 95 var crc = new CRCEngine(CRCPolynomial.CRC32, false, false, 0xFFFFFFFF, 0); 96 Assert.AreEqual(0x0376E6E7, crc.Calculate(checkInputData)); 97 } 98 99 [Test] ShouldCalculateCRC32POSIX()100 public void ShouldCalculateCRC32POSIX() 101 { 102 var crc = new CRCEngine(CRCPolynomial.CRC32, false, false, 0, 0xFFFFFFFF); 103 Assert.AreEqual(0x765E7680, crc.Calculate(checkInputData)); 104 } 105 106 [Test] ShouldCalculateCRC32SATA()107 public void ShouldCalculateCRC32SATA() 108 { 109 var crc = new CRCEngine(CRCPolynomial.CRC32, false, false, 0x52325032, 0); 110 Assert.AreEqual(0xCF72AFE8, crc.Calculate(checkInputData)); 111 } 112 113 [Test] ShouldCalculateCRC31Philips()114 public void ShouldCalculateCRC31Philips() 115 { 116 var crc = new CRCEngine(0x04C11DB7, 31, false, false, 0x7FFFFFFF, 0x7FFFFFFF); 117 Assert.AreEqual(0x0CE9E46C, crc.Calculate(checkInputData)); 118 } 119 120 [Test] ShouldCalculateCRC16CCITT()121 public void ShouldCalculateCRC16CCITT() 122 { 123 var crc = new CRCEngine(CRCPolynomial.CRC16_CCITT, true, true, 0x0000, 0x0000); 124 Assert.AreEqual(0x2189, crc.Calculate(checkInputData)); 125 } 126 127 [Test] ShouldCalculateCRC16()128 public void ShouldCalculateCRC16() 129 { 130 var crc = new CRCEngine(CRCPolynomial.CRC16, true, true, 0x0000, 0x0000); 131 Assert.AreEqual(0xBB3D, crc.Calculate(checkInputData)); 132 } 133 134 [Test] ShouldCalculateCRC8()135 public void ShouldCalculateCRC8() 136 { 137 var crc = new CRCEngine(CRCPolynomial.CRC8_CCITT, false, false, 0x00, 0x00); 138 Assert.AreEqual(0xF4, crc.Calculate(checkInputData)); 139 } 140 141 [Test] ShouldCalculateCRC7()142 public void ShouldCalculateCRC7() 143 { 144 var crc = new CRCEngine(CRCPolynomial.CRC7, false, false, 0x00, 0x00); 145 Assert.AreEqual(0x75, crc.Calculate(checkInputData)); 146 } 147 148 private readonly byte[] checkInputData = new byte[] { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 }; 149 } 150 } 151