From a3d26a0b878ec82bb44725f53a9e8ae58829e4f4 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Fri, 3 May 2019 11:55:35 +0100 Subject: [PATCH 1/6] test: remove sleep from async flush feature --- .../mazerunner/scenarios/AsyncErrorConnectivityScenario.kt | 1 - .../mazerunner/scenarios/AsyncErrorDoubleFlushScenario.kt | 1 - .../android/mazerunner/scenarios/AsyncErrorLaunchScenario.kt | 1 - 3 files changed, 3 deletions(-) diff --git a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AsyncErrorConnectivityScenario.kt b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AsyncErrorConnectivityScenario.kt index 2b1eb6102d..106dc1fa1e 100644 --- a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AsyncErrorConnectivityScenario.kt +++ b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AsyncErrorConnectivityScenario.kt @@ -22,7 +22,6 @@ internal class AsyncErrorConnectivityScenario(config: Configuration, writeErrorToStore(Bugsnag.getClient()) flushErrorStoreAsync(Bugsnag.getClient()) flushErrorStoreOnLaunch(Bugsnag.getClient()) - Thread.sleep(50) } } diff --git a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AsyncErrorDoubleFlushScenario.kt b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AsyncErrorDoubleFlushScenario.kt index c50709ef7c..2e760fa47a 100644 --- a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AsyncErrorDoubleFlushScenario.kt +++ b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AsyncErrorDoubleFlushScenario.kt @@ -20,7 +20,6 @@ internal class AsyncErrorDoubleFlushScenario(config: Configuration, writeErrorToStore(Bugsnag.getClient()) flushErrorStoreAsync(Bugsnag.getClient()) flushErrorStoreAsync(Bugsnag.getClient()) - Thread.sleep(50) } } diff --git a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AsyncErrorLaunchScenario.kt b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AsyncErrorLaunchScenario.kt index 24ef36be5c..71000c0df8 100644 --- a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AsyncErrorLaunchScenario.kt +++ b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AsyncErrorLaunchScenario.kt @@ -21,7 +21,6 @@ internal class AsyncErrorLaunchScenario(config: Configuration, writeErrorToStore(Bugsnag.getClient()) flushErrorStoreOnLaunch(Bugsnag.getClient()) flushErrorStoreAsync(Bugsnag.getClient()) - Thread.sleep(50) } } From 826b438b3069dd7ce801e22a130c77a7521ebc73 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Fri, 3 May 2019 12:13:06 +0100 Subject: [PATCH 2/6] test: add activity lifecycle callbacks to scenario class Adding activity lifecycle callbacks to the scenario class allows us to avoid blocking in certain scenarios, speeding up the test run. --- .../android/mazerunner/scenarios/Scenario.kt | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/Scenario.kt b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/Scenario.kt index a7e132df87..a21aefd203 100644 --- a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/Scenario.kt +++ b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/Scenario.kt @@ -1,10 +1,16 @@ package com.bugsnag.android.mazerunner.scenarios +import android.app.Activity +import android.app.Application +import android.os.Bundle import android.content.Context + import com.bugsnag.android.* -abstract internal class Scenario(protected val config: Configuration, - protected val context: Context) { +abstract internal class Scenario( + protected val config: Configuration, + protected val context: Context +): Application.ActivityLifecycleCallbacks { var eventMetaData: String? = null @@ -72,4 +78,19 @@ abstract internal class Scenario(protected val config: Configuration, */ protected fun generateException(): Throwable = RuntimeException(javaClass.simpleName) + + /* Activity lifecycle callback overrides */ + + protected fun registerActivityLifecycleCallbacks() { + (context.applicationContext as Application).registerActivityLifecycleCallbacks(this) + } + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} + override fun onActivityStarted(activity: Activity) {} + override fun onActivityResumed(activity: Activity) {} + override fun onActivityPaused(activity: Activity) {} + override fun onActivityStopped(activity: Activity) {} + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle?) {} + override fun onActivityDestroyed(activity: Activity) {} + } From 9208699389ba38172b75f885a4669f9057298d40 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Fri, 3 May 2019 12:13:27 +0100 Subject: [PATCH 3/6] test: avoid waiting for 2s in automatic context scenario --- features/error_context.feature | 1 - .../mazerunner/scenarios/AutoContextScenario.kt | 11 ++++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/features/error_context.feature b/features/error_context.feature index f433cf2f3d..42bca7e0ec 100644 --- a/features/error_context.feature +++ b/features/error_context.feature @@ -2,7 +2,6 @@ Feature: Reporting Error Context Scenario: Context automatically set as most recent Activity name When I run "AutoContextScenario" - And I wait for 3 seconds Then I should receive a request And the request is a valid for the error reporting API And the "Bugsnag-API-Key" header equals "a35a2a72bd230ac0aa0f52715bbdc6aa" diff --git a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AutoContextScenario.kt b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AutoContextScenario.kt index 7366df212b..9a65e4aae0 100644 --- a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AutoContextScenario.kt +++ b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AutoContextScenario.kt @@ -3,6 +3,8 @@ package com.bugsnag.android.mazerunner.scenarios import android.app.Activity import android.content.Context import android.content.Intent +import android.os.Bundle + import com.bugsnag.android.Bugsnag import com.bugsnag.android.Configuration import com.bugsnag.android.mazerunner.SecondActivity @@ -18,12 +20,11 @@ internal class AutoContextScenario(config: Configuration, override fun run() { super.run() + registerActivityLifecycleCallbacks() context.startActivity(Intent(context, SecondActivity::class.java)) - - val a = context as Activity - a.window.decorView.postDelayed({ - Bugsnag.notify(generateException()) - }, 2000) } + override fun onActivityStarted(activity: Activity) { + Bugsnag.notify(generateException()) + } } From 2ca17f2f2968729cb338fed5d7c0e70c483c7216 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Fri, 3 May 2019 12:21:44 +0100 Subject: [PATCH 4/6] test: remove wait in InForegroundScenario by using activity lifecycle callbacks --- .../mazerunner/scenarios/InForegroundScenario.kt | 14 +++++++------- features/in_foreground.feature | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/InForegroundScenario.kt b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/InForegroundScenario.kt index e0760face3..9aba4e7656 100644 --- a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/InForegroundScenario.kt +++ b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/InForegroundScenario.kt @@ -1,6 +1,9 @@ package com.bugsnag.android.mazerunner.scenarios +import android.app.Activity import android.content.Context +import android.os.Bundle + import com.bugsnag.android.Bugsnag import com.bugsnag.android.Configuration import java.lang.Thread @@ -19,14 +22,11 @@ internal class InForegroundScenario(config: Configuration, override fun run() { super.run() + registerActivityLifecycleCallbacks() + } - val thread = HandlerThread("HandlerThread") - thread.start() - Handler(thread.looper).post { - Thread.sleep(5000) - Bugsnag.notify(generateException()) - } - + override fun onActivityStopped(activity: Activity) { + Bugsnag.notify(generateException()) } } diff --git a/features/in_foreground.feature b/features/in_foreground.feature index ef9acbf3b5..1ab9b7da5c 100644 --- a/features/in_foreground.feature +++ b/features/in_foreground.feature @@ -1,7 +1,7 @@ Feature: In foreground field populates correctly Scenario: Test handled exception after delay - When I run "InForegroundScenario" + When I run "HandledExceptionScenario" Then I should receive a request And the request is a valid for the error reporting API And the event "app.inForeground" is true From fedee8e96fc8254270ed863b2cf856f0cd8e2136 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Fri, 3 May 2019 14:00:16 +0100 Subject: [PATCH 5/6] test: use activity lifecycle callback in native api --- .../scenarios/CXXAutoContextScenario.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/CXXAutoContextScenario.java b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/CXXAutoContextScenario.java index a8aebb160e..1053e73db1 100644 --- a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/CXXAutoContextScenario.java +++ b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/CXXAutoContextScenario.java @@ -2,14 +2,14 @@ import android.app.Activity; import android.content.Context; +import android.content.Intent; +import android.os.Bundle; import com.bugsnag.android.Configuration; +import com.bugsnag.android.mazerunner.SecondActivity; -import android.content.Intent; import android.support.annotation.NonNull; -import com.bugsnag.android.mazerunner.SecondActivity; - public class CXXAutoContextScenario extends Scenario { static { @@ -29,16 +29,12 @@ public CXXAutoContextScenario(@NonNull Configuration config, @NonNull Context co public void run() { super.run(); Context context = getContext(); + registerActivityLifecycleCallbacks(); context.startActivity(new Intent(context, SecondActivity.class)); + } - if (context instanceof Activity) { - Activity activity = (Activity)context; - activity.getWindow().getDecorView().postDelayed(new Runnable() { - @Override - public void run() { - activate(); - } - }, 2000); - } + @Override + public void onActivityStarted(Activity activity) { + activate(); } } From 336762839f7f858ebb961f95a18d5cb65293fd42 Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Fri, 3 May 2019 14:10:51 +0100 Subject: [PATCH 6/6] test: remove sleep in native breadcrumb scenario --- .../CXXJavaBreadcrumbNativeBreadcrumbScenario.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/CXXJavaBreadcrumbNativeBreadcrumbScenario.java b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/CXXJavaBreadcrumbNativeBreadcrumbScenario.java index 907ec1e8a4..95a7adff9d 100644 --- a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/CXXJavaBreadcrumbNativeBreadcrumbScenario.java +++ b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/CXXJavaBreadcrumbNativeBreadcrumbScenario.java @@ -33,11 +33,6 @@ public void run() { return; } Bugsnag.leaveBreadcrumb("Reverse thrusters"); - handler.postDelayed(new Runnable() { - @Override - public void run() { - activate(); - } - }, 1000); + activate(); } }