| require 'test/unit' | |
| require 'common/Logger' | |
| require 'dbgp/CommandHandler.rb' | |
| require 'dbgp/ThreadManager' | |
| require 'test/MockDebugger' | |
| require 'test/FakeParams' | |
| require 'test/SimpleServer' | |
| module XoredDebugger | |
| class CommandHandlerTest < Test::Unit::TestCase | |
| include Logger | |
| def setup | |
| log('---------------------------- STARTUP!!! -------------------------------') | |
| SimpleServer.start() | |
| @debugger = MockDebugger.new() | |
| @thread_manager = ThreadManager.new(@debugger) | |
| @breakpoint_manager = @debugger.breakpoint_manager | |
| @context = @debugger.current_context | |
| @handler = CommandHandler.new(@thread_manager, Thread.current) | |
| @capture_manager = @thread_manager.capture_manager | |
| end | |
| def teardown | |
| @debugger = nil | |
| @breakpoint_manager = nil | |
| @context = nil | |
| @handler = nil | |
| @capture_manager = nil | |
| @thread_manager.terminate if @thread_manager | |
| @thread_manager = nil | |
| log('Thread manager terminated') | |
| @debugger.terminate if @debugger | |
| @debugger = nil | |
| log('Debugger terminated') | |
| SimpleServer.stop() | |
| log('Server terminated') | |
| assert(!SimpleServer.started?) | |
| log('---------------------------- TEAR DOWN!!! -------------------------------') | |
| end | |
| # Status | |
| def test_handle_status | |
| @context.status = 'starting' | |
| response = @handler.handle(Command.new('status -i 5')) | |
| assert_equal('starting', response.get_attribute('status')) | |
| assert_equal('status', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| assert_equal('ok', response.get_attribute('reason')) | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new('status -i 5')) | |
| assert_equal('running', response.get_attribute('status')) | |
| assert_equal('status', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| assert_equal('ok', response.get_attribute('reason')) | |
| end | |
| # Options and Configuration | |
| def test_handle_feature_get | |
| response = @handler.handle(Command.new('feature_get -i 5 -n protocol_version')) | |
| assert_equal('feature_get', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| assert_equal('protocol_version', response.get_attribute('feature_name')) | |
| assert_equal('1', response.get_attribute('supported')) | |
| assert_equal('1', response.get_data) | |
| response = @handler.handle(Command.new('feature_get -i 5')) | |
| assert_equal(3, response.get_error) | |
| response = @handler.handle(Command.new('feature_get -i 5 -n not_supported_option')) | |
| assert_equal('feature_get', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| assert_equal('not_supported_option', response.get_attribute('feature_name')) | |
| assert_equal('0', response.get_attribute('supported')) | |
| end | |
| def test_handle_feature_set | |
| response = @handler.handle(Command.new('feature_set -i 5 -n protocol_version -v 2.0')) | |
| assert_equal('feature_set', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| assert_equal('protocol_version', response.get_attribute('feature_name')) | |
| assert_equal('0', response.get_attribute('success')) | |
| response = @handler.handle(Command.new('feature_set -i 5')) | |
| assert_equal(3, response.get_error) | |
| response = @handler.handle(Command.new('feature_set -i 5 -n max_depth -v 10')) | |
| assert_equal('feature_set', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| assert_equal('max_depth', response.get_attribute('feature_name')) | |
| assert_equal('1', response.get_attribute('success')) | |
| end | |
| # Continuation Commands | |
| def test_handle_run | |
| @context.status = 'break' | |
| response = @handler.handle(Command.new('run -i 5')) | |
| assert_equal(nil, response) | |
| assert_equal('running', @context.status) | |
| response = @handler.handle(Command.new('run -i 5')) | |
| assert_not_equal(nil, response) | |
| assert_equal(5, response.get_error) | |
| end | |
| def test_handle_step_into | |
| @context.status = 'break' | |
| response = @handler.handle(Command.new('step_into -i 5')) | |
| assert_equal(nil, response) | |
| assert_equal('break', @context.status) | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new('step_into -i 5')) | |
| assert_not_equal(nil, response) | |
| assert_equal(5, response.get_error) | |
| end | |
| def test_handle_step_over | |
| @context.status = 'break' | |
| response = @handler.handle(Command.new('step_over -i 5')) | |
| assert_equal(nil, response) | |
| assert_equal('break', @context.status) | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new('step_over -i 5')) | |
| assert_not_equal(nil, response) | |
| assert_equal(5, response.get_error) | |
| end | |
| def test_handle_step_out | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new('step_out -i 5')) | |
| assert_not_equal(nil, response) | |
| assert_equal(5, response.get_error) | |
| @context.status = 'break' | |
| response = @handler.handle(Command.new('step_out -i 5')) | |
| assert_equal(nil, response) | |
| assert_equal('stopped', @context.status) | |
| end | |
| def test_handle_stop | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new('stop -i 5')) | |
| assert_equal('stop', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| assert_equal('ok', response.get_attribute('reason')) | |
| assert_equal('stopped', response.get_attribute('status')) | |
| assert_equal('stopped', @context.status) | |
| @context.status = 'break' | |
| response = @handler.handle(Command.new('stop -i 5')) | |
| assert_equal('stop', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| assert_equal('ok', response.get_attribute('reason')) | |
| assert_equal('stopped', response.get_attribute('status')) | |
| assert_equal('stopped', @context.status) | |
| end | |
| def test_handle_detach | |
| response = @handler.handle(Command.new("detach -i 5")) | |
| assert_equal(4, response.get_error, 'Please provide unit test for implementation') | |
| end | |
| #breakpoints | |
| def test_handle_breakpoint_set | |
| response = @handler.handle(Command.new("breakpoint_set -i 5 -t line -f test.rb -n 100")) | |
| assert_equal(0, response.get_error) | |
| assert(!response.get_attribute('id').nil?) | |
| response = @handler.handle(Command.new("breakpoint_set -i 5 -t exception -x Exception")) | |
| assert_equal(0, response.get_error) | |
| assert(!response.get_attribute('id').nil?) | |
| response = @handler.handle(Command.new("breakpoint_set -i 5 -t exception -x Fixnum")) | |
| assert_equal(200, response.get_error) | |
| response = @handler.handle(Command.new("breakpoint_set -i 5")) | |
| assert_equal(3, response.get_error) | |
| response = @handler.handle(Command.new("breakpoint_set -i 5 -t unknownType")) | |
| assert_equal(201, response.get_error) | |
| end | |
| def test_handle_breakpoint_get | |
| bp = @breakpoint_manager.add_line_breakpoint('test.rb', 100) | |
| response = @handler.handle(Command.new("breakpoint_get -i 5 -d " + bp.breakpoint_id.to_s)) | |
| expected = BreakpointElement.new(bp).to_xml | |
| assert_equal(expected, response.get_data.to_s) | |
| assert_equal('breakpoint_get', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| bp = @breakpoint_manager.add_exception_breakpoint('Exception') | |
| response = @handler.handle(Command.new("breakpoint_get -i 5 -d " + bp.breakpoint_id.to_s)) | |
| expected = BreakpointElement.new(bp).to_xml | |
| assert_equal(expected, response.get_data.to_s) | |
| assert_equal('breakpoint_get', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| response = @handler.handle(Command.new("breakpoint_get -i 5 -d 97575795")) | |
| assert_equal(205, response.get_error) | |
| end | |
| def test_handle_breakpoint_update | |
| bp = @breakpoint_manager.add_line_breakpoint('test.rb', 100) | |
| response = @handler.handle(Command.new("breakpoint_update -i 5 -d " + bp.breakpoint_id.to_s)) | |
| assert_equal(3, response.get_error) | |
| response = @handler.handle(Command.new("breakpoint_update -i 5 -n 101 -d " + bp.breakpoint_id.to_s)) | |
| assert_equal('breakpoint_update', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| assert_equal(101, bp.lineno) | |
| response = @handler.handle(Command.new("breakpoint_update -i 5 -d 868986086")) | |
| assert_equal(205, response.get_error) | |
| end | |
| def test_handle_breakpoint_remove | |
| bp = @breakpoint_manager.add_line_breakpoint('test.rb', 100) | |
| response = @handler.handle(Command.new("breakpoint_remove -i 5 -d " + bp.breakpoint_id.to_s)) | |
| assert_equal('breakpoint_remove', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| response = @handler.handle(Command.new("breakpoint_remove -i 5 -d " + bp.breakpoint_id.to_s)) | |
| assert_equal(205, response.get_error) | |
| end | |
| def test_handle_breakpoint_list | |
| @breakpoint_manager.clear | |
| response = @handler.handle(Command.new("breakpoint_list -i 5")) | |
| assert_equal(nil, response.get_data) | |
| line = @breakpoint_manager.add_line_breakpoint('test.rb', 100) | |
| expt = @breakpoint_manager.add_exception_breakpoint('Exception') | |
| expected = BreakpointElement.new(line).to_xml + BreakpointElement.new(expt).to_xml | |
| response = @handler.handle(Command.new("breakpoint_list -i 5")) | |
| assert_equal(expected, response.get_data) | |
| end | |
| # Stack commands | |
| def test_handle_stack_depth | |
| @context.status = 'break' | |
| response = @handler.handle(Command.new('stack_depth -i 5')) | |
| assert_equal(@context.stack_frames_num.to_s, response.get_attribute('depth')) | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new('stack_depth -i 5')) | |
| assert_equal(5, response.get_error) | |
| end | |
| def test_handle_stack_get | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new('stack_get -i 5')) | |
| assert_equal(5, response.get_error) | |
| @context.status = 'break' | |
| response = @handler.handle(Command.new('stack_get -i 5 -d 0')) | |
| expected = StackLevelElement.new(0, @context.stack_frame(0)).to_xml | |
| assert_equal(expected, response.get_data.to_s) | |
| assert_equal('stack_get', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| response = @handler.handle(Command.new('stack_get -i 5')) | |
| expected = StackLevelElement.new(0, @context.stack_frame(0)).to_xml + StackLevelElement.new(1,@context.stack_frame(1)).to_xml | |
| assert_equal(expected, response.get_data.to_s) | |
| assert_equal('stack_get', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| end | |
| # Context commands | |
| def test_handle_context_names | |
| response = @handler.handle(Command.new('context_names -i 5')) | |
| assert_equal("<response command=\"context_names\" transaction_id=\"5\">" + | |
| "<context name=\"Local\" id=\"0\"/><context name=\"Global\" id=\"1\"/>" + | |
| "<context name=\"Class\" id=\"2\"/></response>", response.to_xml) | |
| end | |
| def test_handle_context_get | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new('context_get -i 5')) | |
| assert_equal(5, response.get_error) | |
| @context.status = 'break' | |
| response = @handler.handle(Command.new('context_get -i 5')) | |
| assert_equal(0, response.get_error) | |
| assert_equal('0', response.get_attribute('context')) | |
| response = @handler.handle(Command.new('context_get -i 5 -c 1')) | |
| assert_equal(0, response.get_error) | |
| assert_equal('1', response.get_attribute('context')) | |
| end | |
| # Common Data Types | |
| def test_handle_typemap_get | |
| @context.status = 'break' | |
| response = @handler.handle(Command.new('typemap_get -i 5')) | |
| assert_equal('typemap_get', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| assert_equal('http://www.w3.org/2001/XMLSchema', response.get_attribute('xmlns:xsd')) | |
| assert_equal('http://www.w3.org/2001/XMLSchema-instance', response.get_attribute('xmlns:xsi')) | |
| end | |
| # Properties, variables and values | |
| def test_handle_property_get | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new("property_get -i 5 -n 2+2")) | |
| assert_equal(5, response.get_error) | |
| @context.status = 'break' | |
| expected = PropertyElement.new(Kernel.eval('2+2'), '2+2') | |
| response = @handler.handle(Command.new("property_get -i 5 -n 2+2")) | |
| assert_equal(expected.to_xml, response.get_data.to_s) | |
| response = @handler.handle(Command.new("property_get -i 5 -n wefipiwpif")) | |
| assert_equal(300, response.get_error) | |
| end | |
| def test_handle_property_set | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new("property_set -i 5 -n $stdout.sync -- " + Base64.encode64('true'))) | |
| assert_equal(5, response.get_error) | |
| @context.status = 'break' | |
| $stdout.sync = false | |
| response = @handler.handle(Command.new("property_set -i 5 -n $stdout.sync -- " + Base64.encode64('true'))) | |
| assert_equal('1', response.get_attribute('success')) | |
| assert_equal(true, $stdout.sync) | |
| response = @handler.handle(Command.new("property_set -i 5 -n wefipiwpif -- " + Base64.encode64('value'))) | |
| assert_equal(300, response.get_error) | |
| assert_equal('0', response.get_attribute('success')) | |
| end | |
| def test_handle_property_value | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new("property_value -i 5 -n 2+2")) | |
| assert_equal(5, response.get_error) | |
| @context.status = 'break' | |
| response = @handler.handle(Command.new("property_value -i 5 -n 2+2")) | |
| assert_equal('4', response.get_data.to_s) | |
| response = @handler.handle(Command.new("property_get -i 5 -n wefipiwpif")) | |
| assert_equal(300, response.get_error) | |
| end | |
| # Source | |
| def test_handle_source | |
| response = @handler.handle(Command.new('source -i 5 -z thisFileWillNotBeFound')) | |
| assert_equal(3, response.get_error) | |
| response = @handler.handle(Command.new('source -i 5 -f thisFileWillNotBeFound')) | |
| assert_equal(100, response.get_error) | |
| response = @handler.handle(Command.new('source -i 5 -f CommandHandlerTest.rb')) | |
| assert_equal(0, response.get_error) | |
| assert_not_equal(nil, response.get_data) | |
| end | |
| # Stdout, stderr redirection | |
| def test_handle_stdout | |
| capturer = @capture_manager.stdout_capturer | |
| capturer.state = CaptureManager::REDIRECT | |
| response = @handler.handle(Command.new('stdout -i 5 -c 0')) | |
| assert_equal('1', response.get_attribute('success')) | |
| assert_equal(CaptureManager::DISABLE, capturer.state) | |
| end | |
| def test_handle_stderr | |
| capturer = @capture_manager.stderr_capturer | |
| capturer.state = CaptureManager::REDIRECT | |
| response = @handler.handle(Command.new('stderr -i 5 -c 0')) | |
| assert_equal('1', response.get_attribute('success')) | |
| assert_equal(CaptureManager::DISABLE, capturer.state) | |
| end | |
| ###################################### | |
| # Extended Commands | |
| ###################################### | |
| def test_handle_stdin | |
| response = @handler.handle(Command.new('stdin -i 5 -c 1')) | |
| assert_equal(4, response.get_error, 'Please provide unit test for implementation') | |
| end | |
| def test_handle_break | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new('break -i 5')) | |
| assert_equal('break', response.get_attribute('command')) | |
| assert_equal('5', response.get_attribute('transaction_id')) | |
| assert_equal('ok', response.get_attribute('reason')) | |
| assert_equal('break', response.get_attribute('status')) | |
| assert_equal(AbstractContext::BREAK, @context.status) | |
| response = @handler.handle(Command.new('break -i 5')) | |
| assert_equal(5, response.get_error) | |
| end | |
| def test_handle_eval | |
| @context.status = 'running' | |
| response = @handler.handle(Command.new("eval -i 5 -- " + Base64.encode64('2+2'))) | |
| assert_equal(5, response.get_error) | |
| @context.status = 'break' | |
| response = @handler.handle(Command.new("eval -i 5 -- " + Base64.encode64('loop { sleep 1 }'))) | |
| assert_equal(206, response.get_error) | |
| assert_equal('0', response.get_attribute('success')) | |
| response = @handler.handle(Command.new("eval -i 5 -- " + Base64.encode64('+!fpefnpwen'))) | |
| assert_equal(206, response.get_error) | |
| assert_equal('0', response.get_attribute('success')) | |
| expected = PropertyElement.new(Kernel.eval('2+2'), '2+2') | |
| response = @handler.handle(Command.new("eval -i 5 -- " + Base64.encode64('2+2'))) | |
| assert_equal(expected.to_xml, response.get_data.to_s) | |
| assert_equal('1', response.get_attribute('success')) | |
| end | |
| def test_handle_expr | |
| response = @handler.handle(Command.new("expr -i 5 -- SGVsbG8=\n")) | |
| assert_equal(4, response.get_error, 'Please provide unit test for implementation') | |
| end | |
| def test_handle_exec | |
| response = @handler.handle(Command.new("exec -i 5 -- SGVsbG8=\n")) | |
| assert_equal(4, response.get_error, 'Please provide unit test for implementation') | |
| end | |
| # Spawnpoint commands | |
| def test_handle_spawnpoint_set | |
| response = @handler.handle(Command.new("spawnpoint_set -i 5")) | |
| assert_equal(4, response.get_error, 'Please provide unit test for implementation') | |
| end | |
| def test_handle_spawnpoint_get | |
| response = @handler.handle(Command.new("spawnpoint_get -i 5 -d 1")) | |
| assert_equal(4, response.get_error, 'Please provide unit test for implementation') | |
| end | |
| def test_handle_spawnpoint_update | |
| response = @handler.handle(Command.new("spawnpoint_update -i 5 -d 1")) | |
| assert_equal(4, response.get_error, 'Please provide unit test for implementation') | |
| end | |
| def test_handle_spawnpoint_remove | |
| response = @handler.handle(Command.new("spawnpoint_remove -i 5 -d 1")) | |
| assert_equal(4, response.get_error, 'Please provide unit test for implementation') | |
| end | |
| def test_handle_spawnpoint_list | |
| response = @handler.handle(Command.new("spawnpoint_list -i 5")) | |
| assert_equal(4, response.get_error, 'Please provide unit test for implementation') | |
| end | |
| # interact - Interactive Shell | |
| def test_handle_interact | |
| response = @handler.handle(Command.new("interact -i 5 -m mode -- base64(code)")) | |
| assert_equal(4, response.get_error, 'Please provide unit test for implementation') | |
| end | |
| end | |
| end |