@@ -207,64 +207,69 @@ public override void OnCreate ()
207207 var sw = new Stopwatch ( ) ;
208208 // setup the debugger
209209 var session = new SoftDebuggerSession ( ) ;
210- session . Breakpoints = new BreakpointStore ( ) ;
211- string file = Path . Combine ( Root , b . ProjectDirectory , "MainActivity.cs" ) ;
212- int line = FindTextInFile ( file , "base.OnCreate (bundle);" ) ;
213- session . Breakpoints . Add ( file , line ) ;
214- file = Path . Combine ( Root , b . ProjectDirectory , "MyApplication.cs" ) ;
215- line = FindTextInFile ( file , "base.OnCreate ();" ) ;
216- session . Breakpoints . Add ( file , line ) ;
217- session . TargetHitBreakpoint += ( sender , e ) => {
218- TestContext . WriteLine ( $ "BREAK { e . Type } , { e . Backtrace . GetFrame ( 0 ) } ") ;
219- breakcountHitCount ++ ;
220- session . Continue ( ) ;
221- } ;
222- var rnd = new Random ( ) ;
223- int port = rnd . Next ( 10000 , 20000 ) ;
224- TestContext . Out . WriteLine ( $ "{ port } ") ;
225- var args = new SoftDebuggerConnectArgs ( "" , IPAddress . Loopback , port ) {
226- MaxConnectionAttempts = 2000 , // we need a long delay here to get a reliable connection
227- } ;
228- var startInfo = new SoftDebuggerStartInfo ( args ) {
229- WorkingDirectory = Path . Combine ( b . ProjectDirectory , proj . IntermediateOutputPath , "android" , "assets" ) ,
230- } ;
231- var options = new DebuggerSessionOptions ( ) {
232- EvaluationOptions = EvaluationOptions . DefaultOptions ,
233- } ;
234- options . EvaluationOptions . UseExternalTypeResolver = true ;
235- RunProjectAndAssert ( proj , b , doNotCleanupOnUpdate : true , parameters : new string [ ] {
236- $ "AndroidSdbTargetPort={ port } ",
237- $ "AndroidSdbHostPort={ port } ",
238- "AndroidAttachDebugger=True" ,
239- } ) ;
240-
241- session . LogWriter += ( isStderr , text ) => { Console . WriteLine ( text ) ; } ;
242- session . OutputWriter += ( isStderr , text ) => { Console . WriteLine ( text ) ; } ;
243- session . DebugWriter += ( level , category , message ) => { Console . WriteLine ( message ) ; } ;
244- // do we expect the app to start?
245- Assert . AreEqual ( activityStarts , WaitForDebuggerToStart ( Path . Combine ( Root , b . ProjectDirectory , "logcat.log" ) ) , "Debugger should have started" ) ;
246- if ( ! activityStarts )
247- return ;
248- Assert . False ( session . HasExited , "Target should not have exited." ) ;
249- session . Run ( startInfo , options ) ;
250- var expectedTime = TimeSpan . FromSeconds ( 1 ) ;
251- var actualTime = ProfileFor ( ( ) => session . IsConnected ) ;
252- Assert . True ( session . IsConnected , "Debugger should have connected but it did not." ) ;
253- TestContext . Out . WriteLine ( $ "Debugger connected in { actualTime } ") ;
254- Assert . LessOrEqual ( actualTime , expectedTime , $ "Debugger should have connected within { expectedTime } but it took { actualTime } .") ;
255- // we need to wait here for a while to allow the breakpoints to hit
256- // but we need to timeout
257- TimeSpan timeout = TimeSpan . FromSeconds ( 60 ) ;
258- while ( session . IsConnected && breakcountHitCount < 2 && timeout >= TimeSpan . Zero ) {
259- Thread . Sleep ( 10 ) ;
260- timeout = timeout . Subtract ( TimeSpan . FromMilliseconds ( 10 ) ) ;
210+ try {
211+ session . Breakpoints = new BreakpointStore ( ) ;
212+ string file = Path . Combine ( Root , b . ProjectDirectory , "MainActivity.cs" ) ;
213+ int line = FindTextInFile ( file , "base.OnCreate (bundle);" ) ;
214+ session . Breakpoints . Add ( file , line ) ;
215+ file = Path . Combine ( Root , b . ProjectDirectory , "MyApplication.cs" ) ;
216+ line = FindTextInFile ( file , "base.OnCreate ();" ) ;
217+ session . Breakpoints . Add ( file , line ) ;
218+ session . TargetHitBreakpoint += ( sender , e ) => {
219+ TestContext . WriteLine ( $ "BREAK { e . Type } , { e . Backtrace . GetFrame ( 0 ) } ") ;
220+ breakcountHitCount ++ ;
221+ session . Continue ( ) ;
222+ } ;
223+ var rnd = new Random ( ) ;
224+ int port = rnd . Next ( 10000 , 20000 ) ;
225+ TestContext . Out . WriteLine ( $ "{ port } ") ;
226+ var args = new SoftDebuggerConnectArgs ( "" , IPAddress . Loopback , port ) {
227+ MaxConnectionAttempts = 2000 , // we need a long delay here to get a reliable connection
228+ } ;
229+ var startInfo = new SoftDebuggerStartInfo ( args ) {
230+ WorkingDirectory = Path . Combine ( b . ProjectDirectory , proj . IntermediateOutputPath , "android" , "assets" ) ,
231+ } ;
232+ var options = new DebuggerSessionOptions ( ) {
233+ EvaluationOptions = EvaluationOptions . DefaultOptions ,
234+ } ;
235+ options . EvaluationOptions . UseExternalTypeResolver = true ;
236+ RunProjectAndAssert ( proj , b , doNotCleanupOnUpdate : true , parameters : new string [ ] {
237+ $ "AndroidSdbTargetPort={ port } ",
238+ $ "AndroidSdbHostPort={ port } ",
239+ "AndroidAttachDebugger=True" ,
240+ } ) ;
241+
242+ session . LogWriter += ( isStderr , text ) => { Console . WriteLine ( text ) ; } ;
243+ session . OutputWriter += ( isStderr , text ) => { Console . WriteLine ( text ) ; } ;
244+ session . DebugWriter += ( level , category , message ) => { Console . WriteLine ( message ) ; } ;
245+ // do we expect the app to start?
246+ Assert . AreEqual ( activityStarts , WaitForDebuggerToStart ( Path . Combine ( Root , b . ProjectDirectory , "logcat.log" ) ) , "Debugger should have started" ) ;
247+ if ( ! activityStarts )
248+ return ;
249+ Assert . False ( session . HasExited , "Target should not have exited." ) ;
250+ session . Run ( startInfo , options ) ;
251+ var expectedTime = TimeSpan . FromSeconds ( 1 ) ;
252+ var actualTime = ProfileFor ( ( ) => session . IsConnected ) ;
253+ Assert . True ( session . IsConnected , "Debugger should have connected but it did not." ) ;
254+ TestContext . Out . WriteLine ( $ "Debugger connected in { actualTime } ") ;
255+ Assert . LessOrEqual ( actualTime , expectedTime , $ "Debugger should have connected within { expectedTime } but it took { actualTime } .") ;
256+ // we need to wait here for a while to allow the breakpoints to hit
257+ // but we need to timeout
258+ TimeSpan timeout = TimeSpan . FromSeconds ( 60 ) ;
259+ while ( session . IsConnected && breakcountHitCount < 2 && timeout >= TimeSpan . Zero ) {
260+ Thread . Sleep ( 10 ) ;
261+ timeout = timeout . Subtract ( TimeSpan . FromMilliseconds ( 10 ) ) ;
262+ }
263+ WaitFor ( 2000 ) ;
264+ int expected = 2 ;
265+ Assert . AreEqual ( expected , breakcountHitCount , $ "Should have hit { expected } breakpoints. Only hit { breakcountHitCount } ") ;
266+ b . BuildLogFile = "uninstall.log" ;
267+ Assert . True ( b . Uninstall ( proj ) , "Project should have uninstalled." ) ;
268+ } catch ( Exception ex ) {
269+ Assert . Fail ( $ "Exception occurred { ex } ") ;
270+ } finally {
271+ session . Exit ( ) ;
261272 }
262- WaitFor ( 2000 ) ;
263- int expected = 2 ;
264- Assert . AreEqual ( expected , breakcountHitCount , $ "Should have hit { expected } breakpoints. Only hit { breakcountHitCount } ") ;
265- b . BuildLogFile = "uninstall.log" ;
266- Assert . True ( b . Uninstall ( proj ) , "Project should have uninstalled." ) ;
267- session . Exit ( ) ;
268273 }
269274 }
270275
@@ -405,93 +410,97 @@ public Foo ()
405410 var sw = new Stopwatch ( ) ;
406411 // setup the debugger
407412 var session = new SoftDebuggerSession ( ) ;
408-
409- session . Breakpoints = new BreakpointStore ( ) ;
410- string file = Path . Combine ( Root , appBuilder . ProjectDirectory , "MainActivity.cs" ) ;
411- int line = FindTextInFile ( file , "base.OnCreate (savedInstanceState);" ) ;
412- session . Breakpoints . Add ( file , line ) ;
413-
414- file = Path . Combine ( Root , appBuilder . ProjectDirectory , "MainPage.xaml.cs" ) ;
415- line = FindTextInFile ( file , "InitializeComponent ();" ) ;
416- session . Breakpoints . Add ( file , line ) ;
417-
418- file = Path . Combine ( Root , appBuilder . ProjectDirectory , "MainPage.xaml.cs" ) ;
419- line = FindTextInFile ( file , "Console.WriteLine (" ) ;
420- session . Breakpoints . Add ( file , line ) ;
421-
422- file = Path . Combine ( Root , appBuilder . ProjectDirectory , "App.xaml.cs" ) ;
423- line = FindTextInFile ( file , "InitializeComponent ();" ) ;
424- session . Breakpoints . Add ( file , line ) ;
425-
426- file = Path . Combine ( Root , libBuilder . ProjectDirectory , "Foo.cs" ) ;
427- line = FindTextInFile ( file , "public Foo ()" ) ;
428- // Add one to the line so we get the '{' under the constructor
429- session . Breakpoints . Add ( file , line ++ ) ;
430-
431- session . TargetHitBreakpoint += ( sender , e ) => {
432- TestContext . WriteLine ( $ "BREAK { e . Type } , { e . Backtrace . GetFrame ( 0 ) } ") ;
433- breakcountHitCount ++ ;
434- session . Continue ( ) ;
435- } ;
436- var rnd = new Random ( ) ;
437- int port = rnd . Next ( 10000 , 20000 ) ;
438- TestContext . Out . WriteLine ( $ "{ port } ") ;
439- var args = new SoftDebuggerConnectArgs ( "" , IPAddress . Loopback , port ) {
440- MaxConnectionAttempts = 2000 ,
441- } ;
442- var startInfo = new SoftDebuggerStartInfo ( args ) {
443- WorkingDirectory = Path . Combine ( appBuilder . ProjectDirectory , app . IntermediateOutputPath , "android" , "assets" ) ,
444- } ;
445- var options = new DebuggerSessionOptions ( ) {
446- EvaluationOptions = EvaluationOptions . DefaultOptions ,
447- } ;
448- options . EvaluationOptions . UseExternalTypeResolver = true ;
449-
450- parameters . Add ( $ "AndroidSdbTargetPort={ port } ") ;
451- parameters . Add ( $ "AndroidSdbHostPort={ port } ") ;
452- parameters . Add ( "AndroidAttachDebugger=True" ) ;
453-
454- RunProjectAndAssert ( app , appBuilder , doNotCleanupOnUpdate : true , parameters : parameters . ToArray ( ) ) ;
455-
456- session . LogWriter += ( isStderr , text ) => {
457- TestContext . Out . WriteLine ( text ) ;
458- } ;
459- session . OutputWriter += ( isStderr , text ) => {
460- TestContext . Out . WriteLine ( text ) ;
461- } ;
462- session . DebugWriter += ( level , category , message ) => {
463- TestContext . Out . WriteLine ( message ) ;
464- } ;
465- Assert . IsTrue ( WaitForDebuggerToStart ( Path . Combine ( Root , appBuilder . ProjectDirectory , "logcat.log" ) ) , "Debugger should have started" ) ;
466- session . Run ( startInfo , options ) ;
467- TestContext . Out . WriteLine ( $ "Detected debugger startup in log") ;
468- Assert . False ( session . HasExited , "Target should not have exited." ) ;
469- WaitFor ( TimeSpan . FromSeconds ( 30 ) , ( ) => session . IsConnected ) ;
470- Assert . True ( session . IsConnected , "Debugger should have connected but it did not." ) ;
471- // we need to wait here for a while to allow the breakpoints to hit
472- // but we need to timeout
473- TestContext . Out . WriteLine ( $ "Debugger connected.") ;
474- TimeSpan timeout = TimeSpan . FromSeconds ( 60 ) ;
475- int expected = 4 ;
476- while ( session . IsConnected && breakcountHitCount < 3 && timeout >= TimeSpan . Zero ) {
477- Thread . Sleep ( 10 ) ;
478- timeout = timeout . Subtract ( TimeSpan . FromMilliseconds ( 10 ) ) ;
479- }
480- WaitFor ( 2000 ) ;
481- Assert . AreEqual ( expected , breakcountHitCount , $ "Should have hit { expected } breakpoints. Only hit { breakcountHitCount } ") ;
482- breakcountHitCount = 0 ;
483- ClearAdbLogcat ( ) ;
484- ClearBlockingDialogs ( ) ;
485- Assert . True ( ClickButton ( app . PackageName , "myXFButton" , "CLICK ME" ) , "Button should have been clicked!" ) ;
486- while ( session . IsConnected && breakcountHitCount < 1 && timeout >= TimeSpan . Zero ) {
487- Thread . Sleep ( 10 ) ;
488- timeout = timeout . Subtract ( TimeSpan . FromMilliseconds ( 10 ) ) ;
413+ try {
414+ session . Breakpoints = new BreakpointStore ( ) ;
415+ string file = Path . Combine ( Root , appBuilder . ProjectDirectory , "MainActivity.cs" ) ;
416+ int line = FindTextInFile ( file , "base.OnCreate (savedInstanceState);" ) ;
417+ session . Breakpoints . Add ( file , line ) ;
418+
419+ file = Path . Combine ( Root , appBuilder . ProjectDirectory , "MainPage.xaml.cs" ) ;
420+ line = FindTextInFile ( file , "InitializeComponent ();" ) ;
421+ session . Breakpoints . Add ( file , line ) ;
422+
423+ file = Path . Combine ( Root , appBuilder . ProjectDirectory , "MainPage.xaml.cs" ) ;
424+ line = FindTextInFile ( file , "Console.WriteLine (" ) ;
425+ session . Breakpoints . Add ( file , line ) ;
426+
427+ file = Path . Combine ( Root , appBuilder . ProjectDirectory , "App.xaml.cs" ) ;
428+ line = FindTextInFile ( file , "InitializeComponent ();" ) ;
429+ session . Breakpoints . Add ( file , line ) ;
430+
431+ file = Path . Combine ( Root , libBuilder . ProjectDirectory , "Foo.cs" ) ;
432+ line = FindTextInFile ( file , "public Foo ()" ) ;
433+ // Add one to the line so we get the '{' under the constructor
434+ session . Breakpoints . Add ( file , line ++ ) ;
435+
436+ session . TargetHitBreakpoint += ( sender , e ) => {
437+ TestContext . WriteLine ( $ "BREAK { e . Type } , { e . Backtrace . GetFrame ( 0 ) } ") ;
438+ breakcountHitCount ++ ;
439+ session . Continue ( ) ;
440+ } ;
441+ var rnd = new Random ( ) ;
442+ int port = rnd . Next ( 10000 , 20000 ) ;
443+ TestContext . Out . WriteLine ( $ "{ port } ") ;
444+ var args = new SoftDebuggerConnectArgs ( "" , IPAddress . Loopback , port ) {
445+ MaxConnectionAttempts = 2000 ,
446+ } ;
447+ var startInfo = new SoftDebuggerStartInfo ( args ) {
448+ WorkingDirectory = Path . Combine ( appBuilder . ProjectDirectory , app . IntermediateOutputPath , "android" , "assets" ) ,
449+ } ;
450+ var options = new DebuggerSessionOptions ( ) {
451+ EvaluationOptions = EvaluationOptions . DefaultOptions ,
452+ } ;
453+ options . EvaluationOptions . UseExternalTypeResolver = true ;
454+
455+ parameters . Add ( $ "AndroidSdbTargetPort={ port } ") ;
456+ parameters . Add ( $ "AndroidSdbHostPort={ port } ") ;
457+ parameters . Add ( "AndroidAttachDebugger=True" ) ;
458+
459+ RunProjectAndAssert ( app , appBuilder , doNotCleanupOnUpdate : true , parameters : parameters . ToArray ( ) ) ;
460+
461+ session . LogWriter += ( isStderr , text ) => {
462+ TestContext . Out . WriteLine ( text ) ;
463+ } ;
464+ session . OutputWriter += ( isStderr , text ) => {
465+ TestContext . Out . WriteLine ( text ) ;
466+ } ;
467+ session . DebugWriter += ( level , category , message ) => {
468+ TestContext . Out . WriteLine ( message ) ;
469+ } ;
470+ Assert . IsTrue ( WaitForDebuggerToStart ( Path . Combine ( Root , appBuilder . ProjectDirectory , "logcat.log" ) ) , "Debugger should have started" ) ;
471+ session . Run ( startInfo , options ) ;
472+ TestContext . Out . WriteLine ( $ "Detected debugger startup in log") ;
473+ Assert . False ( session . HasExited , "Target should not have exited." ) ;
474+ WaitFor ( TimeSpan . FromSeconds ( 30 ) , ( ) => session . IsConnected ) ;
475+ Assert . True ( session . IsConnected , "Debugger should have connected but it did not." ) ;
476+ // we need to wait here for a while to allow the breakpoints to hit
477+ // but we need to timeout
478+ TestContext . Out . WriteLine ( $ "Debugger connected.") ;
479+ TimeSpan timeout = TimeSpan . FromSeconds ( 60 ) ;
480+ int expected = 4 ;
481+ while ( session . IsConnected && breakcountHitCount < 3 && timeout >= TimeSpan . Zero ) {
482+ Thread . Sleep ( 10 ) ;
483+ timeout = timeout . Subtract ( TimeSpan . FromMilliseconds ( 10 ) ) ;
484+ }
485+ WaitFor ( 2000 ) ;
486+ Assert . AreEqual ( expected , breakcountHitCount , $ "Should have hit { expected } breakpoints. Only hit { breakcountHitCount } ") ;
487+ breakcountHitCount = 0 ;
488+ ClearAdbLogcat ( ) ;
489+ ClearBlockingDialogs ( ) ;
490+ Assert . True ( ClickButton ( app . PackageName , "myXFButton" , "CLICK ME" ) , "Button should have been clicked!" ) ;
491+ while ( session . IsConnected && breakcountHitCount < 1 && timeout >= TimeSpan . Zero ) {
492+ Thread . Sleep ( 10 ) ;
493+ timeout = timeout . Subtract ( TimeSpan . FromMilliseconds ( 10 ) ) ;
494+ }
495+ expected = 1 ;
496+ Assert . AreEqual ( expected , breakcountHitCount , $ "Should have hit { expected } breakpoints. Only hit { breakcountHitCount } ") ;
497+ appBuilder . BuildLogFile = "uninstall.log" ;
498+ Assert . True ( appBuilder . Uninstall ( app ) , "Project should have uninstalled." ) ;
499+ } catch ( Exception ex ) {
500+ Assert . Fail ( $ "Exception occurred { ex } ") ;
501+ } finally {
502+ session . Exit ( ) ;
489503 }
490- expected = 1 ;
491- Assert . AreEqual ( expected , breakcountHitCount , $ "Should have hit { expected } breakpoints. Only hit { breakcountHitCount } ") ;
492- appBuilder . BuildLogFile = "uninstall.log" ;
493- Assert . True ( appBuilder . Uninstall ( app ) , "Project should have uninstalled." ) ;
494- session . Exit ( ) ;
495504 }
496505 }
497506 }
0 commit comments