Software APIs
crc32_unittest.cc
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #include "sw/device/lib/base/crc32.h"
6 
7 #include <cstring>
8 #include <stdint.h>
9 
10 #include "gtest/gtest.h"
11 
12 namespace crc32_unittest {
13 namespace {
14 
15 struct TestParams {
16  std::string input;
17  uint32_t exp_crc;
18 };
19 
20 class CrcTest : public testing::TestWithParam<TestParams> {};
21 
22 // Expected CRC32 values were generated using the following Python snippet:
23 // ```
24 // import zlib
25 // hex(zlib.crc32(b'<string>'))
26 // ```
27 INSTANTIATE_TEST_SUITE_P(AllCases, CrcTest,
28  testing::Values(
29  TestParams{
30  "123456789",
31  0xcbf43926,
32  },
33  TestParams{
34  "The quick brown fox jumps over the lazy dog",
35  0x414fa339,
36  },
37  TestParams{
38  "\xfe\xca\xfe\xca\x02\xb0\xad\x1b",
39  0x9508ac14,
40  }));
41 
42 TEST_P(CrcTest, Crc32) {
43  EXPECT_EQ(crc32(GetParam().input.data(), GetParam().input.length()),
44  GetParam().exp_crc);
45 }
46 
47 TEST_P(CrcTest, Crc32Add) {
48  uint32_t ctx;
49  crc32_init(&ctx);
50  crc32_add(&ctx, GetParam().input.data(), GetParam().input.length());
51 
52  EXPECT_EQ(crc32_finish(&ctx), GetParam().exp_crc);
53 }
54 
55 TEST_F(CrcTest, Misaligned) {
56  constexpr uint32_t kExpCrc = 0x414fa339;
57  alignas(uint32_t) char input[] =
58  ">The quick brown fox jumps over the lazy dog";
59 
60  EXPECT_EQ(crc32(&input[1], std::strlen(input) - 1), kExpCrc);
61 
62  uint32_t ctx;
63  crc32_init(&ctx);
64  crc32_add(&ctx, &input[1], std::strlen(input) - 1);
65 
66  EXPECT_EQ(crc32_finish(&ctx), kExpCrc);
67 }
68 
69 TEST_P(CrcTest, Crc32Add8) {
70  uint32_t ctx;
71  crc32_init(&ctx);
72  for (auto val : GetParam().input) {
73  crc32_add8(&ctx, val);
74  }
75  EXPECT_EQ(crc32_finish(&ctx), GetParam().exp_crc);
76 }
77 
78 TEST_F(CrcTest, Crc32Add32) {
79  uint32_t ctx;
80  crc32_init(&ctx);
81  constexpr uint32_t kExpCrc = 0x9508ac14;
82 
83  crc32_add32(&ctx, 0xcafecafe);
84  OT_DISCARD(crc32_finish(&ctx));
85  crc32_add32(&ctx, 0x1badb002);
86 
87  EXPECT_EQ(crc32_finish(&ctx), kExpCrc);
88 }
89 
90 } // namespace
91 } // namespace crc32_unittest