This commit completes the Rust implementation of mail2couch with full feature parity to the Go version, including: - Complete IMAP client with TLS support and retry logic - Advanced email parsing with MIME multipart support using mail-parser - Email attachment extraction and CouchDB storage - Sync mode implementation with deleted message handling - Enhanced error handling and retry mechanisms - Identical command-line interface with bash completion - Test configurations for both implementations The Rust implementation now provides: - Memory safety and type safety guarantees - Modern async/await patterns with tokio/async-std - Comprehensive error handling with anyhow/thiserror - Structured logging and progress reporting - Performance optimizations and retry logic Test configurations created: - rust/config-test-rust.json - Rust implementation test config - go/config-test-go.json - Go implementation test config - test-config-comparison.md - Detailed comparison documentation - test-both-implementations.sh - Automated testing script Both implementations can now be tested side-by-side with identical configurations to validate feature parity and performance. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
4.8 KiB
Test Configuration Comparison: Rust vs Go
Overview
Two identical test configurations have been created for testing both Rust and Go implementations with the test environment:
- Rust:
/home/olemd/src/mail2couch/rust/config-test-rust.json - Go:
/home/olemd/src/mail2couch/go/config-test-go.json
Configuration Details
Both configurations use the same test environment from /home/olemd/src/mail2couch/test/ with:
Database Connection
- CouchDB URL:
http://localhost:5984 - Admin Credentials:
admin/password
IMAP Test Server
- Host:
localhost - Port:
3143(GreenMail test server) - Connection: Plain (no TLS for testing)
Test Accounts
Both configurations use the same IMAP test accounts:
| Username | Password | Purpose |
|---|---|---|
testuser1 |
password123 |
Wildcard all folders test |
syncuser |
syncpass |
Work pattern test (sync mode) |
archiveuser |
archivepass |
Specific folders test |
testuser2 |
password456 |
Subfolder pattern test (disabled) |
Mail Sources Configuration
Both configurations define identical mail sources with only the account names differing:
1. Wildcard All Folders Test
- Account Name: "Rust Wildcard All Folders Test" vs "Go Wildcard All Folders Test"
- Mode:
archive - Folders: All folders (
*) exceptDraftsandTrash - Filters: Subject keywords:
["meeting", "important"], Sender keywords:["@company.com"]
2. Work Pattern Test
- Account Name: "Rust Work Pattern Test" vs "Go Work Pattern Test"
- Mode:
sync(delete removed emails) - Folders:
Work*,Important*,INBOX(exclude*Temp*) - Filters: Recipient keywords:
["support@", "team@"]
3. Specific Folders Only
- Account Name: "Rust Specific Folders Only" vs "Go Specific Folders Only"
- Mode:
archive - Folders: Exactly
INBOX,Sent,Personal - Filters: None
4. Subfolder Pattern Test (Disabled)
- Account Name: "Rust Subfolder Pattern Test" vs "Go Subfolder Pattern Test"
- Mode:
archive - Folders:
Work/*,Archive/*(exclude*/Drafts) - Status:
enabled: false
Expected Database Names
When run, each implementation will create different databases due to the account name differences:
Rust Implementation Databases
m2c_rust_wildcard_all_folders_testm2c_rust_work_pattern_testm2c_rust_specific_folders_onlym2c_rust_subfolder_pattern_test(disabled)
Go Implementation Databases
m2c_go_wildcard_all_folders_testm2c_go_work_pattern_testm2c_go_specific_folders_onlym2c_go_subfolder_pattern_test(disabled)
Testing Commands
Start Test Environment
cd /home/olemd/src/mail2couch/test
./start-test-env.sh
Run Rust Implementation
cd /home/olemd/src/mail2couch/rust
cargo build --release
./target/release/mail2couch -c config-test-rust.json
Run Go Implementation
cd /home/olemd/src/mail2couch/go
go build -o mail2couch .
./mail2couch -c config-test-go.json
Verify Results
# List all databases
curl http://localhost:5984/_all_dbs
# Check Rust databases
curl http://localhost:5984/m2c_rust_wildcard_all_folders_test
curl http://localhost:5984/m2c_rust_work_pattern_test
curl http://localhost:5984/m2c_rust_specific_folders_only
# Check Go databases
curl http://localhost:5984/m2c_go_wildcard_all_folders_test
curl http://localhost:5984/m2c_go_work_pattern_test
curl http://localhost:5984/m2c_go_specific_folders_only
Stop Test Environment
cd /home/olemd/src/mail2couch/test
./stop-test-env.sh
Validation Points
Both implementations should produce identical results when processing the same IMAP accounts:
- Database Structure: Same document schemas and field names
- Message Processing: Same email parsing and storage logic
- Folder Filtering: Same wildcard pattern matching
- Message Filtering: Same keyword filtering behavior
- Sync Behavior: Same incremental sync and deletion handling
- Error Handling: Same retry logic and error recovery
The only differences should be:
- Database names (due to account name prefixes)
- Timestamp precision (implementation-specific)
- Internal document IDs format (if any)
Use Cases
Feature Parity Testing
Run both implementations with the same configuration to verify identical behavior:
# Run both implementations
./test-both-implementations.sh
# Compare database contents
./compare-database-results.sh
Performance Comparison
Use identical configurations to benchmark performance differences between Rust and Go implementations.
Development Testing
Use separate configurations during development to avoid database conflicts when testing both implementations simultaneously.