Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

refactor: Move apk parsers to dedicated module #1950

Merged
merged 1 commit into from
May 20, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions corellium/adapter/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,7 @@ tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "1.8" }
dependencies {
implementation(project(":corellium:api"))
implementation(project(":corellium:client"))

implementation(Dependencies.KOTLIN_COROUTINES_CORE)
implementation(Dependencies.DEX_TEST_PARSER)
implementation(Dependencies.APK_PARSER)

testImplementation(Dependencies.JUNIT)
}

tasks.test {
maxHeapSize = "3072m"
minHeapSize = "512m"
dependsOn(":resolveArtifacts")
}
6 changes: 0 additions & 6 deletions corellium/adapter/src/main/kotlin/flank/corellium/Api.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ package flank.corellium
import flank.corellium.adapter.executeAndroidTestPlan
import flank.corellium.adapter.installAndroidApps
import flank.corellium.adapter.invokeAndroidDevices
import flank.corellium.adapter.parseApkInfo
import flank.corellium.adapter.parseApkPackageName
import flank.corellium.adapter.parseApkTestCases
import flank.corellium.adapter.requestAuthorization
import flank.corellium.api.CorelliumApi

Expand All @@ -20,7 +17,4 @@ fun corelliumApi(
projectName = projectName
),
executeTest = executeAndroidTestPlan,
parseTestCases = parseApkTestCases,
parseTestApkInfo = parseApkInfo,
parsePackageName = parseApkPackageName
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,4 @@ class CorelliumApi(
val invokeAndroidDevices: AndroidInstance.Invoke,
val installAndroidApps: AndroidApps.Install,
val executeTest: AndroidTestPlan.Execute,
val parseTestCases: Apk.ParseTestCases,
val parsePackageName: Apk.ParsePackageName,
val parseTestApkInfo: Apk.ParseInfo,
)
27 changes: 27 additions & 0 deletions corellium/apk/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
kotlin(Plugins.Kotlin.PLUGIN_JVM)
}

repositories {
jcenter()
mavenCentral()
maven(url = "https://kotlin.bintray.com/kotlinx")
}

tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "1.8" }

dependencies {
implementation(Dependencies.KOTLIN_COROUTINES_CORE)
implementation(Dependencies.DEX_TEST_PARSER)
implementation(Dependencies.APK_PARSER)

testImplementation(Dependencies.JUNIT)
}

tasks.test {
maxHeapSize = "3072m"
minHeapSize = "512m"
dependsOn(":resolveArtifacts")
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
package flank.corellium.api
package flank.apk

import flank.apk.internal.parseApkInfo
import flank.apk.internal.parseApkPackageName
import flank.apk.internal.parseApkTestCases

/**
* Structured representation of the parsed test apk file.
*/
object Apk {

class Api(
val parseTestCases: ParseTestCases = parseApkTestCases,
val parsePackageName: ParsePackageName = parseApkPackageName,
val parseInfo: ParseInfo = parseApkInfo
)

data class Info(
val packageName: String,
val testRunner: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
package flank.corellium.adapter
package flank.apk.internal

import com.linkedin.dex.parser.DexParser
import com.linkedin.dex.parser.TestMethod
import flank.corellium.api.Apk
import flank.apk.Apk
import net.dongliu.apk.parser.ApkFile
import org.xml.sax.InputSource
import java.io.StringReader
import javax.xml.parsers.DocumentBuilderFactory

val parseApkTestCases = Apk.ParseTestCases { path ->
internal val parseApkTestCases = Apk.ParseTestCases { path ->
DexParser.findTestMethods(path)
.map(TestMethod::testName)
}

val parseApkPackageName = Apk.ParsePackageName { path ->
internal val parseApkPackageName = Apk.ParsePackageName { path ->
ApkFile(path).apkMeta.packageName
}

val parseApkInfo = Apk.ParseInfo { path ->
internal val parseApkInfo = Apk.ParseInfo { path ->
Apk.Info(
packageName = ApkFile(path).apkMeta.packageName,
testRunner = DocumentBuilderFactory.newInstance()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package flank.corellium.adapter
package flank.apk

import flank.corellium.api.Apk
import org.junit.Assert.assertEquals
import org.junit.Test

private const val TEST_APK_PATH = "../../test_artifacts/master/apk/app-single-success-debug-androidTest.apk"

class ParseApkTest {

private val apk = Apk.Api()

@Test
fun parseTestCases() {
assertEquals(
Expand All @@ -16,15 +17,15 @@ class ParseApkTest {
"com.example.test_app.InstrumentedTest#ignoredTestWithSuppress",
"com.example.test_app.InstrumentedTest#test",
),
parseApkTestCases(TEST_APK_PATH)
apk.parseTestCases(TEST_APK_PATH)
)
}

@Test
fun parsePackageName() {
assertEquals(
"com.example.test_app.test",
parseApkPackageName(TEST_APK_PATH)
apk.parsePackageName(TEST_APK_PATH)
)
}

Expand All @@ -35,7 +36,7 @@ class ParseApkTest {
packageName = "com.example.test_app.test",
testRunner = "androidx.test.runner.AndroidJUnitRunner"
),
parseApkInfo(TEST_APK_PATH)
apk.parseInfo(TEST_APK_PATH)
)
}
}
1 change: 1 addition & 0 deletions corellium/cli/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ dependencies {
implementation(project(":corellium:api"))
implementation(project(":corellium:domain"))
implementation(project(":corellium:adapter"))
implementation(project(":corellium:apk"))
implementation(Dependencies.JACKSON_KOTLIN)
implementation(Dependencies.JACKSON_YAML)
implementation(Dependencies.JACKSON_XML)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package flank.corellium.cli
import com.fasterxml.jackson.annotation.JsonIgnore
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonProperty
import flank.apk.Apk
import flank.corellium.cli.RunTestCorelliumAndroidCommand.Config
import flank.corellium.cli.util.ConfigMap
import flank.corellium.cli.util.emptyConfigMap
Expand Down Expand Up @@ -104,6 +105,8 @@ class RunTestCorelliumAndroidCommand :

override val api by lazy { corelliumApi(config.project!!) }

override val apk = Apk.Api()

override val args by lazy { createArgs() }

override fun run() = invoke()
Expand Down
1 change: 1 addition & 0 deletions corellium/domain/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "1.8" }
dependencies {
implementation(Dependencies.KOTLIN_COROUTINES_CORE)
implementation(project(":corellium:api"))
implementation(project(":corellium:apk"))
implementation(project(":corellium:shard:calculate"))
implementation(project(":corellium:shard:obfuscate"))
implementation(project(":corellium:shard:dump"))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package flank.corellium.domain

import flank.apk.Apk
import flank.corellium.api.Authorization
import flank.corellium.api.CorelliumApi
import flank.corellium.domain.RunTestCorelliumAndroid.Context
Expand Down Expand Up @@ -33,6 +34,7 @@ object RunTestCorelliumAndroid {
*/
interface Context {
val api: CorelliumApi
val apk: Apk.Api
val args: Args
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ internal fun RunTestCorelliumAndroid.Context.parseApksInfo() = RunTestCorelliumA
val packageNames = mutableMapOf<String, String>()
val testRunners = mutableMapOf<String, String>()
args.apks.map { app ->
packageNames[app.path] = api.parsePackageName(app.path)
packageNames[app.path] = apk.parsePackageName(app.path)

app.tests.map { test ->
val info = api.parseTestApkInfo(test.path)
val info = apk.parseInfo(test.path)
packageNames[test.path] = info.packageName
testRunners[test.path] = info.testRunner
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ internal fun RunTestCorelliumAndroid.Context.parseTestCasesFromApks() = RunTestC
// Get the list of paths to test apks
.flatMap { app -> app.tests.map { test -> test.path } }
// Associate parsed test methods to each apk path
.associateWith(api.parseTestCases)
.associateWith(apk.parseTestCases)
)
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package flank.corellium.domain

import flank.apk.Apk
import flank.corellium.corelliumApi

object RunTestAndroidCorelliumExample : RunTestCorelliumAndroid.Context {
override val api = corelliumApi("Default Project")
override val apk = Apk.Api()
override val args = RunTestCorelliumAndroid.Args(
credentials = loadedCredentials,
apks = fewTestArtifactsApks(APK_PATH_MAIN),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package flank.corellium.domain

import flank.corellium.api.Apk
import flank.apk.Apk
import flank.corellium.api.CorelliumApi
import flank.corellium.domain.RunTestCorelliumAndroid.Args
import kotlinx.coroutines.flow.asFlow
Expand Down Expand Up @@ -48,12 +48,6 @@ class RunTestAndroidCorelliumTestMockApiAndroid : RunTestCorelliumAndroid.Contex
assertEquals(args.credentials, credentials)
completeJob
},
parseTestCases = { path ->
println(path)
(1..path.last().toString().toInt()).map {
path.replace("/", ".") + ".Test#test$it"
}
},
invokeAndroidDevices = { (amount) ->
assertEquals(expectedShardsCount, amount)
(1..amount).asFlow().map(Int::toString)
Expand All @@ -63,22 +57,31 @@ class RunTestAndroidCorelliumTestMockApiAndroid : RunTestCorelliumAndroid.Contex
assertEquals(expectedShardsCount, list.size)
completeJob
},
executeTest = { (instances) ->
println(instances)
assertEquals(expectedShardsCount, instances.size)
emptyList()
},
)

override val apk = Apk.Api(
parseTestCases = { path ->
println(path)
(1..path.last().toString().toInt()).map {
path.replace("/", ".") + ".Test#test$it"
}
},
parsePackageName = { path ->
println(path)
path
},
parseTestApkInfo = { path ->
parseInfo = { path ->
println(path)
Apk.Info(
packageName = path,
testRunner = path
)
},
executeTest = { (instances) ->
println(instances)
assertEquals(expectedShardsCount, instances.size)
emptyList()
},
)

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package flank.corellium.domain

import flank.corellium.adapter.parseApkInfo
import flank.corellium.adapter.parseApkPackageName
import flank.corellium.adapter.parseApkTestCases
import flank.apk.Apk
import flank.corellium.api.CorelliumApi
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.map
Expand All @@ -25,9 +23,6 @@ class RunTestAndroidCorelliumTestParsingAndroid : RunTestCorelliumAndroid.Contex
}

override val api = CorelliumApi(
parseTestCases = parseApkTestCases,
parsePackageName = parseApkPackageName,
parseTestApkInfo = parseApkInfo,
authorize = { credentials ->
println(credentials)
assertEquals(args.credentials, credentials)
Expand Down Expand Up @@ -60,6 +55,8 @@ class RunTestAndroidCorelliumTestParsingAndroid : RunTestCorelliumAndroid.Contex
},
)

override val apk = Apk.Api()

@Test
fun test(): Unit = invoke()

Expand Down
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ include(
":corellium:client",
":corellium:log",
":corellium:api",
":corellium:apk",
":corellium:shard",
":corellium:shard:calculate",
":corellium:shard:obfuscate",
Expand Down