#!/usr/bin/env python3 """ Test script for camera streaming functionality. This script tests the new streaming capabilities without interfering with recording. """ import sys import os import time import requests import threading from datetime import datetime # Add the current directory to Python path sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) def test_api_endpoints(): """Test the streaming API endpoints""" base_url = "http://localhost:8000" print("๐Ÿงช Testing Camera Streaming API Endpoints") print("=" * 50) # Test system status try: response = requests.get(f"{base_url}/system/status", timeout=5) if response.status_code == 200: print("โœ… System status endpoint working") data = response.json() print(f" System: {data.get('status', 'Unknown')}") print(f" Camera Manager: {'Running' if data.get('camera_manager_running') else 'Stopped'}") else: print(f"โŒ System status endpoint failed: {response.status_code}") except Exception as e: print(f"โŒ System status endpoint error: {e}") # Test camera list try: response = requests.get(f"{base_url}/cameras", timeout=5) if response.status_code == 200: print("โœ… Camera list endpoint working") cameras = response.json() print(f" Found {len(cameras)} cameras: {list(cameras.keys())}") # Test streaming for each camera for camera_name in cameras.keys(): test_camera_streaming(base_url, camera_name) else: print(f"โŒ Camera list endpoint failed: {response.status_code}") except Exception as e: print(f"โŒ Camera list endpoint error: {e}") def test_camera_streaming(base_url, camera_name): """Test streaming for a specific camera""" print(f"\n๐ŸŽฅ Testing streaming for {camera_name}") print("-" * 30) # Test start streaming try: response = requests.post(f"{base_url}/cameras/{camera_name}/start-stream", timeout=10) if response.status_code == 200: print(f"โœ… Start stream endpoint working for {camera_name}") data = response.json() print(f" Response: {data.get('message', 'No message')}") else: print(f"โŒ Start stream failed for {camera_name}: {response.status_code}") print(f" Error: {response.text}") return except Exception as e: print(f"โŒ Start stream error for {camera_name}: {e}") return # Wait a moment for stream to initialize time.sleep(2) # Test stream endpoint (just check if it responds) try: response = requests.get(f"{base_url}/cameras/{camera_name}/stream", timeout=5, stream=True) if response.status_code == 200: print(f"โœ… Stream endpoint responding for {camera_name}") print(f" Content-Type: {response.headers.get('content-type', 'Unknown')}") # Read a small amount of data to verify it's working chunk_count = 0 for chunk in response.iter_content(chunk_size=1024): chunk_count += 1 if chunk_count >= 3: # Read a few chunks then stop break print(f" Received {chunk_count} data chunks") else: print(f"โŒ Stream endpoint failed for {camera_name}: {response.status_code}") except Exception as e: print(f"โŒ Stream endpoint error for {camera_name}: {e}") # Test stop streaming try: response = requests.post(f"{base_url}/cameras/{camera_name}/stop-stream", timeout=5) if response.status_code == 200: print(f"โœ… Stop stream endpoint working for {camera_name}") data = response.json() print(f" Response: {data.get('message', 'No message')}") else: print(f"โŒ Stop stream failed for {camera_name}: {response.status_code}") except Exception as e: print(f"โŒ Stop stream error for {camera_name}: {e}") def test_concurrent_recording_and_streaming(): """Test that streaming doesn't interfere with recording""" base_url = "http://localhost:8000" print("\n๐Ÿ”„ Testing Concurrent Recording and Streaming") print("=" * 50) try: # Get available cameras response = requests.get(f"{base_url}/cameras", timeout=5) if response.status_code != 200: print("โŒ Cannot get camera list for concurrent test") return cameras = response.json() if not cameras: print("โŒ No cameras available for concurrent test") return camera_name = list(cameras.keys())[0] # Use first camera print(f"Using camera: {camera_name}") # Start streaming print("1. Starting streaming...") response = requests.post(f"{base_url}/cameras/{camera_name}/start-stream", timeout=10) if response.status_code != 200: print(f"โŒ Failed to start streaming: {response.text}") return time.sleep(2) # Start recording print("2. Starting recording...") response = requests.post(f"{base_url}/cameras/{camera_name}/start-recording", json={"filename": "test_concurrent_recording.avi"}, timeout=10) if response.status_code == 200: print("โœ… Recording started successfully while streaming") else: print(f"โŒ Failed to start recording while streaming: {response.text}") # Let both run for a few seconds print("3. Running both streaming and recording for 5 seconds...") time.sleep(5) # Stop recording print("4. Stopping recording...") response = requests.post(f"{base_url}/cameras/{camera_name}/stop-recording", timeout=5) if response.status_code == 200: print("โœ… Recording stopped successfully") else: print(f"โŒ Failed to stop recording: {response.text}") # Stop streaming print("5. Stopping streaming...") response = requests.post(f"{base_url}/cameras/{camera_name}/stop-stream", timeout=5) if response.status_code == 200: print("โœ… Streaming stopped successfully") else: print(f"โŒ Failed to stop streaming: {response.text}") print("โœ… Concurrent test completed successfully!") except Exception as e: print(f"โŒ Concurrent test error: {e}") def main(): """Main test function""" print("๐Ÿš€ USDA Vision Camera Streaming Test") print("=" * 50) print(f"Test started at: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print() # Wait for system to be ready print("โณ Waiting for system to be ready...") time.sleep(3) # Run tests test_api_endpoints() test_concurrent_recording_and_streaming() print("\n" + "=" * 50) print("๐Ÿ Test completed!") print("\n๐Ÿ“‹ Next Steps:") print("1. Open camera_preview.html in your browser") print("2. Click 'Start Stream' for any camera") print("3. Verify live preview works without blocking recording") print("4. Test concurrent recording and streaming") if __name__ == "__main__": main()