blob: 22bad8db4a749fbf1093b6f14b5468a0dc9eba6a [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#include "sw/device/silicon_creator/lib/crc32.h"
#include <cstring>
#include <stdint.h>
#include "gtest/gtest.h"
namespace crc32_unittest {
namespace {
struct TestParams {
std::string input;
uint32_t exp_crc;
};
class CrcTest : public testing::TestWithParam<TestParams> {};
// Expected CRC32 values were generated using the following Python snippet:
// ```
// import zlib
// hex(zlib.crc32(b'<string>'))
// ```
INSTANTIATE_TEST_SUITE_P(AllCases, CrcTest,
testing::Values(
TestParams{
"123456789",
0xcbf43926,
},
TestParams{
"The quick brown fox jumps over the lazy dog",
0x414fa339,
},
TestParams{
"\xfe\xca\xfe\xca\x02\xb0\xad\x1b",
0x9508ac14,
}));
TEST_P(CrcTest, Crc32) {
EXPECT_EQ(crc32(GetParam().input.data(), GetParam().input.length()),
GetParam().exp_crc);
}
TEST_P(CrcTest, Crc32Add) {
uint32_t ctx;
crc32_init(&ctx);
crc32_add(&ctx, GetParam().input.data(), GetParam().input.length());
EXPECT_EQ(crc32_finish(&ctx), GetParam().exp_crc);
}
TEST_F(CrcTest, Misaligned) {
constexpr uint32_t kExpCrc = 0x414fa339;
alignas(uint32_t) char input[] =
">The quick brown fox jumps over the lazy dog";
EXPECT_EQ(crc32(&input[1], std::strlen(input) - 1), kExpCrc);
uint32_t ctx;
crc32_init(&ctx);
crc32_add(&ctx, &input[1], std::strlen(input) - 1);
EXPECT_EQ(crc32_finish(&ctx), kExpCrc);
}
TEST_P(CrcTest, Crc32Add8) {
uint32_t ctx;
crc32_init(&ctx);
for (auto val : GetParam().input) {
crc32_add8(&ctx, val);
}
EXPECT_EQ(crc32_finish(&ctx), GetParam().exp_crc);
}
TEST_F(CrcTest, Crc32Add32) {
uint32_t ctx;
crc32_init(&ctx);
constexpr uint32_t kExpCrc = 0x9508ac14;
crc32_add32(&ctx, 0xcafecafe);
crc32_finish(&ctx);
crc32_add32(&ctx, 0x1badb002);
EXPECT_EQ(crc32_finish(&ctx), kExpCrc);
}
} // namespace
} // namespace crc32_unittest