155 lines
4.1 KiB
Markdown
155 lines
4.1 KiB
Markdown
# Testing GhydraMCP
|
|
|
|
This document describes how to test the GhydraMCP plugin and bridge.
|
|
|
|
## Prerequisites
|
|
|
|
- Python 3.11 or higher
|
|
- Ghidra with the GhydraMCP plugin installed and running
|
|
- The `requests` Python package (`pip install requests`)
|
|
|
|
## Running All Tests
|
|
|
|
The easiest way to run all tests is to use the test runner script:
|
|
|
|
```bash
|
|
python run_tests.py
|
|
```
|
|
|
|
This will run both the HTTP API tests and the MCP bridge tests and provide a summary of the results.
|
|
|
|
You can also run specific test suites:
|
|
|
|
```bash
|
|
# Run only the HTTP API tests
|
|
python run_tests.py --http
|
|
|
|
# Run only the MCP bridge tests
|
|
python run_tests.py --mcp
|
|
```
|
|
|
|
## HTTP API Tests
|
|
|
|
The `test_http_api.py` script tests the HTTP API exposed by the Java plugin. It verifies that the endpoints return the expected JSON structure and that the response format is consistent.
|
|
|
|
### Running the HTTP API Tests
|
|
|
|
1. Make sure Ghidra is running with the GhydraMCP plugin loaded
|
|
2. Run the tests:
|
|
|
|
```bash
|
|
python test_http_api.py
|
|
```
|
|
|
|
The tests will automatically skip if Ghidra is not running or if the plugin is not responding.
|
|
|
|
### What's Being Tested
|
|
|
|
- Basic connectivity to the plugin
|
|
- Response format and structure
|
|
- JSON structure consistency
|
|
- Required fields in responses
|
|
- Error handling
|
|
|
|
## MCP Bridge Tests
|
|
|
|
The `test_mcp_client.py` script tests the MCP bridge functionality using the MCP client library. It verifies that the bridge responds correctly to MCP requests and that the response format is consistent.
|
|
|
|
### Running the MCP Bridge Tests
|
|
|
|
1. Make sure Ghidra is running with the GhydraMCP plugin loaded
|
|
2. Run the tests:
|
|
|
|
```bash
|
|
python test_mcp_client.py
|
|
```
|
|
|
|
The test script will:
|
|
1. Connect to the bridge using the MCP client
|
|
2. Initialize the session
|
|
3. List the available tools
|
|
4. Call the list_instances tool
|
|
5. Call the discover_instances tool
|
|
6. Call the list_functions tool
|
|
|
|
### What's Being Tested
|
|
|
|
- MCP protocol communication
|
|
- Tool availability and structure
|
|
- Response format and structure
|
|
- JSON structure consistency
|
|
- Required fields in responses
|
|
- Proper initialization of the MCP session
|
|
- Ability to call tools and receive responses
|
|
|
|
## Troubleshooting
|
|
|
|
### HTTP API Tests
|
|
|
|
- If tests are skipped with "Ghidra server not running or not accessible", make sure Ghidra is running and the GhydraMCP plugin is loaded.
|
|
- If tests fail with connection errors, check that the plugin is listening on the expected port (default: 8192).
|
|
|
|
### MCP Bridge Tests
|
|
|
|
- If tests are skipped with "Failed to start MCP bridge process", check that the bridge script is executable and that all dependencies are installed.
|
|
- If tests fail with JSON parsing errors, check that the bridge is responding with valid JSON.
|
|
|
|
## Adding New Tests
|
|
|
|
### HTTP API Tests
|
|
|
|
To add a new test for an HTTP endpoint:
|
|
|
|
1. Add a new test method to the `GhydraMCPHttpApiTests` class
|
|
2. Use the `requests` library to make HTTP requests to the endpoint
|
|
3. Verify the response using assertions
|
|
|
|
Example:
|
|
|
|
```python
|
|
def test_new_endpoint(self):
|
|
"""Test the /new_endpoint endpoint"""
|
|
response = requests.get(f"{BASE_URL}/new_endpoint")
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
# Verify response is valid JSON
|
|
data = response.json()
|
|
|
|
# Check required fields in the standard response format
|
|
self.assertIn("success", data)
|
|
self.assertTrue(data["success"])
|
|
self.assertIn("timestamp", data)
|
|
self.assertIn("port", data)
|
|
```
|
|
|
|
### MCP Bridge Tests
|
|
|
|
To add a new test for an MCP tool:
|
|
|
|
1. Add a new test method to the `MCPBridgeTests` class
|
|
2. Use the `send_mcp_request` method to send an MCP request to the bridge
|
|
3. Verify the response using assertions
|
|
|
|
Example:
|
|
|
|
```python
|
|
def test_new_tool(self):
|
|
"""Test the new_tool tool"""
|
|
response = self.send_mcp_request("call_tool", {
|
|
"name": "new_tool",
|
|
"arguments": {
|
|
"param1": "value1",
|
|
"param2": "value2"
|
|
}
|
|
})
|
|
|
|
# Check basic response structure
|
|
self.assertIn("result", response)
|
|
self.assertIn("content", response["result"])
|
|
|
|
# Parse the content
|
|
content = response["result"]["content"]
|
|
self.assertIsInstance(content, list)
|
|
self.assertGreaterEqual(len(content), 1)
|
|
```
|