Select the asserter based on test framework presence in classpath
Simplify asserter lookup: enumerate all AsserterContributors when the file class with lookupAsserter function is initialized. It's assumed that AsserterContributor initialization should be fast. #KT-21154 Fixed
This commit is contained in:
@@ -8,20 +8,25 @@ package kotlin.test.testng
|
||||
import org.testng.*
|
||||
import kotlin.test.*
|
||||
|
||||
/**
|
||||
* Provides [TestNGAsserter] if `org.testng.Assert` is found in the classpath.
|
||||
*/
|
||||
class TestNGContributor : AsserterContributor {
|
||||
override fun contribute(): Asserter? {
|
||||
for (stackFrame in currentStackTrace()) {
|
||||
val className = stackFrame.className
|
||||
return if (hasTestNGInClassPath) TestNGAsserter else null
|
||||
}
|
||||
|
||||
if (className.startsWith("org.testng.") || className.startsWith("testng.")) {
|
||||
return TestNGAsserter
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
private val hasTestNGInClassPath = try {
|
||||
Class.forName("org.testng.Assert")
|
||||
true
|
||||
} catch (_: ClassNotFoundException) {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements `kotlin.test` assertions by delegating them to `org.testng.Assert` class.
|
||||
*/
|
||||
object TestNGAsserter : Asserter {
|
||||
override fun assertEquals(message: String?, expected: Any?, actual: Any?) {
|
||||
Assert.assertEquals(expected, actual, message)
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
package kotlin.test.testng.tests
|
||||
|
||||
import org.testng.annotations.*
|
||||
import org.testng.*
|
||||
import org.testng.Assert
|
||||
import kotlin.test.*
|
||||
import java.util.concurrent.*
|
||||
import kotlin.test.testng.TestNGAsserter
|
||||
|
||||
class TestNGContributorTest {
|
||||
|
||||
@Test
|
||||
fun smokeTest() {
|
||||
Assert.assertEquals("TestNGAsserter", kotlin.test.asserter.javaClass.simpleName)
|
||||
assertSame(TestNGAsserter, asserter)
|
||||
Assert.assertEquals(TestNGAsserter::class.java.simpleName, kotlin.test.asserter.javaClass.simpleName)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `should fail to contribute if it was run outside of testng`() {
|
||||
fun parallelThreadGetsTheSameAsserter() {
|
||||
val q = ArrayBlockingQueue<Any>(1)
|
||||
|
||||
Thread {
|
||||
q.put(kotlin.test.asserter)
|
||||
q.put(asserter)
|
||||
}.start()
|
||||
|
||||
Assert.assertEquals("DefaultAsserter", q.take().javaClass.simpleName)
|
||||
assertSame(asserter, q.take())
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user