72 lines
2.3 KiB
Python
Executable File
72 lines
2.3 KiB
Python
Executable File
import argparse
|
|
import socket
|
|
import json
|
|
import os
|
|
import sys
|
|
|
|
import use_lldb_suite
|
|
from lldbsuite.test.gdbclientutils import *
|
|
|
|
_description = """\
|
|
Implements a fake qemu for testing purposes. The executable program
|
|
is not actually run. Instead a very basic mock process is presented
|
|
to lldb. This allows us to check the invocation parameters.
|
|
|
|
The behavior of the emulated "process" is controlled via its command line
|
|
arguments, which should take the form of key:value pairs. Currently supported
|
|
actions are:
|
|
- dump: Dump the state of the emulator as a json dictionary. <value> specifies
|
|
the target filename.
|
|
- stdout: Write <value> to program stdout.
|
|
- stderr: Write <value> to program stderr.
|
|
- stdin: Read a line from stdin and store it in the emulator state. <value>
|
|
specifies the dictionary key.
|
|
"""
|
|
|
|
class MyResponder(MockGDBServerResponder):
|
|
def __init__(self, state):
|
|
super().__init__()
|
|
self._state = state
|
|
|
|
def cont(self):
|
|
for a in self._state["args"]:
|
|
action, data = a.split(":", 1)
|
|
if action == "dump":
|
|
with open(data, "w") as f:
|
|
json.dump(self._state, f)
|
|
elif action == "stdout":
|
|
sys.stdout.write(data)
|
|
sys.stdout.flush()
|
|
elif action == "stderr":
|
|
sys.stderr.write(data)
|
|
sys.stderr.flush()
|
|
elif action == "stdin":
|
|
self._state[data] = sys.stdin.readline()
|
|
else:
|
|
print("Unknown action: %r\n" % a)
|
|
return "X01"
|
|
return "W47"
|
|
|
|
class FakeEmulator(MockGDBServer):
|
|
def __init__(self, addr, state):
|
|
super().__init__(UnixServerSocket(addr))
|
|
self.responder = MyResponder(state)
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description=_description,
|
|
formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
parser.add_argument('-g', metavar="unix-socket", required=True)
|
|
parser.add_argument('-0', metavar="arg0")
|
|
parser.add_argument('-fake-arg', dest="fake-arg")
|
|
parser.add_argument('program', help="The program to 'emulate'.")
|
|
parser.add_argument("args", nargs=argparse.REMAINDER)
|
|
args = parser.parse_args()
|
|
|
|
state = vars(args)
|
|
state["environ"] = dict(os.environ)
|
|
emulator = FakeEmulator(args.g, state)
|
|
emulator.run()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|