Sunshine/tests/unit/test_process.cpp
Cilps the Pumpkin 76b3a8596f
feat(api): add application image endpoint (#4627)
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
2026-01-27 16:34:03 -05:00

272 lines
6.4 KiB
C++

/**
* @file tests/unit/test_process.cpp
* @brief Test src/process.* functions.
*/
// test imports
#include "../tests_common.h"
// standard imports
#include <filesystem>
#include <fstream>
// local imports
#include <src/process.h>
namespace fs = std::filesystem;
class ProcessPNGTest: public ::testing::Test {
protected:
void SetUp() override {
// Create test directory
test_dir = fs::temp_directory_path() / "sunshine_process_png_test";
fs::create_directories(test_dir);
}
void TearDown() override {
// Clean up test directory
if (fs::exists(test_dir)) {
fs::remove_all(test_dir);
}
}
// Helper function to create a file with specific content
void createTestFile(const fs::path &path, const std::vector<unsigned char> &content) const {
std::ofstream file(path, std::ios::binary);
file.write(reinterpret_cast<const char *>(content.data()), content.size());
file.close();
}
fs::path test_dir;
};
// Tests for check_valid_png function
TEST_F(ProcessPNGTest, CheckValidPNG_ValidSignature) {
// Valid PNG signature
const std::vector<unsigned char> valid_png_data = {
0x89,
0x50,
0x4E,
0x47,
0x0D,
0x0A,
0x1A,
0x0A, // PNG signature
// Add some dummy data to make it more realistic
0x00,
0x00,
0x00,
0x0D,
0x49,
0x48,
0x44,
0x52
};
const fs::path test_file = test_dir / "valid.png";
createTestFile(test_file, valid_png_data);
EXPECT_TRUE(proc::check_valid_png(test_file));
}
TEST_F(ProcessPNGTest, CheckValidPNG_WrongSignature) {
// Invalid PNG signature (wrong magic bytes)
const std::vector<unsigned char> invalid_png_data = {
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00
};
const fs::path test_file = test_dir / "invalid.png";
createTestFile(test_file, invalid_png_data);
EXPECT_FALSE(proc::check_valid_png(test_file));
}
TEST_F(ProcessPNGTest, CheckValidPNG_TooShort) {
// File too short (less than 8 bytes)
const std::vector<unsigned char> short_data = {
0x89,
0x50,
0x4E,
0x47
};
const fs::path test_file = test_dir / "short.png";
createTestFile(test_file, short_data);
EXPECT_FALSE(proc::check_valid_png(test_file));
}
TEST_F(ProcessPNGTest, CheckValidPNG_EmptyFile) {
// Empty file
const std::vector<unsigned char> empty_data = {};
const fs::path test_file = test_dir / "empty.png";
createTestFile(test_file, empty_data);
EXPECT_FALSE(proc::check_valid_png(test_file));
}
TEST_F(ProcessPNGTest, CheckValidPNG_NonExistentFile) {
// File doesn't exist
const fs::path test_file = test_dir / "nonexistent.png";
EXPECT_FALSE(proc::check_valid_png(test_file));
}
TEST_F(ProcessPNGTest, CheckValidPNG_RealFile) {
// Test with the actual sunshine.png from the project root
// Only run this test if the file exists
if (const fs::path sunshine_png = fs::path(SUNSHINE_SOURCE_DIR) / "sunshine.png"; fs::exists(sunshine_png)) {
EXPECT_TRUE(proc::check_valid_png(sunshine_png));
} else {
GTEST_SKIP() << "sunshine.png not found in project root";
}
}
TEST_F(ProcessPNGTest, CheckValidPNG_JPEGFile) {
// JPEG signature (not PNG)
const std::vector<unsigned char> jpeg_data = {
0xFF,
0xD8,
0xFF,
0xE0,
0x00,
0x10,
0x4A,
0x46
};
const fs::path test_file = test_dir / "fake.png";
createTestFile(test_file, jpeg_data);
EXPECT_FALSE(proc::check_valid_png(test_file));
}
TEST_F(ProcessPNGTest, CheckValidPNG_PartialSignature) {
// Partial PNG signature (first 4 bytes correct, rest wrong)
const std::vector<unsigned char> partial_png_data = {
0x89,
0x50,
0x4E,
0x47,
0x00,
0x00,
0x00,
0x00
};
const fs::path test_file = test_dir / "partial.png";
createTestFile(test_file, partial_png_data);
EXPECT_FALSE(proc::check_valid_png(test_file));
}
// Tests for validate_app_image_path function
TEST_F(ProcessPNGTest, ValidateAppImagePath_EmptyPath) {
// Empty path should return default
const std::string result = proc::validate_app_image_path("");
EXPECT_EQ(result, DEFAULT_APP_IMAGE_PATH);
}
TEST_F(ProcessPNGTest, ValidateAppImagePath_NonPNGExtension) {
// Non-PNG extension should return default
const std::string result = proc::validate_app_image_path("image.jpg");
EXPECT_EQ(result, DEFAULT_APP_IMAGE_PATH);
}
TEST_F(ProcessPNGTest, ValidateAppImagePath_CaseInsensitiveExtension) {
// Test that .PNG (uppercase) is recognized
// Create a valid PNG file
const std::vector<unsigned char> valid_png_data = {
0x89,
0x50,
0x4E,
0x47,
0x0D,
0x0A,
0x1A,
0x0A,
0x00,
0x00,
0x00,
0x0D,
0x49,
0x48,
0x44,
0x52
};
const fs::path test_file = test_dir / "test.PNG";
createTestFile(test_file, valid_png_data);
const std::string result = proc::validate_app_image_path(test_file.string());
// Should accept uppercase .PNG extension
EXPECT_NE(result, DEFAULT_APP_IMAGE_PATH);
}
TEST_F(ProcessPNGTest, ValidateAppImagePath_NonExistentFile) {
// Non-existent PNG file should return default
const std::string result = proc::validate_app_image_path("/nonexistent/path/image.png");
EXPECT_EQ(result, DEFAULT_APP_IMAGE_PATH);
}
TEST_F(ProcessPNGTest, ValidateAppImagePath_InvalidPNGSignature) {
// File with .png extension but invalid signature should return default
const std::vector<unsigned char> invalid_data = {
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00
};
const fs::path test_file = test_dir / "invalid.png";
createTestFile(test_file, invalid_data);
const std::string result = proc::validate_app_image_path(test_file.string());
EXPECT_EQ(result, DEFAULT_APP_IMAGE_PATH);
}
TEST_F(ProcessPNGTest, ValidateAppImagePath_ValidPNG) {
// Valid PNG file should return the path
const std::vector<unsigned char> valid_png_data = {
0x89,
0x50,
0x4E,
0x47,
0x0D,
0x0A,
0x1A,
0x0A,
0x00,
0x00,
0x00,
0x0D,
0x49,
0x48,
0x44,
0x52
};
const fs::path test_file = test_dir / "valid.png";
createTestFile(test_file, valid_png_data);
const std::string result = proc::validate_app_image_path(test_file.string());
EXPECT_EQ(result, test_file.string());
}
TEST_F(ProcessPNGTest, ValidateAppImagePath_OldSteamDefault) {
// Test the special case for old steam image path
const std::string result = proc::validate_app_image_path("./assets/steam.png");
EXPECT_EQ(result, SUNSHINE_ASSETS_DIR "/steam.png");
}