Team Ai
Apppublic

openenv-testing/echo_env

sourceHugging Faceupdated 11mo agoView on Hugging Face
0likes
test_local_docker_provider.py259 linesDownload Raw Back to containers
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