Files
stegasoo/tests/RELEASE_CHECKLIST_V3.2.0.md
2026-01-01 14:04:55 -05:00

14 KiB

Stegasoo v3.2.0 Release Checklist

Overview

This checklist covers comprehensive functionality testing for the v3.2.0 release, which introduces breaking changes from v3.1.x.

Breaking Changes in v3.2.0

Change v3.1.x v3.2.0
Passphrase model 7 daily phrases (day_phrase) Single passphrase
Date parameter Required date_str Removed
Default words 3 4
Format version 3 4
Backward compatible N/A Cannot decode v3.1.x images

1. Core Library Tests

1.1 Key Generation (src/stegasoo/keygen.py)

  • generate_pin() - Default 6 digits, no leading zero
  • generate_pin(length=9) - Custom length works
  • generate_phrase(words=4) - Default 4 words
  • generate_phrase(words=6) - Custom word count
  • generate_credentials(use_pin=True) - Returns single passphrase
  • generate_credentials(use_rsa=True) - RSA key generation
  • generate_credentials(use_pin=False, use_rsa=False) - Raises error
  • Credentials.passphrase - Single string, not dict
  • Credentials.passphrase_entropy - Correct entropy (4 words = 44 bits)
  • Credentials.total_entropy - Sum is correct

1.2 Encoding (src/stegasoo/steganography.py)

  • encode() with passphrase - New parameter name works
  • encode() without date_str - No date parameter needed
  • HEADER_OVERHEAD = 65 - Correct constant
  • LSB mode - Default, full color PNG output
  • DCT mode - Frequency domain embedding
  • DCT + JPEG output - Works correctly
  • DCT + color mode - Preserves colors
  • Capacity calculation - Uses 65-byte overhead

1.3 Decoding (src/stegasoo/steganography.py)

  • decode() with passphrase - New parameter name works
  • decode() without date_str - No date parameter needed
  • Auto mode detection - LSB vs DCT automatic
  • Wrong passphrase - Raises DecryptionError
  • Wrong PIN - Raises DecryptionError
  • Wrong reference photo - Raises DecryptionError

1.4 DCT Steganography (src/stegasoo/dct_steganography.py)

  • Y channel extraction - Uses correct formula (not just R channel)
  • Color mode encoding - YCbCr conversion works
  • Grayscale mode - Converts to grayscale
  • JPEG output - Quality 95, proper format
  • PNG output - Lossless DCT output

1.5 Batch Processing (src/stegasoo/batch.py)

  • BatchCredentials.passphrase - Single field, not dict
  • BatchCredentials.from_dict() - Accepts both old and new format
  • batch_encode() - Uses passphrase parameter
  • batch_decode() - Uses passphrase parameter

1.6 Validation

  • validate_passphrase() - New function works
  • validate_passphrase() warning - Warns if < 4 words
  • validate_pin() - 6-9 digits, no leading zero
  • validate_message() - Non-empty, within size limits

2. CLI Frontend Tests (frontends/cli/main.py)

2.1 Generate Command

# Test default generation (4 words, PIN)
stegasoo generate --pin

# Test custom word count
stegasoo generate --pin --words 6

# Test RSA generation
stegasoo generate --rsa

# Test JSON output
stegasoo generate --pin --json
  • Output shows single PASSPHRASE: not daily phrases
  • Default is 4 words
  • JSON has passphrase field, not phrases dict
  • Entropy shows passphrase_entropy

2.2 Encode Command

# Test basic encode
stegasoo encode -r ref.jpg -c carrier.png \
  -p "word1 word2 word3 word4" --pin 123456 \
  -m "Secret message"

# Test DCT mode
stegasoo encode -r ref.jpg -c carrier.png \
  -p "word1 word2 word3 word4" --pin 123456 \
  -m "Secret" --mode dct

# Test DCT + JPEG
stegasoo encode -r ref.jpg -c carrier.png \
  -p "word1 word2 word3 word4" --pin 123456 \
  -m "Secret" --mode dct --dct-format jpeg
  • -p / --passphrase parameter works
  • No --date parameter exists
  • LSB mode produces PNG
  • DCT mode works
  • DCT + JPEG output works
  • Output filename has no date suffix

2.3 Decode Command

# Test basic decode
stegasoo decode -r ref.jpg -s stego.png \
  -p "word1 word2 word3 word4" --pin 123456

# Test auto mode detection
stegasoo decode -r ref.jpg -s stego.png \
  -p "word1 word2 word3 word4" --pin 123456 --mode auto
  • -p / --passphrase parameter works
  • No --date parameter exists
  • Auto-detects LSB vs DCT
  • Outputs decoded message

2.4 Other Commands

# Verify command
stegasoo verify -s stego.png

# Compare command
stegasoo compare original.png stego.png

# Modes command
stegasoo modes

# Capacity command
stegasoo capacity carrier.png
  • All commands work without errors
  • No references to "day phrase" or dates

3. API Frontend Tests (frontends/api/main.py)

3.1 Status Endpoint

curl http://localhost:8000/
  • Returns version: "3.2.0"
  • Includes breaking_changes object
  • No day_names field

3.2 Generate Endpoint

curl -X POST http://localhost:8000/generate \
  -H "Content-Type: application/json" \
  -d '{"use_pin": true, "words_per_passphrase": 4}'
  • Parameter is words_per_passphrase (not words_per_phrase)
  • Response has passphrase string field
  • Response has phrases: null
  • Entropy field is passphrase not phrase

3.3 Encode Endpoint

curl -X POST http://localhost:8000/encode \
  -H "Content-Type: application/json" \
  -d '{
    "message": "Secret",
    "passphrase": "word1 word2 word3 word4",
    "pin": "123456",
    "reference_photo_base64": "...",
    "carrier_image_base64": "..."
  }'
  • Parameter is passphrase (not day_phrase)
  • No date_str parameter accepted
  • Response has date_used: null
  • Response has day_of_week: null

3.4 Decode Endpoint

curl -X POST http://localhost:8000/decode \
  -H "Content-Type: application/json" \
  -d '{
    "passphrase": "word1 word2 word3 word4",
    "pin": "123456",
    "stego_image_base64": "...",
    "reference_photo_base64": "..."
  }'
  • Parameter is passphrase (not day_phrase)
  • No date_str parameter needed
  • Auto-detects embedding mode

3.5 Multipart Endpoints

# Encode multipart
curl -X POST http://localhost:8000/encode/multipart \
  -F "passphrase=word1 word2 word3 word4" \
  -F "pin=123456" \
  -F "message=Secret" \
  -F "reference_photo=@ref.jpg" \
  -F "carrier=@carrier.png"

# Decode multipart
curl -X POST http://localhost:8000/decode/multipart \
  -F "passphrase=word1 word2 word3 word4" \
  -F "pin=123456" \
  -F "reference_photo=@ref.jpg" \
  -F "stego_image=@stego.png"
  • Form field is passphrase (not day_phrase)
  • No date_str field
  • Headers include X-Stegasoo-Version: 3.2.0
  • No date headers in response

4. Web Frontend Tests (frontends/web/app.py)

4.1 Generate Page (/generate)

  • Form field is words_per_passphrase
  • Default slider value is 4
  • Output shows single passphrase, not 7 daily phrases
  • Memory aid works with single passphrase
  • Entropy display shows passphrase_entropy
  • v3.2.0 badge visible

4.2 Encode Page (/encode)

  • Form field is passphrase
  • No date selection field
  • v3.2.0 badge on passphrase label
  • Passphrase validation warning works (< 4 words)
  • DCT mode options work
  • Success result shows no date info

4.3 Decode Page (/decode)

  • Form field is passphrase
  • No date input field
  • No date detection from filename JavaScript
  • Troubleshooting mentions v3.2.0 compatibility
  • Auto mode detection works

4.4 Other Pages

  • Home (/) - Shows v3.2.0 badge, passphrase terminology
  • About (/about) - Updated terminology, v3.2.0 features
  • Footer - Says "Passphrase" not "Day-Phrase"

5. Integration Tests

5.1 Full Roundtrip Tests

# Generate → Encode → Decode (LSB)
stegasoo generate --pin > creds.json
stegasoo encode -r ref.jpg -c carrier.png -p "..." --pin 123456 -m "Test" -o stego.png
stegasoo decode -r ref.jpg -s stego.png -p "..." --pin 123456

# Generate → Encode → Decode (DCT)
stegasoo encode -r ref.jpg -c carrier.png -p "..." --pin 123456 -m "Test" --mode dct -o stego_dct.png
stegasoo decode -r ref.jpg -s stego_dct.png -p "..." --pin 123456
  • LSB roundtrip works
  • DCT roundtrip works
  • DCT + JPEG roundtrip works
  • File embedding roundtrip works

5.2 Cross-Frontend Tests

  • Encode via CLI, decode via API
  • Encode via API, decode via Web
  • Encode via Web, decode via CLI

5.3 Error Handling

  • Wrong passphrase shows clear error
  • Wrong PIN shows clear error
  • Wrong reference photo shows clear error
  • Capacity exceeded shows clear error
  • Invalid image shows clear error

6. Documentation Tests

6.1 CLI Documentation (frontends/CLI.md)

  • "What's New in v3.2.0" section exists
  • All examples use 4-word passphrases
  • No --date parameter in examples
  • Command reference is complete
  • Migration notes for v3.1.x users

6.2 API Documentation (frontends/API.md)

  • "What's New in v3.2.0" section exists
  • All request examples use passphrase
  • No date_str in request models
  • Response models show date_used: null
  • Code examples updated

6.3 Web UI Documentation (frontends/WEB_UI.md)

  • "What's New in v3.2.0" section exists
  • Workflow examples use passphrase
  • No date selection in screenshots/descriptions
  • Troubleshooting updated

7. Backward Compatibility Tests

7.1 v3.1.x Image Decoding

  • Attempting to decode v3.1.x image with v3.2.0 fails gracefully
  • Error message mentions version incompatibility
  • Suggests using v3.1.x for old images

7.2 Migration Path

  • BatchCredentials.from_dict() accepts old day_phrase key
  • generate_credentials_legacy() available if needed
  • Documentation explains migration steps

8. Unit Test Updates

8.1 Test Files to Update

  • tests/test_stegasoo.py - Use passphrase parameter
  • tests/test_batch.py - Use passphrase in credentials
  • tests/test_compression.py - No changes needed (compression unchanged)

8.2 New Tests Needed

  • Test single passphrase generation
  • Test passphrase_words parameter
  • Test validate_passphrase() function
  • Test DCT Y channel extraction
  • Test 65-byte header overhead

9. Release Artifacts

9.1 Version Bumps

  • src/stegasoo/constants.py - __version__ = "3.2.0"
  • pyproject.toml or setup.py - version updated
  • CHANGELOG.md - v3.2.0 section added

9.2 Documentation

  • README.md - Updated for v3.2.0
  • frontends/CLI.md - Complete
  • frontends/API.md - Complete
  • frontends/WEB_UI.md - Complete

9.3 Git

  • All changes committed
  • Tag created: v3.2.0
  • Release notes written

10. Quick Smoke Test Script

#!/bin/bash
# v3.2.0 Smoke Test

set -e

echo "=== Stegasoo v3.2.0 Smoke Test ==="

# Check version
echo "1. Checking version..."
python -c "import stegasoo; print(f'Version: {stegasoo.__version__}')"

# Generate credentials
echo "2. Generating credentials..."
python -c "
from stegasoo import generate_credentials
creds = generate_credentials(use_pin=True, passphrase_words=4)
print(f'Passphrase: {creds.passphrase}')
print(f'PIN: {creds.pin}')
print(f'Entropy: {creds.total_entropy} bits')
assert ' ' in creds.passphrase, 'Passphrase should have spaces'
assert len(creds.passphrase.split()) == 4, 'Should have 4 words'
print('✓ Credentials OK')
"

# Test encode/decode roundtrip
echo "3. Testing encode/decode roundtrip..."
python -c "
from stegasoo import encode, decode
from PIL import Image
import io

# Create test image
img = Image.new('RGB', (200, 200), color='blue')
buf = io.BytesIO()
img.save(buf, format='PNG')
test_image = buf.getvalue()

# Encode
result = encode(
    message='Hello v3.2.0!',
    reference_photo=test_image,
    carrier_image=test_image,
    passphrase='test phrase four words',
    pin='123456'
)
print(f'Encoded: {result.filename}')

# Decode
decoded = decode(
    stego_image=result.stego_image,
    reference_photo=test_image,
    passphrase='test phrase four words',
    pin='123456'
)
assert decoded.message == 'Hello v3.2.0!', 'Message mismatch'
print(f'Decoded: {decoded.message}')
print('✓ Roundtrip OK')
"

# Test DCT mode
echo "4. Testing DCT mode..."
python -c "
from stegasoo import encode, decode, has_dct_support
if has_dct_support():
    from PIL import Image
    import io
    
    img = Image.new('RGB', (200, 200), color='green')
    buf = io.BytesIO()
    img.save(buf, format='PNG')
    test_image = buf.getvalue()
    
    result = encode(
        message='DCT 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 test'
    print('✓ DCT Mode OK')
else:
    print('⚠ DCT mode not available (scipy not installed)')
"

echo ""
echo "=== All smoke tests passed! ==="

Sign-Off

Area Tested By Date Status
Core Library
CLI Frontend
API Frontend
Web Frontend
Documentation
Integration

Release Approved:

Released By: _________________

Release Date: _________________