Reducing the size of the CorDapp jars used in tests (#4600)

The helper method enclosedCordapp is a replacement to scanning the current package (which pulls in a lot more into the jar than intended).
This commit is contained in:
Shams Asari
2019-01-21 13:54:26 +00:00
committed by GitHub
parent e5d00cf85e
commit c6a7d14f4f
50 changed files with 523 additions and 495 deletions

View File

@ -25,7 +25,7 @@ import java.util.zip.ZipEntry
* disparate classes. The CorDapp metadata that's present in the MANIFEST can also be tailored.
*/
data class CustomCordapp(
val packages: Set<String>,
val packages: Set<String> = emptySet(),
val name: String = "custom-cordapp",
val versionId: Int = 1,
val targetPlatformVersion: Int = PLATFORM_VERSION,

View File

@ -28,6 +28,7 @@ import net.corda.testing.node.InMemoryMessagingNetwork
import net.corda.testing.node.TestCordapp
import net.corda.testing.node.User
import net.corda.testing.node.testContext
import org.apache.commons.lang.ClassUtils
import org.slf4j.LoggerFactory
import rx.Observable
import rx.subjects.AsyncSubject
@ -65,6 +66,13 @@ val FINANCE_WORKFLOWS_CORDAPP: TestCordappImpl = findCordapp("net.corda.finance.
@JvmField
val FINANCE_CORDAPPS: Set<TestCordappInternal> = setOf(FINANCE_CONTRACTS_CORDAPP, FINANCE_WORKFLOWS_CORDAPP)
/**
* *Custom* CorDapp containing the contents of the `net.corda.testing.contracts` package, i.e. the dummy contracts. This is not a real CorDapp
* in the way that [FINANCE_CONTRACTS_CORDAPP] and [FINANCE_WORKFLOWS_CORDAPP] are.
*/
@JvmField
val DUMMY_CONTRACTS_CORDAPP: CustomCordapp = cordappWithPackages("net.corda.testing.contracts")
fun cordappsForPackages(vararg packageNames: String): Set<CustomCordapp> = cordappsForPackages(packageNames.asList())
fun cordappsForPackages(packageNames: Iterable<String>): Set<CustomCordapp> {
@ -88,6 +96,25 @@ fun cordappForClasses(vararg classes: Class<*>): CustomCordapp = CustomCordapp(p
*/
fun findCordapp(scanPackage: String): TestCordappImpl = TestCordapp.findCordapp(scanPackage) as TestCordappImpl
/** Create a *custom* CorDapp which just contains the enclosed classes of the receiver class. */
fun Any.enclosedCordapp(): CustomCordapp {
val receiverClass = javaClass.enclosingClass ?: javaClass // In case this is called in the companion object
val classes = HashSet<Class<*>>()
receiverClass.collectEnclosedClasses(classes)
ClassUtils.getAllSuperclasses(receiverClass).forEach { (it as Class<*>).collectEnclosedClasses(classes) }
ClassUtils.getAllInterfaces(receiverClass).forEach { (it as Class<*>).collectEnclosedClasses(classes) }
require(classes.isNotEmpty()) { "${receiverClass.name} does not contain any enclosed classes to build a CorDapp out of" }
return CustomCordapp(name = receiverClass.name, classes = classes)
}
private fun Class<*>.collectEnclosedClasses(classes: MutableSet<Class<*>>) {
val enclosedClasses = declaredClasses
if (enclosedClasses.isNotEmpty() || enclosingClass != null) {
classes += this
}
enclosedClasses.forEach { it.collectEnclosedClasses(classes) }
}
private fun getCallerClass(directCallerClass: KClass<*>): Class<*>? {
val stackTrace = Throwable().stackTrace
val index = stackTrace.indexOfLast { it.className == directCallerClass.java.name }