mirror of
https://gitee.com/zhangsken/AndroidIDE.git
synced 2026-11-14 07:42:05 +08:00
tests: shutdown Gradle daemons for each tooling API test
This commit is contained in:
+112
-110
@@ -44,148 +44,150 @@ class ModuleProjectTest {
|
||||
|
||||
@Test
|
||||
fun test() {
|
||||
val (_, project, result) = ToolingApiTestLauncher().launchServer()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
ToolingApiTestLauncher.launchServer() {
|
||||
|
||||
Lookup.getDefault().register(BuildService.KEY_PROJECT_PROXY, project)
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
|
||||
verifyProjectManagerAPIs()
|
||||
Lookup.getDefault().register(BuildService.KEY_PROJECT_PROXY, project)
|
||||
|
||||
assertThat(project).isNotNull()
|
||||
verifyProjectManagerAPIs()
|
||||
|
||||
val rootProject = IProjectManager.getInstance().rootProject
|
||||
assertThat(rootProject).isNotNull()
|
||||
assertThat(project).isNotNull()
|
||||
|
||||
val root = rootProject!!.rootProject
|
||||
assertThat(root).isNotNull()
|
||||
assertThat(root.name).isEqualTo("TestApp")
|
||||
val rootProject = IProjectManager.getInstance().rootProject
|
||||
assertThat(rootProject).isNotNull()
|
||||
|
||||
val rootDir = root.projectDir
|
||||
assertThat(rootDir).isNotNull()
|
||||
assertThat(Files.isSameFile(rootDir.toPath(), FileProvider.testProjectRoot())).isTrue()
|
||||
val root = rootProject!!.rootProject
|
||||
assertThat(root).isNotNull()
|
||||
assertThat(root.name).isEqualTo("TestApp")
|
||||
|
||||
val app = rootProject.findByPath(":app")
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(AndroidModule::class.java)
|
||||
val rootDir = root.projectDir
|
||||
assertThat(rootDir).isNotNull()
|
||||
assertThat(Files.isSameFile(rootDir.toPath(), FileProvider.testProjectRoot())).isTrue()
|
||||
|
||||
val appSourceDirs = (app as AndroidModule).getSourceDirectories()
|
||||
assertThat(appSourceDirs).isNotEmpty()
|
||||
assertThat(appSourceDirs)
|
||||
.containsAtLeast(File(rootDir, "app/src/main/java"), File(rootDir, "app/src/main/kotlin"))
|
||||
assertThat(appSourceDirs).doesNotContain(File(rootDir, "other-java-library/src/main/java"))
|
||||
assertThat(app.compilerSettings.javaSourceVersion).isEqualTo("11")
|
||||
assertThat(app.compilerSettings.javaBytecodeVersion).isEqualTo("11")
|
||||
assertThat(app.compilerSettings.javaSourceVersion)
|
||||
.isEqualTo(app.compilerSettings.sourceCompatibility)
|
||||
assertThat(app.compilerSettings.javaBytecodeVersion)
|
||||
.isEqualTo(app.compilerSettings.targetCompatibility)
|
||||
val app = rootProject.findByPath(":app")
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(AndroidModule::class.java)
|
||||
|
||||
val anotherAndroidLib = rootProject.findByPath(":another-android-library")
|
||||
assertThat(anotherAndroidLib).isNotNull()
|
||||
assertThat(anotherAndroidLib).isInstanceOf(AndroidModule::class.java)
|
||||
val appSourceDirs = (app as AndroidModule).getSourceDirectories()
|
||||
assertThat(appSourceDirs).isNotEmpty()
|
||||
assertThat(appSourceDirs)
|
||||
.containsAtLeast(File(rootDir, "app/src/main/java"), File(rootDir, "app/src/main/kotlin"))
|
||||
assertThat(appSourceDirs).doesNotContain(File(rootDir, "other-java-library/src/main/java"))
|
||||
assertThat(app.compilerSettings.javaSourceVersion).isEqualTo("11")
|
||||
assertThat(app.compilerSettings.javaBytecodeVersion).isEqualTo("11")
|
||||
assertThat(app.compilerSettings.javaSourceVersion)
|
||||
.isEqualTo(app.compilerSettings.sourceCompatibility)
|
||||
assertThat(app.compilerSettings.javaBytecodeVersion)
|
||||
.isEqualTo(app.compilerSettings.targetCompatibility)
|
||||
|
||||
val anotherAndroidLibDir = anotherAndroidLib!!.projectDir
|
||||
val anotherAndroidLib = rootProject.findByPath(":another-android-library")
|
||||
assertThat(anotherAndroidLib).isNotNull()
|
||||
assertThat(anotherAndroidLib).isInstanceOf(AndroidModule::class.java)
|
||||
|
||||
val androidLibSourceDirs = (anotherAndroidLib as AndroidModule).getSourceDirectories()
|
||||
assertThat(androidLibSourceDirs).isNotEmpty()
|
||||
assertThat(androidLibSourceDirs)
|
||||
.contains(File(rootDir, "another-android-library/src/main/java"))
|
||||
val anotherAndroidLibDir = anotherAndroidLib!!.projectDir
|
||||
|
||||
assertThat(anotherAndroidLib.getCompileClasspaths())
|
||||
.containsAtLeast(
|
||||
File(
|
||||
anotherAndroidLibDir,
|
||||
"build/${IAndroidProject.FD_INTERMEDIATES}/compile_library_classes_jar/debug/classes.jar"
|
||||
),
|
||||
File(
|
||||
anotherAndroidLibDir,
|
||||
"build/${IAndroidProject.FD_INTERMEDIATES}/compile_r_class_jar/debug/R.jar"
|
||||
)
|
||||
)
|
||||
assertThat(
|
||||
anotherAndroidLib.getCompileClasspaths().firstOrNull {
|
||||
it.name == "nb-javac-android-17.0.0.0.jar"
|
||||
}
|
||||
)
|
||||
.isNotNull()
|
||||
val androidLibSourceDirs = (anotherAndroidLib as AndroidModule).getSourceDirectories()
|
||||
assertThat(androidLibSourceDirs).isNotEmpty()
|
||||
assertThat(androidLibSourceDirs)
|
||||
.contains(File(rootDir, "another-android-library/src/main/java"))
|
||||
|
||||
assertThat(anotherAndroidLib.getCompileSourceDirectories())
|
||||
.containsAtLeast(
|
||||
File(anotherAndroidLibDir, "src/main/java"),
|
||||
File(anotherAndroidLibDir, "src/main/kotlin"),
|
||||
File(rootDir, "other-java-library/src/main/java")
|
||||
)
|
||||
|
||||
assertThat(anotherAndroidLib.compilerSettings.javaSourceVersion).isEqualTo("11")
|
||||
assertThat(anotherAndroidLib.compilerSettings.javaBytecodeVersion).isEqualTo("11")
|
||||
|
||||
val appCompileSourceDirs = app.getCompileSourceDirectories()
|
||||
assertThat(appCompileSourceDirs).isNotEmpty()
|
||||
assertThat(appCompileSourceDirs)
|
||||
.containsAtLeast(
|
||||
File(rootDir, "app/src/main/java"),
|
||||
File(rootDir, "app/src/main/kotlin"),
|
||||
File(anotherAndroidLibDir, "src/main/java")
|
||||
)
|
||||
|
||||
app.getCompileClasspaths().apply {
|
||||
assertThat(this).isNotEmpty()
|
||||
assertThat(this)
|
||||
assertThat(anotherAndroidLib.getCompileClasspaths())
|
||||
.containsAtLeast(
|
||||
File(
|
||||
anotherAndroidLibDir,
|
||||
"build/${IAndroidProject.FD_INTERMEDIATES}/compile_library_classes_jar/debug/classes.jar"
|
||||
),
|
||||
File(
|
||||
app.projectDir,
|
||||
"build/${IAndroidProject.FD_INTERMEDIATES}/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar"
|
||||
),
|
||||
File(
|
||||
anotherAndroidLibDir,
|
||||
"build/${IAndroidProject.FD_INTERMEDIATES}/compile_r_class_jar/debug/R.jar"
|
||||
)
|
||||
)
|
||||
assertThat(
|
||||
filter {
|
||||
it.absolutePath.endsWith("appcompat-1.5.1/jars/classes.jar") ||
|
||||
it.absolutePath.endsWith("material-1.8.0-alpha01/jars/classes.jar") ||
|
||||
it.absolutePath.endsWith("coordinatorlayout-1.2.0/jars/classes.jar")
|
||||
anotherAndroidLib.getCompileClasspaths().firstOrNull {
|
||||
it.name == "nb-javac-android-17.0.0.0.jar"
|
||||
}
|
||||
)
|
||||
.hasSize(3)
|
||||
}
|
||||
.isNotNull()
|
||||
|
||||
val javaLibrary = rootProject.findByPath(":java-library")
|
||||
assertThat(javaLibrary).isNotNull()
|
||||
assertThat(javaLibrary).isInstanceOf(JavaModule::class.java)
|
||||
assertThat(anotherAndroidLib.getCompileSourceDirectories())
|
||||
.containsAtLeast(
|
||||
File(anotherAndroidLibDir, "src/main/java"),
|
||||
File(anotherAndroidLibDir, "src/main/kotlin"),
|
||||
File(rootDir, "other-java-library/src/main/java")
|
||||
)
|
||||
|
||||
val javaLibSourceDirs = (javaLibrary as JavaModule).getSourceDirectories()
|
||||
assertThat(javaLibSourceDirs).isNotEmpty()
|
||||
assertThat(javaLibSourceDirs).contains(File(rootDir, "java-library/src/main/java"))
|
||||
assertThat(anotherAndroidLib.compilerSettings.javaSourceVersion).isEqualTo("11")
|
||||
assertThat(anotherAndroidLib.compilerSettings.javaBytecodeVersion).isEqualTo("11")
|
||||
|
||||
app.indexSourcesAndClasspaths()
|
||||
val appCompileSourceDirs = app.getCompileSourceDirectories()
|
||||
assertThat(appCompileSourceDirs).isNotEmpty()
|
||||
assertThat(appCompileSourceDirs)
|
||||
.containsAtLeast(
|
||||
File(rootDir, "app/src/main/java"),
|
||||
File(rootDir, "app/src/main/kotlin"),
|
||||
File(anotherAndroidLibDir, "src/main/java")
|
||||
)
|
||||
|
||||
val classes = app.compileJavaSourceClasses.findInPackage("com.itsaky")
|
||||
assertThat(classes).isNotNull()
|
||||
assertThat(classes).isNotEmpty()
|
||||
|
||||
for (klass in arrayOf(
|
||||
"com.itsaky.androidide.tooling.test.Main",
|
||||
"com.itsaky.test.app.MainActivity")
|
||||
) {
|
||||
|
||||
classes.find { it.qualifiedName == klass }.let {
|
||||
assertThat(it).isNotNull()
|
||||
assertThat(it!!.isClass).isTrue()
|
||||
assertThat(it::class.java)
|
||||
app.getCompileClasspaths().apply {
|
||||
assertThat(this).isNotEmpty()
|
||||
assertThat(this)
|
||||
.containsAtLeast(
|
||||
File(
|
||||
anotherAndroidLibDir,
|
||||
"build/${IAndroidProject.FD_INTERMEDIATES}/compile_library_classes_jar/debug/classes.jar"
|
||||
),
|
||||
File(
|
||||
app.projectDir,
|
||||
"build/${IAndroidProject.FD_INTERMEDIATES}/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar"
|
||||
),
|
||||
File(
|
||||
anotherAndroidLibDir,
|
||||
"build/${IAndroidProject.FD_INTERMEDIATES}/compile_r_class_jar/debug/R.jar"
|
||||
)
|
||||
)
|
||||
assertThat(
|
||||
filter {
|
||||
it.absolutePath.endsWith("appcompat-1.5.1/jars/classes.jar") ||
|
||||
it.absolutePath.endsWith("material-1.8.0-alpha01/jars/classes.jar") ||
|
||||
it.absolutePath.endsWith("coordinatorlayout-1.2.0/jars/classes.jar")
|
||||
}
|
||||
)
|
||||
.hasSize(3)
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.findByPath(":another-java-library").run {
|
||||
assertThat(this).isInstanceOf(JavaModule::class.java)
|
||||
assertThat((this as JavaModule).compilerSettings).isNotNull()
|
||||
assertThat(compilerSettings.javaSourceVersion).isEqualTo("1.8")
|
||||
assertThat(compilerSettings.javaBytecodeVersion).isEqualTo("1.8")
|
||||
val javaLibrary = rootProject.findByPath(":java-library")
|
||||
assertThat(javaLibrary).isNotNull()
|
||||
assertThat(javaLibrary).isInstanceOf(JavaModule::class.java)
|
||||
|
||||
val javaLibSourceDirs = (javaLibrary as JavaModule).getSourceDirectories()
|
||||
assertThat(javaLibSourceDirs).isNotEmpty()
|
||||
assertThat(javaLibSourceDirs).contains(File(rootDir, "java-library/src/main/java"))
|
||||
|
||||
app.indexSourcesAndClasspaths()
|
||||
|
||||
val classes = app.compileJavaSourceClasses.findInPackage("com.itsaky")
|
||||
assertThat(classes).isNotNull()
|
||||
assertThat(classes).isNotEmpty()
|
||||
|
||||
for (klass in arrayOf(
|
||||
"com.itsaky.androidide.tooling.test.Main",
|
||||
"com.itsaky.test.app.MainActivity")
|
||||
) {
|
||||
|
||||
classes.find { it.qualifiedName == klass }.let {
|
||||
assertThat(it).isNotNull()
|
||||
assertThat(it!!.isClass).isTrue()
|
||||
assertThat(it::class.java)
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.findByPath(":another-java-library").run {
|
||||
assertThat(this).isInstanceOf(JavaModule::class.java)
|
||||
assertThat((this as JavaModule).compilerSettings).isNotNull()
|
||||
assertThat(compilerSettings.javaSourceVersion).isEqualTo("1.8")
|
||||
assertThat(compilerSettings.javaBytecodeVersion).isEqualTo("1.8")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -31,7 +31,7 @@ class ClassTrieTest {
|
||||
|
||||
@Test
|
||||
fun testAppend() {
|
||||
val trie = com.itsaky.androidide.utils.ClassTrie()
|
||||
val trie = ClassTrie()
|
||||
trie.append("java.lang.String")
|
||||
trie.append("java.lang.String.Inner")
|
||||
trie.append("java.lang.Object")
|
||||
@@ -48,7 +48,7 @@ class ClassTrieTest {
|
||||
|
||||
@Test
|
||||
fun testRemoval() {
|
||||
val trie = com.itsaky.androidide.utils.ClassTrie()
|
||||
val trie = ClassTrie()
|
||||
trie.append("java.lang.String")
|
||||
trie.append("java.lang.Object")
|
||||
trie.append("java.util.List")
|
||||
|
||||
+193
-182
@@ -34,35 +34,36 @@ class ApplicationIDComputationTest {
|
||||
@Test
|
||||
fun `test variant-specific application ID computation for default applicationId`() {
|
||||
// no custom applicationIdSuffix or applicationId is set
|
||||
val (_, project, initializeResult) = ToolingApiTestLauncher().launchServer()
|
||||
ToolingApiTestLauncher.launchServer {
|
||||
|
||||
assertThat(initializeResult).isNotNull()
|
||||
assertThat(initializeResult?.isSuccessful).isTrue()
|
||||
assertThat(initializeResult?.failure).isNull()
|
||||
assertThat(result).isNotNull()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
assertThat(result?.failure).isNull()
|
||||
|
||||
assertThat(project).isNotNull()
|
||||
assertThat(project).isNotNull()
|
||||
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
|
||||
|
||||
assertThat(variants).hasSize(2)
|
||||
assertThat(variants.map { it.name }).containsExactly("debug", "release")
|
||||
assertThat(variants).hasSize(2)
|
||||
assertThat(variants.map { it.name }).containsExactly("debug", "release")
|
||||
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
assertThat(applicationId).isEqualTo("com.itsaky.test.app")
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
assertThat(applicationId).isEqualTo("com.itsaky.test.app")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,36 +87,37 @@ class ApplicationIDComputationTest {
|
||||
|
||||
val client = ToolingApiTestLauncher.MultiVersionTestClient(
|
||||
androidBlockConfig = androidBlockConfig)
|
||||
val (_, project, initializeResult) = ToolingApiTestLauncher().launchServer(client = client)
|
||||
ToolingApiTestLauncher.launchServer(client = client) {
|
||||
|
||||
assertThat(initializeResult).isNotNull()
|
||||
assertThat(initializeResult?.isSuccessful).isTrue()
|
||||
assertThat(initializeResult?.failure).isNull()
|
||||
assertThat(result).isNotNull()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
assertThat(result?.failure).isNull()
|
||||
|
||||
assertThat(project).isNotNull()
|
||||
assertThat(project).isNotNull()
|
||||
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
|
||||
|
||||
assertThat(variants).hasSize(4)
|
||||
assertThat(variants.map { it.name }).containsExactly("fullDebug", "fullRelease", "demoDebug",
|
||||
assertThat(variants).hasSize(4)
|
||||
assertThat(variants.map { it.name }).containsExactly("fullDebug", "fullRelease", "demoDebug",
|
||||
"demoRelease")
|
||||
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
assertThat(applicationId).isAnyOf("com.itsaky.test.app.full", "com.itsaky.test.app.demo")
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
assertThat(applicationId).isAnyOf("com.itsaky.test.app.full", "com.itsaky.test.app.demo")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,39 +146,41 @@ class ApplicationIDComputationTest {
|
||||
|
||||
val client = ToolingApiTestLauncher.MultiVersionTestClient(
|
||||
androidBlockConfig = androidBlockConfig)
|
||||
val (_, project, initializeResult) = ToolingApiTestLauncher().launchServer(client = client)
|
||||
ToolingApiTestLauncher.launchServer(client = client) {
|
||||
|
||||
assertThat(initializeResult).isNotNull()
|
||||
assertThat(initializeResult?.isSuccessful).isTrue()
|
||||
assertThat(initializeResult?.failure).isNull()
|
||||
assertThat(result).isNotNull()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
assertThat(result?.failure).isNull()
|
||||
|
||||
assertThat(project).isNotNull()
|
||||
assertThat(project).isNotNull()
|
||||
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
|
||||
|
||||
assertThat(variants).hasSize(8)
|
||||
assertThat(variants.map { it.name }).containsExactly("fullDebug", "fullRelease", "fullStaging",
|
||||
assertThat(variants).hasSize(8)
|
||||
assertThat(variants.map { it.name }).containsExactly("fullDebug", "fullRelease",
|
||||
"fullStaging",
|
||||
"fullExperimental", "demoDebug", "demoRelease", "demoStaging", "demoExperimental")
|
||||
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
|
||||
// the build types don't have any applicationIdSuffix set
|
||||
// so only suffix from the flavors should be applied here
|
||||
assertThat(applicationId).isAnyOf("com.itsaky.test.app.full", "com.itsaky.test.app.demo")
|
||||
// the build types don't have any applicationIdSuffix set
|
||||
// so only suffix from the flavors should be applied here
|
||||
assertThat(applicationId).isAnyOf("com.itsaky.test.app.full", "com.itsaky.test.app.demo")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -196,37 +200,38 @@ class ApplicationIDComputationTest {
|
||||
|
||||
val client = ToolingApiTestLauncher.MultiVersionTestClient(
|
||||
androidBlockConfig = androidBlockConfig)
|
||||
val (_, project, initializeResult) = ToolingApiTestLauncher().launchServer(client = client)
|
||||
ToolingApiTestLauncher.launchServer(client = client) {
|
||||
|
||||
assertThat(initializeResult).isNotNull()
|
||||
assertThat(initializeResult?.isSuccessful).isTrue()
|
||||
assertThat(initializeResult?.failure).isNull()
|
||||
assertThat(result).isNotNull()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
assertThat(result?.failure).isNull()
|
||||
|
||||
assertThat(project).isNotNull()
|
||||
assertThat(project).isNotNull()
|
||||
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
|
||||
|
||||
assertThat(variants).hasSize(4)
|
||||
assertThat(variants.map { it.name }).containsExactly("debug", "release", "staging",
|
||||
"experimental")
|
||||
assertThat(variants).hasSize(4)
|
||||
assertThat(variants.map { it.name }).containsExactly("debug", "release", "staging",
|
||||
"experimental")
|
||||
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
assertThat(applicationId).isAnyOf("com.itsaky.test.app", "com.itsaky.test.app.staging",
|
||||
"com.itsaky.test.app.experimental")
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
assertThat(applicationId).isAnyOf("com.itsaky.test.app", "com.itsaky.test.app.staging",
|
||||
"com.itsaky.test.app.experimental")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -257,40 +262,42 @@ class ApplicationIDComputationTest {
|
||||
|
||||
val client = ToolingApiTestLauncher.MultiVersionTestClient(
|
||||
androidBlockConfig = androidBlockConfig)
|
||||
val (_, project, initializeResult) = ToolingApiTestLauncher().launchServer(client = client)
|
||||
ToolingApiTestLauncher.launchServer(client = client) {
|
||||
|
||||
assertThat(initializeResult).isNotNull()
|
||||
assertThat(initializeResult?.isSuccessful).isTrue()
|
||||
assertThat(initializeResult?.failure).isNull()
|
||||
assertThat(result).isNotNull()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
assertThat(result?.failure).isNull()
|
||||
|
||||
assertThat(project).isNotNull()
|
||||
assertThat(project).isNotNull()
|
||||
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
|
||||
|
||||
assertThat(variants).hasSize(8)
|
||||
assertThat(variants.map { it.name }).containsExactly("fullDebug", "fullRelease", "fullStaging",
|
||||
assertThat(variants).hasSize(8)
|
||||
assertThat(variants.map { it.name }).containsExactly("fullDebug", "fullRelease",
|
||||
"fullStaging",
|
||||
"fullExperimental", "demoDebug", "demoRelease", "demoStaging", "demoExperimental")
|
||||
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
|
||||
// the flavors don't have any applicationIdSuffix set
|
||||
// so only suffix from the build types should be applied here
|
||||
assertThat(applicationId).isAnyOf("com.itsaky.test.app", "com.itsaky.test.app.staging",
|
||||
"com.itsaky.test.app.experimental")
|
||||
// the flavors don't have any applicationIdSuffix set
|
||||
// so only suffix from the build types should be applied here
|
||||
assertThat(applicationId).isAnyOf("com.itsaky.test.app", "com.itsaky.test.app.staging",
|
||||
"com.itsaky.test.app.experimental")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -323,45 +330,47 @@ class ApplicationIDComputationTest {
|
||||
|
||||
val client = ToolingApiTestLauncher.MultiVersionTestClient(
|
||||
androidBlockConfig = androidBlockConfig)
|
||||
val (_, project, initializeResult) = ToolingApiTestLauncher().launchServer(client = client)
|
||||
ToolingApiTestLauncher.launchServer(client = client) {
|
||||
|
||||
assertThat(initializeResult).isNotNull()
|
||||
assertThat(initializeResult?.isSuccessful).isTrue()
|
||||
assertThat(initializeResult?.failure).isNull()
|
||||
assertThat(result).isNotNull()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
assertThat(result?.failure).isNull()
|
||||
|
||||
assertThat(project).isNotNull()
|
||||
assertThat(project).isNotNull()
|
||||
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
|
||||
|
||||
assertThat(variants).hasSize(8)
|
||||
assertThat(variants.map { it.name }).containsExactly("fullDebug", "fullRelease", "fullStaging",
|
||||
assertThat(variants).hasSize(8)
|
||||
assertThat(variants.map { it.name }).containsExactly("fullDebug", "fullRelease",
|
||||
"fullStaging",
|
||||
"fullExperimental", "demoDebug", "demoRelease", "demoStaging", "demoExperimental")
|
||||
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
|
||||
// the flavors don't have any applicationIdSuffix set
|
||||
// so only suffix from the build types should be applied here
|
||||
assertThat(applicationId).isAnyOf(
|
||||
// 'debug' and 'release' build types
|
||||
"com.itsaky.test.app.full", "com.itsaky.test.app.demo",
|
||||
// the flavors don't have any applicationIdSuffix set
|
||||
// so only suffix from the build types should be applied here
|
||||
assertThat(applicationId).isAnyOf(
|
||||
// 'debug' and 'release' build types
|
||||
"com.itsaky.test.app.full", "com.itsaky.test.app.demo",
|
||||
|
||||
// custom build types with applicationIdSuffix
|
||||
"com.itsaky.test.app.full.staging", "com.itsaky.test.app.demo.staging",
|
||||
"com.itsaky.test.app.full.experimental", "com.itsaky.test.app.demo.experimental")
|
||||
// custom build types with applicationIdSuffix
|
||||
"com.itsaky.test.app.full.staging", "com.itsaky.test.app.demo.staging",
|
||||
"com.itsaky.test.app.full.experimental", "com.itsaky.test.app.demo.experimental")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -385,36 +394,37 @@ class ApplicationIDComputationTest {
|
||||
|
||||
val client = ToolingApiTestLauncher.MultiVersionTestClient(
|
||||
androidBlockConfig = androidBlockConfig)
|
||||
val (_, project, initializeResult) = ToolingApiTestLauncher().launchServer(client = client)
|
||||
ToolingApiTestLauncher.launchServer(client = client) {
|
||||
|
||||
assertThat(initializeResult).isNotNull()
|
||||
assertThat(initializeResult?.isSuccessful).isTrue()
|
||||
assertThat(initializeResult?.failure).isNull()
|
||||
assertThat(result).isNotNull()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
assertThat(result?.failure).isNull()
|
||||
|
||||
assertThat(project).isNotNull()
|
||||
assertThat(project).isNotNull()
|
||||
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
|
||||
|
||||
assertThat(variants).hasSize(4)
|
||||
assertThat(variants.map { it.name }).containsExactly("fullDebug", "fullRelease", "demoDebug",
|
||||
assertThat(variants).hasSize(4)
|
||||
assertThat(variants.map { it.name }).containsExactly("fullDebug", "fullRelease", "demoDebug",
|
||||
"demoRelease")
|
||||
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
assertThat(applicationId).isAnyOf("com.androidide.app.full", "com.androidide.app.demo")
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
assertThat(applicationId).isAnyOf("com.androidide.app.full", "com.androidide.app.demo")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -438,36 +448,37 @@ class ApplicationIDComputationTest {
|
||||
|
||||
val client = ToolingApiTestLauncher.MultiVersionTestClient(
|
||||
androidBlockConfig = androidBlockConfig)
|
||||
val (_, project, initializeResult) = ToolingApiTestLauncher().launchServer(client = client)
|
||||
ToolingApiTestLauncher.launchServer(client = client) {
|
||||
|
||||
assertThat(initializeResult).isNotNull()
|
||||
assertThat(initializeResult?.isSuccessful).isTrue()
|
||||
assertThat(initializeResult?.failure).isNull()
|
||||
assertThat(result).isNotNull()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
assertThat(result?.failure).isNull()
|
||||
|
||||
assertThat(project).isNotNull()
|
||||
assertThat(project).isNotNull()
|
||||
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
val selectionResult = project.selectProject(StringParameter(":app")).get()
|
||||
assertThat(selectionResult).isNotNull()
|
||||
assertThat(selectionResult.isSuccessful).isTrue()
|
||||
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
val app = project.asAndroidProject()
|
||||
assertThat(app).isNotNull()
|
||||
assertThat(app).isInstanceOf(IAndroidProject::class.java)
|
||||
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
val variants = app.getVariants().get()
|
||||
assertThat(variants).isNotNull()
|
||||
assertThat(variants).isNotEmpty()
|
||||
|
||||
|
||||
assertThat(variants).hasSize(4)
|
||||
assertThat(variants.map { it.name }).containsExactly("fullDebug", "fullRelease", "demoDebug",
|
||||
assertThat(variants).hasSize(4)
|
||||
assertThat(variants.map { it.name }).containsExactly("fullDebug", "fullRelease", "demoDebug",
|
||||
"demoRelease")
|
||||
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
assertThat(applicationId).isAnyOf("com.androidide.app.full", "com.itsaky.test.app.demo")
|
||||
variants.forEach { variant ->
|
||||
val applicationId = variant.mainArtifact.applicationId
|
||||
assertThat(applicationId).isNotNull()
|
||||
assertThat(applicationId?.trim()).isNotEmpty()
|
||||
assertThat(applicationId).isAnyOf("com.androidide.app.full", "com.itsaky.test.app.demo")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+29
-34
@@ -46,53 +46,47 @@ class CIOnlyToolingApiTests {
|
||||
@Test
|
||||
fun `test CI-only simple multi module project initialization with multiple AGP versions`() {
|
||||
// Test the minimum supported and the latest AGP version
|
||||
val versions =
|
||||
listOf(
|
||||
// AGP to Gradle
|
||||
BuildInfo.AGP_VERSION_MININUM to "7.3.3",
|
||||
BuildInfo.AGP_VERSION_LATEST to "8.2"
|
||||
)
|
||||
val versions = listOf(
|
||||
// AGP to Gradle
|
||||
BuildInfo.AGP_VERSION_MININUM to "7.3.3", BuildInfo.AGP_VERSION_LATEST to "8.2")
|
||||
|
||||
val client = ToolingApiTestLauncher.MultiVersionTestClient()
|
||||
for ((agpVersion, gradleVersion) in versions) {
|
||||
client.agpVersion = agpVersion
|
||||
client.gradleVersion = gradleVersion
|
||||
val (server, project, result) = ToolingApiTestLauncher().launchServer(client = client)
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
ToolingApiTestLauncher.launchServer(client = client) {
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
|
||||
performBasicProjectAssertions(project = project, server = server)
|
||||
performBasicProjectAssertions(project = project, server = server)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `test CI-only latest tested AGP version warning`() {
|
||||
val log = CollectingLogger()
|
||||
val log = CollectingLogger()
|
||||
val agpVersion = AndroidPluginVersion.parse(BuildInfo.AGP_VERSION_LATEST)
|
||||
|
||||
val client = ToolingApiTestLauncher.MultiVersionTestClient(
|
||||
agpVersion = agpVersion.toStringSimple(),
|
||||
gradleVersion = "${agpVersion.major}.${agpVersion.minor}", log = log)
|
||||
val (_, project, result) = ToolingApiTestLauncher().launchServer(
|
||||
client = client,
|
||||
log = log,
|
||||
sysProps = mapOf(
|
||||
ToolingProps.TESTING_LATEST_AGP_VERSION to ToolingApiTestLauncher.MultiVersionTestClient.DEFAULT_AGP_VERSION)
|
||||
)
|
||||
val output = log.toString()
|
||||
ToolingApiTestLauncher.launchServer(client = client, log = log, sysProps = mapOf(
|
||||
ToolingProps.TESTING_LATEST_AGP_VERSION to ToolingApiTestLauncher.MultiVersionTestClient.DEFAULT_AGP_VERSION)) {
|
||||
val output = log.toString()
|
||||
|
||||
if (result?.isSuccessful != true) {
|
||||
// print the output if the initialization fails
|
||||
println(output)
|
||||
if (result?.isSuccessful != true) {
|
||||
// print the output if the initialization fails
|
||||
println(output)
|
||||
}
|
||||
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
|
||||
val syncIssues = project.getProjectSyncIssues().get()
|
||||
assertThat(syncIssues).isNotNull()
|
||||
assertThat(syncIssues.syncIssues).isNotEmpty()
|
||||
assertThat(
|
||||
syncIssues.syncIssues.find { it.type == IDESyncIssue.TYPE_AGP_VERSION_TOO_NEW }).isNotNull()
|
||||
}
|
||||
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
|
||||
val syncIssues = project.getProjectSyncIssues().get()
|
||||
assertThat(syncIssues).isNotNull()
|
||||
assertThat(syncIssues.syncIssues).isNotEmpty()
|
||||
assertThat(
|
||||
syncIssues.syncIssues.find { it.type == IDESyncIssue.TYPE_AGP_VERSION_TOO_NEW }
|
||||
).isNotNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -101,11 +95,12 @@ class CIOnlyToolingApiTests {
|
||||
val agpVersion = "7.1.0"
|
||||
val client = ToolingApiTestLauncher.MultiVersionTestClient(agpVersion = agpVersion,
|
||||
gradleVersion = "7.2", log = log)
|
||||
val (_, _, result) = ToolingApiTestLauncher().launchServer(client = client, log = log)
|
||||
assertThat(result?.isSuccessful).isFalse()
|
||||
ToolingApiTestLauncher.launchServer(client = client, log = log) {
|
||||
assertThat(result?.isSuccessful).isFalse()
|
||||
|
||||
val output = log.toString()
|
||||
assertThat(output).contains(
|
||||
"Android Gradle Plugin version $agpVersion is not supported by AndroidIDE.")
|
||||
val output = log.toString()
|
||||
assertThat(output).contains(
|
||||
"Android Gradle Plugin version $agpVersion is not supported by AndroidIDE.")
|
||||
}
|
||||
}
|
||||
}
|
||||
+35
-51
@@ -44,17 +44,18 @@ class MultiModuleAndroidProjectTest {
|
||||
|
||||
@Test
|
||||
fun `test simple multi module project initialization`() {
|
||||
val (server, project, result) = ToolingApiTestLauncher().launchServer()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
performBasicProjectAssertions(project, server)
|
||||
ToolingApiTestLauncher.launchServer {
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
performBasicProjectAssertions(project, server)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `test non-existing project initialization`() {
|
||||
val (_, _, result) = ToolingApiTestLauncher().launchServer(
|
||||
projectDir = Paths.get("/directory/does/not/exist/"))
|
||||
assertThat(result?.isSuccessful).isFalse()
|
||||
assertThat(result?.failure).isEqualTo(TaskExecutionResult.Failure.PROJECT_NOT_FOUND)
|
||||
ToolingApiTestLauncher.launchServer(projectDir = Paths.get("/directory/does/not/exist/")) {
|
||||
assertThat(result?.isSuccessful).isFalse()
|
||||
assertThat(result?.failure).isEqualTo(TaskExecutionResult.Failure.PROJECT_NOT_FOUND)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -64,9 +65,10 @@ class MultiModuleAndroidProjectTest {
|
||||
path.deleteIfExists()
|
||||
path.createFile()
|
||||
|
||||
val (_, _, result) = ToolingApiTestLauncher().launchServer(projectDir = path)
|
||||
assertThat(result?.isSuccessful).isFalse()
|
||||
assertThat(result?.failure).isEqualTo(TaskExecutionResult.Failure.PROJECT_NOT_DIRECTORY)
|
||||
ToolingApiTestLauncher.launchServer(projectDir = path) {
|
||||
assertThat(result?.isSuccessful).isFalse()
|
||||
assertThat(result?.failure).isEqualTo(TaskExecutionResult.Failure.PROJECT_NOT_DIRECTORY)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -91,50 +93,32 @@ class MultiModuleAndroidProjectTest {
|
||||
}
|
||||
}
|
||||
|
||||
val (server, project, result) = ToolingApiTestLauncher().launchServer(client = client)
|
||||
assertThat(server).isNotNull()
|
||||
assertThat(project).isNotNull()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
ToolingApiTestLauncher.launchServer(client = client) {
|
||||
assertThat(server).isNotNull()
|
||||
assertThat(project).isNotNull()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
|
||||
println("Executed tasks during initialization : " + taskPaths.joinToString(
|
||||
separator = System.lineSeparator()))
|
||||
taskPaths.clear()
|
||||
println("Executed tasks during initialization : " + taskPaths.joinToString(
|
||||
separator = System.lineSeparator()))
|
||||
taskPaths.clear()
|
||||
|
||||
val (isSuccessful, failure) = server.executeTasks(
|
||||
TaskExecutionMessage(tasks = listOf("assembleDebug"))).get()
|
||||
val (isSuccessful, failure) = server.executeTasks(
|
||||
TaskExecutionMessage(tasks = listOf("assembleDebug"))).get()
|
||||
|
||||
if (failure != null) {
|
||||
println("Failure: $failure")
|
||||
if (failure != null) {
|
||||
println("Failure: $failure")
|
||||
}
|
||||
|
||||
assertThat(isSuccessful).isTrue()
|
||||
assertThat(failure).isNull()
|
||||
|
||||
assertThat(taskPaths).isNotNull()
|
||||
assertThat(taskPaths.size).isGreaterThan(10)
|
||||
assertThat(taskPaths).containsAtLeastElementsIn(
|
||||
arrayOf("preBuild", "generateDebugResources", "compileDebugJavaWithJavac",
|
||||
"assembleDebug").map { ":android-library:$it" })
|
||||
println(
|
||||
"Executed tasks during build : " + taskPaths.joinToString(separator = System.lineSeparator()))
|
||||
}
|
||||
|
||||
assertThat(isSuccessful).isTrue()
|
||||
assertThat(failure).isNull()
|
||||
|
||||
assertThat(taskPaths).isNotNull()
|
||||
assertThat(taskPaths.size).isGreaterThan(10)
|
||||
assertThat(taskPaths).containsAtLeastElementsIn(
|
||||
arrayOf("preBuild", "generateDebugResources", "compileDebugJavaWithJavac",
|
||||
"assembleDebug").map { ":android-library:$it" })
|
||||
println(
|
||||
"Executed tasks during build : " + taskPaths.joinToString(separator = System.lineSeparator()))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `test project initialization cancellation`() {
|
||||
// launch project initialization
|
||||
val (server, _, initFuture) = ToolingApiTestLauncher().launchServerAsync()
|
||||
Thread.sleep(1000L)
|
||||
|
||||
// cancel initialization request
|
||||
val cancellationResult = server.cancelCurrentBuild().get()
|
||||
println("Cancellation result: $cancellationResult")
|
||||
assertThat(cancellationResult).isNotNull()
|
||||
assertThat(cancellationResult.wasEnqueued).isTrue()
|
||||
assertThat(cancellationResult.failureReason).isNull()
|
||||
|
||||
// verify that the initialization failed with reason BUILD_CANCELLED
|
||||
val initResult = initFuture.get()
|
||||
assertThat(initResult!!.isSuccessful).isFalse()
|
||||
assertThat(initResult.failure).isEqualTo(TaskExecutionResult.Failure.BUILD_CANCELLED)
|
||||
}
|
||||
}
|
||||
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* This file is part of AndroidIDE.
|
||||
*
|
||||
* AndroidIDE is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* AndroidIDE is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.itsaky.androidide.tooling.impl
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import com.itsaky.androidide.testing.tooling.ToolingApiTestLauncher
|
||||
import com.itsaky.androidide.tooling.api.messages.result.TaskExecutionResult
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.JUnit4
|
||||
|
||||
/**
|
||||
* @author Akash Yadav
|
||||
*/
|
||||
@RunWith(JUnit4::class)
|
||||
class ProjectInitializationCancellationTest {
|
||||
|
||||
@Test
|
||||
fun `test project initialization cancellation`() {
|
||||
// launch project initialization
|
||||
ToolingApiTestLauncher.launchServerAsync {
|
||||
|
||||
Thread.sleep(1000L)
|
||||
|
||||
// cancel initialization request
|
||||
val cancellationResult = server.cancelCurrentBuild().get()
|
||||
println("Cancellation result: $cancellationResult")
|
||||
assertThat(cancellationResult).isNotNull()
|
||||
assertThat(cancellationResult.wasEnqueued).isTrue()
|
||||
assertThat(cancellationResult.failureReason).isNull()
|
||||
|
||||
// verify that the initialization failed with reason BUILD_CANCELLED
|
||||
val initResult = initializeResult.get()
|
||||
assertThat(initResult!!.isSuccessful).isFalse()
|
||||
assertThat(initResult.failure).isEqualTo(TaskExecutionResult.Failure.BUILD_CANCELLED)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -85,32 +85,31 @@ abstract class LSPTest {
|
||||
mockkStatic(::tabSize)
|
||||
every { tabSize } returns 4
|
||||
|
||||
val (server, project, result) =
|
||||
ToolingApiTestLauncher()
|
||||
.launchServer()
|
||||
ToolingApiTestLauncher.launchServer {
|
||||
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
|
||||
this.toolingProject = project
|
||||
this.toolingServer = server
|
||||
this@LSPTest.toolingProject = project
|
||||
this@LSPTest.toolingServer = server
|
||||
|
||||
Lookup.getDefault().update(BuildService.KEY_PROJECT_PROXY, project)
|
||||
Lookup.getDefault().update(BuildService.KEY_PROJECT_PROXY, project)
|
||||
|
||||
Environment.ANDROID_JAR = FileProvider.resources().resolve("android.jar").toFile()
|
||||
Environment.JAVA_HOME = File(System.getProperty("java.home")!!)
|
||||
registerServer()
|
||||
Environment.ANDROID_JAR = FileProvider.resources().resolve("android.jar").toFile()
|
||||
Environment.JAVA_HOME = File(System.getProperty("java.home")!!)
|
||||
registerServer()
|
||||
|
||||
val projectManager = ProjectManagerImpl.getInstance()
|
||||
projectManager.register()
|
||||
runBlocking { projectManager.setupProject(project) }
|
||||
val projectManager = ProjectManagerImpl.getInstance()
|
||||
projectManager.register()
|
||||
runBlocking { projectManager.setupProject(project) }
|
||||
|
||||
// We need to manually setup the language server with the project here
|
||||
// ProjectManager.notifyProjectUpdate()
|
||||
ILanguageServerRegistry.getDefault()
|
||||
.getServer(getServerId())!!
|
||||
.setupWithProject(projectManager.rootProject!!)
|
||||
// We need to manually setup the language server with the project here
|
||||
// ProjectManager.notifyProjectUpdate()
|
||||
ILanguageServerRegistry.getDefault()
|
||||
.getServer(getServerId())!!
|
||||
.setupWithProject(projectManager.rootProject!!)
|
||||
|
||||
isInitialized = true
|
||||
isInitialized = true
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract fun registerServer()
|
||||
|
||||
+71
-45
@@ -17,6 +17,8 @@
|
||||
|
||||
package com.itsaky.androidide.testing.tooling
|
||||
|
||||
import com.itsaky.androidide.testing.tooling.models.ToolingApiTestLauncherParams
|
||||
import com.itsaky.androidide.testing.tooling.models.ToolingApiTestScope
|
||||
import com.itsaky.androidide.tooling.api.IProject
|
||||
import com.itsaky.androidide.tooling.api.IToolingApiClient
|
||||
import com.itsaky.androidide.tooling.api.IToolingApiServer
|
||||
@@ -52,7 +54,7 @@ import kotlin.io.path.pathString
|
||||
*
|
||||
* @author Akash Yadav
|
||||
*/
|
||||
class ToolingApiTestLauncher {
|
||||
object ToolingApiTestLauncher {
|
||||
|
||||
private val opens =
|
||||
mutableMapOf("java.base" to "java.lang", "java.base" to "java.util",
|
||||
@@ -66,46 +68,7 @@ class ToolingApiTestLauncher {
|
||||
"jdk.compiler" to "com.sun.tools.javac.util")
|
||||
|
||||
@JvmOverloads
|
||||
fun launchServerAsync(
|
||||
projectDir: Path = FileProvider.testProjectRoot(),
|
||||
client: MultiVersionTestClient = MultiVersionTestClient(),
|
||||
initParams: InitializeProjectParams = InitializeProjectParams(
|
||||
projectDir.pathString,
|
||||
client.gradleDistParams
|
||||
),
|
||||
log: ILogger = ILogger.newInstance("BuildOutputLogger"),
|
||||
sysProps: Map<String, String> = emptyMap(),
|
||||
sysEnvs: Map<String, String> = emptyMap()
|
||||
): Triple<IToolingApiServer, IProject, CompletableFuture<InitializeResult>> {
|
||||
val cmdLine = createProcessCmd(
|
||||
FileProvider.implModule()
|
||||
.resolve("build/libs/tooling-api-all.jar").pathString,
|
||||
sysProps
|
||||
)
|
||||
|
||||
val builder = ProcessBuilder(cmdLine)
|
||||
val androidHome = findAndroidHome()
|
||||
|
||||
builder.environment()["ANDROID_SDK_ROOT"] = androidHome
|
||||
builder.environment()["ANDROID_HOME"] = androidHome
|
||||
builder.environment().putAll(sysEnvs)
|
||||
|
||||
val proc = builder.start()
|
||||
|
||||
Thread(Reader(proc.errorStream, log)).start()
|
||||
val launcher =
|
||||
ToolingApiLauncher.newClientLauncher(client, proc.inputStream,
|
||||
proc.outputStream)
|
||||
|
||||
launcher.startListening()
|
||||
|
||||
val server = launcher.remoteProxy as IToolingApiServer
|
||||
val project = launcher.remoteProxy as IProject
|
||||
val result = server.initialize(initParams)
|
||||
return Triple(server, project, result)
|
||||
}
|
||||
|
||||
@JvmOverloads
|
||||
@JvmStatic
|
||||
fun launchServer(
|
||||
projectDir: Path = FileProvider.testProjectRoot(),
|
||||
client: MultiVersionTestClient = MultiVersionTestClient(),
|
||||
@@ -115,10 +78,73 @@ class ToolingApiTestLauncher {
|
||||
),
|
||||
log: ILogger = ILogger.newInstance("BuildOutputLogger"),
|
||||
sysProps: Map<String, String> = emptyMap(),
|
||||
sysEnvs: Map<String, String> = emptyMap()
|
||||
): Triple<IToolingApiServer, IProject, InitializeResult?> {
|
||||
return launchServerAsync(projectDir, client, initParams, log, sysProps, sysEnvs).let { result ->
|
||||
Triple(result.first, result.second, result.third.get())
|
||||
sysEnvs: Map<String, String> = emptyMap(),
|
||||
action: ToolingApiTestScope.() -> Unit
|
||||
) = launchServer(ToolingApiTestLauncherParams(projectDir, client, initParams, log, sysProps, sysEnvs), action)
|
||||
|
||||
@JvmOverloads
|
||||
@JvmStatic
|
||||
@JvmName("launchServerWithParams")
|
||||
fun launchServer(
|
||||
params: ToolingApiTestLauncherParams = ToolingApiTestLauncherParams(),
|
||||
action: ToolingApiTestScope.() -> Unit
|
||||
) {
|
||||
return launchServerAsync(params) {
|
||||
// wait for project initialization
|
||||
initializeResult.get()
|
||||
|
||||
action()
|
||||
}
|
||||
}
|
||||
|
||||
@JvmOverloads
|
||||
@JvmStatic
|
||||
fun launchServerAsync(
|
||||
params: ToolingApiTestLauncherParams = ToolingApiTestLauncherParams(),
|
||||
action: ToolingApiTestScope.() -> Unit
|
||||
) {
|
||||
val cmdLine = createProcessCmd(
|
||||
FileProvider.implModule()
|
||||
.resolve("build/libs/tooling-api-all.jar").pathString,
|
||||
params.sysProps
|
||||
)
|
||||
|
||||
val builder = ProcessBuilder(cmdLine)
|
||||
val androidHome = findAndroidHome()
|
||||
|
||||
builder.environment()["ANDROID_SDK_ROOT"] = androidHome
|
||||
builder.environment()["ANDROID_HOME"] = androidHome
|
||||
builder.environment().putAll(params.sysEnvs)
|
||||
|
||||
val proc = builder.start()
|
||||
|
||||
proc.onExit().whenComplete { process, error ->
|
||||
if (process != null) {
|
||||
println("[ToolingApiTestLauncher] Tooling API server process finished with exit code: ${process.exitValue()}")
|
||||
}
|
||||
if (error != null) {
|
||||
println("[ToolingApiTestLauncher] Tooling API server process error")
|
||||
error.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
Thread(Reader(proc.errorStream, params.log)).start()
|
||||
val launcher =
|
||||
ToolingApiLauncher.newClientLauncher(params.client, proc.inputStream,
|
||||
proc.outputStream)
|
||||
|
||||
launcher.startListening()
|
||||
|
||||
val server = launcher.remoteProxy as IToolingApiServer
|
||||
val project = launcher.remoteProxy as IProject
|
||||
val result = server.initialize(params.initParams)
|
||||
|
||||
try {
|
||||
// perform the action
|
||||
ToolingApiTestScope(server, project, result).action()
|
||||
} finally {
|
||||
server.cancelCurrentBuild().get()
|
||||
server.shutdown().get()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* This file is part of AndroidIDE.
|
||||
*
|
||||
* AndroidIDE is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* AndroidIDE is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.itsaky.androidide.testing.tooling.models
|
||||
|
||||
import com.itsaky.androidide.testing.tooling.ToolingApiTestLauncher
|
||||
import com.itsaky.androidide.tooling.api.messages.InitializeProjectParams
|
||||
import com.itsaky.androidide.utils.FileProvider
|
||||
import com.itsaky.androidide.utils.ILogger
|
||||
import java.nio.file.Path
|
||||
import kotlin.io.path.pathString
|
||||
|
||||
/**
|
||||
* Parameters for launching the tooling API server.
|
||||
*
|
||||
* @author Akash Yadav
|
||||
*/
|
||||
data class ToolingApiTestLauncherParams(
|
||||
val projectDir: Path = FileProvider.testProjectRoot(),
|
||||
val client: ToolingApiTestLauncher.MultiVersionTestClient = ToolingApiTestLauncher.MultiVersionTestClient(),
|
||||
val initParams: InitializeProjectParams = InitializeProjectParams(
|
||||
projectDir.pathString,
|
||||
client.gradleDistParams
|
||||
),
|
||||
val log: ILogger = ILogger.newInstance("BuildOutputLogger"),
|
||||
val sysProps: Map<String, String> = emptyMap(),
|
||||
val sysEnvs: Map<String, String> = emptyMap()
|
||||
)
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* This file is part of AndroidIDE.
|
||||
*
|
||||
* AndroidIDE is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* AndroidIDE is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.itsaky.androidide.testing.tooling.models
|
||||
|
||||
import com.itsaky.androidide.tooling.api.IProject
|
||||
import com.itsaky.androidide.tooling.api.IToolingApiServer
|
||||
import com.itsaky.androidide.tooling.api.messages.result.InitializeResult
|
||||
import java.util.concurrent.CompletableFuture
|
||||
|
||||
/**
|
||||
* Scope for Tooling API tests. Provides access to the [IToolingApiServer], [IProject] and the [InitializeResult].
|
||||
*
|
||||
* @author Akash Yadav
|
||||
*/
|
||||
class ToolingApiTestScope(
|
||||
val server: IToolingApiServer,
|
||||
val project: IProject,
|
||||
val initializeResult: CompletableFuture<InitializeResult>
|
||||
) {
|
||||
|
||||
val result: InitializeResult?
|
||||
get() = initializeResult.get()
|
||||
}
|
||||
@@ -43,13 +43,13 @@ object XmlInflaterTest {
|
||||
return
|
||||
}
|
||||
|
||||
val (_, project, result) =
|
||||
ToolingApiTestLauncher().launchServer()
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
ToolingApiTestLauncher.launchServer {
|
||||
assertThat(result?.isSuccessful).isTrue()
|
||||
|
||||
Lookup.getDefault().register(BuildService.KEY_PROJECT_PROXY, project)
|
||||
runBlocking { IProjectManager.getInstance().setupProject(project) }
|
||||
init.set(true)
|
||||
Lookup.getDefault().register(BuildService.KEY_PROJECT_PROXY, project)
|
||||
runBlocking { IProjectManager.getInstance().setupProject(project) }
|
||||
init.set(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user