webserv/docs/TESTING_SETUP.md
2025-10-10 07:56:49 +02:00

4.7 KiB

Webserv Unit Testing Platform - Setup Summary

🎉 Successfully Implemented!

I've successfully added a comprehensive unit testing platform to your webserv project using Google Test (gtest). Here's what has been set up:

📁 Project Structure

webserv/
├── CMakeLists.txt              # Updated with testing support
├── Makefile                    # Added test targets
├── run_tests.sh               # Custom test runner script ⭐
├── tests/                     # New test directory
│   ├── CMakeLists.txt         # Test configuration
│   ├── README.md              # Comprehensive testing guide
│   ├── test_main.cpp          # Main test runner
│   ├── test_config.conf       # Sample config for tests
│   ├── config/                # Configuration tests
│   │   └── test_directives.cpp
│   ├── http/                  # HTTP component tests
│   │   └── test_http_headers.cpp
│   ├── log/                   # Logging system tests
│   │   └── test_log.cpp
│   └── socket/                # Socket tests
│       └── test_socket.cpp

🚀 How to Use

Quick Commands

# Build and run all tests
make test

# Run tests with verbose output
make test_verbose

# Only build tests (don't run)
make test_build

# Use the custom test runner (with colors and better formatting)
./run_tests.sh
./run_tests.sh --verbose
./run_tests.sh --build-only

🧪 Current Test Coverage

33 Tests covering:

Configuration System (10 tests)

  • StringDirective creation and parsing
  • IntDirective creation and parsing
  • BoolDirective creation and parsing
  • DirectiveFactory functionality
  • Exception handling for invalid directives

HTTP Components (10 tests)

  • HttpHeaders add/get/remove operations
  • Case-insensitive header handling
  • Content-Length, Content-Type, Host parsing
  • Header string serialization

Logging System (10 tests)

  • Log level conversions (string ↔ enum)
  • Color code generation
  • Channel construction
  • Static logging methods
  • Context-aware logging

Socket System (3 tests)

  • Socket construction
  • Exception handling for invalid file descriptors
  • Basic move semantics

🔧 Technical Features

Smart Dependency Management

  • System gtest: Uses system-installed Google Test when available
  • Fallback: Downloads Google Test v1.14.0 if system version unavailable
  • CMake Integration: Automatic test discovery with gtest_discover_tests

Build System Integration

  • Library Separation: Creates webserv_lib (without main.cpp) for testing
  • Parallel Builds: Full CMake parallel compilation support
  • Multiple Configurations: Works with Release, Debug, and ASAN builds

Developer Experience

  • Colored Output: Beautiful test runner with emojis and status indicators
  • Verbose Mode: Detailed test output when needed
  • Build-Only Mode: Compile tests without running
  • Error Reporting: Clear failure messages with context

📊 Current Results

🎯 100% tests passed, 0 tests failed out of 33
⏱️  Total Test time: 0.07 sec

🔮 Next Steps

Add More Test Coverage

// Example: Add tests for new components
tests/
├── client/
   └── test_client.cpp        # Client request handling
├── server/  
   └── test_server.cpp        # Server lifecycle, epoll handling
├── router/
   └── test_router.cpp        # URL routing, location matching
└── integration/
    └── test_full_request.cpp  # End-to-end request processing

Extend Testing Capabilities

  • Mock Objects: Add gmock for mocking network operations
  • Integration Tests: Add tests that use real sockets/files
  • Performance Tests: Add benchmarking with Google Benchmark
  • Coverage Reporting: Add code coverage analysis

💡 Best Practices Established

  1. Test Isolation: Each test is independent
  2. Descriptive Names: Clear test names like HttpHeadersTest.CaseInsensitiveHeaderNames
  3. Arrange-Act-Assert: Well-structured test flow
  4. Exception Testing: Proper testing of error conditions
  5. Edge Cases: Testing boundary conditions and invalid inputs

🛠️ Example: Adding a New Test

// tests/router/test_router.cpp
#include <gtest/gtest.h>
#include <webserv/router/Router.hpp>

class RouterTest : public ::testing::Test {
protected:
    void SetUp() override {
        // Setup test data
    }
};

TEST_F(RouterTest, RouteMatching) {
    // Test your router functionality
    EXPECT_EQ(expected, actual);
}

The testing platform is now fully operational and ready for development! 🚀