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