summaryrefslogtreecommitdiffstats
path: root/MdePkg/Test/GoogleTest/Library/BaseLib/TestCheckSum.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'MdePkg/Test/GoogleTest/Library/BaseLib/TestCheckSum.cpp')
-rw-r--r--MdePkg/Test/GoogleTest/Library/BaseLib/TestCheckSum.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/MdePkg/Test/GoogleTest/Library/BaseLib/TestCheckSum.cpp b/MdePkg/Test/GoogleTest/Library/BaseLib/TestCheckSum.cpp
new file mode 100644
index 0000000000..1f4f73a88b
--- /dev/null
+++ b/MdePkg/Test/GoogleTest/Library/BaseLib/TestCheckSum.cpp
@@ -0,0 +1,64 @@
+/** @file
+ Unit tests for BaseLib's checksum capabilities.
+
+ Copyright (c) 2023 Pedro Falcato. All rights reserved<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <gtest/gtest.h>
+extern "C" {
+ #include <Base.h>
+ #include <Library/BaseLib.h>
+}
+
+// Precomputed crc32c and crc16-ansi for "hello" (without the null byte)
+constexpr STATIC UINT32 mHelloCrc32c = 0x9A71BB4C;
+constexpr STATIC UINT16 mHelloCrc16 = 0x34F6;
+
+TEST (Crc32c, BasicCheck) {
+ // Note: The magic numbers below are precomputed checksums
+ // Check for basic operation on even and odd numbers of bytes
+ EXPECT_EQ (CalculateCrc32c ("hello", 5, 0), mHelloCrc32c);
+ EXPECT_EQ (
+ CalculateCrc32c ("longlonglonglonglong", sizeof ("longlonglonglonglong") - 1, 0),
+ 0xC50F869D
+ );
+ EXPECT_EQ (CalculateCrc32c ("h", 1, 0), 0xB96298FC);
+
+ // Check if a checksum with no bytes correctly yields 0
+ EXPECT_EQ (CalculateCrc32c ("", 0, 0), 0U);
+}
+
+TEST (Crc32c, MultipartCheck) {
+ // Test multi-part crc32c calculation. So that given a string of bytes
+ // s[N], crc32c(s, N, 0) == crc32c(s[N - 1], 1, crc32c(s, N - 1, 0))
+ // and all other sorts of combinations one might imagine.
+ UINT32 val;
+
+ val = CalculateCrc32c ("hel", 3, 0);
+ EXPECT_EQ (CalculateCrc32c (&"hello"[3], 2, val), mHelloCrc32c);
+}
+
+TEST (Crc16, BasicCheck) {
+ // Note: The magic numbers below are precomputed checksums
+ // Check for basic operation on even and odd numbers of bytes
+ EXPECT_EQ (CalculateCrc16Ansi ("hello", 5, CRC16ANSI_INIT), mHelloCrc16);
+ EXPECT_EQ (
+ CalculateCrc16Ansi ("longlonglonglonglong", sizeof ("longlonglonglonglong") - 1, CRC16ANSI_INIT),
+ 0xF723
+ );
+ EXPECT_EQ (CalculateCrc16Ansi ("h", 1, CRC16ANSI_INIT), 0xAEBE);
+
+ // Check if a checksum with no bytes correctly yields CRC16ANSI_INIT
+ EXPECT_EQ (CalculateCrc16Ansi ("", 0, CRC16ANSI_INIT), CRC16ANSI_INIT);
+}
+
+TEST (Crc16, MultipartCheck) {
+ // Test multi-part crc16 calculation. So that given a string of bytes
+ // s[N], crc16(s, N, 0) == crc16(s[N - 1], 1, crc16(s, N - 1, 0))
+ // and all other sorts of combinations one might imagine.
+ UINT16 val;
+
+ val = CalculateCrc16Ansi ("hel", 3, CRC16ANSI_INIT);
+ EXPECT_EQ (CalculateCrc16Ansi (&"hello"[3], 2, val), mHelloCrc16);
+}