# TechIRCd Stress Testing Tool

A comprehensive Python-based stress testing tool for TechIRCd IRC server.

## Features

- **Configurable Test Scenarios**: JSON-based configuration
- **Multiple Test Types**: Connection tests, message flooding, command spam
- **Gradual or Mass Operations**: Connect/disconnect clients gradually or all at once
- **Real-time Statistics**: Connection counts, message statistics, error tracking
- **Logging**: Detailed logging to file and console
- **SSL Support**: Test both plain and SSL connections

## Requirements

```bash
pip3 install asyncio  # Usually included with Python 3.7+
```

## Usage

### Run All Test Scenarios
```bash
python3 stress_test.py
```

### Run Specific Scenario
```bash
python3 stress_test.py --scenario "Basic Connection Test"
```

### Use Custom Configuration
```bash
python3 stress_test.py --config my_config.json
```

## Configuration

Edit `stress_config.json` to customize tests:

### Server Settings
```json
{
  "server": {
    "host": "localhost",      // IRC server hostname
    "port": 6667,            // IRC server port
    "ssl": false,            // Use SSL connection
    "ssl_port": 6697,        // SSL port
    "nick_prefix": "StressBot", // Prefix for bot nicknames
    "auto_join_channels": ["#test"] // Channels to auto-join
  }
}
```

### Test Scenarios

Each scenario supports:
- `client_count`: Number of concurrent clients
- `duration`: How long to run the test (seconds)
- `connect_gradually`: Connect clients one by one vs all at once
- `connect_delay`: Delay between gradual connections
- `disconnect_gradually`: Disconnect gradually vs all at once
- `activities`: List of activities to perform during test

### Activity Types

1. **channel_flood**: Flood channels with messages
2. **private_flood**: Send private messages between clients
3. **join_part_spam**: Rapid JOIN/PART operations
4. **nick_change_spam**: Rapid nickname changes
5. **random_commands**: Send random IRC commands

## Pre-configured Test Scenarios

1. **Basic Connection Test** (10 clients, 30s)
   - Simple connection and registration test

2. **Mass Connection Stress** (50 clients, 60s)
   - Many simultaneous connections with channel flooding

3. **Gradual Connection Test** (30 clients, 45s)
   - Gradual connection buildup with private messaging

4. **Heavy Activity Test** (25 clients, 90s)
   - Multiple activity types running simultaneously

5. **Nick Change Spam** (15 clients, 30s)
   - Rapid nickname change testing

6. **Channel Chaos Test** (20 clients, 60s)
   - JOIN/PART spam with message flooding

7. **Maximum Load Test** (100 clients, 120s)
   - Push server to maximum capacity

## Monitoring

- **Real-time logs**: Monitor progress in console
- **Log file**: Detailed logs saved to `stress_test.log`
- **Statistics**: Connection counts, message statistics, error tracking

## Example Output

```
2025-09-07 12:00:00 - INFO - Starting scenario: Basic Connection Test
2025-09-07 12:00:00 - INFO - Clients: 10, Duration: 30s
2025-09-07 12:00:00 - INFO - Mass connecting 10 clients...
2025-09-07 12:00:01 - INFO - Connected 10/10 clients
2025-09-07 12:00:03 - INFO - Registered 10/10 clients
2025-09-07 12:00:33 - INFO - Stats: 10 connected, 10 registered, 0 messages sent
2025-09-07 12:00:35 - INFO - Scenario Basic Connection Test completed
```

## Tips for Testing

1. **Start Small**: Begin with basic connection test
2. **Monitor Resources**: Watch TechIRCd memory/CPU usage
3. **Check Logs**: Review both stress test and TechIRCd logs
4. **Gradual Increase**: Increase client counts gradually
5. **Test Different Scenarios**: Each scenario tests different aspects

## Troubleshooting

- **Connection Refused**: Make sure TechIRCd is running
- **SSL Errors**: Check SSL configuration in both TechIRCd and test config
- **Memory Issues**: Reduce client count or test duration
- **Python Errors**: Ensure Python 3.7+ with asyncio support
