Extra2D/Tests/test_data_processor.cpp

261 lines
7.9 KiB
C++

/**
* @file test_data_processor.cpp
* @brief DataProcessor 单元测试
*
* 测试数据处理管道、加密/解密、压缩/解压功能。
*/
#include "test_framework.h"
#include <extra2d/asset/data_processor.h>
using namespace extra2d;
using namespace extra2d::test;
// ---------------------------------------------------------------------------
// XOR 加密/解密测试
// ---------------------------------------------------------------------------
TEST(DataProcessor, XOR_EncryptDecrypt) {
std::vector<u8> original = createTestData(1024);
std::string key = "test-key-12345";
Encryptor encryptor(key, Decryptor::Type::XOR);
Decryptor decryptor(key, Decryptor::Type::XOR);
std::vector<u8> encrypted = encryptor.process(original);
std::vector<u8> decrypted = decryptor.process(encrypted);
TEST_ASSERT_TRUE(dataEquals(original, decrypted));
TEST_ASSERT_FALSE(dataEquals(original, encrypted));
}
TEST(DataProcessor, XOR_SameKeyProducesSameResult) {
std::vector<u8> data = createTestData(512);
std::string key = "secret";
Encryptor enc1(key, Decryptor::Type::XOR);
Encryptor enc2(key, Decryptor::Type::XOR);
std::vector<u8> result1 = enc1.process(data);
std::vector<u8> result2 = enc2.process(data);
TEST_ASSERT_TRUE(dataEquals(result1, result2));
}
TEST(DataProcessor, XOR_DifferentKeysProduceDifferentResults) {
std::vector<u8> data = createTestData(512);
Encryptor enc1("key1", Decryptor::Type::XOR);
Encryptor enc2("key2", Decryptor::Type::XOR);
std::vector<u8> result1 = enc1.process(data);
std::vector<u8> result2 = enc2.process(data);
TEST_ASSERT_FALSE(dataEquals(result1, result2));
}
TEST(DataProcessor, XOR_EmptyKey) {
std::vector<u8> data = createTestData(256);
Encryptor encryptor("", Decryptor::Type::XOR);
Decryptor decryptor("", Decryptor::Type::XOR);
std::vector<u8> encrypted = encryptor.process(data);
std::vector<u8> decrypted = decryptor.process(encrypted);
TEST_ASSERT_TRUE(dataEquals(data, decrypted));
}
TEST(DataProcessor, XOR_EmptyData) {
std::vector<u8> empty;
std::string key = "test";
Encryptor encryptor(key, Decryptor::Type::XOR);
Decryptor decryptor(key, Decryptor::Type::XOR);
std::vector<u8> encrypted = encryptor.process(empty);
std::vector<u8> decrypted = decryptor.process(encrypted);
TEST_ASSERT_TRUE(decrypted.empty());
}
// ---------------------------------------------------------------------------
// DataPipe 测试
// ---------------------------------------------------------------------------
TEST(DataProcessor, DataPipe_Empty) {
DataPipe pipe;
TEST_ASSERT_TRUE(pipe.empty());
TEST_ASSERT_EQ(0u, pipe.size());
std::vector<u8> data = createTestData(100);
std::vector<u8> result = pipe.process(data);
TEST_ASSERT_TRUE(dataEquals(data, result));
}
TEST(DataProcessor, DataPipe_SingleProcessor) {
DataPipe pipe;
pipe.encrypt("key", Decryptor::Type::XOR);
TEST_ASSERT_FALSE(pipe.empty());
TEST_ASSERT_EQ(1u, pipe.size());
std::vector<u8> original = createTestData(256);
std::vector<u8> processed = pipe.process(original);
TEST_ASSERT_FALSE(dataEquals(original, processed));
}
TEST(DataProcessor, DataPipe_MultipleProcessors) {
DataPipe pipe;
pipe.encrypt("key", Decryptor::Type::XOR);
pipe.encrypt("key2", Decryptor::Type::XOR);
pipe.encrypt("key", Decryptor::Type::XOR);
pipe.encrypt("key2", Decryptor::Type::XOR);
TEST_ASSERT_EQ(4u, pipe.size());
std::vector<u8> original = createTestData(512);
std::vector<u8> processed = pipe.process(original);
TEST_ASSERT_TRUE(dataEquals(original, processed));
}
TEST(DataProcessor, DataPipe_EncryptDecrypt) {
DataPipe encryptPipe;
encryptPipe.encrypt("secret-key", Decryptor::Type::XOR);
DataPipe decryptPipe;
decryptPipe.decrypt("secret-key", Decryptor::Type::XOR);
std::vector<u8> original = createTestData(1024);
std::vector<u8> encrypted = encryptPipe.process(original);
std::vector<u8> decrypted = decryptPipe.process(encrypted);
TEST_ASSERT_TRUE(dataEquals(original, decrypted));
}
TEST(DataProcessor, DataPipe_Clear) {
DataPipe pipe;
pipe.encrypt("key", Decryptor::Type::XOR);
pipe.encrypt("key2", Decryptor::Type::XOR);
TEST_ASSERT_EQ(2u, pipe.size());
pipe.clear();
TEST_ASSERT_TRUE(pipe.empty());
TEST_ASSERT_EQ(0u, pipe.size());
}
TEST(DataProcessor, DataPipe_MoveSemantics) {
DataPipe pipe1;
pipe1.encrypt("key", Decryptor::Type::XOR);
DataPipe pipe2 = std::move(pipe1);
TEST_ASSERT_EQ(1u, pipe2.size());
std::vector<u8> data = createTestData(128);
std::vector<u8> result = pipe2.process(data);
TEST_ASSERT_FALSE(dataEquals(data, result));
}
// ---------------------------------------------------------------------------
// 校验和测试
// ---------------------------------------------------------------------------
TEST(DataProcessor, Checksum_Consistency) {
std::vector<u8> data = createTestData(1024);
std::vector<u8> checksum1 = computeChecksum(data);
std::vector<u8> checksum2 = computeChecksum(data);
TEST_ASSERT_TRUE(dataEquals(checksum1, checksum2));
}
TEST(DataProcessor, Checksum_DifferentData) {
std::vector<u8> data1 = createTestData(1024, 42);
std::vector<u8> data2 = createTestData(1024, 43);
std::vector<u8> checksum1 = computeChecksum(data1);
std::vector<u8> checksum2 = computeChecksum(data2);
TEST_ASSERT_FALSE(dataEquals(checksum1, checksum2));
}
TEST(DataProcessor, Checksum_Verify) {
std::vector<u8> data = createTestData(2048);
std::vector<u8> checksum = computeChecksum(data);
TEST_ASSERT_TRUE(verifyChecksum(data, checksum));
}
TEST(DataProcessor, Checksum_VerifyTampered) {
std::vector<u8> data = createTestData(2048);
std::vector<u8> checksum = computeChecksum(data);
data[100] ^= 0xFF;
TEST_ASSERT_FALSE(verifyChecksum(data, checksum));
}
TEST(DataProcessor, Checksum_Size) {
std::vector<u8> data = createTestData(100);
std::vector<u8> checksum = computeChecksum(data);
TEST_ASSERT_EQ(32u, checksum.size());
}
// ---------------------------------------------------------------------------
// 处理器链测试
// ---------------------------------------------------------------------------
TEST(DataProcessor, Chain_EncryptDecrypt) {
std::vector<u8> original = createTestData(512);
std::string key = "chain-test-key";
Encryptor encryptor(key, Decryptor::Type::XOR);
Decryptor decryptor(key, Decryptor::Type::XOR);
encryptor.setNext(std::make_unique<Decryptor>(key, Decryptor::Type::XOR));
std::vector<u8> result = encryptor.process(original);
TEST_ASSERT_TRUE(dataEquals(original, result));
}
// ---------------------------------------------------------------------------
// 边界条件测试
// ---------------------------------------------------------------------------
TEST(DataProcessor, Boundary_SingleByte) {
std::vector<u8> data = {0x42};
std::string key = "key";
Encryptor encryptor(key, Decryptor::Type::XOR);
Decryptor decryptor(key, Decryptor::Type::XOR);
std::vector<u8> encrypted = encryptor.process(data);
std::vector<u8> decrypted = decryptor.process(encrypted);
TEST_ASSERT_TRUE(dataEquals(data, decrypted));
TEST_ASSERT_EQ(1u, encrypted.size());
}
TEST(DataProcessor, Boundary_LargeData) {
std::vector<u8> data = createTestData(1024 * 1024);
std::string key = "large-data-key";
Encryptor encryptor(key, Decryptor::Type::XOR);
Decryptor decryptor(key, Decryptor::Type::XOR);
std::vector<u8> encrypted = encryptor.process(data);
std::vector<u8> decrypted = decryptor.process(encrypted);
TEST_ASSERT_TRUE(dataEquals(data, decrypted));
}