Files
stegasoo/tests/RELEASE_CHECKLIST_V4_0_0.md
2026-01-01 22:18:13 -05:00

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 passphrase string
  • Returns 4 words by default

5.3 OpenAPI Docs

  • /docs loads (Swagger UI)
  • /redoc loads (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.py and pyproject.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: _________________