| #include "unity/unity.h" |
| #include "zlib.h" |
|
|
| #include <stdint.h> |
| #include <string.h> |
| #include <stdlib.h> |
|
|
| |
| extern void test_make_crc_table(void); |
|
|
| void setUp(void) { |
| |
| } |
|
|
| void tearDown(void) { |
| |
| } |
|
|
| |
| void test_make_crc_table_initializes_known_entries(void) { |
| test_make_crc_table(); |
|
|
| const unsigned long *tbl = get_crc_table(); |
| TEST_ASSERT_NOT_NULL(tbl); |
|
|
| |
| TEST_ASSERT_EQUAL_HEX32(0x00000000u, (uint32_t)tbl[0]); |
| TEST_ASSERT_EQUAL_HEX32(0x77073096u, (uint32_t)tbl[1]); |
| TEST_ASSERT_EQUAL_HEX32(0xEE0E612Cu, (uint32_t)tbl[2]); |
| TEST_ASSERT_EQUAL_HEX32(0x990951BAu, (uint32_t)tbl[3]); |
|
|
| TEST_ASSERT_EQUAL_HEX32(0x076DC419u, (uint32_t)tbl[4]); |
| TEST_ASSERT_EQUAL_HEX32(0x706AF48Fu, (uint32_t)tbl[5]); |
| TEST_ASSERT_EQUAL_HEX32(0xE963A535u, (uint32_t)tbl[6]); |
| TEST_ASSERT_EQUAL_HEX32(0x9E6495A3u, (uint32_t)tbl[7]); |
|
|
| TEST_ASSERT_EQUAL_HEX32(0x0EDB8832u, (uint32_t)tbl[8]); |
| TEST_ASSERT_EQUAL_HEX32(0x79DCB8A4u, (uint32_t)tbl[9]); |
| TEST_ASSERT_EQUAL_HEX32(0xE0D5E91Eu, (uint32_t)tbl[10]); |
| TEST_ASSERT_EQUAL_HEX32(0x97D2D988u, (uint32_t)tbl[11]); |
|
|
| TEST_ASSERT_EQUAL_HEX32(0x09B64C2Bu, (uint32_t)tbl[12]); |
| TEST_ASSERT_EQUAL_HEX32(0x7EB17CBDu, (uint32_t)tbl[13]); |
| TEST_ASSERT_EQUAL_HEX32(0xE7B82D07u, (uint32_t)tbl[14]); |
| TEST_ASSERT_EQUAL_HEX32(0x90BF1D91u, (uint32_t)tbl[15]); |
|
|
| |
| TEST_ASSERT_EQUAL_HEX32(0x2D02EF8Du, (uint32_t)tbl[255]); |
| } |
|
|
| |
| void test_make_crc_table_idempotent(void) { |
| test_make_crc_table(); |
| const unsigned long *tbl1 = get_crc_table(); |
| TEST_ASSERT_NOT_NULL(tbl1); |
|
|
| |
| uint32_t snapshot[33]; |
| for (int i = 0; i < 32; i++) { |
| snapshot[i] = (uint32_t)tbl1[i]; |
| } |
| snapshot[32] = (uint32_t)tbl1[255]; |
|
|
| |
| test_make_crc_table(); |
| const unsigned long *tbl2 = get_crc_table(); |
| TEST_ASSERT_NOT_NULL(tbl2); |
|
|
| for (int i = 0; i < 32; i++) { |
| TEST_ASSERT_EQUAL_HEX32(snapshot[i], (uint32_t)tbl2[i]); |
| } |
| TEST_ASSERT_EQUAL_HEX32(snapshot[32], (uint32_t)tbl2[255]); |
| } |
|
|
| |
| void test_make_crc_table_crc32_known_vector(void) { |
| test_make_crc_table(); |
|
|
| const char *msg = "123456789"; |
| uLong crc = crc32(0L, (const Bytef *)msg, (uInt)strlen(msg)); |
| TEST_ASSERT_EQUAL_HEX32(0xCBF43926u, (uint32_t)crc); |
| } |
|
|
| |
| void test_make_crc_table_crc32_combine_consistency(void) { |
| test_make_crc_table(); |
|
|
| const char *a = "Hello, "; |
| const char *b = "world!"; |
| const size_t la = strlen(a); |
| const size_t lb = strlen(b); |
|
|
| uLong crc_a = crc32(0L, (const Bytef *)a, (uInt)la); |
| uLong crc_b = crc32(0L, (const Bytef *)b, (uInt)lb); |
| uLong crc_ab_direct = crc32(0L, (const Bytef *)a, (uInt)la); |
| crc_ab_direct = crc32(crc_ab_direct, (const Bytef *)b, (uInt)lb); |
|
|
| uLong crc_ab_combined = crc32_combine64(crc_a, crc_b, (z_off64_t)lb); |
|
|
| TEST_ASSERT_EQUAL_HEX32((uint32_t)crc_ab_direct, (uint32_t)crc_ab_combined); |
| } |
|
|
| int main(void) { |
| UNITY_BEGIN(); |
| RUN_TEST(test_make_crc_table_initializes_known_entries); |
| RUN_TEST(test_make_crc_table_idempotent); |
| RUN_TEST(test_make_crc_table_crc32_known_vector); |
| RUN_TEST(test_make_crc_table_crc32_combine_consistency); |
| return UNITY_END(); |
| } |