diff options
| author | David Göransson <david.goransson@mullvad.net> | 2025-05-20 10:11:16 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2025-05-21 11:56:43 +0200 |
| commit | bf7f22e42500ba570776a08d132b6ee1e3a93df9 (patch) | |
| tree | f7f031ab0c01d82328cf65e99b872d2da5e9f375 /android | |
| parent | ee8c0578c5d7f330b40272cdec1ee62af2c5fd20 (diff) | |
| download | mullvadvpn-bf7f22e42500ba570776a08d132b6ee1e3a93df9.tar.xz mullvadvpn-bf7f22e42500ba570776a08d132b6ee1e3a93df9.zip | |
Unify usage of gradle properties
This commit does multiple changes to how we work with properties.
- Instead of relying on `e2e.properties` and `local.properties` only use
the `gradle.properties` as per standard gradle.
- Naming of properties are changed to have a coherent structure.
- Allow for setting stagemole and prod account separately.
- Consolidate all the default values into `gradle.properties`
Diffstat (limited to 'android')
20 files changed, 180 insertions, 148 deletions
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index d40b7bd8b2..9571b9819a 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -1,4 +1,3 @@ -import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties import com.android.build.gradle.internal.tasks.factory.dependsOn import com.github.triplet.gradle.androidpublisher.ReleaseStatus import java.io.FileInputStream @@ -20,7 +19,7 @@ plugins { val repoRootPath = rootProject.projectDir.absoluteFile.parentFile.absolutePath val relayListDirectory = file("$repoRootPath/dist-assets/relays/").absolutePath -val defaultChangelogAssetsDirectory = "$repoRootPath/android/src/main/play/release-notes/" +val changelogAssetsDirectory = "$repoRootPath/android/src/main/play/release-notes/" val rustJniLibsDir = layout.buildDirectory.dir("rustJniLibs/android").get() val credentialsPath = "${rootProject.projectDir}/credentials" @@ -38,13 +37,11 @@ android { ndkVersion = Versions.ndkVersion defaultConfig { - val localProperties = gradleLocalProperties(rootProject.projectDir, providers) - applicationId = "net.mullvad.mullvadvpn" minSdk = Versions.minSdkVersion targetSdk = Versions.targetSdkVersion - versionCode = generateVersionCode(localProperties) - versionName = generateVersionName(localProperties) + versionCode = generateVersionCode() + versionName = generateVersionName() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" lint { @@ -89,11 +86,7 @@ android { ) } getByName(BuildTypes.DEBUG) { - if ( - gradleLocalProperties(rootProject.projectDir, providers) - .getProperty("KEEP_DEBUG_SYMBOLS") - .toBoolean() - ) { + if (getBooleanProperty("mullvad.app.build.keepDebugSymbols")) { packaging { jniLibs.keepDebugSymbols.add("**/*.so") } } } @@ -133,13 +126,7 @@ android { } sourceSets { - getByName("main") { - val changelogDir = - gradleLocalProperties(rootProject.projectDir, providers) - .getOrDefault("OVERRIDE_CHANGELOG_DIR", defaultChangelogAssetsDirectory) - - assets.srcDirs(relayListDirectory, changelogDir) - } + getByName("main") { assets.srcDirs(relayListDirectory, changelogAssetsDirectory) } } buildFeatures { @@ -194,14 +181,10 @@ android { } applicationVariants.configureEach { - val enableInAppVersionNotifications = - gradleLocalProperties(rootProject.projectDir, providers) - .getProperty("ENABLE_IN_APP_VERSION_NOTIFICATIONS") ?: "true" - buildConfigField( "boolean", "ENABLE_IN_APP_VERSION_NOTIFICATIONS", - enableInAppVersionNotifications, + getBooleanProperty("mullvad.app.config.inAppVersionNotifications.enable").toString(), ) } @@ -267,18 +250,13 @@ junitPlatform { } cargo { - val localProperties = gradleLocalProperties(rootProject.projectDir, providers) val isReleaseBuild = isReleaseBuild() - val enableApiOverride = - !isReleaseBuild || isDevBuild(localProperties) || isAlphaBuild(localProperties) + val enableApiOverride = !isReleaseBuild || isDevBuild() || isAlphaBuild() module = repoRootPath libname = "mullvad-jni" // All available targets: // https://github.com/mozilla/rust-android-gradle/tree/master?tab=readme-ov-file#targets - targets = - gradleLocalProperties(rootProject.projectDir, providers) - .getProperty("CARGO_TARGETS") - ?.split(",") ?: listOf("arm", "arm64", "x86", "x86_64") + targets = getStringListProperty("mullvad.app.build.cargo.targets") profile = if (isReleaseBuild) { "release" @@ -305,11 +283,7 @@ tasks.register<Exec>("cargoClean") { commandLine("cargo", "clean") } -if ( - gradleLocalProperties(rootProject.projectDir, providers) - .getProperty("CLEAN_CARGO_BUILD") - ?.toBoolean() != false -) { +if (getBooleanProperty("mullvad.app.build.cargo.cleanBuild")) { tasks["clean"].dependsOn("cargoClean") } diff --git a/android/build.sh b/android/build.sh index 05337e21ac..3e63a4ce55 100755 --- a/android/build.sh +++ b/android/build.sh @@ -17,7 +17,6 @@ BUILD_BUNDLE="no" BUNDLE_TASKS=(createPlayProdReleaseDistBundle) RUN_PLAY_PUBLISH_TASKS="no" PLAY_PUBLISH_TASKS=() -LOCAL_PROPERTIES_FILE="local.properties" while [ -n "${1:-""}" ]; do if [[ "${1:-""}" == "--dev-build" ]]; then @@ -90,8 +89,4 @@ echo "" echo " Build checksums:" md5sum ../dist/MullvadVPN-"$PRODUCT_VERSION"* | sed 's/^/ /' echo "" -if [[ -f "$LOCAL_PROPERTIES_FILE" ]] && grep -q "^CARGO_TARGETS=" "$LOCAL_PROPERTIES_FILE"; then - echo " CARGO_TARGETS is set in $LOCAL_PROPERTIES_FILE, build may not be reproducible!" -fi -echo "" echo "**********************************" diff --git a/android/buildSrc/src/main/kotlin/Utils.kt b/android/buildSrc/src/main/kotlin/Utils.kt index b442ad453a..d939363827 100644 --- a/android/buildSrc/src/main/kotlin/Utils.kt +++ b/android/buildSrc/src/main/kotlin/Utils.kt @@ -8,24 +8,22 @@ fun Project.isReleaseBuild() = it.contains("release", ignoreCase = true) || it.contains("fdroid", ignoreCase = true) } -fun Project.isAlphaBuild(localProperties: Properties): Boolean { - val versionName = generateVersionName(localProperties) +fun Project.isAlphaBuild(): Boolean { + val versionName = generateVersionName() return versionName.contains("alpha") } -fun Project.isDevBuild(localProperties: Properties): Boolean { - val versionName = generateVersionName(localProperties) +fun Project.isDevBuild(): Boolean { + val versionName = generateVersionName() return versionName.contains("-dev-") } -fun Project.generateVersionCode(localProperties: Properties): Int { - return localProperties.getProperty("OVERRIDE_VERSION_CODE")?.toIntOrNull() - ?: execVersionCodeCargoCommand() -} +fun Project.generateVersionCode(): Int = + getIntPropertyOrNull("mullvad.app.config.override.versionCode") ?: execVersionCodeCargoCommand() -fun Project.generateVersionName(localProperties: Properties): String { - return localProperties.getProperty("OVERRIDE_VERSION_NAME") ?: execVersionNameCargoCommand() -} +fun Project.generateVersionName(): String = + getStringPropertyOrNull("mullvad.app.config.override.versionName") + ?: execVersionNameCargoCommand() fun Project.generateRemapArguments(): String { val script = "${projectDir.parent}/../building/rustc-remap-path-prefix.sh" @@ -48,3 +46,23 @@ private fun Project.execVersionNameCargoCommand() = .asText .get() .trim() + +fun Project.getStringPropertyOrNull(name: String): String? = findProperty(name)?.toString() + +fun Project.getIntPropertyOrNull(name: String): Int? = findProperty(name)?.toString()?.toInt() + +fun Project.getBooleanPropertyOrNull(name: String): Boolean? = + findProperty(name)?.toString()?.toBooleanStrict() + +fun Project.getStringProperty(name: String): String = properties[name].toString() + +fun Project.getIntProperty(name: String): Int = properties[name].toString().toInt() + +fun Project.getBooleanProperty(name: String): Boolean = + properties[name].toString().toBooleanStrict() + +// Fetch a string and that is split by `,` into a list of strings +const val STRING_LIST_SEPARATOR = ',' + +fun Project.getStringListProperty(name: String): List<String> = + properties[name].toString().split(STRING_LIST_SEPARATOR) diff --git a/android/gradle.properties b/android/gradle.properties index 2170a22f34..865475dd75 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,15 +1,67 @@ -# Android properties +### Android properties ### android.enableR8.fullMode=true android.nonTransitiveRClass=false android.useAndroidX=true -# Kotlin properties + +### Kotlin properties ### kotlin.code.style=official -# Gradle properties + +### Gradle properties ### org.gradle.caching=true org.gradle.jvmargs=-Xmx8192M -Dkotlin.daemon.jvm.options\="-Xmx8192M" -# Mullvad properties -test.e2e.enableAccessToLocalApiTests=false +### Mullvad properties ### + +# Show in app version notifications +mullvad.app.config.inAppVersionNotifications.enable=true + +# Optional property to override the version name and code +# app.config.override.versionName= +# app.config.override.versionCode= + +# Targets to build the daemon for +mullvad.app.build.cargo.targets=arm,arm64,x86,x86_64 + +# Perform a clean the cargo before each build +mullvad.app.build.cargo.cleanBuild=true + +# Keep debug symbols in debug builds, this will cause the debug artifacts +# to be substantially larger. +mullvad.app.build.keepDebugSymbols=false + +## E2E tests ## + +# To run e2e tests you need to provide credentails for the enviroment you +# are targeting. Either provide a partnerAuth that will automatically create +# accounts as needed or provide already valid credentaisl + +#mullvad.test.e2e.prod.partnerAuth= +# OR +#mullvad.test.e2e.stagemole.accountNumber.valid= +#mullvad.test.e2e.stagemole.accountNumber.invalid=1234123412341234 + +#mullvad.test.e2e.stagemole.partnerAuth= +# OR +#mullvad.test.e2e.prod.accountNumber.valid= +#mullvad.test.e2e.prod.accountNumber.invalid=1234123412341234 + + +# Run the highly rate limited tests, these will make the test run go for longer +# since it will have to be careful not to trigger the rate limiting. +mullvad.test.e2e.config.runHighlyRateLimitedTests=false + +# Whether to enable tests dependent on RAAS (Router As A Service), if enabled +# you need to provide the rest of the `test.e2e.config.raas.*` properties. +mullvad.test.e2e.config.raas.enable=false +# +# IP to the machine running RAAS +#mullvad.test.e2e.config.raas.host= +# +# IP address or host to send traffic to +#mullvad.test.e2e.config.raas.trafficGenerator.target.host= +# +# Port 1-65532 +#mullvad.test.e2e.config.raas.trafficGenerator.target.port= diff --git a/android/service/build.gradle.kts b/android/service/build.gradle.kts index 7fd560aa43..4fd794c765 100644 --- a/android/service/build.gradle.kts +++ b/android/service/build.gradle.kts @@ -1,5 +1,3 @@ -import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties - plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) @@ -13,8 +11,7 @@ android { defaultConfig { minSdk = Versions.minSdkVersion - val localProperties = gradleLocalProperties(rootProject.projectDir, providers) - val shouldRequireBundleRelayFile = isReleaseBuild() && !isDevBuild(localProperties) + val shouldRequireBundleRelayFile = isReleaseBuild() && !isDevBuild() buildConfigField( "Boolean", "REQUIRE_BUNDLED_RELAY_FILE", diff --git a/android/test/e2e/build.gradle.kts b/android/test/e2e/build.gradle.kts index 31181aab52..debd5ff9b6 100644 --- a/android/test/e2e/build.gradle.kts +++ b/android/test/e2e/build.gradle.kts @@ -1,5 +1,3 @@ -import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties -import java.util.Properties import org.gradle.internal.extensions.stdlib.capitalized plugins { @@ -23,42 +21,16 @@ android { "de.mannodermaus.junit5.AndroidJUnit5Builder" targetProjectPath = ":app" - fun Properties.addRequiredPropertyAsBuildConfigField(name: String) { - val value = - System.getenv(name) - ?: getProperty(name) - ?: throw GradleException("Missing property: $name") + testInstrumentationRunnerArguments += buildMap { + put("clearPackageData", "true") - buildConfigField(type = "String", name = name, value = "\"$value\"") - } - - Properties().apply { - load(project.file("e2e.properties").inputStream()) - addRequiredPropertyAsBuildConfigField("API_VERSION") - addRequiredPropertyAsBuildConfigField("TRAFFIC_GENERATION_IP_ADDRESS") - addRequiredPropertyAsBuildConfigField("TEST_ROUTER_API_HOST") - } - - fun MutableMap<String, String>.addOptionalPropertyAsArgument(name: String) { - val value = - rootProject.properties.getOrDefault(name, null) as? String - ?: gradleLocalProperties(rootProject.projectDir, providers).getProperty(name) - - if (value != null) { - put(name, value) - } - } - - testInstrumentationRunnerArguments += - mutableMapOf<String, String>().apply { - put("clearPackageData", "true") - addOptionalPropertyAsArgument("enable_highly_rate_limited_tests") - addOptionalPropertyAsArgument("valid_test_account_number") - addOptionalPropertyAsArgument("invalid_test_account_number") - project.findProperty("test.e2e.enableAccessToLocalApiTests")?.let { - put("enable_access_to_local_api_tests", it.toString()) + // Add all properties starting with "test.e2e" to the testInstrumentationRunnerArguments + properties.forEach { + if (it.key.startsWith("mullvad.test.e2e")) { + put(it.key, it.value.toString()) } } + } } flavorDimensions += FlavorDimensions.BILLING diff --git a/android/test/e2e/e2e.properties b/android/test/e2e/e2e.properties deleted file mode 100644 index 1cfa0f6bd1..0000000000 --- a/android/test/e2e/e2e.properties +++ /dev/null @@ -1,3 +0,0 @@ -API_VERSION=v1 -TRAFFIC_GENERATION_IP_ADDRESS=45.83.223.209 -TEST_ROUTER_API_HOST=192.168.105.1 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 4720fc5ce6..f23f74dd6a 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 @@ -20,6 +20,7 @@ import net.mullvad.mullvadvpn.test.e2e.api.relay.RelayApi import net.mullvad.mullvadvpn.test.e2e.misc.AccountTestRule import net.mullvad.mullvadvpn.test.e2e.misc.ClearFirewallRules import net.mullvad.mullvadvpn.test.e2e.router.firewall.DropRule +import net.mullvad.mullvadvpn.test.e2e.router.firewall.FirewallClient import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.RegisterExtension @@ -34,6 +35,7 @@ class ConnectionTest : EndToEndTest() { private val connCheckClient = ConnectionCheckApi() private val relayClient = RelayApi() + private val firewallClient by lazy { FirewallClient() } @Test fun testConnect() { diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LeakTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LeakTest.kt index 3d5eb70cfa..9a2ec22fef 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LeakTest.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LeakTest.kt @@ -1,5 +1,6 @@ package net.mullvad.mullvadvpn.test.e2e +import androidx.test.platform.app.InstrumentationRegistry import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.delay import kotlinx.coroutines.test.runTest @@ -17,6 +18,8 @@ import net.mullvad.mullvadvpn.test.common.page.enableShadowsocksStory import net.mullvad.mullvadvpn.test.common.page.on import net.mullvad.mullvadvpn.test.common.rule.ForgetAllVpnAppsInSettingsTestRule import net.mullvad.mullvadvpn.test.e2e.annotations.HasDependencyOnLocalAPI +import net.mullvad.mullvadvpn.test.e2e.constant.getTrafficGeneratorHost +import net.mullvad.mullvadvpn.test.e2e.constant.getTrafficGeneratorPort import net.mullvad.mullvadvpn.test.e2e.misc.AccountTestRule import net.mullvad.mullvadvpn.test.e2e.misc.NetworkTrafficChecker import net.mullvad.mullvadvpn.test.e2e.misc.NoTrafficToHostRule @@ -83,8 +86,8 @@ class LeakTest : EndToEndTest() { on<ConnectPage> { waitForConnectedLabel() } // Capture generated traffic to a specific host - val targetIpAddress = BuildConfig.TRAFFIC_GENERATION_IP_ADDRESS - val targetPort = 80 + val targetIpAddress = InstrumentationRegistry.getArguments().getTrafficGeneratorHost() + val targetPort = InstrumentationRegistry.getArguments().getTrafficGeneratorPort() val captureResult = PacketCapture().capturePackets { TrafficGenerator(targetIpAddress, targetPort).generateTraffic(10.milliseconds) { @@ -131,8 +134,8 @@ class LeakTest : EndToEndTest() { on<ConnectPage> { waitForConnectedLabel() } // Capture generated traffic to a specific host - val targetIpAddress = BuildConfig.TRAFFIC_GENERATION_IP_ADDRESS - val targetPort = 80 + val targetIpAddress = InstrumentationRegistry.getArguments().getTrafficGeneratorHost() + val targetPort = InstrumentationRegistry.getArguments().getTrafficGeneratorPort() val captureResult: PacketCaptureResult = PacketCapture().capturePackets { TrafficGenerator(targetIpAddress, targetPort).generateTraffic(10.milliseconds) { @@ -188,8 +191,8 @@ class LeakTest : EndToEndTest() { on<ConnectPage> { waitForConnectedLabel() } // Capture generated traffic to a specific host - val targetIpAddress = BuildConfig.TRAFFIC_GENERATION_IP_ADDRESS - val targetPort = 80 + val targetIpAddress = InstrumentationRegistry.getArguments().getTrafficGeneratorHost() + val targetPort = InstrumentationRegistry.getArguments().getTrafficGeneratorPort() val captureResult: PacketCaptureResult = PacketCapture().capturePackets { TrafficGenerator(targetIpAddress, targetPort).generateTraffic(10.milliseconds) { diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/annotations/HasDependencyOnLocalAPI.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/annotations/HasDependencyOnLocalAPI.kt index 12987df9e0..94b0bfa3f6 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/annotations/HasDependencyOnLocalAPI.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/annotations/HasDependencyOnLocalAPI.kt @@ -1,7 +1,7 @@ package net.mullvad.mullvadvpn.test.e2e.annotations import androidx.test.platform.app.InstrumentationRegistry -import net.mullvad.mullvadvpn.test.e2e.extension.getRequiredArgument +import net.mullvad.mullvadvpn.test.e2e.constant.isRaasEnabled import org.junit.jupiter.api.extension.ConditionEvaluationResult import org.junit.jupiter.api.extension.ExecutionCondition import org.junit.jupiter.api.extension.ExtendWith @@ -19,10 +19,7 @@ annotation class HasDependencyOnLocalAPI { context: ExtensionContext? ): ConditionEvaluationResult { - val enable = - InstrumentationRegistry.getArguments() - .getRequiredArgument("enable_access_to_local_api_tests") - .toBoolean() + val enable = InstrumentationRegistry.getArguments().isRaasEnabled() return if (enable) { ConditionEvaluationResult.enabled( diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/annotations/HighlyRateLimited.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/annotations/HighlyRateLimited.kt index 12280fcaf1..09124ca5a5 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/annotations/HighlyRateLimited.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/annotations/HighlyRateLimited.kt @@ -1,8 +1,7 @@ package net.mullvad.mullvadvpn.test.e2e.annotations import androidx.test.platform.app.InstrumentationRegistry -import net.mullvad.mullvadvpn.test.e2e.constant.ENABLE_HIGHLY_RATE_LIMITED_TESTS -import net.mullvad.mullvadvpn.test.e2e.extension.getRequiredArgument +import net.mullvad.mullvadvpn.test.e2e.constant.isHighlyRateLimitedTestsEnabled import org.junit.jupiter.api.extension.ConditionEvaluationResult import org.junit.jupiter.api.extension.ExecutionCondition import org.junit.jupiter.api.extension.ExtendWith @@ -19,10 +18,7 @@ annotation class HighlyRateLimited { override fun evaluateExecutionCondition( context: ExtensionContext? ): ConditionEvaluationResult { - val enable = - InstrumentationRegistry.getArguments() - .getRequiredArgument(ENABLE_HIGHLY_RATE_LIMITED_TESTS) - .toBoolean() + val enable = InstrumentationRegistry.getArguments().isHighlyRateLimitedTestsEnabled() return if (enable) { ConditionEvaluationResult.enabled("Running test highly affected by rate limiting.") diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/mullvad/MullvadApi.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/mullvad/MullvadApi.kt index d24a6d3c92..099808fcdb 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/mullvad/MullvadApi.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/mullvad/MullvadApi.kt @@ -84,8 +84,8 @@ class MullvadApi { companion object { private const val BASE_URL = "api.${BuildConfig.INFRASTRUCTURE_BASE_DOMAIN}" - private const val AUTH_PATH = "auth/${BuildConfig.API_VERSION}/token" - private const val DEVICES_PATH = "accounts/${BuildConfig.API_VERSION}/devices" + private const val AUTH_PATH = "auth/v1/token" + private const val DEVICES_PATH = "accounts/v1/devices" } } diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/partner/PartnerApi.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/partner/PartnerApi.kt index 647bb49b20..e6465f0b23 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/partner/PartnerApi.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/partner/PartnerApi.kt @@ -64,7 +64,7 @@ class PartnerApi(base64AuthCredentials: String) { companion object { private const val BASE_URL = "partner.${BuildConfig.INFRASTRUCTURE_BASE_DOMAIN}" - private const val ACCOUNT_PATH = "${BuildConfig.API_VERSION}/accounts" + private const val ACCOUNT_PATH = "v1/accounts" } } diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/partner/PartnerApiTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/partner/PartnerApiTest.kt index d6f91bb749..e2d723da22 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/partner/PartnerApiTest.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/partner/PartnerApiTest.kt @@ -2,7 +2,7 @@ package net.mullvad.mullvadvpn.test.e2e.api.partner import androidx.test.platform.app.InstrumentationRegistry import kotlinx.coroutines.test.runTest -import net.mullvad.mullvadvpn.test.e2e.constant.PARTNER_AUTH +import net.mullvad.mullvadvpn.test.e2e.constant.getPartnerAuth import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test @@ -10,8 +10,7 @@ import org.junit.jupiter.api.assertDoesNotThrow @Disabled("Only used developing the PartnerApi") class PartnerApiTest { - private val partnerApi = - PartnerApi(InstrumentationRegistry.getArguments().getString(PARTNER_AUTH, null)) + private val partnerApi = PartnerApi(InstrumentationRegistry.getArguments().getPartnerAuth()!!) @Test fun testCreateAccount() = runTest { diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/relay/RelayApi.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/relay/RelayApi.kt index 2b2017f210..767851bc1c 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/relay/RelayApi.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/relay/RelayApi.kt @@ -50,6 +50,6 @@ class RelayApi { companion object { private const val BASE_URL = "api.${BuildConfig.INFRASTRUCTURE_BASE_DOMAIN}" - private const val RELAY_PATH = "app/${BuildConfig.API_VERSION}/relays" + private const val RELAY_PATH = "app/v1/relays" } } diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/Constants.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/Constants.kt index 0c221f8ddf..8bcb5c2997 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/Constants.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/Constants.kt @@ -1,9 +1,46 @@ package net.mullvad.mullvadvpn.test.e2e.constant +import android.os.Bundle +import androidx.test.platform.app.InstrumentationRegistry +import net.mullvad.mullvadvpn.test.e2e.BuildConfig +import net.mullvad.mullvadvpn.test.e2e.extension.getRequiredArgument + const val LOG_TAG = "mullvad-e2e" -const val PARTNER_AUTH = "partner_auth" -const val VALID_TEST_ACCOUNT_NUMBER_ARGUMENT_KEY = "valid_test_account_number" -const val INVALID_TEST_ACCOUNT_NUMBER_ARGUMENT_KEY = "invalid_test_account_number" -const val ENABLE_ACCESS_TO_LOCAL_API_TESTS = "enable_access_to_local_api_tests" -const val ENABLE_HIGHLY_RATE_LIMITED_TESTS = "enable_highly_rate_limited_tests" +fun Bundle.getPartnerAuth() = + InstrumentationRegistry.getArguments() + .getString("mullvad.test.e2e.${BuildConfig.FLAVOR_infrastructure}.partnerAuth") + +fun Bundle.getValidAccountNumber() = + InstrumentationRegistry.getArguments() + .getRequiredArgument( + "mullvad.test.e2e.${BuildConfig.FLAVOR_infrastructure}.accountNumber.valid" + ) + +fun Bundle.getInvalidAccountNumber() = + InstrumentationRegistry.getArguments() + .getRequiredArgument( + "mullvad.test.e2e.${BuildConfig.FLAVOR_infrastructure}.accountNumber.invalid" + ) + +fun Bundle.isRaasEnabled(): Boolean = + InstrumentationRegistry.getArguments() + .getRequiredArgument("mullvad.test.e2e.config.raas.enable") + .toBoolean() + +fun Bundle.isHighlyRateLimitedTestsEnabled(): Boolean = + InstrumentationRegistry.getArguments() + .getRequiredArgument("mullvad.test.e2e.config.runHighlyRateLimitedTests") + .toBoolean() + +fun Bundle.getRaasHost() = + InstrumentationRegistry.getArguments().getRequiredArgument("mullvad.test.e2e.config.raas.host") + +fun Bundle.getTrafficGeneratorHost(): String = + InstrumentationRegistry.getArguments() + .getRequiredArgument("mullvad.test.e2e.config.raas.trafficGenerator.target.host") + +fun Bundle.getTrafficGeneratorPort(): Int = + InstrumentationRegistry.getArguments() + .getRequiredArgument("mullvad.test.e2e.config.raas.trafficGenerator.target.port") + .toInt() diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/AccountProvider.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/AccountProvider.kt index 61fc023ade..799f33be64 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/AccountProvider.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/AccountProvider.kt @@ -4,15 +4,13 @@ import androidx.test.platform.app.InstrumentationRegistry import net.mullvad.mullvadvpn.test.e2e.api.mullvad.MullvadApi import net.mullvad.mullvadvpn.test.e2e.api.mullvad.removeAllDevices import net.mullvad.mullvadvpn.test.e2e.api.partner.PartnerApi -import net.mullvad.mullvadvpn.test.e2e.constant.INVALID_TEST_ACCOUNT_NUMBER_ARGUMENT_KEY -import net.mullvad.mullvadvpn.test.e2e.constant.PARTNER_AUTH -import net.mullvad.mullvadvpn.test.e2e.constant.VALID_TEST_ACCOUNT_NUMBER_ARGUMENT_KEY -import net.mullvad.mullvadvpn.test.e2e.extension.getRequiredArgument +import net.mullvad.mullvadvpn.test.e2e.constant.getInvalidAccountNumber +import net.mullvad.mullvadvpn.test.e2e.constant.getPartnerAuth +import net.mullvad.mullvadvpn.test.e2e.constant.getValidAccountNumber object AccountProvider { private val mullvadClient = MullvadApi() - private val partnerAuth: String? = - InstrumentationRegistry.getArguments().getString(PARTNER_AUTH, null) + private val partnerAuth: String? = InstrumentationRegistry.getArguments().getPartnerAuth() private val partnerClient: PartnerApi by lazy { PartnerApi(partnerAuth!!) } suspend fun getValidAccountNumber() = @@ -23,14 +21,10 @@ object AccountProvider { partnerClient.addTime(accountNumber = accountNumber, daysToAdd = 1) accountNumber } else { - val validAccountNumber = - InstrumentationRegistry.getArguments() - .getRequiredArgument(VALID_TEST_ACCOUNT_NUMBER_ARGUMENT_KEY) + val validAccountNumber = InstrumentationRegistry.getArguments().getValidAccountNumber() mullvadClient.removeAllDevices(validAccountNumber) validAccountNumber } - fun getInvalidAccountNumber() = - InstrumentationRegistry.getArguments() - .getRequiredArgument(INVALID_TEST_ACCOUNT_NUMBER_ARGUMENT_KEY) + fun getInvalidAccountNumber() = InstrumentationRegistry.getArguments().getInvalidAccountNumber() } 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 3cf1f602b4..ae59231788 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 @@ -5,8 +5,7 @@ import co.touchlab.kermit.Logger import kotlinx.coroutines.runBlocking import net.mullvad.mullvadvpn.test.e2e.api.mullvad.MullvadApi import net.mullvad.mullvadvpn.test.e2e.api.mullvad.removeAllDevices -import net.mullvad.mullvadvpn.test.e2e.constant.VALID_TEST_ACCOUNT_NUMBER_ARGUMENT_KEY -import net.mullvad.mullvadvpn.test.e2e.extension.getRequiredArgument +import net.mullvad.mullvadvpn.test.e2e.constant.getValidAccountNumber import org.junit.jupiter.api.extension.BeforeEachCallback import org.junit.jupiter.api.extension.ExtensionContext @@ -15,9 +14,7 @@ class CleanupAccountTestRule : BeforeEachCallback { override fun beforeEach(context: ExtensionContext) { Logger.d("Cleaning up account before test: ${context.requiredTestMethod.name}") - val validTestAccountNumber = - InstrumentationRegistry.getArguments() - .getRequiredArgument(VALID_TEST_ACCOUNT_NUMBER_ARGUMENT_KEY) + val validTestAccountNumber = InstrumentationRegistry.getArguments().getValidAccountNumber() runBlocking { mullvadApi.removeAllDevices(validTestAccountNumber) } } } diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/router/firewall/FirewallClient.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/router/firewall/FirewallClient.kt index 3d6264047b..3f6a212497 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/router/firewall/FirewallClient.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/router/firewall/FirewallClient.kt @@ -1,5 +1,6 @@ package net.mullvad.mullvadvpn.test.e2e.router.firewall +import androidx.test.platform.app.InstrumentationRegistry import co.touchlab.kermit.Logger import io.ktor.client.HttpClient import io.ktor.client.engine.cio.CIO @@ -13,7 +14,7 @@ import io.ktor.http.URLProtocol import io.ktor.http.contentType import io.ktor.serialization.kotlinx.json.json import kotlinx.serialization.json.Json -import net.mullvad.mullvadvpn.test.e2e.BuildConfig +import net.mullvad.mullvadvpn.test.e2e.constant.getRaasHost class FirewallClient(private val httpClient: HttpClient = defaultHttpClient()) { suspend fun createRule(rule: DropRule) { @@ -40,7 +41,7 @@ private fun defaultHttpClient(): HttpClient = defaultRequest { url { protocol = URLProtocol.HTTP - host = BuildConfig.TEST_ROUTER_API_HOST + host = InstrumentationRegistry.getArguments().getRaasHost() } } diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/router/packetCapture/PacketCapture.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/router/packetCapture/PacketCapture.kt index e192eacc4a..055d1620d0 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/router/packetCapture/PacketCapture.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/router/packetCapture/PacketCapture.kt @@ -1,5 +1,6 @@ package net.mullvad.mullvadvpn.test.e2e.router.packetCapture +import androidx.test.platform.app.InstrumentationRegistry import co.touchlab.kermit.Logger import io.ktor.client.HttpClient import io.ktor.client.call.body @@ -20,7 +21,7 @@ import java.util.UUID import kotlinx.serialization.Serializable import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json -import net.mullvad.mullvadvpn.test.e2e.BuildConfig +import net.mullvad.mullvadvpn.test.e2e.constant.getRaasHost import net.mullvad.mullvadvpn.test.e2e.misc.Networking import net.mullvad.mullvadvpn.test.e2e.serializer.PacketCaptureSessionSerializer import org.junit.jupiter.api.fail @@ -60,7 +61,7 @@ class PacketCapture { private fun defaultHttpClient(): HttpClient = HttpClient(CIO) { - defaultRequest { url("http://${BuildConfig.TEST_ROUTER_API_HOST}") } + defaultRequest { url("http://${InstrumentationRegistry.getArguments().getRaasHost()}") } engine { requestTimeout = REQUEST_TIMEOUT_MS } install(ContentNegotiation) { |
