diff options
Diffstat (limited to 'android/test')
26 files changed, 116 insertions, 80 deletions
diff --git a/android/test/arch/build.gradle.kts b/android/test/arch/build.gradle.kts index dff039f0e2..18503fa362 100644 --- a/android/test/arch/build.gradle.kts +++ b/android/test/arch/build.gradle.kts @@ -30,6 +30,6 @@ androidComponents { dependencies { testImplementation(Dependencies.Compose.uiToolingAndroidPreview) testImplementation(Dependencies.AndroidX.appcompat) - testImplementation(Dependencies.junit) + testImplementation(Dependencies.junitApi) testImplementation(Dependencies.konsist) } diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ArchitectureTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ArchitectureTests.kt index 2a7e1e205e..4c0eac135e 100644 --- a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ArchitectureTests.kt +++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ArchitectureTests.kt @@ -3,7 +3,7 @@ package net.mullvad.mullvadvpn.test.arch import com.lemonappdev.konsist.api.Konsist import com.lemonappdev.konsist.api.architecture.KoArchitectureCreator.assertArchitecture import com.lemonappdev.konsist.api.architecture.Layer -import org.junit.Test +import org.junit.jupiter.api.Test class ArchitectureTests { diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/GeneralTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/GeneralTests.kt index 60842537c3..a4049270ed 100644 --- a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/GeneralTests.kt +++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/GeneralTests.kt @@ -4,7 +4,7 @@ import com.lemonappdev.konsist.api.Konsist import com.lemonappdev.konsist.api.ext.list.properties import com.lemonappdev.konsist.api.verify.assert import com.lemonappdev.konsist.api.verify.assertNot -import org.junit.Test +import org.junit.jupiter.api.Test class GeneralTests { @Test diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/KonsistTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/KonsistTests.kt index f2954bdb68..a1994c4a83 100644 --- a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/KonsistTests.kt +++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/KonsistTests.kt @@ -3,7 +3,7 @@ package net.mullvad.mullvadvpn.test.arch import com.lemonappdev.konsist.api.Konsist import com.lemonappdev.konsist.api.ext.list.withAnnotationOf import com.lemonappdev.konsist.api.verify.assert -import org.junit.Test +import org.junit.jupiter.api.Test class KonsistTests { @Test diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ViewModelTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ViewModelTests.kt index 0f23e52a43..d80959af78 100644 --- a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ViewModelTests.kt +++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ViewModelTests.kt @@ -8,7 +8,7 @@ import com.lemonappdev.konsist.api.ext.list.properties import com.lemonappdev.konsist.api.ext.list.withAllParentsOf import com.lemonappdev.konsist.api.verify.assert import com.lemonappdev.konsist.api.verify.assertNot -import org.junit.Test +import org.junit.jupiter.api.Test class ViewModelTests { @Test diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/ClassTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/ClassTests.kt index 918139bf24..f3aa3a9938 100644 --- a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/ClassTests.kt +++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/ClassTests.kt @@ -2,7 +2,7 @@ package net.mullvad.mullvadvpn.test.arch.classes import com.lemonappdev.konsist.api.Konsist import com.lemonappdev.konsist.api.verify.assert -import org.junit.Test +import org.junit.jupiter.api.Test class ClassTests { @Test diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/DataClassTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/DataClassTests.kt index cc2f7262b1..44ca7bcd49 100644 --- a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/DataClassTests.kt +++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/DataClassTests.kt @@ -4,7 +4,7 @@ import com.lemonappdev.konsist.api.Konsist import com.lemonappdev.konsist.api.ext.list.modifierprovider.withDataModifier import com.lemonappdev.konsist.api.ext.list.properties import com.lemonappdev.konsist.api.verify.assertNot -import org.junit.Test +import org.junit.jupiter.api.Test class DataClasses { @Test diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/ValueClassTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/ValueClassTests.kt index 6b40e051e8..9d085876fd 100644 --- a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/ValueClassTests.kt +++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/ValueClassTests.kt @@ -2,9 +2,8 @@ package net.mullvad.mullvadvpn.test.arch.classes import com.lemonappdev.konsist.api.Konsist import com.lemonappdev.konsist.api.ext.list.modifierprovider.withValueModifier -import com.lemonappdev.konsist.api.ext.list.properties import com.lemonappdev.konsist.api.verify.assertTrue -import org.junit.Test +import org.junit.jupiter.api.Test class ValueClassTests { @Test diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposePreviewTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposePreviewTests.kt index 5f8b1fef80..1c2df4bdd7 100644 --- a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposePreviewTests.kt +++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposePreviewTests.kt @@ -4,7 +4,7 @@ import androidx.compose.ui.tooling.preview.Preview import com.lemonappdev.konsist.api.Konsist import com.lemonappdev.konsist.api.ext.list.withAllAnnotationsOf import com.lemonappdev.konsist.api.verify.assert -import org.junit.Test +import org.junit.jupiter.api.Test class ComposePreviewTests { @Test diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposeTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposeTests.kt index 025f10d11f..2f7bb481fd 100644 --- a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposeTests.kt +++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposeTests.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Composable import com.lemonappdev.konsist.api.Konsist import com.lemonappdev.konsist.api.ext.list.withAllAnnotationsOf import com.lemonappdev.konsist.api.verify.assert -import org.junit.Test +import org.junit.jupiter.api.Test class ComposeTests { @Test diff --git a/android/test/arch/src/test/resources/junit-platform.properties b/android/test/arch/src/test/resources/junit-platform.properties new file mode 100644 index 0000000000..c5cb4a4e88 --- /dev/null +++ b/android/test/arch/src/test/resources/junit-platform.properties @@ -0,0 +1,6 @@ +# Enables parallel execution of Konsist tests, values found here: +# https://docs.konsist.lemonappdev.com/advanced/additional-junit5-setup +junit.jupiter.execution.parallel.enabled=true +junit.jupiter.execution.parallel.mode.default=concurrent +junit.jupiter.execution.parallel.config.strategy=dynamic +junit.jupiter.execution.parallel.config.dynamic.factor=0.95 diff --git a/android/test/common/build.gradle.kts b/android/test/common/build.gradle.kts index 99fcb9d2a7..df9dea41ab 100644 --- a/android/test/common/build.gradle.kts +++ b/android/test/common/build.gradle.kts @@ -22,6 +22,16 @@ android { abortOnError = true warningsAsErrors = true } + + packaging { + resources { + pickFirsts += setOf( + // Fixes packaging error caused by: jetified-junit-* + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md" + ) + } + } } androidComponents { @@ -37,7 +47,7 @@ dependencies { implementation(Dependencies.AndroidX.testRunner) implementation(Dependencies.AndroidX.testRules) implementation(Dependencies.AndroidX.testUiAutomator) - implementation(Dependencies.junit) + implementation(Dependencies.junitEngine) implementation(Dependencies.Kotlin.stdlib) androidTestUtil(Dependencies.AndroidX.testOrchestrator) diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/CaptureScreenshotOnFailedTestRule.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/CaptureScreenshotOnFailedTestRule.kt index 024522e94a..9138982a43 100644 --- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/CaptureScreenshotOnFailedTestRule.kt +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/CaptureScreenshotOnFailedTestRule.kt @@ -16,15 +16,15 @@ import java.io.IOException import java.nio.file.Paths import java.time.OffsetDateTime import java.time.temporal.ChronoUnit -import org.junit.rules.TestWatcher -import org.junit.runner.Description +import org.junit.jupiter.api.extension.ExtensionContext +import org.junit.jupiter.api.extension.TestWatcher -class CaptureScreenshotOnFailedTestRule(private val testTag: String) : TestWatcher() { +class CaptureScreenshotOnFailedTestRule(private val testTag: String) : TestWatcher { - override fun failed(e: Throwable?, description: Description) { - Log.d(testTag, "Capturing screenshot of failed test: " + description.methodName) + override fun testFailed(context: ExtensionContext, cause: Throwable) { + Log.d(testTag, "Capturing screenshot of failed test: " + context.requiredTestMethod.name) val timestamp = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS) - val screenshotName = "$timestamp-${description.methodName}.jpeg" + val screenshotName = "$timestamp-${context.requiredTestMethod.name}.jpeg" captureScreenshot(testTag, screenshotName) } diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/ForgetAllVpnAppsInSettingsTestRule.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/ForgetAllVpnAppsInSettingsTestRule.kt index eebdb291ab..0e5371fcc3 100644 --- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/ForgetAllVpnAppsInSettingsTestRule.kt +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/ForgetAllVpnAppsInSettingsTestRule.kt @@ -7,11 +7,11 @@ import androidx.test.uiautomator.By import androidx.test.uiautomator.UiDevice import net.mullvad.mullvadvpn.test.common.extension.findObjectByCaseInsensitiveText import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout -import org.junit.rules.TestWatcher -import org.junit.runner.Description +import org.junit.jupiter.api.extension.BeforeTestExecutionCallback +import org.junit.jupiter.api.extension.ExtensionContext -class ForgetAllVpnAppsInSettingsTestRule : TestWatcher() { - override fun starting(description: Description) { +class ForgetAllVpnAppsInSettingsTestRule : BeforeTestExecutionCallback { + override fun beforeTestExecution(context: ExtensionContext) { val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) val targetContext = InstrumentationRegistry.getInstrumentation().targetContext targetContext.startActivity( diff --git a/android/test/e2e/build.gradle.kts b/android/test/e2e/build.gradle.kts index 8e24974fcd..946e8effa9 100644 --- a/android/test/e2e/build.gradle.kts +++ b/android/test/e2e/build.gradle.kts @@ -4,6 +4,7 @@ import java.util.Properties plugins { id(Dependencies.Plugin.androidTestId) id(Dependencies.Plugin.kotlinAndroidId) + id(Dependencies.Plugin.junit5) version Versions.Plugin.junit5 } android { @@ -14,6 +15,8 @@ android { minSdk = Versions.Android.minSdkVersion testApplicationId = "net.mullvad.mullvadvpn.test.e2e" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments["runnerBuilder"] = + "de.mannodermaus.junit5.AndroidJUnit5Builder" targetProjectPath = ":app" missingDimensionStrategy(FlavorDimensions.BILLING, Flavors.OSS) @@ -62,6 +65,17 @@ android { abortOnError = true warningsAsErrors = true } + + packaging { + resources { + pickFirsts += + setOf( + // Fixes packaging error caused by: jetified-junit-* + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md" + ) + } + } } configure<org.owasp.dependencycheck.gradle.extension.DependencyCheckExtension> { @@ -83,6 +97,10 @@ dependencies { implementation(Dependencies.AndroidX.testRules) implementation(Dependencies.AndroidX.testUiAutomator) implementation(Dependencies.androidVolley) + implementation(Dependencies.junitAndroidTestExtensions) + implementation(Dependencies.junitApi) + implementation(Dependencies.junitAndroidTestCore) + implementation(Dependencies.junitAndroidTestRunner) implementation(Dependencies.Kotlin.stdlib) androidTestUtil(Dependencies.AndroidX.testOrchestrator) diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/ConnectionTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/ConnectionTest.kt index 488162b08c..bbecb037f3 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/ConnectionTest.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/ConnectionTest.kt @@ -1,20 +1,22 @@ package net.mullvad.mullvadvpn.test.e2e import androidx.test.uiautomator.By -import junit.framework.Assert.assertEquals import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout import net.mullvad.mullvadvpn.test.common.rule.ForgetAllVpnAppsInSettingsTestRule import net.mullvad.mullvadvpn.test.e2e.misc.CleanupAccountTestRule import net.mullvad.mullvadvpn.test.e2e.misc.ConnCheckState import net.mullvad.mullvadvpn.test.e2e.misc.SimpleMullvadHttpClient -import org.junit.Rule -import org.junit.Test +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.RegisterExtension class ConnectionTest : EndToEndTest() { - @Rule @JvmField val cleanupAccountTestRule = CleanupAccountTestRule() + @RegisterExtension @JvmField val cleanupAccountTestRule = CleanupAccountTestRule() - @Rule @JvmField val forgetAllVpnAppsInSettingsTestRule = ForgetAllVpnAppsInSettingsTestRule() + @RegisterExtension + @JvmField + val forgetAllVpnAppsInSettingsTestRule = ForgetAllVpnAppsInSettingsTestRule() @Test fun testConnectAndVerifyWithConnectionCheck() { diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt index c9226993b8..2cf8ba712d 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt @@ -4,35 +4,32 @@ import android.Manifest import android.content.Context import android.os.Build import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.rule.GrantPermissionRule -import androidx.test.runner.AndroidJUnit4 import androidx.test.uiautomator.UiDevice +import de.mannodermaus.junit5.extensions.GrantPermissionExtension import net.mullvad.mullvadvpn.test.common.interactor.AppInteractor import net.mullvad.mullvadvpn.test.common.rule.CaptureScreenshotOnFailedTestRule import net.mullvad.mullvadvpn.test.e2e.constant.INVALID_TEST_ACCOUNT_TOKEN_ARGUMENT_KEY import net.mullvad.mullvadvpn.test.e2e.constant.LOG_TAG import net.mullvad.mullvadvpn.test.e2e.constant.VALID_TEST_ACCOUNT_TOKEN_ARGUMENT_KEY import net.mullvad.mullvadvpn.test.e2e.extension.getRequiredArgument -import org.junit.Before -import org.junit.Rule -import org.junit.runner.RunWith +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.extension.RegisterExtension -@RunWith(AndroidJUnit4::class) abstract class EndToEndTest { - @Rule @JvmField val rule = CaptureScreenshotOnFailedTestRule(LOG_TAG) + @RegisterExtension @JvmField val rule = CaptureScreenshotOnFailedTestRule(LOG_TAG) - @Rule @JvmField - val permissionRule: GrantPermissionRule? = - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - GrantPermissionRule.grant( + @RegisterExtension + val extension = + (if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + GrantPermissionExtension.grant( Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE ) } else { - null - } + GrantPermissionExtension.grant() + }) lateinit var device: UiDevice lateinit var targetContext: Context @@ -40,7 +37,7 @@ abstract class EndToEndTest { lateinit var validTestAccountToken: String lateinit var invalidTestAccountToken: String - @Before + @BeforeEach fun setup() { device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) targetContext = InstrumentationRegistry.getInstrumentation().targetContext diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LaunchAppTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LaunchAppTest.kt index 64f534990c..f68df92854 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LaunchAppTest.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LaunchAppTest.kt @@ -1,10 +1,7 @@ package net.mullvad.mullvadvpn.test.e2e -import androidx.test.runner.AndroidJUnit4 -import org.junit.Test -import org.junit.runner.RunWith +import org.junit.jupiter.api.Test -@RunWith(AndroidJUnit4::class) class LaunchAppTest : EndToEndTest() { @Test fun testLaunchApp() { diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LoginTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LoginTest.kt index ab3ef54fb1..792c63f1a1 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LoginTest.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LoginTest.kt @@ -1,20 +1,17 @@ package net.mullvad.mullvadvpn.test.e2e -import androidx.test.runner.AndroidJUnit4 import androidx.test.uiautomator.By import net.mullvad.mullvadvpn.test.common.constant.LOGIN_FAILURE_TIMEOUT import net.mullvad.mullvadvpn.test.common.extension.clickAgreeOnPrivacyDisclaimer import net.mullvad.mullvadvpn.test.common.extension.clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout import net.mullvad.mullvadvpn.test.e2e.misc.CleanupAccountTestRule -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.RegisterExtension -@RunWith(AndroidJUnit4::class) class LoginTest : EndToEndTest() { - @Rule @JvmField val cleanupAccountTestRule = CleanupAccountTestRule() + @RegisterExtension @JvmField val cleanupAccountTestRule = CleanupAccountTestRule() @Test fun testLoginWithInvalidCredentials() { diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/WebLinkTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/WebLinkTest.kt index ac3997c372..5e72305efe 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/WebLinkTest.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/WebLinkTest.kt @@ -5,7 +5,7 @@ import net.mullvad.mullvadvpn.test.common.constant.WEB_TIMEOUT import net.mullvad.mullvadvpn.test.common.extension.clickAgreeOnPrivacyDisclaimer import net.mullvad.mullvadvpn.test.common.extension.clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout -import org.junit.Test +import org.junit.jupiter.api.Test class WebLinkTest : EndToEndTest() { @Test diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/CleanupAccountTestRule.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/CleanupAccountTestRule.kt index 2e19cb42fe..ba42862397 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/CleanupAccountTestRule.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/CleanupAccountTestRule.kt @@ -6,12 +6,13 @@ import net.mullvad.mullvadvpn.test.e2e.constant.LOG_TAG import net.mullvad.mullvadvpn.test.e2e.constant.VALID_TEST_ACCOUNT_TOKEN_ARGUMENT_KEY import net.mullvad.mullvadvpn.test.e2e.extension.getRequiredArgument import net.mullvad.mullvadvpn.test.e2e.interactor.MullvadAccountInteractor -import org.junit.rules.TestWatcher -import org.junit.runner.Description +import org.junit.jupiter.api.extension.BeforeEachCallback +import org.junit.jupiter.api.extension.ExtensionContext -class CleanupAccountTestRule : TestWatcher() { - override fun starting(description: Description) { - Log.d(LOG_TAG, "Cleaning up account before test: ${description.methodName}") +class CleanupAccountTestRule : BeforeEachCallback { + + override fun beforeEach(context: ExtensionContext) { + Log.d(LOG_TAG, "Cleaning up account before test: ${context.requiredTestMethod.name}") val targetContext = InstrumentationRegistry.getInstrumentation().targetContext val validTestAccountToken = InstrumentationRegistry.getArguments() diff --git a/android/test/firebase-test-lab.yml b/android/test/firebase-test-lab.yml index feaefbc236..d84e64134b 100644 --- a/android/test/firebase-test-lab.yml +++ b/android/test/firebase-test-lab.yml @@ -12,3 +12,4 @@ default: - {model: GoogleTvEmulator, version: 30, locale: en, orientation: landscape} environment-variables: clearPackageData: "true" + runnerBuilder: "de.mannodermaus.junit5.AndroidJUnit5Builder" diff --git a/android/test/mockapi/build.gradle.kts b/android/test/mockapi/build.gradle.kts index 8be38fdcbc..e5d20d3d50 100644 --- a/android/test/mockapi/build.gradle.kts +++ b/android/test/mockapi/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id(Dependencies.Plugin.androidTestId) id(Dependencies.Plugin.kotlinAndroidId) + id(Dependencies.Plugin.junit5) version Versions.Plugin.junit5 } android { @@ -11,6 +12,8 @@ android { minSdk = Versions.Android.minSdkVersion testApplicationId = "net.mullvad.mullvadvpn.test.mockapi" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments["runnerBuilder"] = + "de.mannodermaus.junit5.AndroidJUnit5Builder" targetProjectPath = ":app" missingDimensionStrategy(FlavorDimensions.BILLING, Flavors.OSS) @@ -37,6 +40,16 @@ android { abortOnError = true warningsAsErrors = true } + + packaging { + resources { + pickFirsts += setOf( + // Fixes packaging error caused by: jetified-junit-* + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md" + ) + } + } } configure<org.owasp.dependencycheck.gradle.extension.DependencyCheckExtension> { @@ -59,6 +72,10 @@ dependencies { implementation(Dependencies.AndroidX.testRules) implementation(Dependencies.AndroidX.testUiAutomator) implementation(Dependencies.jodaTime) + implementation(Dependencies.junitAndroidTestExtensions) + implementation(Dependencies.junitApi) + implementation(Dependencies.junitAndroidTestCore) + implementation(Dependencies.junitAndroidTestRunner) implementation(Dependencies.Kotlin.stdlib) implementation(Dependencies.mockkWebserver) diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LoginMockApiTest.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LoginMockApiTest.kt index 7d94b37492..3f3d882835 100644 --- a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LoginMockApiTest.kt +++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LoginMockApiTest.kt @@ -1,6 +1,5 @@ package net.mullvad.mullvadvpn.test.mockapi -import androidx.test.runner.AndroidJUnit4 import androidx.test.uiautomator.By import androidx.test.uiautomator.Until import net.mullvad.mullvadvpn.compose.test.LOGIN_TITLE_TEST_TAG @@ -10,11 +9,9 @@ import net.mullvad.mullvadvpn.test.common.extension.clickAllowOnNotificationPerm import net.mullvad.mullvadvpn.test.common.extension.dismissChangelogDialogIfShown import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout import net.mullvad.mullvadvpn.test.mockapi.util.currentUtcTimeWithOffsetZero -import org.junit.Assert.assertTrue -import org.junit.Test -import org.junit.runner.RunWith +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test -@RunWith(AndroidJUnit4::class) class LoginMockApiTest : MockApiTest() { @Test fun testLoginWithInvalidCredentials() { diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LogoutMockApiTest.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LogoutMockApiTest.kt index e13a728296..266fe73977 100644 --- a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LogoutMockApiTest.kt +++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LogoutMockApiTest.kt @@ -1,17 +1,14 @@ package net.mullvad.mullvadvpn.test.mockapi -import androidx.test.runner.AndroidJUnit4 import androidx.test.uiautomator.By -import junit.framework.TestCase.assertNotNull import net.mullvad.mullvadvpn.test.common.extension.clickAgreeOnPrivacyDisclaimer import net.mullvad.mullvadvpn.test.common.extension.clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove import net.mullvad.mullvadvpn.test.common.extension.dismissChangelogDialogIfShown import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout import net.mullvad.mullvadvpn.test.mockapi.util.currentUtcTimeWithOffsetZero -import org.junit.Test -import org.junit.runner.RunWith +import org.junit.jupiter.api.Assertions.assertNotNull +import org.junit.jupiter.api.Test -@RunWith(AndroidJUnit4::class) class LogoutMockApiTest : MockApiTest() { @Test diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt index 702aa72db4..9ee4f52e04 100644 --- a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt +++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiTest.kt @@ -5,29 +5,26 @@ import android.Manifest.permission.WRITE_EXTERNAL_STORAGE import android.content.Context import android.util.Log import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.rule.GrantPermissionRule -import androidx.test.runner.AndroidJUnit4 import androidx.test.uiautomator.UiDevice +import de.mannodermaus.junit5.extensions.GrantPermissionExtension import java.net.InetAddress import net.mullvad.mullvadvpn.lib.endpoint.CustomApiEndpointConfiguration import net.mullvad.mullvadvpn.test.common.interactor.AppInteractor import net.mullvad.mullvadvpn.test.common.rule.CaptureScreenshotOnFailedTestRule import net.mullvad.mullvadvpn.test.mockapi.constant.LOG_TAG import okhttp3.mockwebserver.MockWebServer -import org.junit.After -import org.junit.Before -import org.junit.Rule -import org.junit.runner.RunWith +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.extension.RegisterExtension -@RunWith(AndroidJUnit4::class) abstract class MockApiTest { - @Rule @JvmField val rule = CaptureScreenshotOnFailedTestRule(LOG_TAG) + @RegisterExtension @JvmField val rule = CaptureScreenshotOnFailedTestRule(LOG_TAG) - @Rule + @RegisterExtension @JvmField - val permissionRule: GrantPermissionRule = - GrantPermissionRule.grant(WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE) + val permissionRule: GrantPermissionExtension = + GrantPermissionExtension.grant(WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE) protected val apiDispatcher = MockApiDispatcher() private val mockWebServer = MockWebServer().apply { dispatcher = apiDispatcher } @@ -37,7 +34,7 @@ abstract class MockApiTest { lateinit var app: AppInteractor lateinit var endpoint: CustomApiEndpointConfiguration - @Before + @BeforeEach open fun setup() { device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) targetContext = InstrumentationRegistry.getInstrumentation().targetContext @@ -49,7 +46,7 @@ abstract class MockApiTest { endpoint = createEndpoint(mockWebServer.port) } - @After + @AfterEach open fun teardown() { mockWebServer.shutdown() } |
