1*7eba2f3bSAndroid Build Coastguard Worker //
2*7eba2f3bSAndroid Build Coastguard Worker // Copyright (C) 2024 The Android Open Source Project
3*7eba2f3bSAndroid Build Coastguard Worker //
4*7eba2f3bSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*7eba2f3bSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*7eba2f3bSAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*7eba2f3bSAndroid Build Coastguard Worker //
8*7eba2f3bSAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
9*7eba2f3bSAndroid Build Coastguard Worker //
10*7eba2f3bSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*7eba2f3bSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*7eba2f3bSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*7eba2f3bSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*7eba2f3bSAndroid Build Coastguard Worker // limitations under the License.
15*7eba2f3bSAndroid Build Coastguard Worker //
16*7eba2f3bSAndroid Build Coastguard Worker
17*7eba2f3bSAndroid Build Coastguard Worker #include "CrcChecksum.h"
18*7eba2f3bSAndroid Build Coastguard Worker #include <gtest/gtest.h>
19*7eba2f3bSAndroid Build Coastguard Worker #include <fstream>
20*7eba2f3bSAndroid Build Coastguard Worker #include <iostream>
21*7eba2f3bSAndroid Build Coastguard Worker #include <string>
22*7eba2f3bSAndroid Build Coastguard Worker
writeFileWithChecksum(const std::string & filename,const std::string & data,uint16_t checksum)23*7eba2f3bSAndroid Build Coastguard Worker void writeFileWithChecksum(const std::string& filename, const std::string& data,
24*7eba2f3bSAndroid Build Coastguard Worker uint16_t checksum)
25*7eba2f3bSAndroid Build Coastguard Worker {
26*7eba2f3bSAndroid Build Coastguard Worker std::ofstream file(filename, std::ios::binary);
27*7eba2f3bSAndroid Build Coastguard Worker if (file.is_open()) {
28*7eba2f3bSAndroid Build Coastguard Worker file.write(reinterpret_cast<const char*>(&checksum),
29*7eba2f3bSAndroid Build Coastguard Worker sizeof(checksum));
30*7eba2f3bSAndroid Build Coastguard Worker file.write(data.c_str(), data.size());
31*7eba2f3bSAndroid Build Coastguard Worker file.close();
32*7eba2f3bSAndroid Build Coastguard Worker }
33*7eba2f3bSAndroid Build Coastguard Worker }
34*7eba2f3bSAndroid Build Coastguard Worker class CrcChecksumTest : public ::testing::Test {
35*7eba2f3bSAndroid Build Coastguard Worker protected:
SetUp()36*7eba2f3bSAndroid Build Coastguard Worker void SetUp() override {}
TearDown()37*7eba2f3bSAndroid Build Coastguard Worker void TearDown() override {}
38*7eba2f3bSAndroid Build Coastguard Worker };
39*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(CrcChecksumTest,EmptyBuffer)40*7eba2f3bSAndroid Build Coastguard Worker TEST_F(CrcChecksumTest, EmptyBuffer) {
41*7eba2f3bSAndroid Build Coastguard Worker unsigned char buffer[] = {};
42*7eba2f3bSAndroid Build Coastguard Worker uint16_t result = crcChecksumCompute(buffer, sizeof(buffer));
43*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(result, 0);
44*7eba2f3bSAndroid Build Coastguard Worker }
45*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(CrcChecksumTest,SingleByteBuffer)46*7eba2f3bSAndroid Build Coastguard Worker TEST_F(CrcChecksumTest, SingleByteBuffer) {
47*7eba2f3bSAndroid Build Coastguard Worker unsigned char buffer[] = {0x01};
48*7eba2f3bSAndroid Build Coastguard Worker uint16_t result = crcChecksumCompute(buffer, sizeof(buffer));
49*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(result, 49345);
50*7eba2f3bSAndroid Build Coastguard Worker }
51*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(CrcChecksumTest,MultipleByteBuffer)52*7eba2f3bSAndroid Build Coastguard Worker TEST_F(CrcChecksumTest, MultipleByteBuffer) {
53*7eba2f3bSAndroid Build Coastguard Worker unsigned char buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05};
54*7eba2f3bSAndroid Build Coastguard Worker uint16_t result = crcChecksumCompute(buffer, sizeof(buffer));
55*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(result, 47886);
56*7eba2f3bSAndroid Build Coastguard Worker }
57*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(CrcChecksumTest,AllZeroBuffer)58*7eba2f3bSAndroid Build Coastguard Worker TEST_F(CrcChecksumTest, AllZeroBuffer) {
59*7eba2f3bSAndroid Build Coastguard Worker unsigned char buffer[5] = {0};
60*7eba2f3bSAndroid Build Coastguard Worker uint16_t result = crcChecksumCompute(buffer, sizeof(buffer));
61*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(result, 0x0000);
62*7eba2f3bSAndroid Build Coastguard Worker }
63*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(CrcChecksumTest,AllOneBuffer)64*7eba2f3bSAndroid Build Coastguard Worker TEST_F(CrcChecksumTest, AllOneBuffer) {
65*7eba2f3bSAndroid Build Coastguard Worker unsigned char buffer[] = {0xFF, 0xFF, 0xFF, 0xFF};
66*7eba2f3bSAndroid Build Coastguard Worker uint16_t result = crcChecksumCompute(buffer, sizeof(buffer));
67*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(result, 37889);
68*7eba2f3bSAndroid Build Coastguard Worker }
69*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(CrcChecksumTest,AlternatingBytes)70*7eba2f3bSAndroid Build Coastguard Worker TEST_F(CrcChecksumTest, AlternatingBytes) {
71*7eba2f3bSAndroid Build Coastguard Worker unsigned char buffer[] = {0xAA, 0x55, 0xAA, 0x55};
72*7eba2f3bSAndroid Build Coastguard Worker uint16_t result = crcChecksumCompute(buffer, sizeof(buffer));
73*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(result, 22415);
74*7eba2f3bSAndroid Build Coastguard Worker }
75*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(CrcChecksumTest,LargeBuffer)76*7eba2f3bSAndroid Build Coastguard Worker TEST_F(CrcChecksumTest, LargeBuffer) {
77*7eba2f3bSAndroid Build Coastguard Worker std::string largeData(10 * 1024 * 1024, 'A');
78*7eba2f3bSAndroid Build Coastguard Worker uint16_t expectedChecksum = crcChecksumCompute(
79*7eba2f3bSAndroid Build Coastguard Worker reinterpret_cast<const unsigned char*>(largeData.c_str()),
80*7eba2f3bSAndroid Build Coastguard Worker largeData.size());
81*7eba2f3bSAndroid Build Coastguard Worker std::string filename = "test_large_buffer.bin";
82*7eba2f3bSAndroid Build Coastguard Worker writeFileWithChecksum(filename, largeData, expectedChecksum);
83*7eba2f3bSAndroid Build Coastguard Worker bool result = crcChecksumVerifyIntegrity(filename.c_str());
84*7eba2f3bSAndroid Build Coastguard Worker EXPECT_TRUE(result);
85*7eba2f3bSAndroid Build Coastguard Worker remove(filename.c_str());
86*7eba2f3bSAndroid Build Coastguard Worker }
87*7eba2f3bSAndroid Build Coastguard Worker
88*7eba2f3bSAndroid Build Coastguard Worker class CrcChecksumFileTest : public ::testing::Test {
89*7eba2f3bSAndroid Build Coastguard Worker protected:
SetUp()90*7eba2f3bSAndroid Build Coastguard Worker void SetUp() override {}
TearDown()91*7eba2f3bSAndroid Build Coastguard Worker void TearDown() override {}
92*7eba2f3bSAndroid Build Coastguard Worker };
93*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(CrcChecksumFileTest,VerifyFileIntegrity)94*7eba2f3bSAndroid Build Coastguard Worker TEST_F(CrcChecksumFileTest, VerifyFileIntegrity) {
95*7eba2f3bSAndroid Build Coastguard Worker // Define test data and compute the expected checksum
96*7eba2f3bSAndroid Build Coastguard Worker std::string data = "Hello, CRC!";
97*7eba2f3bSAndroid Build Coastguard Worker uint16_t expectedChecksum = crcChecksumCompute(
98*7eba2f3bSAndroid Build Coastguard Worker reinterpret_cast<const unsigned char*>(data.c_str()), data.size());
99*7eba2f3bSAndroid Build Coastguard Worker std::string filename = "test_file_with_crc.bin";
100*7eba2f3bSAndroid Build Coastguard Worker writeFileWithChecksum(filename, data, expectedChecksum);
101*7eba2f3bSAndroid Build Coastguard Worker bool result = crcChecksumVerifyIntegrity(filename.c_str());
102*7eba2f3bSAndroid Build Coastguard Worker EXPECT_TRUE(result);
103*7eba2f3bSAndroid Build Coastguard Worker remove(filename.c_str());
104*7eba2f3bSAndroid Build Coastguard Worker }
105*7eba2f3bSAndroid Build Coastguard Worker
106*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(CrcChecksumFileTest,VerifyFileIntegrityWithCorruptedChecksum)107*7eba2f3bSAndroid Build Coastguard Worker TEST_F(CrcChecksumFileTest, VerifyFileIntegrityWithCorruptedChecksum)
108*7eba2f3bSAndroid Build Coastguard Worker {
109*7eba2f3bSAndroid Build Coastguard Worker std::string data = "Hello, CRC!";
110*7eba2f3bSAndroid Build Coastguard Worker uint16_t expectedChecksum = crcChecksumCompute(
111*7eba2f3bSAndroid Build Coastguard Worker reinterpret_cast<const unsigned char*>(data.c_str()), data.size());
112*7eba2f3bSAndroid Build Coastguard Worker uint16_t corruptedChecksum = expectedChecksum + 1;
113*7eba2f3bSAndroid Build Coastguard Worker std::string filename = "test_file_with_corrupted_crc.bin";
114*7eba2f3bSAndroid Build Coastguard Worker writeFileWithChecksum(filename, data, corruptedChecksum);
115*7eba2f3bSAndroid Build Coastguard Worker bool result = crcChecksumVerifyIntegrity(filename.c_str());
116*7eba2f3bSAndroid Build Coastguard Worker EXPECT_FALSE(result);
117*7eba2f3bSAndroid Build Coastguard Worker remove(filename.c_str());
118*7eba2f3bSAndroid Build Coastguard Worker }
119*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(CrcChecksumFileTest,FileWithMissingChecksum)120*7eba2f3bSAndroid Build Coastguard Worker TEST_F(CrcChecksumFileTest, FileWithMissingChecksum) {
121*7eba2f3bSAndroid Build Coastguard Worker std::string data = "Hello, CRC!";
122*7eba2f3bSAndroid Build Coastguard Worker std::string filename = "test_missing_checksum.bin";
123*7eba2f3bSAndroid Build Coastguard Worker std::ofstream file(filename, std::ios::binary);
124*7eba2f3bSAndroid Build Coastguard Worker file.write(data.c_str(), data.size());
125*7eba2f3bSAndroid Build Coastguard Worker bool result = crcChecksumVerifyIntegrity(filename.c_str());
126*7eba2f3bSAndroid Build Coastguard Worker EXPECT_FALSE(result);
127*7eba2f3bSAndroid Build Coastguard Worker remove(filename.c_str());
128*7eba2f3bSAndroid Build Coastguard Worker }
129*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(CrcChecksumFileTest,EmptyFile)130*7eba2f3bSAndroid Build Coastguard Worker TEST_F(CrcChecksumFileTest, EmptyFile) {
131*7eba2f3bSAndroid Build Coastguard Worker std::string filename = "test_empty_file.bin";
132*7eba2f3bSAndroid Build Coastguard Worker std::ofstream file(filename, std::ios::binary);
133*7eba2f3bSAndroid Build Coastguard Worker bool result = crcChecksumVerifyIntegrity(filename.c_str());
134*7eba2f3bSAndroid Build Coastguard Worker EXPECT_FALSE(result);
135*7eba2f3bSAndroid Build Coastguard Worker remove(filename.c_str());
136*7eba2f3bSAndroid Build Coastguard Worker }
137*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(CrcChecksumFileTest,LargeFile)138*7eba2f3bSAndroid Build Coastguard Worker TEST_F(CrcChecksumFileTest, LargeFile) {
139*7eba2f3bSAndroid Build Coastguard Worker std::string data(10 * 1024 * 1024, 'A');
140*7eba2f3bSAndroid Build Coastguard Worker uint16_t checksum = crcChecksumCompute(
141*7eba2f3bSAndroid Build Coastguard Worker reinterpret_cast<const unsigned char*>(data.c_str()), data.size());
142*7eba2f3bSAndroid Build Coastguard Worker std::string filename = "test_large_file.bin";
143*7eba2f3bSAndroid Build Coastguard Worker writeFileWithChecksum(filename, data, checksum);
144*7eba2f3bSAndroid Build Coastguard Worker bool result = crcChecksumVerifyIntegrity(filename.c_str());
145*7eba2f3bSAndroid Build Coastguard Worker EXPECT_TRUE(result);
146*7eba2f3bSAndroid Build Coastguard Worker remove(filename.c_str());
147*7eba2f3bSAndroid Build Coastguard Worker }
148*7eba2f3bSAndroid Build Coastguard Worker
main(int argc,char ** argv)149*7eba2f3bSAndroid Build Coastguard Worker int main(int argc, char** argv) {
150*7eba2f3bSAndroid Build Coastguard Worker ::testing::InitGoogleTest(&argc, argv);
151*7eba2f3bSAndroid Build Coastguard Worker return RUN_ALL_TESTS();
152*7eba2f3bSAndroid Build Coastguard Worker }