[WIP] Add Compiler Smoke Tests for (suspend) main methods
This commit ports the (parameterless) main integration tests in `CompilerSmokeTest` to the IR backend. It also includes a simple suspend main test. The advanced ones (like `helloAppSuspendParameterlessMain`) are currently blocked by pending changes to capturing suspend lambdas, which are underway.
This commit is contained in:
committed by
Ilmir Usmanov
parent
55aafb3430
commit
5b62c9e54d
@@ -33,7 +33,6 @@ interface JvmLoweredDeclarationOrigin : IrDeclarationOrigin {
|
|||||||
object STATIC_INLINE_CLASS_REPLACEMENT : IrDeclarationOriginImpl("STATIC_INLINE_CLASS_REPLACEMENT")
|
object STATIC_INLINE_CLASS_REPLACEMENT : IrDeclarationOriginImpl("STATIC_INLINE_CLASS_REPLACEMENT")
|
||||||
object GENERATED_ASSERTION_ENABLED_FIELD : IrDeclarationOriginImpl("GENERATED_ASSERTION_ENABLED_FIELD", isSynthetic = true)
|
object GENERATED_ASSERTION_ENABLED_FIELD : IrDeclarationOriginImpl("GENERATED_ASSERTION_ENABLED_FIELD", isSynthetic = true)
|
||||||
object GENERATED_EXTENDED_MAIN : IrDeclarationOriginImpl("GENERATED_EXTENDED_MAIN", isSynthetic = true)
|
object GENERATED_EXTENDED_MAIN : IrDeclarationOriginImpl("GENERATED_EXTENDED_MAIN", isSynthetic = true)
|
||||||
object SUSPEND_FUNCTION_VIEW : IrDeclarationOriginImpl("SUSPEND_FUNCTION_VIEW")
|
|
||||||
object SUSPEND_IMPL_STATIC_FUNCTION : IrDeclarationOriginImpl("SUSPEND_IMPL_STATIC_FUNCTION", isSynthetic = true)
|
object SUSPEND_IMPL_STATIC_FUNCTION : IrDeclarationOriginImpl("SUSPEND_IMPL_STATIC_FUNCTION", isSynthetic = true)
|
||||||
object INTERFACE_COMPANION_PRIVATE_INSTANCE : IrDeclarationOriginImpl("INTERFACE_COMPANION_PRIVATE_INSTANCE", isSynthetic = true)
|
object INTERFACE_COMPANION_PRIVATE_INSTANCE : IrDeclarationOriginImpl("INTERFACE_COMPANION_PRIVATE_INSTANCE", isSynthetic = true)
|
||||||
object POLYMORPHIC_SIGNATURE_INSTANTIATION : IrDeclarationOriginImpl("POLYMORPHIC_SIGNATURE_INSTANTIATION", isSynthetic = true)
|
object POLYMORPHIC_SIGNATURE_INSTANTIATION : IrDeclarationOriginImpl("POLYMORPHIC_SIGNATURE_INSTANTIATION", isSynthetic = true)
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Return code: 0
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package Hello
|
||||||
|
|
||||||
|
fun main(args: kotlin.Array<kotlin.String>) {
|
||||||
|
args.size
|
||||||
|
System.out.println("Hello from fully qualified main!")
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
OUT:
|
||||||
|
Hello from fully qualified main!
|
||||||
|
|
||||||
|
Return code: 0
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Return code: 0
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package Hello
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
System.out.println("Hello!")
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
OUT:
|
||||||
|
Hello!
|
||||||
|
|
||||||
|
Return code: 0
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
Return code: 0
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
package Hello
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
args.size
|
||||||
|
System.out.println("Hello!")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
System.out.println("Fail")
|
||||||
|
}
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
OUT:
|
||||||
|
Hello!
|
||||||
|
|
||||||
|
Return code: 0
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
Return code: 0
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package Hello
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
System.out.println("Hello!")
|
||||||
|
}
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
OUT:
|
||||||
|
Hello!
|
||||||
|
|
||||||
|
Return code: 0
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
Return code: 0
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package Hello
|
||||||
|
|
||||||
|
import kotlin.concurrent.thread
|
||||||
|
import kotlin.coroutines.suspendCoroutine
|
||||||
|
import kotlin.coroutines.resume
|
||||||
|
|
||||||
|
@kotlin.jvm.Volatile
|
||||||
|
private var result = ""
|
||||||
|
@kotlin.jvm.Volatile
|
||||||
|
private var callback: Function0<Unit>? = null
|
||||||
|
|
||||||
|
suspend fun appendAndSuspend(s: String) {
|
||||||
|
result += s
|
||||||
|
|
||||||
|
suspendCoroutine<Unit> { continuation ->
|
||||||
|
callback = {
|
||||||
|
continuation.resume(Unit)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun main(args: Array<String>) {
|
||||||
|
thread(isDaemon = true) {
|
||||||
|
while (true) {
|
||||||
|
val c = callback
|
||||||
|
c?.invoke()
|
||||||
|
Thread.sleep(500)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
appendAndSuspend(args[0])
|
||||||
|
appendAndSuspend(args[1])
|
||||||
|
println(result)
|
||||||
|
callback = null
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
OUT:
|
||||||
|
OK
|
||||||
|
|
||||||
|
Return code: 0
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
Return code: 0
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
@file:JvmMultifileClass
|
||||||
|
@file:JvmName("Foo")
|
||||||
|
package Hello
|
||||||
|
|
||||||
|
import kotlin.concurrent.thread
|
||||||
|
import kotlin.coroutines.suspendCoroutine
|
||||||
|
import kotlin.coroutines.resume
|
||||||
|
|
||||||
|
@kotlin.jvm.Volatile
|
||||||
|
private var result = ""
|
||||||
|
@kotlin.jvm.Volatile
|
||||||
|
private var callback: Function0<Unit>? = null
|
||||||
|
|
||||||
|
suspend fun appendAndSuspend(s: String) {
|
||||||
|
result += s
|
||||||
|
|
||||||
|
suspendCoroutine<Unit> { continuation ->
|
||||||
|
callback = {
|
||||||
|
continuation.resume(Unit)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun main(args: Array<String>) {
|
||||||
|
thread(isDaemon = true) {
|
||||||
|
while (true) {
|
||||||
|
val c = callback
|
||||||
|
c?.invoke()
|
||||||
|
Thread.sleep(500)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
appendAndSuspend(args[0])
|
||||||
|
appendAndSuspend(args[1])
|
||||||
|
println(result)
|
||||||
|
callback = null
|
||||||
|
}
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
OUT:
|
||||||
|
OK
|
||||||
|
|
||||||
|
Return code: 0
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
Return code: 0
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
package Hello
|
||||||
|
|
||||||
|
import kotlin.concurrent.thread
|
||||||
|
import kotlin.coroutines.suspendCoroutine
|
||||||
|
import kotlin.coroutines.resume
|
||||||
|
import kotlin.reflect.jvm.javaMethod
|
||||||
|
|
||||||
|
@kotlin.jvm.Volatile
|
||||||
|
private var result = ""
|
||||||
|
@kotlin.jvm.Volatile
|
||||||
|
private var callback: Function0<Unit>? = null
|
||||||
|
|
||||||
|
suspend fun appendAndSuspend(s: String) {
|
||||||
|
result += s
|
||||||
|
|
||||||
|
suspendCoroutine<Unit> { continuation ->
|
||||||
|
callback = {
|
||||||
|
continuation.resume(Unit)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun main() {
|
||||||
|
thread(isDaemon = true) {
|
||||||
|
while (true) {
|
||||||
|
val c = callback
|
||||||
|
c?.invoke()
|
||||||
|
Thread.sleep(500)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
appendAndSuspend("O")
|
||||||
|
appendAndSuspend("K")
|
||||||
|
println(result)
|
||||||
|
callback = null
|
||||||
|
}
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
OUT:
|
||||||
|
OK
|
||||||
|
|
||||||
|
Return code: 0
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
Return code: 0
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package Hello
|
||||||
|
|
||||||
|
fun main(vararg args: kotlin.String) {
|
||||||
|
args.size
|
||||||
|
System.out.println("Hello from vararg main!")
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
OUT:
|
||||||
|
Hello from vararg main!
|
||||||
|
|
||||||
|
Return code: 0
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
Return code: 0
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package Hello
|
||||||
|
|
||||||
|
suspend fun f(o: String, k: String): String {
|
||||||
|
return o + k
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun main(args: Array<String>) {
|
||||||
|
val result = f(args[0], args[1])
|
||||||
|
println(result)
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
OUT:
|
||||||
|
OK
|
||||||
|
|
||||||
|
Return code: 0
|
||||||
@@ -29,6 +29,13 @@ public class CompilerSmokeTest extends CompilerSmokeTestBase {
|
|||||||
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testHelloAppIR() throws Exception {
|
||||||
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
|
assertEquals("compilation failed", 0, runCompiler("hello.compile", "-include-runtime", "-Xuse-ir", "hello.kt", "-d", jar));
|
||||||
|
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
||||||
|
}
|
||||||
|
|
||||||
public void testHelloAppFQMain() throws Exception {
|
public void testHelloAppFQMain() throws Exception {
|
||||||
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
@@ -36,6 +43,13 @@ public class CompilerSmokeTest extends CompilerSmokeTestBase {
|
|||||||
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testHelloAppFQMainIR() throws Exception {
|
||||||
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
|
assertEquals("compilation failed", 0, runCompiler("hello.compile", "-include-runtime", "-Xuse-ir", "hello.kt", "-d", jar));
|
||||||
|
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
||||||
|
}
|
||||||
|
|
||||||
public void testHelloAppVarargMain() throws Exception {
|
public void testHelloAppVarargMain() throws Exception {
|
||||||
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
@@ -43,6 +57,13 @@ public class CompilerSmokeTest extends CompilerSmokeTestBase {
|
|||||||
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testHelloAppVarargMainIR() throws Exception {
|
||||||
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
|
assertEquals("compilation failed", 0, runCompiler("hello.compile", "-include-runtime", "-Xuse-ir", "hello.kt", "-d", jar));
|
||||||
|
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
||||||
|
}
|
||||||
|
|
||||||
public void testHelloAppSuspendMain() throws Exception {
|
public void testHelloAppSuspendMain() throws Exception {
|
||||||
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
@@ -57,6 +78,13 @@ public class CompilerSmokeTest extends CompilerSmokeTestBase {
|
|||||||
run("hello.run", "-cp", jar, "Hello.Foo", "O", "K");
|
run("hello.run", "-cp", jar, "Hello.Foo", "O", "K");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testHelloAppSuspendMainInMultifileIR() throws Exception {
|
||||||
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
|
assertEquals("compilation failed", 0, runCompiler("hello.compile", "-include-runtime", "-Xuse-ir", "hello.kt", "-d", jar));
|
||||||
|
run("hello.run", "-cp", jar, "Hello.Foo", "O", "K");
|
||||||
|
}
|
||||||
|
|
||||||
public void testHelloAppParameterlessMain() throws Exception {
|
public void testHelloAppParameterlessMain() throws Exception {
|
||||||
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
@@ -64,6 +92,13 @@ public class CompilerSmokeTest extends CompilerSmokeTestBase {
|
|||||||
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testHelloAppParameterlessMainIR() throws Exception {
|
||||||
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
|
assertEquals("compilation failed", 0, runCompiler("hello.compile", "-include-runtime", "-Xuse-ir", "hello.kt", "-d", jar));
|
||||||
|
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
||||||
|
}
|
||||||
|
|
||||||
public void testHelloAppOldAndParameterlessMain() throws Exception {
|
public void testHelloAppOldAndParameterlessMain() throws Exception {
|
||||||
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
@@ -71,6 +106,13 @@ public class CompilerSmokeTest extends CompilerSmokeTestBase {
|
|||||||
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testHelloAppOldAndParameterlessMainIR() throws Exception {
|
||||||
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
|
assertEquals("compilation failed", 0, runCompiler("hello.compile", "-include-runtime", "-Xuse-ir", "hello.kt", "-d", jar));
|
||||||
|
run("hello.run", "-cp", jar, "Hello.HelloKt");
|
||||||
|
}
|
||||||
|
|
||||||
public void testHelloAppSuspendParameterlessMain() throws Exception {
|
public void testHelloAppSuspendParameterlessMain() throws Exception {
|
||||||
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
@@ -78,6 +120,20 @@ public class CompilerSmokeTest extends CompilerSmokeTestBase {
|
|||||||
run("hello.run", "-cp", jar, "Hello.HelloKt", "O", "K");
|
run("hello.run", "-cp", jar, "Hello.HelloKt", "O", "K");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testHelloAppSuspendParameterlessMainIR() throws Exception {
|
||||||
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
|
assertEquals("compilation failed", 0, runCompiler("hello.compile", "-include-runtime", "-Xuse-ir", "hello.kt", "-d", jar));
|
||||||
|
run("hello.run", "-cp", jar, "Hello.HelloKt", "O", "K");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSimplestSuspendMainIR() throws Exception {
|
||||||
|
String jar = tmpdir.getAbsolutePath() + File.separator + "hello.jar";
|
||||||
|
|
||||||
|
assertEquals("compilation failed", 0, runCompiler("hello.compile", "-include-runtime", "-Xuse-ir", "hello.kt", "-d", jar));
|
||||||
|
run("hello.run", "-cp", jar, "Hello.HelloKt", "O", "K");
|
||||||
|
}
|
||||||
|
|
||||||
public void testCompilationFailed() throws Exception {
|
public void testCompilationFailed() throws Exception {
|
||||||
String jar = tmpdir.getAbsolutePath() + File.separator + "smoke.jar";
|
String jar = tmpdir.getAbsolutePath() + File.separator + "smoke.jar";
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user