1 // Copyright 2020 The Pigweed Authors
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
7 // https://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
14 #include "pw_checksum/crc32.h"
17 #include <string_view>
19 #include "gtest/gtest.h"
20 #include "pw_bytes/array.h"
22 namespace pw::checksum {
25 // The expected CRC32 values were calculated using
27 // http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
29 // with polynomial 0x4C11DB7, initial value 0xFFFFFFFF.
31 constexpr auto kBytes = bytes::Array<1, 2, 3, 4, 5, 6, 7, 8, 9>();
32 constexpr auto kBytesPart0 = bytes::Array<1, 2, 3, 4, 5>();
33 constexpr auto kBytesPart1 = bytes::Array<6, 7, 8, 9>();
34 constexpr uint32_t kBufferCrc = 0x40EFAB9E;
36 constexpr std::string_view kString =
37 "In the beginning the Universe was created. This has made a lot of "
38 "people very angry and been widely regarded as a bad move.";
39 constexpr uint32_t kStringCrc = 0x9EC87F88;
42 EXPECT_EQ(Crc32::Calculate(std::span<std::byte>()), PW_CHECKSUM_EMPTY_CRC32);
46 EXPECT_EQ(Crc32::Calculate(std::as_bytes(std::span(kBytes))), kBufferCrc);
50 EXPECT_EQ(Crc32::Calculate(std::as_bytes(std::span(kString))), kStringCrc);
53 TEST(Crc32Class, ByteByByte) {
55 for (std::byte b : kBytes) {
58 EXPECT_EQ(crc.value(), kBufferCrc);
61 TEST(Crc32Class, Buffer) {
63 crc32.Update(std::as_bytes(std::span(kBytes)));
64 EXPECT_EQ(crc32.value(), kBufferCrc);
67 TEST(Crc32Class, BufferAppend) {
69 crc32.Update(kBytesPart0);
70 crc32.Update(kBytesPart1);
71 EXPECT_EQ(crc32.value(), kBufferCrc);
74 TEST(Crc32Class, String) {
76 crc32.Update(std::as_bytes(std::span(kString)));
77 EXPECT_EQ(crc32.value(), kStringCrc);
80 extern "C" uint32_t CallChecksumCrc32(const void* data, size_t size_bytes);
81 extern "C" uint32_t CallChecksumCrc32Append(const void* data,
85 TEST(Crc32FromC, Buffer) {
86 EXPECT_EQ(CallChecksumCrc32(kBytes.data(), kBytes.size()), kBufferCrc);
89 TEST(Crc32FromC, String) {
90 EXPECT_EQ(CallChecksumCrc32(kString.data(), kString.size()), kStringCrc);
93 TEST(Crc32AppendFromC, Buffer) {
94 uint32_t crc = PW_CHECKSUM_EMPTY_CRC32;
95 for (std::byte b : kBytes) {
96 crc = CallChecksumCrc32Append(&b, 1, crc);
99 EXPECT_EQ(crc, kBufferCrc);
102 TEST(Crc32AppendFromC, String) {
103 EXPECT_EQ(CallChecksumCrc32Append(
104 kString.data(), kString.size(), PW_CHECKSUM_EMPTY_CRC32),
109 } // namespace pw::checksum