mcp-proxy-adapter 6.0.0__py3-none-any.whl โ 6.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mcp_proxy_adapter/__main__.py +27 -7
- mcp_proxy_adapter/api/app.py +209 -79
- mcp_proxy_adapter/api/handlers.py +16 -5
- mcp_proxy_adapter/api/middleware/__init__.py +14 -9
- mcp_proxy_adapter/api/middleware/command_permission_middleware.py +148 -0
- mcp_proxy_adapter/api/middleware/factory.py +36 -12
- mcp_proxy_adapter/api/middleware/protocol_middleware.py +84 -18
- mcp_proxy_adapter/api/middleware/unified_security.py +197 -0
- mcp_proxy_adapter/api/middleware/user_info_middleware.py +158 -0
- mcp_proxy_adapter/commands/__init__.py +7 -1
- mcp_proxy_adapter/commands/base.py +7 -4
- mcp_proxy_adapter/commands/builtin_commands.py +8 -2
- mcp_proxy_adapter/commands/command_registry.py +8 -0
- mcp_proxy_adapter/commands/echo_command.py +81 -0
- mcp_proxy_adapter/commands/health_command.py +1 -1
- mcp_proxy_adapter/commands/help_command.py +21 -14
- mcp_proxy_adapter/commands/proxy_registration_command.py +326 -185
- mcp_proxy_adapter/commands/role_test_command.py +141 -0
- mcp_proxy_adapter/commands/security_command.py +488 -0
- mcp_proxy_adapter/commands/ssl_setup_command.py +234 -351
- mcp_proxy_adapter/commands/token_management_command.py +1 -1
- mcp_proxy_adapter/config.py +323 -40
- mcp_proxy_adapter/core/app_factory.py +410 -0
- mcp_proxy_adapter/core/app_runner.py +272 -0
- mcp_proxy_adapter/core/certificate_utils.py +291 -73
- mcp_proxy_adapter/core/client.py +574 -0
- mcp_proxy_adapter/core/client_manager.py +284 -0
- mcp_proxy_adapter/core/client_security.py +384 -0
- mcp_proxy_adapter/core/logging.py +8 -3
- mcp_proxy_adapter/core/mtls_asgi.py +156 -0
- mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
- mcp_proxy_adapter/core/protocol_manager.py +169 -10
- mcp_proxy_adapter/core/proxy_client.py +602 -0
- mcp_proxy_adapter/core/proxy_registration.py +299 -47
- mcp_proxy_adapter/core/security_adapter.py +12 -15
- mcp_proxy_adapter/core/security_integration.py +286 -0
- mcp_proxy_adapter/core/server_adapter.py +282 -0
- mcp_proxy_adapter/core/server_engine.py +270 -0
- mcp_proxy_adapter/core/ssl_utils.py +13 -12
- mcp_proxy_adapter/core/transport_manager.py +5 -5
- mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
- mcp_proxy_adapter/examples/__init__.py +13 -4
- mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
- mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/main.py +44 -0
- mcp_proxy_adapter/examples/commands/__init__.py +5 -0
- mcp_proxy_adapter/examples/create_certificates_simple.py +550 -0
- mcp_proxy_adapter/examples/debug_request_state.py +112 -0
- mcp_proxy_adapter/examples/debug_role_chain.py +158 -0
- mcp_proxy_adapter/examples/demo_client.py +275 -0
- mcp_proxy_adapter/examples/examples/basic_framework/__init__.py +9 -0
- mcp_proxy_adapter/examples/examples/basic_framework/commands/__init__.py +4 -0
- mcp_proxy_adapter/examples/examples/basic_framework/hooks/__init__.py +4 -0
- mcp_proxy_adapter/examples/examples/basic_framework/main.py +44 -0
- mcp_proxy_adapter/examples/examples/full_application/__init__.py +12 -0
- mcp_proxy_adapter/examples/examples/full_application/commands/__init__.py +7 -0
- mcp_proxy_adapter/examples/examples/full_application/commands/custom_echo_command.py +80 -0
- mcp_proxy_adapter/examples/examples/full_application/commands/dynamic_calculator_command.py +90 -0
- mcp_proxy_adapter/examples/examples/full_application/hooks/__init__.py +7 -0
- mcp_proxy_adapter/examples/examples/full_application/hooks/application_hooks.py +75 -0
- mcp_proxy_adapter/examples/examples/full_application/hooks/builtin_command_hooks.py +71 -0
- mcp_proxy_adapter/examples/examples/full_application/main.py +173 -0
- mcp_proxy_adapter/examples/examples/full_application/proxy_endpoints.py +154 -0
- mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
- mcp_proxy_adapter/examples/full_application/commands/__init__.py +7 -0
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +80 -0
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +90 -0
- mcp_proxy_adapter/examples/full_application/hooks/__init__.py +7 -0
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +75 -0
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +71 -0
- mcp_proxy_adapter/examples/full_application/main.py +173 -0
- mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +154 -0
- mcp_proxy_adapter/examples/generate_all_certificates.py +362 -0
- mcp_proxy_adapter/examples/generate_certificates.py +177 -0
- mcp_proxy_adapter/examples/generate_certificates_and_tokens.py +369 -0
- mcp_proxy_adapter/examples/generate_test_configs.py +331 -0
- mcp_proxy_adapter/examples/proxy_registration_example.py +334 -0
- mcp_proxy_adapter/examples/run_example.py +59 -0
- mcp_proxy_adapter/examples/run_full_test_suite.py +318 -0
- mcp_proxy_adapter/examples/run_proxy_server.py +146 -0
- mcp_proxy_adapter/examples/run_security_tests.py +544 -0
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +247 -0
- mcp_proxy_adapter/examples/scripts/config_generator.py +740 -0
- mcp_proxy_adapter/examples/scripts/create_certificates_simple.py +560 -0
- mcp_proxy_adapter/examples/scripts/generate_certificates_and_tokens.py +369 -0
- mcp_proxy_adapter/examples/security_test_client.py +782 -0
- mcp_proxy_adapter/examples/setup_test_environment.py +328 -0
- mcp_proxy_adapter/examples/test_config.py +148 -0
- mcp_proxy_adapter/examples/test_config_generator.py +86 -0
- mcp_proxy_adapter/examples/test_examples.py +281 -0
- mcp_proxy_adapter/examples/universal_client.py +620 -0
- mcp_proxy_adapter/main.py +66 -148
- mcp_proxy_adapter/utils/config_generator.py +1008 -0
- mcp_proxy_adapter/version.py +5 -2
- mcp_proxy_adapter-6.0.1.dist-info/METADATA +679 -0
- mcp_proxy_adapter-6.0.1.dist-info/RECORD +140 -0
- mcp_proxy_adapter-6.0.1.dist-info/entry_points.txt +2 -0
- {mcp_proxy_adapter-6.0.0.dist-info โ mcp_proxy_adapter-6.0.1.dist-info}/licenses/LICENSE +2 -2
- mcp_proxy_adapter/api/middleware/auth.py +0 -146
- mcp_proxy_adapter/api/middleware/auth_adapter.py +0 -235
- mcp_proxy_adapter/api/middleware/mtls_adapter.py +0 -305
- mcp_proxy_adapter/api/middleware/mtls_middleware.py +0 -296
- mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
- mcp_proxy_adapter/api/middleware/rate_limit_adapter.py +0 -241
- mcp_proxy_adapter/api/middleware/roles_adapter.py +0 -365
- mcp_proxy_adapter/api/middleware/roles_middleware.py +0 -381
- mcp_proxy_adapter/api/middleware/security.py +0 -376
- mcp_proxy_adapter/api/middleware/token_auth_middleware.py +0 -261
- mcp_proxy_adapter/examples/README.md +0 -124
- mcp_proxy_adapter/examples/basic_server/README.md +0 -60
- mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
- mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
- mcp_proxy_adapter/examples/basic_server/config.json +0 -70
- mcp_proxy_adapter/examples/basic_server/config_all_protocols.json +0 -54
- mcp_proxy_adapter/examples/basic_server/config_http.json +0 -70
- mcp_proxy_adapter/examples/basic_server/config_http_only.json +0 -52
- mcp_proxy_adapter/examples/basic_server/config_https.json +0 -58
- mcp_proxy_adapter/examples/basic_server/config_mtls.json +0 -58
- mcp_proxy_adapter/examples/basic_server/config_ssl.json +0 -46
- mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
- mcp_proxy_adapter/examples/basic_server/server.py +0 -114
- mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
- mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
- mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -566
- mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
- mcp_proxy_adapter/examples/custom_commands/auto_commands/test_command.py +0 -105
- mcp_proxy_adapter/examples/custom_commands/catalog/commands/test_command.py +0 -129
- mcp_proxy_adapter/examples/custom_commands/config.json +0 -118
- mcp_proxy_adapter/examples/custom_commands/config_all_protocols.json +0 -46
- mcp_proxy_adapter/examples/custom_commands/config_https_only.json +0 -46
- mcp_proxy_adapter/examples/custom_commands/config_https_transport.json +0 -33
- mcp_proxy_adapter/examples/custom_commands/config_mtls_only.json +0 -46
- mcp_proxy_adapter/examples/custom_commands/config_mtls_transport.json +0 -33
- mcp_proxy_adapter/examples/custom_commands/config_single_transport.json +0 -33
- mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
- mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
- mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
- mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
- mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
- mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
- mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
- mcp_proxy_adapter/examples/custom_commands/full_help_response.json +0 -1
- mcp_proxy_adapter/examples/custom_commands/generated_openapi.json +0 -629
- mcp_proxy_adapter/examples/custom_commands/get_openapi.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
- mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
- mcp_proxy_adapter/examples/custom_commands/loadable_commands/test_ignored.py +0 -129
- mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/proxy_connection_manager.py +0 -278
- mcp_proxy_adapter/examples/custom_commands/server.py +0 -252
- mcp_proxy_adapter/examples/custom_commands/simple_openapi_server.py +0 -75
- mcp_proxy_adapter/examples/custom_commands/start_server_with_proxy_manager.py +0 -299
- mcp_proxy_adapter/examples/custom_commands/start_server_with_registration.py +0 -278
- mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
- mcp_proxy_adapter/examples/custom_commands/test_openapi.py +0 -27
- mcp_proxy_adapter/examples/custom_commands/test_registry.py +0 -23
- mcp_proxy_adapter/examples/custom_commands/test_simple.py +0 -19
- mcp_proxy_adapter/examples/custom_project_example/README.md +0 -103
- mcp_proxy_adapter/examples/custom_project_example/README_EN.md +0 -103
- mcp_proxy_adapter/examples/deployment/README.md +0 -49
- mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
- mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
- mcp_proxy_adapter/examples/deployment/config.json +0 -29
- mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
- mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
- mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
- mcp_proxy_adapter/examples/deployment/run.sh +0 -43
- mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
- mcp_proxy_adapter/examples/simple_custom_commands/README.md +0 -149
- mcp_proxy_adapter/examples/simple_custom_commands/README_EN.md +0 -149
- mcp_proxy_adapter/schemas/base_schema.json +0 -114
- mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
- mcp_proxy_adapter/schemas/roles_schema.json +0 -162
- mcp_proxy_adapter/tests/__init__.py +0 -0
- mcp_proxy_adapter/tests/api/__init__.py +0 -3
- mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
- mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
- mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
- mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
- mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
- mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
- mcp_proxy_adapter/tests/commands/__init__.py +0 -3
- mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
- mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
- mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
- mcp_proxy_adapter/tests/conftest.py +0 -131
- mcp_proxy_adapter/tests/functional/__init__.py +0 -3
- mcp_proxy_adapter/tests/functional/test_api.py +0 -253
- mcp_proxy_adapter/tests/integration/__init__.py +0 -3
- mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
- mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
- mcp_proxy_adapter/tests/performance/__init__.py +0 -3
- mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
- mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
- mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
- mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
- mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
- mcp_proxy_adapter/tests/test_base_command.py +0 -123
- mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
- mcp_proxy_adapter/tests/test_command_registry.py +0 -281
- mcp_proxy_adapter/tests/test_config.py +0 -127
- mcp_proxy_adapter/tests/test_utils.py +0 -65
- mcp_proxy_adapter/tests/unit/__init__.py +0 -3
- mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
- mcp_proxy_adapter/tests/unit/test_config.py +0 -270
- mcp_proxy_adapter-6.0.0.dist-info/METADATA +0 -201
- mcp_proxy_adapter-6.0.0.dist-info/RECORD +0 -179
- {mcp_proxy_adapter-6.0.0.dist-info โ mcp_proxy_adapter-6.0.1.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-6.0.0.dist-info โ mcp_proxy_adapter-6.0.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,281 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
"""
|
3
|
+
Test Examples Script
|
4
|
+
This script tests all examples with different configurations.
|
5
|
+
Author: Vasiliy Zdanovskiy
|
6
|
+
email: vasilyvz@gmail.com
|
7
|
+
"""
|
8
|
+
import json
|
9
|
+
import os
|
10
|
+
import subprocess
|
11
|
+
import time
|
12
|
+
import requests
|
13
|
+
from pathlib import Path
|
14
|
+
from typing import Dict, Any, List
|
15
|
+
# Configuration for testing
|
16
|
+
CONFIGS = {
|
17
|
+
"basic_framework": {
|
18
|
+
"http_simple": {"port": 8000, "ssl": False, "auth": False},
|
19
|
+
"https_simple": {"port": 8443, "ssl": True, "auth": False},
|
20
|
+
"http_auth": {"port": 8001, "ssl": False, "auth": True},
|
21
|
+
"https_auth": {"port": 8444, "ssl": True, "auth": True},
|
22
|
+
"mtls_no_roles": {"port": 9443, "ssl": True, "auth": True, "mtls": True},
|
23
|
+
"mtls_with_roles": {"port": 9444, "ssl": True, "auth": True, "mtls": True}
|
24
|
+
},
|
25
|
+
"full_application": {
|
26
|
+
"http_simple": {"port": 9000, "ssl": False, "auth": False},
|
27
|
+
"https_simple": {"port": 9445, "ssl": True, "auth": False},
|
28
|
+
"http_auth": {"port": 9001, "ssl": False, "auth": True},
|
29
|
+
"https_auth": {"port": 9446, "ssl": True, "auth": True},
|
30
|
+
"mtls_no_roles": {"port": 9447, "ssl": True, "auth": True, "mtls": True},
|
31
|
+
"mtls_with_roles": {"port": 9448, "ssl": True, "auth": True, "mtls": True}
|
32
|
+
}
|
33
|
+
}
|
34
|
+
API_KEYS = {
|
35
|
+
"admin": "admin-secret-key-123",
|
36
|
+
"user": "user-secret-key-456"
|
37
|
+
}
|
38
|
+
class ExampleTester:
|
39
|
+
"""Test examples with different configurations."""
|
40
|
+
def __init__(self):
|
41
|
+
self.examples_dir = Path(__file__).parent
|
42
|
+
self.results = {}
|
43
|
+
self.processes = []
|
44
|
+
def generate_certificates(self):
|
45
|
+
"""Generate certificates for testing."""
|
46
|
+
print("๐ Generating certificates...")
|
47
|
+
cert_script = self.examples_dir.parent / "generate_certificates.py"
|
48
|
+
if cert_script.exists():
|
49
|
+
result = subprocess.run([sys.executable, str(cert_script)],
|
50
|
+
capture_output=True, text=True)
|
51
|
+
if result.returncode == 0:
|
52
|
+
print("โ
Certificates generated successfully")
|
53
|
+
return True
|
54
|
+
else:
|
55
|
+
print(f"โ Certificate generation failed: {result.stderr}")
|
56
|
+
return False
|
57
|
+
else:
|
58
|
+
print("โ ๏ธ Certificate generation script not found, using existing certificates")
|
59
|
+
return True
|
60
|
+
def start_server(self, example_type: str, config_name: str) -> subprocess.Popen:
|
61
|
+
"""Start a server with specific configuration."""
|
62
|
+
config_path = self.examples_dir / example_type / "configs" / f"{config_name}.json"
|
63
|
+
main_script = self.examples_dir / example_type / "main.py"
|
64
|
+
if not config_path.exists():
|
65
|
+
raise FileNotFoundError(f"Configuration file not found: {config_path}")
|
66
|
+
if not main_script.exists():
|
67
|
+
raise FileNotFoundError(f"Main script not found: {main_script}")
|
68
|
+
cmd = [
|
69
|
+
sys.executable, str(main_script),
|
70
|
+
"--config", str(config_path)
|
71
|
+
]
|
72
|
+
print(f"๐ Starting {example_type} server with {config_name} config...")
|
73
|
+
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
74
|
+
# Wait for server to start
|
75
|
+
time.sleep(5)
|
76
|
+
return process
|
77
|
+
def test_health_endpoint(self, port: int, ssl: bool = False, auth: bool = False,
|
78
|
+
api_key: str = None) -> Dict[str, Any]:
|
79
|
+
"""Test health endpoint."""
|
80
|
+
protocol = "https" if ssl else "http"
|
81
|
+
url = f"{protocol}://localhost:{port}/health"
|
82
|
+
headers = {}
|
83
|
+
if auth and api_key:
|
84
|
+
headers["X-API-Key"] = api_key
|
85
|
+
try:
|
86
|
+
response = requests.get(url, headers=headers, verify=False, timeout=10)
|
87
|
+
return {
|
88
|
+
"success": True,
|
89
|
+
"status_code": response.status_code,
|
90
|
+
"response": response.json() if response.headers.get('content-type', '').startswith('application/json') else response.text
|
91
|
+
}
|
92
|
+
except Exception as e:
|
93
|
+
return {
|
94
|
+
"success": False,
|
95
|
+
"error": str(e)
|
96
|
+
}
|
97
|
+
def test_echo_command(self, port: int, ssl: bool = False, auth: bool = False,
|
98
|
+
api_key: str = None) -> Dict[str, Any]:
|
99
|
+
"""Test echo command."""
|
100
|
+
protocol = "https" if ssl else "http"
|
101
|
+
url = f"{protocol}://localhost:{port}/cmd"
|
102
|
+
headers = {"Content-Type": "application/json"}
|
103
|
+
if auth and api_key:
|
104
|
+
headers["X-API-Key"] = api_key
|
105
|
+
data = {
|
106
|
+
"jsonrpc": "2.0",
|
107
|
+
"method": "echo",
|
108
|
+
"params": {"message": "Hello from test!"},
|
109
|
+
"id": 1
|
110
|
+
}
|
111
|
+
try:
|
112
|
+
response = requests.post(url, json=data, headers=headers, verify=False, timeout=10)
|
113
|
+
return {
|
114
|
+
"success": True,
|
115
|
+
"status_code": response.status_code,
|
116
|
+
"response": response.json()
|
117
|
+
}
|
118
|
+
except Exception as e:
|
119
|
+
return {
|
120
|
+
"success": False,
|
121
|
+
"error": str(e)
|
122
|
+
}
|
123
|
+
def test_full_application_commands(self, port: int, ssl: bool = False, auth: bool = False,
|
124
|
+
api_key: str = None) -> Dict[str, Any]:
|
125
|
+
"""Test full application specific commands."""
|
126
|
+
protocol = "https" if ssl else "http"
|
127
|
+
url = f"{protocol}://localhost:{port}/cmd"
|
128
|
+
headers = {"Content-Type": "application/json"}
|
129
|
+
if auth and api_key:
|
130
|
+
headers["X-API-Key"] = api_key
|
131
|
+
results = {}
|
132
|
+
# Test custom echo command
|
133
|
+
data = {
|
134
|
+
"jsonrpc": "2.0",
|
135
|
+
"method": "custom_echo",
|
136
|
+
"params": {"message": "Custom echo test", "repeat": 3},
|
137
|
+
"id": 1
|
138
|
+
}
|
139
|
+
try:
|
140
|
+
response = requests.post(url, json=data, headers=headers, verify=False, timeout=10)
|
141
|
+
results["custom_echo"] = {
|
142
|
+
"success": True,
|
143
|
+
"status_code": response.status_code,
|
144
|
+
"response": response.json()
|
145
|
+
}
|
146
|
+
except Exception as e:
|
147
|
+
results["custom_echo"] = {
|
148
|
+
"success": False,
|
149
|
+
"error": str(e)
|
150
|
+
}
|
151
|
+
# Test dynamic calculator command
|
152
|
+
data = {
|
153
|
+
"jsonrpc": "2.0",
|
154
|
+
"method": "dynamic_calculator",
|
155
|
+
"params": {"operation": "add", "a": 10, "b": 5},
|
156
|
+
"id": 2
|
157
|
+
}
|
158
|
+
try:
|
159
|
+
response = requests.post(url, json=data, headers=headers, verify=False, timeout=10)
|
160
|
+
results["dynamic_calculator"] = {
|
161
|
+
"success": True,
|
162
|
+
"status_code": response.status_code,
|
163
|
+
"response": response.json()
|
164
|
+
}
|
165
|
+
except Exception as e:
|
166
|
+
results["dynamic_calculator"] = {
|
167
|
+
"success": False,
|
168
|
+
"error": str(e)
|
169
|
+
}
|
170
|
+
return results
|
171
|
+
def run_tests(self):
|
172
|
+
"""Run all tests."""
|
173
|
+
print("๐งช Starting Example Tests")
|
174
|
+
print("=" * 60)
|
175
|
+
# Generate certificates first
|
176
|
+
if not self.generate_certificates():
|
177
|
+
print("โ Certificate generation failed, skipping tests")
|
178
|
+
return
|
179
|
+
for example_type, configs in CONFIGS.items():
|
180
|
+
print(f"\n๐ Testing {example_type.upper()}")
|
181
|
+
print("-" * 40)
|
182
|
+
for config_name, config_info in configs.items():
|
183
|
+
print(f"\n๐ง Testing {config_name} configuration...")
|
184
|
+
try:
|
185
|
+
# Start server
|
186
|
+
process = self.start_server(example_type, config_name)
|
187
|
+
self.processes.append(process)
|
188
|
+
port = config_info["port"]
|
189
|
+
ssl = config_info.get("ssl", False)
|
190
|
+
auth = config_info.get("auth", False)
|
191
|
+
# Test health endpoint
|
192
|
+
print(f" ๐ Testing health endpoint...")
|
193
|
+
health_result = self.test_health_endpoint(port, ssl, auth)
|
194
|
+
print(f" Health: {'โ
' if health_result['success'] else 'โ'}")
|
195
|
+
# Test echo command
|
196
|
+
print(f" ๐ Testing echo command...")
|
197
|
+
if auth:
|
198
|
+
# Test with admin key
|
199
|
+
echo_result = self.test_echo_command(port, ssl, auth, API_KEYS["admin"])
|
200
|
+
else:
|
201
|
+
echo_result = self.test_echo_command(port, ssl, auth)
|
202
|
+
print(f" Echo: {'โ
' if echo_result['success'] else 'โ'}")
|
203
|
+
# Test full application specific commands
|
204
|
+
if example_type == "full_application":
|
205
|
+
print(f" ๐ง Testing full application commands...")
|
206
|
+
app_results = self.test_full_application_commands(port, ssl, auth,
|
207
|
+
API_KEYS["admin"] if auth else None)
|
208
|
+
for cmd_name, result in app_results.items():
|
209
|
+
print(f" {cmd_name}: {'โ
' if result['success'] else 'โ'}")
|
210
|
+
# Store results
|
211
|
+
self.results[f"{example_type}_{config_name}"] = {
|
212
|
+
"health": health_result,
|
213
|
+
"echo": echo_result,
|
214
|
+
"config_info": config_info
|
215
|
+
}
|
216
|
+
if example_type == "full_application":
|
217
|
+
self.results[f"{example_type}_{config_name}"]["app_commands"] = app_results
|
218
|
+
except Exception as e:
|
219
|
+
print(f" โ Error testing {config_name}: {e}")
|
220
|
+
self.results[f"{example_type}_{config_name}"] = {
|
221
|
+
"error": str(e),
|
222
|
+
"config_info": config_info
|
223
|
+
}
|
224
|
+
finally:
|
225
|
+
# Stop server
|
226
|
+
if process:
|
227
|
+
process.terminate()
|
228
|
+
process.wait()
|
229
|
+
time.sleep(2)
|
230
|
+
self.print_results()
|
231
|
+
def print_results(self):
|
232
|
+
"""Print test results."""
|
233
|
+
print("\n๐ Test Results Summary")
|
234
|
+
print("=" * 60)
|
235
|
+
total_tests = len(self.results)
|
236
|
+
successful_tests = 0
|
237
|
+
for test_name, result in self.results.items():
|
238
|
+
print(f"\n๐ {test_name}")
|
239
|
+
if "error" in result:
|
240
|
+
print(f" โ Error: {result['error']}")
|
241
|
+
continue
|
242
|
+
# Check health test
|
243
|
+
health_success = result.get("health", {}).get("success", False)
|
244
|
+
print(f" Health: {'โ
' if health_success else 'โ'}")
|
245
|
+
# Check echo test
|
246
|
+
echo_success = result.get("echo", {}).get("success", False)
|
247
|
+
print(f" Echo: {'โ
' if echo_success else 'โ'}")
|
248
|
+
# Check app commands for full application
|
249
|
+
if "app_commands" in result:
|
250
|
+
app_success = all(cmd_result.get("success", False)
|
251
|
+
for cmd_result in result["app_commands"].values())
|
252
|
+
print(f" App Commands: {'โ
' if app_success else 'โ'}")
|
253
|
+
# Overall test success
|
254
|
+
test_success = health_success and echo_success
|
255
|
+
if test_success:
|
256
|
+
successful_tests += 1
|
257
|
+
print(f"\n๐ฏ Overall Results: {successful_tests}/{total_tests} tests passed")
|
258
|
+
if successful_tests == total_tests:
|
259
|
+
print("๐ All tests passed!")
|
260
|
+
else:
|
261
|
+
print("โ ๏ธ Some tests failed. Check the details above.")
|
262
|
+
def cleanup(self):
|
263
|
+
"""Cleanup processes."""
|
264
|
+
for process in self.processes:
|
265
|
+
if process.poll() is None:
|
266
|
+
process.terminate()
|
267
|
+
process.wait()
|
268
|
+
def main():
|
269
|
+
"""Main function."""
|
270
|
+
import sys
|
271
|
+
tester = ExampleTester()
|
272
|
+
try:
|
273
|
+
tester.run_tests()
|
274
|
+
except KeyboardInterrupt:
|
275
|
+
print("\n๐ Tests interrupted by user")
|
276
|
+
except Exception as e:
|
277
|
+
print(f"\nโ Test execution failed: {e}")
|
278
|
+
finally:
|
279
|
+
tester.cleanup()
|
280
|
+
if __name__ == "__main__":
|
281
|
+
main()
|