openenv-testing/echo_env
0
1#!/usr/bin/env python32"""3End-to-end test for LocalDockerProvider.4 5This script tests the complete flow:61. Start a container using LocalDockerProvider72. Wait for it to be ready83. Make HTTP requests to test the environment94. Clean up the container10"""11 12import sys13from pathlib import Path14 15# Add src to path16sys.path.insert(0, str(Path(__file__).parent.parent.parent))17 18import requests19 20from core.containers.runtime import LocalDockerProvider21 22# TODO: Remove this test or make it a functional test sicne this will be tested in e2e test for echo env23def test_local_docker_provider():24 """Test LocalDockerProvider end-to-end."""25 print("=" * 60)26 print("LocalDockerProvider End-to-End Test")27 print("=" * 60)28 print()29 30 provider = None31 32 try:33 # Step 1: Create provider34 print("Step 1: Creating LocalDockerProvider...")35 provider = LocalDockerProvider()36 print("✓ Provider created\n")37 38 # Step 2: Start container39 print("Step 2: Starting echo-env container...")40 base_url = provider.start_container("echo-env:latest")41 print(f"✓ Container started at: {base_url}")42 if provider._container_id:43 print(f" Container ID: {provider._container_id[:12]}...")44 if provider._container_name:45 print(f" Container name: {provider._container_name}\n")46 47 # Step 3: Wait for ready48 print("Step 3: Waiting for container to be ready...")49 provider.wait_for_ready(base_url, timeout_s=30.0)50 print("✓ Container is ready!\n")51 52 # Step 4: Test health endpoint53 print("Step 4: Testing /health endpoint...")54 response = requests.get(f"{base_url}/health")55 print(f" Status: {response.status_code}")56 print(f" Response: {response.json()}")57 assert response.status_code == 20058 assert response.json()["status"] == "healthy"59 print("✓ Health check passed\n")60 61 # Step 5: Test reset endpoint62 print("Step 5: Testing /reset endpoint...")63 response = requests.post(64 f"{base_url}/reset",65 json={},66 headers={"Content-Type": "application/json"},67 )68 print(f" Status: {response.status_code}")69 data = response.json()70 print(f" Message: {data['observation']['echoed_message']}")71 print(f" Reward: {data['reward']}")72 print(f" Done: {data['done']}")73 assert response.status_code == 20074 assert data["observation"]["echoed_message"] == "Echo environment ready!"75 print("✓ Reset test passed\n")76 77 # Step 6: Test step endpoint78 print("Step 6: Testing /step endpoint...")79 response = requests.post(80 f"{base_url}/step",81 json={"action": {"message": "Hello from LocalDockerProvider!"}},82 headers={"Content-Type": "application/json"},83 )84 print(f" Status: {response.status_code}")85 data = response.json()86 print(f" Echoed: {data['observation']['echoed_message']}")87 print(f" Length: {data['observation']['message_length']}")88 print(f" Reward: {data['reward']}")89 assert response.status_code == 20090 assert data["observation"]["echoed_message"] == "Hello from LocalDockerProvider!"91 assert data["observation"]["message_length"] == 3192 print("✓ Step test passed\n")93 94 # Step 7: Test state endpoint95 print("Step 7: Testing /state endpoint...")96 response = requests.get(f"{base_url}/state")97 print(f" Status: {response.status_code}")98 data = response.json()99 print(f" Episode ID: {data['episode_id']}")100 print(f" Step count: {data['step_count']}")101 assert response.status_code == 200102 assert data["step_count"] == 1 # One step from above103 print("✓ State test passed\n")104 105 # Step 8: Multiple steps106 print("Step 8: Testing multiple steps...")107 for i in range(3):108 response = requests.post(109 f"{base_url}/step",110 json={"action": {"message": f"Message {i+1}"}},111 headers={"Content-Type": "application/json"},112 )113 assert response.status_code == 200114 print(f" Step {i+1}: ✓")115 116 # Check state updated117 response = requests.get(f"{base_url}/state")118 data = response.json()119 assert data["step_count"] == 4 # 1 + 3 more steps120 print(f" Final step count: {data['step_count']}")121 print("✓ Multiple steps test passed\n")122 123 print("=" * 60)124 print("✓ All tests passed!")125 print("=" * 60)126 print()127 128 return True129 130 except Exception as e:131 print(f"\n❌ Test failed: {e}")132 import traceback133 traceback.print_exc()134 return False135 136 finally:137 # Step 9: Cleanup138 if provider is not None:139 print("\nStep 9: Cleaning up container...")140 try:141 provider.stop_container()142 print("✓ Container stopped and removed\n")143 except Exception as e:144 print(f"⚠️ Cleanup warning: {e}\n")145 146 147def test_provider_with_custom_port():148 """Test provider with custom port."""149 print("=" * 60)150 print("LocalDockerProvider with Custom Port Test")151 print("=" * 60)152 print()153 154 provider = None155 156 try:157 provider = LocalDockerProvider()158 159 print("Starting container on custom port 8123...")160 base_url = provider.start_container("echo-env:latest", port=8123)161 print(f"✓ Started at: {base_url}")162 assert ":8123" in base_url163 164 print("Waiting for ready...")165 provider.wait_for_ready(base_url)166 print("✓ Ready!")167 168 print("Testing health...")169 response = requests.get(f"{base_url}/health")170 assert response.status_code == 200171 print("✓ Health check passed")172 173 print("\n✓ Custom port test passed!\n")174 return True175 176 except Exception as e:177 print(f"\n❌ Test failed: {e}")178 return False179 180 finally:181 if provider is not None:182 provider.stop_container()183 print("✓ Cleaned up\n")184 185 186def test_provider_with_env_vars():187 """Test provider with environment variables."""188 print("=" * 60)189 print("LocalDockerProvider with Environment Variables Test")190 print("=" * 60)191 print()192 193 provider = None194 195 try:196 provider = LocalDockerProvider()197 198 print("Starting container with environment variables...")199 base_url = provider.start_container(200 "echo-env:latest",201 env_vars={"DEBUG": "true", "LOG_LEVEL": "info"}202 )203 print(f"✓ Started at: {base_url}")204 205 print("Waiting for ready...")206 provider.wait_for_ready(base_url)207 print("✓ Ready!")208 209 print("Testing health...")210 response = requests.get(f"{base_url}/health")211 assert response.status_code == 200212 print("✓ Health check passed")213 214 print("\n✓ Environment variables test passed!\n")215 return True216 217 except Exception as e:218 print(f"\n❌ Test failed: {e}")219 return False220 221 finally:222 if provider is not None:223 provider.stop_container()224 print("✓ Cleaned up\n")225 226 227if __name__ == "__main__":228 print()229 print("🐳 LocalDockerProvider Test Suite")230 print()231 232 results = []233 234 # Run basic test235 results.append(("Basic End-to-End", test_local_docker_provider()))236 237 # Run custom port test238 results.append(("Custom Port", test_provider_with_custom_port()))239 240 # Run environment variables test241 results.append(("Environment Variables", test_provider_with_env_vars()))242 243 # Summary244 print("=" * 60)245 print("Test Summary")246 print("=" * 60)247 for name, passed in results:248 status = "✓ PASSED" if passed else "✗ FAILED"249 print(f"{name:25} {status}")250 print("=" * 60)251 252 all_passed = all(result for _, result in results)253 if all_passed:254 print("\n🎉 All tests passed!")255 exit(0)256 else:257 print("\n❌ Some tests failed")258 exit(1)259 