| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674 |
- #!/usr/bin/python
- # Copyright 2016 Steven Watanabe
- # Distributed under the Boost Software License, Version 1.0.
- # (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt)
- # Test for the debugger
- import BoostBuild
- import TestCmd
- import re
- def split_stdin_stdout(text):
- """stdin is all text after the prompt up to and including
- the next newline. Everything else is stdout. stdout
- may contain regular expressions enclosed in {{}}."""
- prompt = re.escape('(b2db) ')
- pattern = re.compile('(?<=%s)(.*\n)' % prompt)
- text = text.replace("{{bjam}}", "{{.*}}b2{{(?:\\.exe)?}}")
- stdin = ''.join(re.findall(pattern, text))
- stdout = re.sub(pattern, '', text)
- outside_pattern = re.compile(r'(?:\A|(?<=\}\}))(?:[^\{]|(?:\{(?!\{)))*(?:(?=\{\{)|\Z)')
- def escape_line(line):
- line = re.sub(outside_pattern, lambda m: re.escape(m.group(0)), line)
- return re.sub(r'\{\{|\}\}', '', line)
- stdout = '\n'.join([escape_line(line) for line in stdout.split('\n')])
- return (stdin,stdout)
- def run(tester, io):
- (input,output) = split_stdin_stdout(io)
- tester.run_build_system(stdin=input, stdout=output, match=TestCmd.match_re)
- def make_tester():
- return BoostBuild.Tester(["-dconsole"], pass_toolset=False, pass_d0=False,
- use_test_config=False, ignore_toolset_requirements=False, match=TestCmd.match_re)
- def test_run():
- t = make_tester()
- t.write("test.jam", """\
- UPDATE ;
- """)
- run(t, """\
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Child {{\d+}} exited with status 0
- (b2db) quit
- """)
- t.cleanup()
- def test_exit_status():
- t = make_tester()
- t.write("test.jam", """\
- EXIT : 1 ;
- """)
- run(t, """\
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Child {{\d+}} exited with status 1
- (b2db) quit
- """)
- t.cleanup()
- def test_step():
- t = make_tester()
- t.write("test.jam", """\
- rule g ( )
- {
- a = 1 ;
- b = 2 ;
- }
- rule f ( )
- {
- g ;
- c = 3 ;
- }
- f ;
- """)
- run(t, """\
- (b2db) break f
- Breakpoint 1 set at f
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, f ( ) at test.jam:8
- 8 g ;
- (b2db) step
- 3 a = 1 ;
- (b2db) step
- 4 b = 2 ;
- (b2db) step
- 9 c = 3 ;
- (b2db) quit
- """)
- t.cleanup()
- # Note: step doesn't need to worry about breakpoints,
- # as it always stops at the next line executed.
- def test_next():
- t = make_tester()
- t.write("test.jam", """\
- rule g ( )
- {
- a = 1 ;
- }
- rule f ( )
- {
- g ;
- b = 2 ;
- c = 3 ;
- }
- rule h ( )
- {
- f ;
- g ;
- }
- h ;
- d = 4 ;
- """)
- run(t, """\
- (b2db) break f
- Breakpoint 1 set at f
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, f ( ) at test.jam:7
- 7 g ;
- (b2db) next
- 8 b = 2 ;
- (b2db) next
- 9 c = 3 ;
- (b2db) next
- 14 g ;
- (b2db) next
- 17 d = 4 ;
- (b2db) quit
- """)
- t.cleanup()
- def test_next_breakpoint():
- """next should stop if it encounters a breakpoint.
- If the normal end point happens to be a breakpoint,
- then it should be reported as normal stepping."""
- t = make_tester()
- t.write("test.jam", """\
- rule f ( recurse ? )
- {
- if $(recurse) { f ; }
- a = 1 ;
- }
- rule g ( )
- {
- b = 2 ;
- }
- f true ;
- g ;
- """)
- run(t, """\
- (b2db) break f
- Breakpoint 1 set at f
- (b2db) break g
- Breakpoint 2 set at g
- (b2db) break test.jam:4
- Breakpoint 3 set at test.jam:4
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, f ( true ) at test.jam:3
- 3 if $(recurse) { f ; }
- (b2db) next
- Breakpoint 1, f ( ) at test.jam:3
- 3 if $(recurse) { f ; }
- (b2db) next
- 4 a = 1 ;
- (b2db) next
- 4 a = 1 ;
- (b2db) next
- 11 g ;
- (b2db) next
- Breakpoint 2, g ( ) at test.jam:8
- 8 b = 2 ;
- (b2db) quit
- """)
- t.cleanup()
- def test_finish():
- t = make_tester()
- t.write("test.jam", """\
- rule f ( )
- {
- a = 1 ;
- }
- rule g ( )
- {
- f ;
- b = 2 ;
- i ;
- }
- rule h ( )
- {
- g ;
- i ;
- }
- rule i ( )
- {
- c = 3 ;
- }
- h ;
- d = 4 ;
- """)
- run(t, """\
- (b2db) break f
- Breakpoint 1 set at f
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, f ( ) at test.jam:3
- 3 a = 1 ;
- (b2db) finish
- 8 b = 2 ;
- (b2db) finish
- 14 i ;
- (b2db) finish
- 21 d = 4 ;
- (b2db) quit
- """)
- t.cleanup()
- def test_finish_breakpoints():
- """finish should stop when it reaches a breakpoint."""
- t = make_tester()
- t.write("test.jam", """\
- rule f ( recurse * )
- {
- if $(recurse)
- {
- a = [ f $(recurse[2-]) ] ;
- }
- }
- rule g ( list * )
- {
- for local v in $(list)
- {
- x = $(v) ;
- }
- }
- f 1 2 ;
- g 1 2 ;
- """)
- run(t, """\
- (b2db) break test.jam:5
- Breakpoint 1 set at test.jam:5
- (b2db) break test.jam:12
- Breakpoint 2 set at test.jam:12
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, f ( 1 2 ) at test.jam:5
- 5 a = [ f $(recurse[2-]) ] ;
- (b2db) finish
- Breakpoint 1, f ( 2 ) at test.jam:5
- 5 a = [ f $(recurse[2-]) ] ;
- (b2db) finish
- 5 a = [ f $(recurse[2-]) ] ;
- (b2db) finish
- 16 g 1 2 ;
- (b2db) finish
- Breakpoint 2, g ( 1 2 ) at test.jam:12
- 12 x = $(v) ;
- (b2db) finish
- Breakpoint 2, g ( 1 2 ) at test.jam:12
- 12 x = $(v) ;
- (b2db) quit
- """)
- t.cleanup()
- def test_continue_breakpoints():
- """continue should stop when it reaches a breakpoint"""
- t = make_tester()
- t.write("test.jam", """\
- rule f ( recurse * )
- {
- if $(recurse)
- {
- a = [ f $(recurse[2-]) ] ;
- }
- }
- rule g ( list * )
- {
- for local v in $(list)
- {
- x = $(v) ;
- }
- }
- f 1 2 ;
- g 1 2 ;
- """)
- run(t, """\
- (b2db) break test.jam:5
- Breakpoint 1 set at test.jam:5
- (b2db) break test.jam:12
- Breakpoint 2 set at test.jam:12
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, f ( 1 2 ) at test.jam:5
- 5 a = [ f $(recurse[2-]) ] ;
- (b2db) continue
- Breakpoint 1, f ( 2 ) at test.jam:5
- 5 a = [ f $(recurse[2-]) ] ;
- (b2db) continue
- Breakpoint 1, f ( 1 2 ) at test.jam:5
- 5 a = [ f $(recurse[2-]) ] ;
- (b2db) continue
- Breakpoint 2, g ( 1 2 ) at test.jam:12
- 12 x = $(v) ;
- (b2db) continue
- Breakpoint 2, g ( 1 2 ) at test.jam:12
- 12 x = $(v) ;
- (b2db) quit
- """)
- t.cleanup()
- def test_breakpoints():
- """Tests the interaction between the following commands:
- break, clear, delete, disable, enable"""
- t = make_tester()
- t.write("test.jam", """\
- rule f ( )
- {
- a = 1 ;
- }
- rule g ( )
- {
- b = 2 ;
- }
- rule h ( )
- {
- c = 3 ;
- d = 4 ;
- }
- f ;
- g ;
- h ;
- UPDATE ;
- """)
- run(t, """\
- (b2db) break f
- Breakpoint 1 set at f
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, f ( ) at test.jam:3
- 3 a = 1 ;
- (b2db) kill
- (b2db) break g
- Breakpoint 2 set at g
- (b2db) disable 1
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 2, g ( ) at test.jam:7
- 7 b = 2 ;
- (b2db) kill
- (b2db) enable 1
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, f ( ) at test.jam:3
- 3 a = 1 ;
- (b2db) kill
- (b2db) delete 1
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 2, g ( ) at test.jam:7
- 7 b = 2 ;
- (b2db) kill
- (b2db) break test.jam:12
- Breakpoint 3 set at test.jam:12
- (b2db) clear g
- Deleted breakpoint 2
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 3, h ( ) at test.jam:12
- 12 d = 4 ;
- (b2db) kill
- (b2db) clear test.jam:12
- Deleted breakpoint 3
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Child {{\d+}} exited with status 0
- (b2db) quit
- """)
- t.cleanup()
- def test_breakpoints_running():
- """Tests that breakpoints can be added and modified
- while the program is running."""
- t = make_tester()
- t.write("test.jam", """\
- rule f ( )
- {
- a = 1 ;
- }
- rule g ( )
- {
- b = 2 ;
- }
- rule h ( )
- {
- c = 3 ;
- d = 4 ;
- }
- f ;
- g ;
- h ;
- UPDATE ;
- """)
- run(t, """\
- (b2db) break test.jam:14
- Breakpoint 1 set at test.jam:14
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, module scope at test.jam:14
- 14 f ;
- (b2db) break f
- Breakpoint 2 set at f
- (b2db) continue
- Breakpoint 2, f ( ) at test.jam:3
- 3 a = 1 ;
- (b2db) kill
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, module scope at test.jam:14
- 14 f ;
- (b2db) break g
- Breakpoint 3 set at g
- (b2db) disable 2
- (b2db) continue
- Breakpoint 3, g ( ) at test.jam:7
- 7 b = 2 ;
- (b2db) kill
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, module scope at test.jam:14
- 14 f ;
- (b2db) enable 2
- (b2db) continue
- Breakpoint 2, f ( ) at test.jam:3
- 3 a = 1 ;
- (b2db) kill
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, module scope at test.jam:14
- 14 f ;
- (b2db) delete 2
- (b2db) continue
- Breakpoint 3, g ( ) at test.jam:7
- 7 b = 2 ;
- (b2db) kill
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, module scope at test.jam:14
- 14 f ;
- (b2db) break test.jam:12
- Breakpoint 4 set at test.jam:12
- (b2db) clear g
- Deleted breakpoint 3
- (b2db) continue
- Breakpoint 4, h ( ) at test.jam:12
- 12 d = 4 ;
- (b2db) kill
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, module scope at test.jam:14
- 14 f ;
- (b2db) clear test.jam:12
- Deleted breakpoint 4
- (b2db) continue
- Child {{\d+}} exited with status 0
- (b2db) quit
- """)
- t.cleanup()
- def test_backtrace():
- t = make_tester()
- t.write("test.jam", """\
- rule f ( x * : y * : z * )
- {
- return $(x) ;
- }
- rule g ( x * : y * : z * )
- {
- return [ f $(x) : $(y) : $(z) ] ;
- }
- g 1 : 2 : 3 ;
- """)
- run(t, """\
- (b2db) break f
- Breakpoint 1 set at f
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, f ( 1 : 2 : 3 ) at test.jam:3
- 3 return $(x) ;
- (b2db) backtrace
- #0 in f ( 1 : 2 : 3 ) at test.jam:3
- #1 in g ( 1 : 2 : 3 ) at test.jam:7
- #2 in module scope at test.jam:9
- (b2db) quit
- """)
- t.cleanup()
- def test_print():
- t = make_tester()
- t.write("test.jam", """\
- rule f ( args * )
- {
- return $(args) ;
- }
- f x ;
- f x y ;
- """)
- run(t, """\
- (b2db) break f
- Breakpoint 1 set at f
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, f ( x ) at test.jam:3
- 3 return $(args) ;
- (b2db) print $(args)
- x
- (b2db) continue
- Breakpoint 1, f ( x y ) at test.jam:3
- 3 return $(args) ;
- (b2db) print $(args)
- x y
- (b2db) disable 1
- (b2db) print [ f z ]
- z
- (b2db) quit
- """)
- t.cleanup()
- def test_run_running():
- t = make_tester()
- t.write("test.jam", """\
- UPDATE ;
- """)
- run(t, """\
- (b2db) break test.jam:1
- Breakpoint 1 set at test.jam:1
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, module scope at test.jam:1
- 1 UPDATE ;
- (b2db) run -ftest.jam
- Child {{\d+}} exited with status 0
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, module scope at test.jam:1
- 1 UPDATE ;
- (b2db) quit
- """)
- t.cleanup()
- def test_error_not_running():
- t = make_tester()
- run(t, """\
- (b2db) continue
- The program is not being run.
- (b2db) step
- The program is not being run.
- (b2db) next
- The program is not being run.
- (b2db) finish
- The program is not being run.
- (b2db) kill
- The program is not being run.
- (b2db) backtrace
- The program is not being run.
- (b2db) print 1
- The program is not being run.
- (b2db) quit
- """)
- t.cleanup()
- def test_bad_arguments():
- t = make_tester()
- t.write("test.jam", """\
- UPDATE ;
- """)
- run(t, """\
- (b2db) break test.jam:1
- Breakpoint 1 set at test.jam:1
- (b2db) run -ftest.jam
- Starting program: {{bjam}} -ftest.jam
- Breakpoint 1, module scope at test.jam:1
- 1 UPDATE ;
- (b2db) continue 1
- Too many arguments to continue.
- (b2db) step 1
- Too many arguments to step.
- (b2db) next 1
- Too many arguments to next.
- (b2db) finish 1
- Too many arguments to finish.
- (b2db) break
- Missing argument to break.
- (b2db) break x y
- Too many arguments to break.
- (b2db) disable
- Missing argument to disable.
- (b2db) disable 1 2
- Too many arguments to disable.
- (b2db) disable x
- Invalid breakpoint number x.
- (b2db) disable 2
- Unknown breakpoint 2.
- (b2db) enable
- Missing argument to enable.
- (b2db) enable 1 2
- Too many arguments to enable.
- (b2db) enable x
- Invalid breakpoint number x.
- (b2db) enable 2
- Unknown breakpoint 2.
- (b2db) delete
- Missing argument to delete.
- (b2db) delete 1 2
- Too many arguments to delete.
- (b2db) delete x
- Invalid breakpoint number x.
- (b2db) delete 2
- Unknown breakpoint 2.
- (b2db) clear
- Missing argument to clear.
- (b2db) clear test.jam:1 test.jam:1
- Too many arguments to clear.
- (b2db) clear test.jam:2
- No breakpoint at test.jam:2.
- (b2db) quit
- """)
- t.cleanup()
- def test_unknown_command():
- t = make_tester()
- run(t, """\
- (b2db) xyzzy
- Unknown command: xyzzy
- (b2db) gnusto rezrov
- Unknown command: gnusto
- (b2db) quit
- """)
- t.cleanup()
- test_run()
- test_exit_status()
- test_step()
- test_next()
- test_next_breakpoint()
- test_finish()
- test_finish_breakpoints()
- test_continue_breakpoints()
- test_breakpoints()
- test_breakpoints_running()
- test_backtrace()
- test_print()
- test_run_running()
- test_error_not_running()
- test_bad_arguments()
- test_unknown_command()
|