Skip to content

Commit

Permalink
Avoid ActivityController mem leaks
Browse files Browse the repository at this point in the history
  • Loading branch information
seadowg committed Aug 15, 2023
1 parent 8bf109c commit 0d4e14f
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,12 @@ import org.odk.collect.externalapp.ExternalAppUtils
import org.odk.collect.forms.Form
import org.odk.collect.formstest.FormFixtures.form
import org.odk.collect.strings.R
import org.odk.collect.testshared.ActivityControllerRule
import org.odk.collect.testshared.AssertIntentsHelper
import org.odk.collect.testshared.EspressoHelpers.assertText
import org.odk.collect.testshared.EspressoHelpers.clickOnContentDescription
import org.odk.collect.testshared.FakeScheduler
import org.odk.collect.testshared.RobolectricHelpers.recreateWithProcessRestore
import org.robolectric.Robolectric
import org.robolectric.Shadows.shadowOf
import java.io.File

Expand All @@ -48,6 +48,9 @@ class FormFillingActivityTest {
@get:Rule
val recordedIntentsRule = RecordedIntentsRule()

@get:Rule
val activityControllerRule = ActivityControllerRule()

private val assertIntentsHelper = AssertIntentsHelper()

private val scheduler = FakeScheduler()
Expand Down Expand Up @@ -77,7 +80,7 @@ class FormFillingActivityTest {
)

// Start activity
val initial = Robolectric.buildActivity(FormFillingActivity::class.java, intent).setup()
val initial = activityControllerRule.build(FormFillingActivity::class.java, intent).setup()
scheduler.flush()
assertText("Two Question")
assertText("What is your name?")
Expand All @@ -87,7 +90,10 @@ class FormFillingActivityTest {
assertText("What is your age?")

// Recreate and assert we start FormHierarchyActivity
val recreated = initial.recreateWithProcessRestore { resetProcess(dependencies) }
val recreated = activityControllerRule.add {
initial.recreateWithProcessRestore { resetProcess(dependencies) }
}

scheduler.flush()
assertIntentsHelper.assertNewIntent(FormHierarchyActivity::class)

Expand All @@ -112,7 +118,7 @@ class FormFillingActivityTest {
)

// Start activity
val initial = Robolectric.buildActivity(FormFillingActivity::class.java, intent).setup()
val initial = activityControllerRule.build(FormFillingActivity::class.java, intent).setup()
scheduler.flush()
assertText("Two Question")
assertText("What is your name?")
Expand All @@ -125,7 +131,10 @@ class FormFillingActivityTest {
assertIntentsHelper.assertNewIntent(FormHierarchyActivity::class)

// Recreate and assert we start FormHierarchyActivity
val recreated = initial.recreateWithProcessRestore { resetProcess(dependencies) }
val recreated = activityControllerRule.add {
initial.recreateWithProcessRestore { resetProcess(dependencies) }
}

scheduler.flush()
assertIntentsHelper.assertNewIntent(FormHierarchyActivity::class)

Expand All @@ -150,7 +159,7 @@ class FormFillingActivityTest {
)

// Start activity
val initial = Robolectric.buildActivity(FormFillingActivity::class.java, intent).setup()
val initial = activityControllerRule.build(FormFillingActivity::class.java, intent).setup()
scheduler.flush()
assertText("Two Question")
assertText("What is your name?")
Expand All @@ -167,7 +176,10 @@ class FormFillingActivityTest {
)

// Recreate and assert we start FormHierarchyActivity
val recreated = initial.recreateWithProcessRestore { resetProcess(dependencies) }
val recreated = activityControllerRule.add {
initial.recreateWithProcessRestore { resetProcess(dependencies) }
}

scheduler.flush()
assertIntentsHelper.assertNewIntent(FormHierarchyActivity::class)

Expand All @@ -192,7 +204,7 @@ class FormFillingActivityTest {
)

// Start activity
val initial = Robolectric.buildActivity(FormFillingActivity::class.java, intent).setup()
val initial = activityControllerRule.build(FormFillingActivity::class.java, intent).setup()
scheduler.flush()
assertText("Two Question")
assertText("What is your name?")
Expand All @@ -207,7 +219,10 @@ class FormFillingActivityTest {

// Recreate with result
val returnData = ExternalAppUtils.getReturnIntent("159")
initial.recreateWithProcessRestore(RESULT_OK, returnData) { resetProcess(dependencies) }
activityControllerRule.add {
initial.recreateWithProcessRestore(RESULT_OK, returnData) { resetProcess(dependencies) }
}

scheduler.flush()

assertIntentsHelper.assertNoNewIntent()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.odk.collect.testshared

import android.app.Activity
import android.content.Intent
import org.junit.rules.ExternalResource
import org.robolectric.Robolectric
import org.robolectric.android.controller.ActivityController

class ActivityControllerRule : ExternalResource() {

private val controllers = mutableListOf<ActivityController<*>>()

override fun after() {
controllers.forEach { it.close() }
controllers.clear()
}

fun <A : Activity> build(activityClass: Class<A>, intent: Intent): ActivityController<A> {
return Robolectric.buildActivity(activityClass, intent).also {
controllers.add(it)
}
}

fun <A : Activity> add(supplier: () -> ActivityController<A>): ActivityController<A> {
return supplier().also {
controllers.add(it)
}
}
}

0 comments on commit 0d4e14f

Please sign in to comment.