| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import re | 5 import re |
| 6 import sys | 6 import sys |
| 7 import xml.etree.ElementTree | 7 import xml.etree.ElementTree |
| 8 | 8 |
| 9 import gdb_rsp | 9 import gdb_rsp |
| 10 | 10 |
| 11 | 11 |
| 12 def AssertRaises(exc_class, func): |
| 13 try: |
| 14 func() |
| 15 except exc_class: |
| 16 pass |
| 17 else: |
| 18 raise AssertionError('Function did not raise %r' % exc_class) |
| 19 |
| 20 |
| 12 def GetTargetArch(connection): | 21 def GetTargetArch(connection): |
| 13 """Get the CPU architecture of the NaCl application.""" | 22 """Get the CPU architecture of the NaCl application.""" |
| 14 reply = connection.RspRequest('qXfer:features:read:target.xml:0,fff') | 23 reply = connection.RspRequest('qXfer:features:read:target.xml:0,fff') |
| 15 assert reply[0] == 'l', reply | 24 assert reply[0] == 'l', reply |
| 16 tree = xml.etree.ElementTree.fromstring(reply[1:]) | 25 tree = xml.etree.ElementTree.fromstring(reply[1:]) |
| 17 arch_tag = tree.find('architecture') | 26 arch_tag = tree.find('architecture') |
| 18 assert arch_tag is not None, reply | 27 assert arch_tag is not None, reply |
| 19 return arch_tag.text.strip() | 28 return arch_tag.text.strip() |
| 20 | 29 |
| 21 | 30 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 39 if arch == 'i386:x86-64': | 48 if arch == 'i386:x86-64': |
| 40 # rip index is 16 | 49 # rip index is 16 |
| 41 return ReverseBytes(registers[16 * 16 : 16 * 16 + 8]) | 50 return ReverseBytes(registers[16 * 16 : 16 * 16 + 8]) |
| 42 if arch == 'iwmmxt': | 51 if arch == 'iwmmxt': |
| 43 # pc index is 15 | 52 # pc index is 15 |
| 44 return ReverseBytes(registers[15 * 8 : 15 * 8 + 8]) | 53 return ReverseBytes(registers[15 * 8 : 15 * 8 + 8]) |
| 45 raise AssertionError('Unknown architecture: %s' % arch) | 54 raise AssertionError('Unknown architecture: %s' % arch) |
| 46 | 55 |
| 47 | 56 |
| 48 def TestContinue(connection): | 57 def TestContinue(connection): |
| 49 result = connection.RspRequest('vCont;c') | |
| 50 # Once the NaCl test module reports that the test passed, the NaCl <embed> | 58 # Once the NaCl test module reports that the test passed, the NaCl <embed> |
| 51 # element is removed from the page and so the NaCl module is killed by | 59 # element is removed from the page. The NaCl module will be killed by the |
| 52 # the browser what is reported as exit due to SIGKILL (X09). | 60 # browser which will appear as EOF (end-of-file) on the debug stub socket. |
| 53 assert result == 'X09', result | 61 AssertRaises(gdb_rsp.EofOnReplyException, |
| 62 lambda: connection.RspRequest('vCont;c')) |
| 54 | 63 |
| 55 | 64 |
| 56 def TestBreakpoint(connection): | 65 def TestBreakpoint(connection): |
| 57 # Breakpoints and single-stepping might interfere with Chrome sandbox. So we | 66 # Breakpoints and single-stepping might interfere with Chrome sandbox. So we |
| 58 # check that they work properly in this test. | 67 # check that they work properly in this test. |
| 59 arch = GetTargetArch(connection) | 68 arch = GetTargetArch(connection) |
| 60 registers = connection.RspRequest('g') | 69 registers = connection.RspRequest('g') |
| 61 pc = GetProgCtrString(connection, arch) | 70 pc = GetProgCtrString(connection, arch) |
| 62 # Set breakpoint | 71 # Set breakpoint |
| 63 result = connection.RspRequest('Z0,%s,1' % pc) | 72 result = connection.RspRequest('Z0,%s,1' % pc) |
| 64 assert result == 'OK', result | 73 assert result == 'OK', result |
| 65 # Check that we stopped at breakpoint | 74 # Check that we stopped at breakpoint |
| 66 result = connection.RspRequest('vCont;c') | 75 result = connection.RspRequest('vCont;c') |
| 67 stop_reply = re.compile(r'T05thread:(\d+);') | 76 stop_reply = re.compile(r'T05thread:(\d+);') |
| 68 assert stop_reply.match(result), result | 77 assert stop_reply.match(result), result |
| 69 thread = stop_reply.match(result).group(1) | 78 thread = stop_reply.match(result).group(1) |
| 70 # Check that registers haven't changed | 79 # Check that registers haven't changed |
| 71 result = connection.RspRequest('g') | 80 result = connection.RspRequest('g') |
| 72 assert result == registers, (result, registers) | 81 assert result == registers, (result, registers) |
| 73 # Remove breakpoint | 82 # Remove breakpoint |
| 74 result = connection.RspRequest('z0,%s,1' % pc) | 83 result = connection.RspRequest('z0,%s,1' % pc) |
| 75 assert result == 'OK', result | 84 assert result == 'OK', result |
| 76 # Check single stepping | 85 # Check single stepping |
| 77 result = connection.RspRequest('vCont;s:%s' % thread) | 86 result = connection.RspRequest('vCont;s:%s' % thread) |
| 78 assert result == 'T05thread:%s;' % thread, result | 87 assert result == 'T05thread:%s;' % thread, result |
| 79 assert pc != GetProgCtrString(connection, arch) | 88 assert pc != GetProgCtrString(connection, arch) |
| 80 # Check that we terminate normally | 89 # Check that we terminate normally |
| 81 result = connection.RspRequest('vCont;c') | 90 AssertRaises(gdb_rsp.EofOnReplyException, |
| 82 assert result == 'X09', result | 91 lambda: connection.RspRequest('vCont;c')) |
| 83 | 92 |
| 84 | 93 |
| 85 def Main(args): | 94 def Main(args): |
| 86 port = int(args[0]) | 95 port = int(args[0]) |
| 87 name = args[1] | 96 name = args[1] |
| 88 connection = gdb_rsp.GdbRspConnection(('localhost', port)) | 97 connection = gdb_rsp.GdbRspConnection(('localhost', port)) |
| 89 if name == 'continue': | 98 if name == 'continue': |
| 90 TestContinue(connection) | 99 TestContinue(connection) |
| 91 elif name == 'breakpoint': | 100 elif name == 'breakpoint': |
| 92 TestBreakpoint(connection) | 101 TestBreakpoint(connection) |
| 93 else: | 102 else: |
| 94 raise AssertionError('Unknown test name: %r' % name) | 103 raise AssertionError('Unknown test name: %r' % name) |
| 95 | 104 |
| 96 | 105 |
| 97 if __name__ == '__main__': | 106 if __name__ == '__main__': |
| 98 Main(sys.argv[1:]) | 107 Main(sys.argv[1:]) |
| OLD | NEW |