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:
Ilya Gorbunov
2018-02-06 09:19:45 +03:00
parent 9dfa54eb62
commit 5e3edf4bd7
5 changed files with 48 additions and 71 deletions
@@ -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())
}
}
}