voltron/tests/http_api_tests.py

164 lines
4.1 KiB
Python

"""
Tests that emulate the debugger adaptor and just test the interaction between
the front end and back end API classes. HTTP edition!
Tests:
Server (via HTTP)
"""
import logging
import sys
import json
import time
import subprocess
from nose.tools import *
import voltron
from voltron.core import *
from voltron.api import *
from voltron.plugin import *
import platform
if platform.system() == 'Darwin':
sys.path.append("/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python")
from .common import *
import requests
log = logging.getLogger('tests')
class APIHostNotSupportedRequest(APIRequest):
@server_side
def dispatch(self):
return APIDebuggerHostNotSupportedErrorResponse()
class APIHostNotSupportedPlugin(APIPlugin):
request = "host_not_supported"
request_class = APIHostNotSupportedRequest
response_class = APIResponse
def setup():
global server, client, target, pm, adaptor, methods
log.info("setting up API tests")
# set up voltron
voltron.setup_env()
voltron.config['server'] = {
"listen": {
"tcp": ["127.0.0.1", 5555]
}
}
pm = PluginManager()
plugin = pm.debugger_plugin_for_host('mock')
adaptor = plugin.adaptor_class()
voltron.debugger = adaptor
# inject mock methods
inject_mock(adaptor)
# start up a voltron server
server = Server()
server.start()
time.sleep(2)
def teardown():
server.stop()
time.sleep(2)
def test_disassemble():
data = requests.get('http://localhost:5555/api/disassemble?count=16').text
res = APIResponse(data=data)
assert res.is_success
assert res.disassembly == disassemble_response
def test_command():
data = requests.get('http://localhost:5555/api/command?command=reg%20read').text
res = APIResponse(data=data)
assert res.is_success
assert res.output == command_response
def test_targets():
data = requests.get('http://localhost:5555/api/targets').text
res = api_response('targets', data=data)
assert res.is_success
assert res.targets == targets_response
def test_memory():
data = requests.get('http://localhost:5555/api/registers').text
res = api_response('registers', data=data)
url = 'http://localhost:5555/api/memory?address={}&length=64'.format(res.registers['rip'])
data = requests.get(url).text
res = api_response('memory', data=data)
assert res.is_success
assert res.memory == memory_response
def test_registers():
data = requests.get('http://localhost:5555/api/registers').text
res = api_response('registers', data=data)
assert res.is_success
assert res.registers == registers_response
def test_stack_length_missing():
data = requests.get('http://localhost:5555/api/stack').text
res = APIErrorResponse(data=data)
assert res.is_error
assert res.message == 'length'
def test_stack():
data = requests.get('http://localhost:5555/api/stack?length=64').text
res = api_response('stack', data=data)
assert res.is_success
assert res.memory == stack_response
def test_state():
data = requests.get('http://localhost:5555/api/state').text
res = api_response('state', data=data)
assert res.is_success
assert res.state == state_response
def test_version():
data = requests.get('http://localhost:5555/api/version').text
res = api_response('version', data=data)
assert res.is_success
assert res.api_version == 1.1
assert res.host_version == 'lldb-something'
def test_bad_json():
data = requests.post('http://localhost:5555/api/request', data='xxx').text
res = APIResponse(data=data)
assert res.is_error
assert res.code == 0x1001
def test_bad_request():
data = requests.post('http://localhost:5555/api/request', data='{"type":"request","request":"no_such_request"}').text
res = APIResponse(data=data)
assert res.is_error
assert res.code == 0x1002
def test_breakpoints():
data = requests.get('http://localhost:5555/api/breakpoints').text
res = api_response('breakpoints', data=data)
assert res.is_success
assert res.breakpoints == breakpoints_response