Mock Testing Examples
This document provides comprehensive examples for using the mock testing framework in the SerDes Validation Framework.
Overview
The mock testing framework allows you to develop, test, and validate your code without requiring physical hardware. This is particularly useful for:
Development environments
CI/CD pipelines
Unit testing
Integration testing
Demonstration purposes
Basic Mock Mode Usage
Example 1: Enabling Mock Mode
import os
# Method 1: Environment variable
os.environ['SVF_MOCK_MODE'] = '1'
# Method 2: Programmatic configuration
from serdes_validation_framework.config import set_mock_mode
set_mock_mode(True)
# Verify mock mode is enabled
from serdes_validation_framework.config import is_mock_mode_enabled
print(f"Mock mode enabled: {is_mock_mode_enabled()}")
Example 2: Basic Mock Validation
# With mock mode enabled, all classes use mock implementations
from serdes_validation_framework.protocols.usb4 import USB4Validator
validator = USB4Validator()
# Generate mock signal data
mock_signal = validator.generate_mock_signal_data(
duration=1e-6, # 1 microsecond
sample_rate=100e9, # 100 GSa/s
noise_level=0.01
)
# Run validation (uses mock implementations)
results = validator.validate_compliance(mock_signal)
print(f"Mock validation completed with {len(results)} results")
for result in results[:5]: # Show first 5 results
print(f" {result.test_name}: {'PASS' if result.status else 'FAIL'}")
Mock Data Generation
Example 3: Custom Mock Signal Generation
from serdes_validation_framework.mocks import MockSignalGenerator
from serdes_validation_framework.protocols.usb4.constants import USB4SignalMode
# Create mock signal generator
generator = MockSignalGenerator()
# Generate realistic USB4 signal
usb4_signal = generator.generate_usb4_signal(
mode=USB4SignalMode.GEN3_X2,
duration=2e-6, # 2 microseconds
sample_rate=200e9, # 200 GSa/s
lane_skew_ps=5.0, # 5 ps lane skew
jitter_rms=0.02, # 2% RMS jitter
noise_amplitude=0.05
)
print(f"Generated signal with {len(usb4_signal.lane0_data)} samples")
print(f"Lane skew: {usb4_signal.lane_skew_ps:.1f} ps")
Example 4: Mock Eye Diagram Data
from serdes_validation_framework.mocks import MockEyeDiagramGenerator
# Generate mock eye diagram data
eye_generator = MockEyeDiagramGenerator()
eye_data = eye_generator.generate_eye_diagram(
signal_mode=USB4SignalMode.GEN3_X2,
eye_height=0.8, # 80% of ideal
eye_width=0.75, # 75% of ideal
jitter_rms=0.015, # 1.5% RMS jitter
noise_level=0.02
)
print(f"Mock eye diagram:")
print(f" Height: {eye_data.eye_height:.3f}")
print(f" Width: {eye_data.eye_width:.3f}")
print(f" Quality Factor: {eye_data.quality_factor:.2f}")
Mock Testing Patterns
Example 5: Unit Testing with Mocks
import unittest
from unittest.mock import patch
import os
class TestUSB4Validation(unittest.TestCase):
def setUp(self):
"""Set up mock mode for each test"""
os.environ['SVF_MOCK_MODE'] = '1'
def test_compliance_validation(self):
"""Test USB4 compliance validation"""
from serdes_validation_framework.protocols.usb4 import USB4ComplianceValidator
validator = USB4ComplianceValidator()
# Generate mock signal data
signal_data = validator.generate_mock_signal_data()
# Run compliance tests
results = validator.validate_full_compliance(signal_data)
# Assertions
self.assertGreater(len(results), 0, "Should have test results")
# In mock mode, most tests should pass
pass_rate = sum(1 for r in results if r.status) / len(results)
self.assertGreater(pass_rate, 0.8, "Mock tests should have high pass rate")
def test_signal_analysis(self):
"""Test signal analysis functionality"""
from serdes_validation_framework.protocols.usb4 import USB4SignalAnalyzer
analyzer = USB4SignalAnalyzer()
signal_data = analyzer.generate_mock_signal_data()
# Test eye diagram analysis
eye_results = analyzer.analyze_eye_diagram(signal_data)
self.assertIsNotNone(eye_results)
self.assertGreater(eye_results.eye_height, 0)
self.assertGreater(eye_results.eye_width, 0)
# Test jitter analysis
jitter_results = analyzer.analyze_jitter(signal_data)
self.assertIsNotNone(jitter_results)
self.assertGreater(jitter_results.rms_jitter, 0)
if __name__ == '__main__':
unittest.main()
Example 6: Integration Testing
def test_end_to_end_usb4_workflow():
"""Test complete USB4 validation workflow in mock mode"""
# Enable mock mode
os.environ['SVF_MOCK_MODE'] = '1'
# Import all required modules
from serdes_validation_framework.protocols.usb4 import (
USB4Validator,
USB4SignalAnalyzer,
USB4ComplianceValidator
)
from serdes_validation_framework.reporting import USB4TestReporter
from serdes_validation_framework.visualization import USB4Visualizer
# Step 1: Generate mock signal data
validator = USB4Validator()
signal_data = validator.generate_mock_signal_data(
mode=USB4SignalMode.GEN3_X2
)
# Step 2: Analyze signal
analyzer = USB4SignalAnalyzer()
eye_results = analyzer.analyze_eye_diagram(signal_data)
skew_results = analyzer.analyze_lane_skew(signal_data)
# Step 3: Run compliance tests
compliance_validator = USB4ComplianceValidator()
compliance_results = compliance_validator.validate_full_compliance(signal_data)
# Step 4: Generate visualization
visualizer = USB4Visualizer()
eye_plot, _ = visualizer.plot_eye_diagram(signal_data)
# Step 5: Create report
reporter = USB4TestReporter()
session = TestSession(
session_id="integration_test_001",
timestamp=datetime.now(),
test_type=ReportType.COMPLIANCE,
signal_mode=USB4SignalMode.GEN3_X2
)
reporter.add_test_session(session)
reporter.add_compliance_results(session.session_id, compliance_results)
report_path = reporter.generate_compliance_report(session.session_id)
# Verify all steps completed successfully
assert eye_results is not None
assert skew_results is not None
assert len(compliance_results) > 0
assert os.path.exists(eye_plot)
assert os.path.exists(report_path)
print("✓ End-to-end integration test passed")
# Run the test
test_end_to_end_usb4_workflow()
CI/CD Integration Examples
Example 7: GitHub Actions Workflow
# .github/workflows/usb4-validation.yml
name: USB4 Validation Tests
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.9, 3.10, 3.11]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install -e .
- name: Run USB4 validation tests
env:
SVF_MOCK_MODE: "1"
run: |
python -m pytest tests/test_usb4_comprehensive.py -v
python -m pytest tests/test_usb4_compliance.py -v
python -m pytest tests/test_thunderbolt_certification.py -v
- name: Generate test report
env:
SVF_MOCK_MODE: "1"
run: |
python scripts/generate_ci_report.py
- name: Upload test results
uses: actions/upload-artifact@v3
with:
name: test-results-${{ matrix.python-version }}
path: test_reports/
Example 8: CI/CD Test Script
#!/usr/bin/env python3
"""
CI/CD test script for USB4 validation
"""
import os
import sys
import json
from datetime import datetime
from pathlib import Path
def run_ci_tests():
"""Run comprehensive CI/CD tests"""
# Ensure mock mode is enabled
os.environ['SVF_MOCK_MODE'] = '1'
# Import test modules
from serdes_validation_framework.protocols.usb4 import (
USB4Validator,
USB4ComplianceValidator
)
from serdes_validation_framework.protocols.usb4.thunderbolt import (
ThunderboltSecurityValidator,
IntelCertificationSuite
)
test_results = {
'timestamp': datetime.now().isoformat(),
'mock_mode': True,
'tests': {}
}
# Test 1: Basic USB4 validation
try:
validator = USB4Validator()
signal_data = validator.generate_mock_signal_data()
results = validator.validate_compliance(signal_data)
test_results['tests']['basic_validation'] = {
'status': 'PASS',
'test_count': len(results),
'pass_rate': sum(1 for r in results if r.status) / len(results)
}
print("✓ Basic USB4 validation test passed")
except Exception as e:
test_results['tests']['basic_validation'] = {
'status': 'FAIL',
'error': str(e)
}
print(f"✗ Basic USB4 validation test failed: {e}")
# Test 2: Compliance testing
try:
compliance_validator = USB4ComplianceValidator()
signal_data = compliance_validator.generate_mock_signal_data()
compliance_results = compliance_validator.validate_full_compliance(signal_data)
test_results['tests']['compliance_testing'] = {
'status': 'PASS',
'test_count': len(compliance_results),
'pass_rate': sum(1 for r in compliance_results if r.status) / len(compliance_results)
}
print("✓ Compliance testing passed")
except Exception as e:
test_results['tests']['compliance_testing'] = {
'status': 'FAIL',
'error': str(e)
}
print(f"✗ Compliance testing failed: {e}")
# Test 3: Thunderbolt security
try:
security_validator = ThunderboltSecurityValidator()
security_results = security_validator.validate_security_features({
'dma_protection': True,
'device_authentication': True
})
test_results['tests']['thunderbolt_security'] = {
'status': 'PASS',
'security_features': security_results
}
print("✓ Thunderbolt security test passed")
except Exception as e:
test_results['tests']['thunderbolt_security'] = {
'status': 'FAIL',
'error': str(e)
}
print(f"✗ Thunderbolt security test failed: {e}")
# Test 4: Certification suite
try:
cert_suite = IntelCertificationSuite()
cert_results = cert_suite.run_pre_certification_checks()
test_results['tests']['certification_suite'] = {
'status': 'PASS',
'pre_check_results': cert_results
}
print("✓ Certification suite test passed")
except Exception as e:
test_results['tests']['certification_suite'] = {
'status': 'FAIL',
'error': str(e)
}
print(f"✗ Certification suite test failed: {e}")
# Save results
results_dir = Path('test_reports')
results_dir.mkdir(exist_ok=True)
with open(results_dir / 'ci_test_results.json', 'w') as f:
json.dump(test_results, f, indent=2)
# Determine overall status
failed_tests = [name for name, result in test_results['tests'].items()
if result['status'] == 'FAIL']
if failed_tests:
print(f"\n✗ CI tests failed. Failed tests: {', '.join(failed_tests)}")
return 1
else:
print("\n✓ All CI tests passed successfully!")
return 0
if __name__ == '__main__':
sys.exit(run_ci_tests())
Mock Performance Testing
Example 9: Performance Benchmarking with Mocks
import time
from serdes_validation_framework.protocols.usb4.performance import USB4PerformanceBenchmark
def benchmark_mock_performance():
"""Benchmark mock implementation performance"""
os.environ['SVF_MOCK_MODE'] = '1'
benchmark = USB4PerformanceBenchmark()
# Test signal generation performance
start_time = time.time()
for i in range(100):
signal_data = benchmark.generate_mock_signal_data(
duration=1e-6,
sample_rate=100e9
)
generation_time = time.time() - start_time
print(f"Mock signal generation: {generation_time:.2f}s for 100 signals")
# Test validation performance
start_time = time.time()
validator = USB4Validator()
for i in range(50):
results = validator.validate_compliance(signal_data)
validation_time = time.time() - start_time
print(f"Mock validation: {validation_time:.2f}s for 50 validations")
# Performance metrics
print(f"Signal generation rate: {100/generation_time:.1f} signals/sec")
print(f"Validation rate: {50/validation_time:.1f} validations/sec")
benchmark_mock_performance()
Example 10: Memory Usage Testing
import psutil
import os
def test_mock_memory_usage():
"""Test memory usage of mock implementations"""
os.environ['SVF_MOCK_MODE'] = '1'
process = psutil.Process()
initial_memory = process.memory_info().rss / 1024 / 1024 # MB
# Create multiple validators
validators = []
for i in range(10):
validator = USB4Validator()
signal_data = validator.generate_mock_signal_data()
results = validator.validate_compliance(signal_data)
validators.append((validator, results))
peak_memory = process.memory_info().rss / 1024 / 1024 # MB
memory_increase = peak_memory - initial_memory
print(f"Initial memory: {initial_memory:.1f} MB")
print(f"Peak memory: {peak_memory:.1f} MB")
print(f"Memory increase: {memory_increase:.1f} MB")
print(f"Memory per validator: {memory_increase/10:.1f} MB")
# Cleanup
del validators
final_memory = process.memory_info().rss / 1024 / 1024 # MB
print(f"Final memory: {final_memory:.1f} MB")
test_mock_memory_usage()
Advanced Mock Scenarios
Example 11: Custom Mock Behaviors
from serdes_validation_framework.mocks import MockUSB4Validator
class CustomMockValidator(MockUSB4Validator):
"""Custom mock validator with specific behaviors"""
def __init__(self, failure_rate=0.1):
super().__init__()
self.failure_rate = failure_rate
def validate_compliance(self, signal_data, config=None):
"""Override to introduce controlled failures"""
results = super().validate_compliance(signal_data, config)
# Introduce failures based on failure rate
import random
for result in results:
if random.random() < self.failure_rate:
result.status = False
result.measured_value *= 0.8 # Simulate poor measurement
return results
# Use custom mock validator
custom_validator = CustomMockValidator(failure_rate=0.2) # 20% failure rate
signal_data = custom_validator.generate_mock_signal_data()
results = custom_validator.validate_compliance(signal_data)
failed_tests = [r for r in results if not r.status]
print(f"Custom mock validation: {len(failed_tests)}/{len(results)} tests failed")
Example 12: Mock Data Persistence
import pickle
from pathlib import Path
def save_mock_data_for_replay():
"""Save mock data for consistent replay"""
os.environ['SVF_MOCK_MODE'] = '1'
validator = USB4Validator()
# Generate and save multiple mock datasets
mock_datasets = {}
for mode in [USB4SignalMode.GEN2_X2, USB4SignalMode.GEN3_X2]:
signal_data = validator.generate_mock_signal_data(mode=mode)
results = validator.validate_compliance(signal_data)
mock_datasets[mode.name] = {
'signal_data': signal_data,
'results': results,
'timestamp': datetime.now()
}
# Save to file
mock_data_dir = Path('mock_data')
mock_data_dir.mkdir(exist_ok=True)
with open(mock_data_dir / 'usb4_mock_datasets.pkl', 'wb') as f:
pickle.dump(mock_datasets, f)
print(f"Saved {len(mock_datasets)} mock datasets")
def load_and_replay_mock_data():
"""Load and replay saved mock data"""
mock_data_dir = Path('mock_data')
with open(mock_data_dir / 'usb4_mock_datasets.pkl', 'rb') as f:
mock_datasets = pickle.load(f)
for mode_name, dataset in mock_datasets.items():
print(f"Replaying {mode_name} dataset:")
print(f" Signal samples: {len(dataset['signal_data'].lane0_data)}")
print(f" Test results: {len(dataset['results'])}")
print(f" Generated: {dataset['timestamp']}")
# Save and replay mock data
save_mock_data_for_replay()
load_and_replay_mock_data()
These examples demonstrate the comprehensive mock testing capabilities of the framework. Mock mode enables efficient development, testing, and CI/CD integration without requiring physical hardware.
For more information on mock testing, see the Mock Testing Tutorial and API Documentation.