11 KiB
11 KiB
Stegasoo v4.0.0 Release Checklist
Overview
This checklist covers functionality testing for the v4.0.0 release.
Changes in v4.0.0
| Change | v3.2.0 | v4.0.0 |
|---|---|---|
| Python version | 3.10-3.12 | 3.10-3.12 (3.13 NOT supported) |
| JPEG handling | Could crash on quality=100 | Normalized before jpegio |
| Header size | 65 bytes | 65 bytes (unchanged) |
| API | passphrase, no date_str | Same (no breaking changes) |
| Format version | 4 | 4 (compatible with v3.2.0) |
Key Points
- No breaking API changes from v3.2.0
- v4.0 CAN decode v3.2.0 images (same format version)
- v4.0 CANNOT decode v3.1.x or earlier images
- Python 3.13 is NOT supported (jpegio C extension ABI incompatibility)
1. Pre-Release Checks
1.1 Python Version
python --version # Must be 3.10, 3.11, or 3.12
- Python version is 3.10, 3.11, or 3.12
- NOT Python 3.13 (jpegio will crash)
1.2 Dependencies
pip list | grep -E "jpegio|scipy|pillow|argon2"
- jpegio installed (for DCT JPEG support)
- scipy installed (for DCT mode)
- pillow installed
- argon2-cffi installed
2. Core Library Tests
2.1 Run Unit Tests
cd /path/to/stegasoo
pytest tests/ -v
- All tests pass
- No deprecation warnings for removed parameters
2.2 JPEG Normalization Test (NEW in v4.0)
python -c "
from PIL import Image
import io
from stegasoo import encode, decode
# Create quality=100 JPEG (triggers normalization)
img = Image.new('RGB', (400, 400), 'red')
buf = io.BytesIO()
img.save(buf, format='JPEG', quality=100)
jpeg_data = buf.getvalue()
# This should NOT crash (v3.2.0 would crash here)
result = encode(
message='Test quality 100',
reference_photo=jpeg_data,
carrier_image=jpeg_data,
passphrase='test phrase four words',
pin='123456',
embed_mode='dct'
)
print('✓ Quality=100 JPEG encode OK')
decoded = decode(
stego_image=result.stego_image,
reference_photo=jpeg_data,
passphrase='test phrase four words',
pin='123456'
)
assert decoded.message == 'Test quality 100'
print('✓ Quality=100 JPEG decode OK')
"
- Quality=100 JPEG encoding works (no crash)
- Quality=100 JPEG decoding works
2.3 Large Image Test (NEW in v4.0)
python -c "
from PIL import Image
import io
from stegasoo import encode, decode
# Create large image (similar to 14MB real photo)
img = Image.new('RGB', (4000, 3000), 'blue')
buf = io.BytesIO()
img.save(buf, format='PNG')
large_image = buf.getvalue()
print(f'Test image size: {len(large_image) / 1024 / 1024:.1f} MB')
result = encode(
message='Large image test',
reference_photo=large_image,
carrier_image=large_image,
passphrase='large image test phrase',
pin='123456'
)
print('✓ Large image encode OK')
decoded = decode(
stego_image=result.stego_image,
reference_photo=large_image,
passphrase='large image test phrase',
pin='123456'
)
assert decoded.message == 'Large image test'
print('✓ Large image decode OK')
"
- Large image (12MP+) encoding works
- Large image decoding works
3. Docker Build Tests
3.1 Base Image Build
# Build base image (one-time, 5-10 min)
sudo docker build -f Dockerfile.base -t stegasoo-base:latest .
- Base image builds successfully
- jpegio + scipy + numpy verification passes
3.2 Application Build
# Fast build using base image
sudo docker-compose build
- Web container builds
- API container builds
3.3 Container Startup
sudo docker-compose up -d
sudo docker-compose logs
- Web container starts without errors
- API container starts without errors
- No import errors in logs
4. Web UI Tests (http://localhost:5000)
4.1 Home Page
- v4.0 badge visible
- "Learn More" button is white/visible
- No references to "day phrase" or dates
4.2 Generate Page (/generate)
- Default is 4 words
- Single passphrase generated (not 7 daily)
- PIN toggle shows/hides digits
- Memory aid generator works
4.3 Encode Page (/encode)
- Passphrase field has blue glow on focus
- PIN field has orange glow on focus
- PIN box is 180px wide (fits LastPass icon)
- Passphrase font shrinks for long input (stepped)
- RSA .pem/QR toggle works
- QR image preview shows when selected
- DCT mode options appear when selected
- Encoding works (LSB mode)
- Encoding works (DCT mode)
4.4 Decode Page (/decode)
- Same styling as encode (glowing inputs)
- RSA .pem/QR toggle works (matches encode layout)
- QR image preview shows when selected
- Copy button is below message (not overlapping)
- Decoding works (LSB mode)
- Decoding works (DCT mode)
- Auto mode detection works
4.5 About Page (/about)
- Version history table present
- v4.0.0 entry in table
- Python 3.10-3.12 requirement noted
- No marketing language ("military-grade" removed)
5. API Tests (http://localhost:8000)
5.1 Status Endpoint
curl http://localhost:8000/
- Returns version "4.0.0"
- No import errors
5.2 Generate Endpoint
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d '{"use_pin": true}'
- Returns single
passphrasestring - Returns 4 words by default
5.3 OpenAPI Docs
/docsloads (Swagger UI)/redocloads (ReDoc)- All endpoints documented
6. CLI Tests
6.1 Version
stegasoo --version
- Shows 4.0.0
6.2 Generate
stegasoo generate --pin --words 4
- Single passphrase output
- 4 words generated
6.3 Encode/Decode Roundtrip
# Generate test image
python -c "from PIL import Image; Image.new('RGB', (200,200), 'red').save('/tmp/test.png')"
# Encode
stegasoo encode \
-r /tmp/test.png \
-c /tmp/test.png \
-p "cli test phrase here" \
--pin 123456 \
-m "CLI roundtrip test" \
-o /tmp/stego.png
# Decode
stegasoo decode \
-r /tmp/test.png \
-s /tmp/stego.png \
-p "cli test phrase here" \
--pin 123456
- Encode succeeds
- Decode returns correct message
7. Cross-Version Compatibility
7.1 v3.2.0 Compatibility
- v4.0 can decode v3.2.0 images (same format version 4)
7.2 v3.1.x Incompatibility
- v4.0 fails gracefully on v3.1.x images
- Error message is clear
8. Documentation Review
8.1 Updated Files
- README.md - v4.0 references
- INSTALL.md - Python 3.13 warning prominent
- SECURITY.md - v4.0 changes documented
- UNDER_THE_HOOD.md - JPEG normalization section
8.2 Template Updates
- All 7 templates updated
- No v3.x badges remaining
- Version history in About page
9. Quick Smoke Test Script
#!/bin/bash
# v4.0.0 Smoke Test
set -e
echo "=== Stegasoo v4.0.0 Smoke Test ==="
# Check version
echo "1. Checking version..."
python -c "import stegasoo; assert stegasoo.__version__.startswith('4.'), f'Wrong version: {stegasoo.__version__}'; print(f'✓ Version: {stegasoo.__version__}')"
# Check Python version
echo "2. Checking Python version..."
python -c "
import sys
v = sys.version_info
assert v.major == 3 and 10 <= v.minor <= 12, f'Python {v.major}.{v.minor} not supported'
print(f'✓ Python {v.major}.{v.minor}.{v.micro}')
"
# Check DCT support
echo "3. Checking DCT support..."
python -c "
from stegasoo import has_dct_support
from stegasoo.dct_steganography import has_jpegio_support
print(f' DCT (scipy): {has_dct_support()}')
print(f' JPEG native (jpegio): {has_jpegio_support()}')
assert has_dct_support(), 'DCT not available'
print('✓ DCT support OK')
"
# Test encode/decode roundtrip
echo "4. Testing encode/decode roundtrip..."
python -c "
from stegasoo import encode, decode
from PIL import Image
import io
img = Image.new('RGB', (200, 200), color='blue')
buf = io.BytesIO()
img.save(buf, format='PNG')
test_image = buf.getvalue()
result = encode(
message='Hello v4.0.0!',
reference_photo=test_image,
carrier_image=test_image,
passphrase='test phrase four words',
pin='123456'
)
decoded = decode(
stego_image=result.stego_image,
reference_photo=test_image,
passphrase='test phrase four words',
pin='123456'
)
assert decoded.message == 'Hello v4.0.0!', f'Got: {decoded.message}'
print('✓ LSB roundtrip OK')
"
# Test DCT mode
echo "5. Testing DCT mode..."
python -c "
from stegasoo import encode, decode
from PIL import Image
import io
img = Image.new('RGB', (400, 400), color='green')
buf = io.BytesIO()
img.save(buf, format='PNG')
test_image = buf.getvalue()
result = encode(
message='DCT v4.0 test',
reference_photo=test_image,
carrier_image=test_image,
passphrase='dct test phrase here',
pin='123456',
embed_mode='dct'
)
decoded = decode(
stego_image=result.stego_image,
reference_photo=test_image,
passphrase='dct test phrase here',
pin='123456'
)
assert decoded.message == 'DCT v4.0 test'
print('✓ DCT roundtrip OK')
"
# Test JPEG quality=100 (v4.0 fix)
echo "6. Testing JPEG quality=100 handling..."
python -c "
from stegasoo import encode, decode
from PIL import Image
import io
img = Image.new('RGB', (400, 400), color='red')
buf = io.BytesIO()
img.save(buf, format='JPEG', quality=100)
jpeg_q100 = buf.getvalue()
result = encode(
message='Quality 100 test',
reference_photo=jpeg_q100,
carrier_image=jpeg_q100,
passphrase='jpeg quality test here',
pin='123456',
embed_mode='dct'
)
decoded = decode(
stego_image=result.stego_image,
reference_photo=jpeg_q100,
passphrase='jpeg quality test here',
pin='123456'
)
assert decoded.message == 'Quality 100 test'
print('✓ JPEG quality=100 OK (v4.0 fix working)')
"
echo ""
echo "=== All smoke tests passed! ==="
echo "Ready for release."
10. Release Steps
10.1 Final Checks
- All tests pass
- All Docker containers work
- Documentation updated
- Version bumped in
constants.pyandpyproject.toml
10.2 Git
git add -A
git status # Review changes
git commit -m "v4.0.0: JPEG normalization, Python 3.12, UI polish"
git tag v4.0.0
git push origin main --tags
- Changes committed
- Tag created
- Pushed to remote
10.3 Release Notes
## v4.0.0
### What's New
- **JPEG Normalization**: Quality=100 JPEGs now work with DCT mode
- **Python 3.12**: Recommended version (3.13 NOT supported due to jpegio)
- **UI Polish**: Glowing input fields, better layout, version history
### Fixes
- Fixed jpegio crash on quality=100 JPEG images
- Fixed QR code input on decode page
- Fixed passphrase font sizing (stepped instead of smooth)
### Breaking Changes
- Python 3.13 is NOT supported
### Compatibility
- v4.0 can decode v3.2.0 images (same format)
- v4.0 CANNOT decode v3.1.x or earlier
Sign-Off
| Area | Tested By | Date | Status |
|---|---|---|---|
| Python/Dependencies | ☐ | ||
| Unit Tests | ☐ | ||
| Docker Build | ☐ | ||
| Web UI | ☐ | ||
| API | ☐ | ||
| CLI | ☐ | ||
| Documentation | ☐ |
Release Approved: ☐
Released By: _________________
Release Date: _________________