From 057a8d8ae9dbfa0e2ee9f62ba30fabc9f2ee12b7 Mon Sep 17 00:00:00 2001 From: Christian Sailer Date: Thu, 9 Jul 2020 15:13:20 +0100 Subject: [PATCH] NOTICK fix smoke tests and slow integration tests (#6422) * Add schema migration to smoke tests * Fix driver to work correctly for out-of-proc node with persistent database. Co-authored-by: Ross Nicoll --- .../internal/network/NetworkBootstrapper.kt | 3 +- .../registration/NodeRegistrationTest.kt | 3 +- .../testing/node/internal/DriverDSLImpl.kt | 5 ++- .../net/corda/smoketesting/NodeProcess.kt | 31 ++++++++++++++++--- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt index 7e63bda8e8..24a08aaf01 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt @@ -80,7 +80,8 @@ constructor(private val initSerEnv: Boolean, "-jar", "corda.jar", "run-migration-scripts", - "--core-schemas" + "--core-schemas", + "--app-schemas" ) private const val LOGS_DIR_NAME = "logs" diff --git a/node/src/integration-test-slow/kotlin/net/corda/node/utilities/registration/NodeRegistrationTest.kt b/node/src/integration-test-slow/kotlin/net/corda/node/utilities/registration/NodeRegistrationTest.kt index 889a4e880e..dcf2422ef5 100644 --- a/node/src/integration-test-slow/kotlin/net/corda/node/utilities/registration/NodeRegistrationTest.kt +++ b/node/src/integration-test-slow/kotlin/net/corda/node/utilities/registration/NodeRegistrationTest.kt @@ -84,7 +84,8 @@ class NodeRegistrationTest { portAllocation = portAllocation, compatibilityZone = compatibilityZone, notarySpecs = listOf(NotarySpec(notaryName)), - notaryCustomOverrides = mapOf("devMode" to false) + notaryCustomOverrides = mapOf("devMode" to false), + allowHibernateToManageAppSchema = false ) { startNode(providedName = aliceName, customOverrides = mapOf("devMode" to false)).getOrThrow() diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt index 4740a51ca6..536d5f9c6f 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt @@ -15,7 +15,6 @@ import net.corda.core.concurrent.firstOf import net.corda.core.identity.CordaX500Name import net.corda.core.internal.PLATFORM_VERSION import net.corda.core.internal.ThreadBox -import net.corda.core.internal.concurrent.doOnComplete import net.corda.core.internal.concurrent.doOnError import net.corda.core.internal.concurrent.doneFuture import net.corda.core.internal.concurrent.flatMap @@ -260,7 +259,7 @@ class DriverDSLImpl( val config = createConfig(name, parameters, p2pAddress) val registrationFuture = if (compatibilityZone?.rootCert != null) { // We don't need the network map to be available to be able to register the node - createSchema(config, false).doOnComplete { startNodeRegistration(it, compatibilityZone.rootCert, compatibilityZone.config()) } + createSchema(config, false).flatMap { startNodeRegistration(it, compatibilityZone.rootCert, compatibilityZone.config()) } } else { doneFuture(config) } @@ -536,7 +535,7 @@ class DriverDSLImpl( ): CordaFuture> { val notaryConfig = mapOf("notary" to mapOf("validating" to spec.validating)) val parameters = NodeParameters(rpcUsers = spec.rpcUsers, verifierType = spec.verifierType, customOverrides = notaryConfig + notaryCustomOverrides, maximumHeapSize = spec.maximumHeapSize) - return createSchema(createConfig(spec.name, parameters), false).doOnComplete { config -> + return createSchema(createConfig(spec.name, parameters), false).flatMap { config -> startNodeRegistration(config, rootCert, compatibilityZone.config())}.flatMap { config -> // Node registration only gives us the node CA cert, not the identity cert. That is only created on first // startup or when the node is told to just generate its node info file. We do that here. diff --git a/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt b/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt index d39d6817ea..1daa51ae94 100644 --- a/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt +++ b/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt @@ -2,19 +2,22 @@ package net.corda.smoketesting import net.corda.client.rpc.CordaRPCClient import net.corda.client.rpc.CordaRPCConnection -import net.corda.nodeapi.internal.rpc.client.AMQPClientSerializationScheme import net.corda.core.identity.Party -import net.corda.core.internal.* +import net.corda.core.internal.createDirectories +import net.corda.core.internal.deleteRecursively +import net.corda.core.internal.div +import net.corda.core.internal.toPath +import net.corda.core.internal.writeText import net.corda.core.node.NotaryInfo import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.contextLogger import net.corda.nodeapi.internal.DevIdentityGenerator import net.corda.nodeapi.internal.config.User import net.corda.nodeapi.internal.network.NetworkParametersCopier +import net.corda.nodeapi.internal.rpc.client.AMQPClientSerializationScheme import net.corda.testing.common.internal.asContextEnv import net.corda.testing.common.internal.checkNotOnClasspath import net.corda.testing.common.internal.testNetworkParameters -import java.lang.IllegalStateException import java.nio.file.Path import java.nio.file.Paths import java.time.Instant @@ -32,6 +35,7 @@ class NodeProcess( companion object { const val CORDAPPS_DIR_NAME = "cordapps" private val log = contextLogger() + private const val schemaCreationTimeOutSeconds: Long = 180 } fun connect(user: User): CordaRPCConnection { @@ -103,6 +107,7 @@ class NodeProcess( (nodeDir / "node.conf").writeText(config.toText()) createNetworkParameters(NotaryInfo(notaryParty!!, true), nodeDir) + createSchema(nodeDir) val process = startNode(nodeDir) val client = CordaRPCClient(NetworkHostAndPort("localhost", config.rpcPort)) waitForNode(process, config, client) @@ -138,9 +143,25 @@ class NodeProcess( } } - private fun startNode(nodeDir: Path): Process { + class SchemaCreationTimedOutError(nodeDir: Path) : Exception("Creating node schema timed out for $nodeDir") + class SchemaCreationFailedError(nodeDir: Path) : Exception("Creating node schema failed for $nodeDir") + + + private fun createSchema(nodeDir: Path){ + val process = startNode(nodeDir, arrayOf("run-migration-scripts", "--core-schemas", "--app-schemas")) + if (!process.waitFor(schemaCreationTimeOutSeconds, SECONDS)) { + process.destroy() + throw SchemaCreationTimedOutError(nodeDir) + } + if (process.exitValue() != 0){ + throw SchemaCreationFailedError(nodeDir) + } + } + + @Suppress("SpreadOperator") + private fun startNode(nodeDir: Path, extraArgs: Array = emptyArray()): Process { val builder = ProcessBuilder() - .command(javaPath.toString(), "-Dcapsule.log=verbose", "-jar", cordaJar.toString()) + .command(javaPath.toString(), "-Dcapsule.log=verbose", "-jar", cordaJar.toString(), *extraArgs) .directory(nodeDir.toFile()) .redirectError(ProcessBuilder.Redirect.INHERIT) .redirectOutput(ProcessBuilder.Redirect.INHERIT)