diff --git a/build.gradle b/build.gradle index 3ee87d9696..c63403d42d 100644 --- a/build.gradle +++ b/build.gradle @@ -201,11 +201,11 @@ allprojects { systemProperty(AMQP_ENABLE_PROP_NAME, System.getProperty(AMQP_ENABLE_PROP_NAME)) // relational database provider to be used by node - final DATABASE_PROVIDER = "databaseProvider" - final DATASOURCE_URL = "dataSourceProperties.dataSource.url" - final DATASOURCE_CLASSNAME = "dataSourceProperties.dataSourceClassName" - final DATASOURCE_USER = "dataSourceProperties.dataSource.user" - final DATASOURCE_PASSWORD = "dataSourceProperties.dataSource.password" + final DATABASE_PROVIDER = "custom.databaseProvider" + final DATASOURCE_URL = "corda.dataSourceProperties.dataSource.url" + final DATASOURCE_CLASSNAME = "corda.dataSourceProperties.dataSourceClassName" + final DATASOURCE_USER = "corda.dataSourceProperties.dataSource.user" + final DATASOURCE_PASSWORD = "corda.dataSourceProperties.dataSource.password" // integration testing database configuration (to be used in conjunction with a DATABASE_PROVIDER) final TEST_DB_ADMIN_USER = "test.db.admin.user" diff --git a/client/jfx/src/integration-test/kotlin/net/corda/client/jfx/NodeMonitorModelTest.kt b/client/jfx/src/integration-test/kotlin/net/corda/client/jfx/NodeMonitorModelTest.kt index e72e97f59a..ab0c4cf204 100644 --- a/client/jfx/src/integration-test/kotlin/net/corda/client/jfx/NodeMonitorModelTest.kt +++ b/client/jfx/src/integration-test/kotlin/net/corda/client/jfx/NodeMonitorModelTest.kt @@ -67,7 +67,8 @@ class NodeMonitorModelTest : IntegrationTest() { private lateinit var newNode: (CordaX500Name) -> NodeInfo companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(*listOf(ALICE_NAME, BOB_NAME, CHARLIE_NAME, DUMMY_NOTARY_NAME) .map { it.toDatabaseSchemaName() }.toTypedArray()) } diff --git a/client/rpc/src/integration-test/kotlin/net/corda/client/rpc/BlacklistKotlinClosureTest.kt b/client/rpc/src/integration-test/kotlin/net/corda/client/rpc/BlacklistKotlinClosureTest.kt index a1a0635142..d6a5bf7390 100644 --- a/client/rpc/src/integration-test/kotlin/net/corda/client/rpc/BlacklistKotlinClosureTest.kt +++ b/client/rpc/src/integration-test/kotlin/net/corda/client/rpc/BlacklistKotlinClosureTest.kt @@ -32,7 +32,8 @@ class BlacklistKotlinClosureTest : IntegrationTest() { companion object { const val EVIL: Long = 666 - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName()) } diff --git a/client/rpc/src/integration-test/kotlin/net/corda/client/rpc/CordaRPCClientTest.kt b/client/rpc/src/integration-test/kotlin/net/corda/client/rpc/CordaRPCClientTest.kt index 21897f3e7a..eec3f54f53 100644 --- a/client/rpc/src/integration-test/kotlin/net/corda/client/rpc/CordaRPCClientTest.kt +++ b/client/rpc/src/integration-test/kotlin/net/corda/client/rpc/CordaRPCClientTest.kt @@ -63,7 +63,8 @@ class CordaRPCClientTest : NodeBasedTest(listOf("net.corda.finance.contracts", C connection = client.start(username, password, externalTrace, impersonatedActor) } companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName()) } diff --git a/client/rpc/src/integration-test/kotlin/net/corda/client/rpc/FlowsExecutionModeRpcTest.kt b/client/rpc/src/integration-test/kotlin/net/corda/client/rpc/FlowsExecutionModeRpcTest.kt index 432d50ce03..1d278ad1e0 100644 --- a/client/rpc/src/integration-test/kotlin/net/corda/client/rpc/FlowsExecutionModeRpcTest.kt +++ b/client/rpc/src/integration-test/kotlin/net/corda/client/rpc/FlowsExecutionModeRpcTest.kt @@ -29,7 +29,6 @@ import net.corda.testing.driver.driver import net.corda.testing.internal.IntegrationTest import net.corda.testing.internal.IntegrationTestSchemas import net.corda.testing.internal.toDatabaseSchemaName -import net.corda.testing.internal.toDatabaseSchemaNames import net.corda.testing.internal.chooseIdentity import net.corda.testing.node.User import net.corda.testing.node.internal.NodeBasedTest @@ -42,10 +41,10 @@ import org.junit.Test class FlowsExecutionModeRpcTest : IntegrationTest() { companion object { - @ClassRule @JvmField - val databaseSchemas = IntegrationTestSchemas(*listOf(ALICE_NAME, BOB_NAME, DUMMY_BANK_A_NAME).map { it.toDatabaseSchemaNames("", "_10000", "_10003", "_10006") }.flatten().toTypedArray(), DUMMY_NOTARY_NAME.toDatabaseSchemaName()) + val databaseSchemas = IntegrationTestSchemas(*listOf(ALICE_NAME, BOB_NAME, DUMMY_BANK_A_NAME, DUMMY_NOTARY_NAME) + .map { it.toDatabaseSchemaName() }.toTypedArray()) } @Test @@ -73,6 +72,12 @@ class FlowsExecutionModeRpcTest : IntegrationTest() { class FlowsExecutionModeTests : NodeBasedTest(listOf("net.corda.finance.contracts", CashSchemaV1::class.packageName)) { + companion object { + @ClassRule + @JvmField + val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName()) + } + private val rpcUser = User("user1", "test", permissions = setOf(Permissions.all())) private lateinit var node: StartedNode private lateinit var client: CordaRPCClient diff --git a/docs/source/example-code/src/integration-test/kotlin/net/corda/docs/IntegrationTestingTutorial.kt b/docs/source/example-code/src/integration-test/kotlin/net/corda/docs/IntegrationTestingTutorial.kt index 3af028b5da..436b2707b5 100644 --- a/docs/source/example-code/src/integration-test/kotlin/net/corda/docs/IntegrationTestingTutorial.kt +++ b/docs/source/example-code/src/integration-test/kotlin/net/corda/docs/IntegrationTestingTutorial.kt @@ -38,7 +38,8 @@ import kotlin.test.assertEquals class IntegrationTestingTutorial : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), BOB_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName()) } diff --git a/docs/source/node-database.rst b/docs/source/node-database.rst index 0869c49d90..92f0a8fadd 100644 --- a/docs/source/node-database.rst +++ b/docs/source/node-database.rst @@ -60,7 +60,7 @@ Example node configuration for SQL Azure: Oracle ```````````````````````` -Corda supports Oracle 11g RC2 and Oracle 12c with ojdbc6.jar driver.. +Corda supports Oracle 11g RC2 (with ojdbc6.jar) and Oracle 12c (ojdbc8.jar). The minimum transaction isolation level ``database.transactionIsolationLevel`` is 'READ_COMMITTED'. The property ``database.schema`` is optional. diff --git a/docs/source/testing.rst b/docs/source/testing.rst index 039c3af029..1beeb1a930 100644 --- a/docs/source/testing.rst +++ b/docs/source/testing.rst @@ -43,50 +43,51 @@ TODO: Add instructions on manual testing External Database Testing ------------------------- -Integration test can be parameterised to run against any remote database (by default, integration tests use in-memory H2 instances). -For the purpose of testing other relational database providers or different database setups (for example, H2 in server mode), -we introduce an optional system property called ``databaseProvider`` which is resolved at run-time to load a configuration file on the classpath with the -name ``$databaseProvider.conf`` containing database configuration properties that override the default H2 settings -defined in the general node configuration file (see ``reference.conf``). +Integration tests can be parameterised to run against any remote database (instead of the default embeded H2 instance). + +When running Gradle task `integrationTest`, a combination of several system properties (passed as `-Dproperty=...`) can modify the node default JDBC setting and trigger a database setup before and after each test. +The property ``custom.databaseProvider`` is resolved at run-time to load a configuration file on the classpath with the +name `$custom.databaseProvider.conf` containing database configuration properties. These settings override the default H2 ones +defined in the node configuration file (see ``reference.conf``). Integration test runs predefined set of SQL setup scripts selected for a specific database provider by ``test.db.script.dir``. -SQL scripts is a template which contains standard SQL DDL statements with a ${schema} placeholder. An integration test runs the SQL scripts -for all nodes involed in the test and replaces ${schema} with appropriate value derived from node name. -SQL templates files are executed at different stage of an integration test: -``db-global-setup.sql``- before a test class (@BeforeClass), should create database users, schema and permissions -``db-setup.sql`` - before a test (@Before), should clean up/drop tables -``db-cleanup.sql` - after a test (@After), may clean up/drop tables -``db-global-cleanup.sql`` - after a test class (@AfterClass), may drop user and schema -Depends on the database providers not each SQL file is present (e.g. db-setp always deletes tabels so db-cleanp is not needed). +SQL scripts are templates which contain SQL DDL statements with the `${schema}` placeholder. +Integration tests run the script for all nodes involved in the test and replace `${schema}` with the appropriate value, derived from a node name. SQL templates files are executed at different stage of the integration test: + +- ``db-global-setup.sql``- before a test class (@BeforeClass), should create database users, schema and permissions +- ``db-setup.sql`` - before a test (@Before), should clean up/drop tables +- ``db-cleanup.sql`` - after a test (@After), may clean up/drop tables +- ``db-global-cleanup.sql`` - after a test class (@AfterClass), may drop user and schema + +Not all stages need to be present e.g. when ``db-setup.sql`` deletes all tables before a test then ``db-cleanup.sql`` after the test is not needed. The setup ensures that all nodes involved in a single integration test use different database users to achieve database separation. -The data source configuration files (denote by ``databaseProvider``) define user and schema by ${custom.nodeOrganizationName} placeholder. -At a runtime the node resolves the placeholder to its organization name. - +The configuration file (denoted by the ``custom.databaseProvider`` property) define a user and a schema as `${custom.nodeOrganizationName}` value. +The value is a placeholder which is resolved at runtime to a node organization name. To run integration tests against a remote database provide these system properties: -- ``databaseProvider`` - a template dataSource/database configuration for a node, accepted values [“integration-azure-sql”, “integration-sql-server”] +- ``custom.databaseProvider`` - the predefined configuration template for a node, the template is a name of the file under resources` folder and a switch to add JDBC driver runtime dependency, accepted values: `integration-azure-sql`, `integration-sql-server`, `integration-oracle-11`, `integration-oracle`, `integration-postgress` -- ``test.db.script.dir`` - a relative directory path with SQL script templates for a given database, - accepted values [“database-scripts/azure-sql”, “database-scripts/sql-server”] +- ``test.db.script.dir`` - the path to predefined set of SQL script templates for a given database, accepted values: `database-scripts/azure-sql`, `database-scripts/sql-server`, `database-scripts/oracle`, `database-scripts/postgress` + +- ``test.db.admin.user`` - a database user to run SQL setup scripts, the user needs to have permissions to create other users and grant them permissions -- ``test.db.admin.user`` - a database user to run SQL setup scripts, the user need to have permissions - to create other users and grant them permissions - ``test.db.admin.password`` - a password for the database user to run SQL scripts -Provided configuration file ``$databaseProvider.conf``file () contains a specific JDBC connection string with a dummy database host, - the following properties can override JDBC connection string and password: +- ``corda.dataSourceProperties.dataSource.url`` - specify full JDBC connection string use by a node to connect to database, JDBC URL provided by the predefined configuration file (by ``databaseProvider``) doesn't contain specific host names and port -- ``dataSourceProperties.dataSource.url`` - specify full JDBC connection string use by a node to connect to database +- ``corda.dataSourceProperties.dataSource.password`` - optional parameter, currently a database user password in the SQL setup script ``test.db.script.dir`` matches one in the node configuration file ``test.db.script.dir`` -- ``dataSourceProperties.dataSource.password`` - optional setup, currently SQL scripts creates users with a given hardcoded - password with matches one in node configuration -All defaults are taken from the ``reference.conf`` file. -Example running Gradle integration tests task against Azure SQL database running at ``mycordadb.database.windows.net``: -``./gradlew integrationTest -DdataSourceProperties.dataSource.url="jdbc:sqlserver://mycordadb.database.windows.net:1433;databaseName=mycordadb;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30" --DdatabaseProvider=integration-sql-azure -Dtest.db.admin.user=dbuser@mycordadb -Dtest.db.admin.password='paSSword(!' - -Dtest.db.script.dir=database-scripts/sql-azure --info`` +Example running Gradle integration tests task against Azure SQL database at `mycordadb.database.windows.net` host: + +.. code:: bash + + ./gradlew integrationTest -Dcustom.databaseProvider=integration-sql-azure \ + -Dcorda.dataSourceProperties.dataSource.url="jdbc:sqlserver://mycordadb.database.windows.net:1433;databaseName=mycordadb;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30" \ + -Dtest.db.admin.user=dbuser@mycordadb \ + -Dtest.db.admin.password='paSSword(!' \ + -Dtest.db.script.dir=database-scripts/sql-azure diff --git a/finance/src/integration-test/kotlin/net/corda/finance/flows/CashConfigDataFlowTest.kt b/finance/src/integration-test/kotlin/net/corda/finance/flows/CashConfigDataFlowTest.kt index 31d5defef5..32a2902145 100644 --- a/finance/src/integration-test/kotlin/net/corda/finance/flows/CashConfigDataFlowTest.kt +++ b/finance/src/integration-test/kotlin/net/corda/finance/flows/CashConfigDataFlowTest.kt @@ -27,7 +27,8 @@ import org.junit.Test class CashConfigDataFlowTest : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), BOB_NAME.toDatabaseSchemaName(), DUMMY_BANK_A_NAME.toDatabaseSchemaName()) } diff --git a/node/build.gradle b/node/build.gradle index aa583b1529..dd11bc270a 100644 --- a/node/build.gradle +++ b/node/build.gradle @@ -192,7 +192,7 @@ dependencies { testCompile "org.glassfish.jersey.containers:jersey-container-jetty-http:${jersey_version}" // Add runtime-only dependency on the JDBC driver for the specified DB provider (used in database integration tests) - def DB_PROVIDER = System.getProperty("databaseProvider") + def DB_PROVIDER = System.getProperty("custom.databaseProvider") switch (DB_PROVIDER) { case null: //DB provider not provided, use default H2 driver (already in the classpath) break diff --git a/node/src/integration-test/kotlin/net/corda/node/AuthDBTests.kt b/node/src/integration-test/kotlin/net/corda/node/AuthDBTests.kt index f29da55e7d..ee1c434b84 100644 --- a/node/src/integration-test/kotlin/net/corda/node/AuthDBTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/AuthDBTests.kt @@ -48,7 +48,8 @@ import kotlin.test.assertFailsWith @RunWith(Parameterized::class) class AuthDBTests : NodeBasedTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName()) private val cacheExpireAfterSecs: Long = 1 diff --git a/node/src/integration-test/kotlin/net/corda/node/BootTests.kt b/node/src/integration-test/kotlin/net/corda/node/BootTests.kt index de64ccc105..dfa637ad6b 100644 --- a/node/src/integration-test/kotlin/net/corda/node/BootTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/BootTests.kt @@ -40,7 +40,8 @@ import kotlin.test.assertEquals class BootTests : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(*listOf(ALICE_NAME, BOB_NAME, DUMMY_BANK_A_NAME, DUMMY_NOTARY_NAME) .map { it.toDatabaseSchemaName() }.toTypedArray()) } diff --git a/node/src/integration-test/kotlin/net/corda/node/CordappScanningDriverTest.kt b/node/src/integration-test/kotlin/net/corda/node/CordappScanningDriverTest.kt index 18eb3b4fa4..ee0bed08cc 100644 --- a/node/src/integration-test/kotlin/net/corda/node/CordappScanningDriverTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/CordappScanningDriverTest.kt @@ -34,7 +34,8 @@ import org.junit.Test class CordappScanningDriverTest : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), BOB_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName()) } diff --git a/node/src/integration-test/kotlin/net/corda/node/NodeKeystoreCheckTest.kt b/node/src/integration-test/kotlin/net/corda/node/NodeKeystoreCheckTest.kt index 5216847fbd..2cca572d40 100644 --- a/node/src/integration-test/kotlin/net/corda/node/NodeKeystoreCheckTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/NodeKeystoreCheckTest.kt @@ -32,7 +32,8 @@ import javax.security.auth.x500.X500Principal class NodeKeystoreCheckTest : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName()) } diff --git a/node/src/integration-test/kotlin/net/corda/node/NodeStartupPerformanceTests.kt b/node/src/integration-test/kotlin/net/corda/node/NodeStartupPerformanceTests.kt index 1292a541db..f6f150fb14 100644 --- a/node/src/integration-test/kotlin/net/corda/node/NodeStartupPerformanceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/NodeStartupPerformanceTests.kt @@ -28,7 +28,8 @@ import java.util.concurrent.TimeUnit @Ignore("Only use locally") class NodeStartupPerformanceTests : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(*listOf(ALICE_NAME, BOB_NAME, DUMMY_BANK_A_NAME, DUMMY_NOTARY_NAME) .map { it.toDatabaseSchemaName() }.toTypedArray()) } diff --git a/node/src/integration-test/kotlin/net/corda/node/NodeUnloadHandlerTests.kt b/node/src/integration-test/kotlin/net/corda/node/NodeUnloadHandlerTests.kt index 7c1d63525d..7b4264b6a6 100644 --- a/node/src/integration-test/kotlin/net/corda/node/NodeUnloadHandlerTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/NodeUnloadHandlerTests.kt @@ -29,7 +29,8 @@ import java.util.concurrent.TimeUnit class NodeUnloadHandlerTests : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(DUMMY_BANK_A_NAME.toDatabaseSchemaName()) val latch = CountDownLatch(1) } diff --git a/node/src/integration-test/kotlin/net/corda/node/modes/draining/P2PFlowsDrainingModeTest.kt b/node/src/integration-test/kotlin/net/corda/node/modes/draining/P2PFlowsDrainingModeTest.kt index 370ada422c..069905e3d0 100644 --- a/node/src/integration-test/kotlin/net/corda/node/modes/draining/P2PFlowsDrainingModeTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/modes/draining/P2PFlowsDrainingModeTest.kt @@ -23,22 +23,30 @@ import net.corda.core.utilities.getOrThrow import net.corda.core.utilities.loggerFor import net.corda.core.utilities.unwrap import net.corda.node.services.Permissions -import net.corda.testing.core.singleIdentity +import net.corda.testing.core.* import net.corda.testing.driver.DriverParameters import net.corda.testing.driver.PortAllocation import net.corda.testing.driver.driver +import net.corda.testing.internal.IntegrationTest +import net.corda.testing.internal.IntegrationTestSchemas +import net.corda.testing.internal.toDatabaseSchemaName import net.corda.testing.node.User import org.assertj.core.api.AssertionsForInterfaceTypes.assertThat -import org.junit.After -import org.junit.Before -import org.junit.Ignore -import org.junit.Test +import org.junit.* import java.util.concurrent.Executors import java.util.concurrent.ScheduledExecutorService import java.util.concurrent.TimeUnit import kotlin.test.fail -class P2PFlowsDrainingModeTest { +class P2PFlowsDrainingModeTest : IntegrationTest() { + companion object { + @ClassRule + @JvmField + val databaseSchemas = IntegrationTestSchemas(*listOf(ALICE_NAME, BOB_NAME, DUMMY_BANK_A_NAME, DUMMY_NOTARY_NAME) + .map { it.toDatabaseSchemaName() }.toTypedArray()) + + private val logger = loggerFor() + } private val portAllocation = PortAllocation.Incremental(10000) private val user = User("mark", "dadada", setOf(Permissions.all())) @@ -46,10 +54,6 @@ class P2PFlowsDrainingModeTest { private var executor: ScheduledExecutorService? = null - companion object { - private val logger = loggerFor() - } - @Before fun setup() { executor = Executors.newSingleThreadScheduledExecutor() @@ -64,8 +68,8 @@ class P2PFlowsDrainingModeTest { fun `flows draining mode suspends consumption of initial session messages`() { driver(DriverParameters(isDebug = true, startNodesInProcess = true, portAllocation = portAllocation)) { - val initiatedNode = startNode().getOrThrow() - val initiating = startNode(rpcUsers = users).getOrThrow().rpc + val initiatedNode = startNode(providedName = ALICE_NAME).getOrThrow() + val initiating = startNode(rpcUsers = users, providedName = BOB_NAME).getOrThrow().rpc val counterParty = initiatedNode.nodeInfo.singleIdentity() val initiated = initiatedNode.rpc diff --git a/node/src/integration-test/kotlin/net/corda/node/modes/draining/RpcFlowsDrainingModeTest.kt b/node/src/integration-test/kotlin/net/corda/node/modes/draining/RpcFlowsDrainingModeTest.kt index 16fb6eb776..cf937d40c3 100644 --- a/node/src/integration-test/kotlin/net/corda/node/modes/draining/RpcFlowsDrainingModeTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/modes/draining/RpcFlowsDrainingModeTest.kt @@ -17,15 +17,26 @@ import net.corda.core.messaging.startFlow import net.corda.core.utilities.getOrThrow import net.corda.node.services.Permissions import net.corda.nodeapi.exceptions.RejectedCommandException +import net.corda.testing.core.* import net.corda.testing.driver.DriverParameters import net.corda.testing.driver.PortAllocation import net.corda.testing.driver.driver +import net.corda.testing.internal.IntegrationTest +import net.corda.testing.internal.IntegrationTestSchemas +import net.corda.testing.internal.toDatabaseSchemaName import net.corda.testing.node.User import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.catchThrowable +import org.junit.ClassRule import org.junit.Test -class RpcFlowsDrainingModeTest { +class RpcFlowsDrainingModeTest : IntegrationTest() { + companion object { + @ClassRule + @JvmField + val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), BOB_NAME.toDatabaseSchemaName(), + DUMMY_BANK_A_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName()) + } private val portAllocation = PortAllocation.Incremental(10000) private val user = User("mark", "dadada", setOf(Permissions.all())) diff --git a/node/src/integration-test/kotlin/net/corda/node/services/AttachmentLoadingTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/AttachmentLoadingTests.kt index 2485739238..8f60bb8262 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/AttachmentLoadingTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/AttachmentLoadingTests.kt @@ -58,7 +58,8 @@ class AttachmentLoadingTests : IntegrationTest() { private val appContext get() = provider.getAppContext(cordapp) private companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(DUMMY_BANK_A_NAME.toDatabaseSchemaName(), DUMMY_BANK_B_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName()) diff --git a/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt index d7e65263cc..2d2d1cf558 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt @@ -56,7 +56,8 @@ import kotlin.test.assertTrue class BFTNotaryServiceTests : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas("node_0", "node_1", "node_2", "node_3", "node_4", "node_5", "node_6", "node_7", "node_8", "node_9") } diff --git a/node/src/integration-test/kotlin/net/corda/node/services/DistributedServiceTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/DistributedServiceTests.kt index dffea61eb1..c83010727d 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/DistributedServiceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/DistributedServiceTests.kt @@ -49,7 +49,8 @@ class DistributedServiceTests : IntegrationTest() { private lateinit var raftNotaryIdentity: Party private lateinit var notaryStateMachines: Observable> companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(*DUMMY_NOTARY_NAME.toDatabaseSchemaNames("_0", "_1", "_2").toTypedArray(), ALICE_NAME.toDatabaseSchemaName()) } diff --git a/node/src/integration-test/kotlin/net/corda/node/services/MySQLNotaryServiceTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/MySQLNotaryServiceTests.kt index 8c29a01b17..229cfa90bb 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/MySQLNotaryServiceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/MySQLNotaryServiceTests.kt @@ -51,7 +51,8 @@ import kotlin.test.assertFailsWith class MySQLNotaryServiceTests : IntegrationTest() { companion object { val notaryName = CordaX500Name("MySQL Notary Service", "Zurich", "CH") - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas("node_0", "node_1", "node_2") } diff --git a/node/src/integration-test/kotlin/net/corda/node/services/RaftNotaryServiceTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/RaftNotaryServiceTests.kt index 6e678d2c19..fbdde16e6d 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/RaftNotaryServiceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/RaftNotaryServiceTests.kt @@ -40,7 +40,8 @@ import kotlin.test.assertFailsWith class RaftNotaryServiceTests : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas("RAFTNotaryService_0", "RAFTNotaryService_1", "RAFTNotaryService_2", DUMMY_BANK_A_NAME.toDatabaseSchemaName()) } diff --git a/node/src/integration-test/kotlin/net/corda/node/services/network/NetworkMapTest.kt b/node/src/integration-test/kotlin/net/corda/node/services/network/NetworkMapTest.kt index 5252804fe1..9ff2bcd0a1 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/network/NetworkMapTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/network/NetworkMapTest.kt @@ -44,7 +44,8 @@ import kotlin.test.assertEquals class NetworkMapTest : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), BOB_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName()) } diff --git a/node/src/integration-test/kotlin/net/corda/node/services/network/PersistentNetworkMapCacheTest.kt b/node/src/integration-test/kotlin/net/corda/node/services/network/PersistentNetworkMapCacheTest.kt index 14be0d0139..67a13063fd 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/network/PersistentNetworkMapCacheTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/network/PersistentNetworkMapCacheTest.kt @@ -35,7 +35,8 @@ class PersistentNetworkMapCacheTest : NodeBasedTest() { val BOB = TestIdentity(BOB_NAME, 80).party val DUMMY_REGULATOR = TestIdentity(CordaX500Name("Regulator A", "Paris", "FR"), 100).party - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(DUMMY_REGULATOR.name.toDatabaseSchemaName(), ALICE.name.toDatabaseSchemaName(), BOB.name.toDatabaseSchemaName()) } diff --git a/node/src/integration-test/kotlin/net/corda/node/services/rpc/RpcSslTest.kt b/node/src/integration-test/kotlin/net/corda/node/services/rpc/RpcSslTest.kt index 71f1ffab1d..a53fa227f2 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/rpc/RpcSslTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/rpc/RpcSslTest.kt @@ -35,7 +35,8 @@ import org.junit.Test class RpcSslTest : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(*listOf(ALICE_NAME, BOB_NAME, DUMMY_BANK_A_NAME, DUMMY_NOTARY_NAME) .map { it.toDatabaseSchemaName() }.toTypedArray()) } diff --git a/node/src/integration-test/kotlin/net/corda/node/services/statemachine/FlowVersioningTest.kt b/node/src/integration-test/kotlin/net/corda/node/services/statemachine/FlowVersioningTest.kt index 432940fc85..3936f77d5a 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/statemachine/FlowVersioningTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/statemachine/FlowVersioningTest.kt @@ -30,7 +30,8 @@ import org.junit.Test class FlowVersioningTest : NodeBasedTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), BOB_NAME.toDatabaseSchemaName()) } diff --git a/node/src/integration-test/kotlin/net/corda/node/services/statemachine/LargeTransactionsTest.kt b/node/src/integration-test/kotlin/net/corda/node/services/statemachine/LargeTransactionsTest.kt index a06319fa32..30ef8aea5b 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/statemachine/LargeTransactionsTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/statemachine/LargeTransactionsTest.kt @@ -43,7 +43,8 @@ class LargeTransactionsTest : IntegrationTest() { companion object { val BOB = TestIdentity(BOB_NAME, 80).party val DUMMY_NOTARY = TestIdentity(DUMMY_NOTARY_NAME, 20).party - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), BOB_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName()) } diff --git a/node/src/integration-test/kotlin/net/corda/node/services/vault/VaultQueryIntegrationTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/vault/VaultQueryIntegrationTests.kt index 5716a6a758..278cb6c2c9 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/vault/VaultQueryIntegrationTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/vault/VaultQueryIntegrationTests.kt @@ -37,7 +37,8 @@ class VaultQueryIntegrationTests : VaultQueryTests() { companion object { val MEGA_CORP = TestIdentity(CordaX500Name("MegaCorp", "London", "GB")).name - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(MEGA_CORP.toDatabaseSchemaName()) @BeforeClass diff --git a/node/src/integration-test/kotlin/net/corda/node/utilities/registration/NodeRegistrationTest.kt b/node/src/integration-test/kotlin/net/corda/node/utilities/registration/NodeRegistrationTest.kt index cb1d633200..189dda5fb5 100644 --- a/node/src/integration-test/kotlin/net/corda/node/utilities/registration/NodeRegistrationTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/utilities/registration/NodeRegistrationTest.kt @@ -55,7 +55,8 @@ import javax.ws.rs.core.Response class NodeRegistrationTest : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas("NotaryService", "Alice", "Genevieve") private val notaryName = CordaX500Name("NotaryService", "Zurich", "CH") diff --git a/node/src/integration-test/kotlin/net/corda/services/messaging/MQSecurityTest.kt b/node/src/integration-test/kotlin/net/corda/services/messaging/MQSecurityTest.kt index 426e7b270b..c415e25208 100644 --- a/node/src/integration-test/kotlin/net/corda/services/messaging/MQSecurityTest.kt +++ b/node/src/integration-test/kotlin/net/corda/services/messaging/MQSecurityTest.kt @@ -54,7 +54,8 @@ import kotlin.test.assertEquals */ abstract class MQSecurityTest : NodeBasedTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), BOB_NAME.toDatabaseSchemaName()) } diff --git a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt index 6622b3b45d..7608b10765 100644 --- a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt +++ b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt @@ -48,7 +48,8 @@ import java.util.concurrent.atomic.AtomicInteger class P2PMessagingTest : IntegrationTest() { private companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), "DistributedService_0", "DistributedService_1") val DISTRIBUTED_SERVICE_NAME = CordaX500Name("DistributedService", "London", "GB") diff --git a/node/src/integration-test/kotlin/net/corda/test/node/NodeStatePersistenceTests.kt b/node/src/integration-test/kotlin/net/corda/test/node/NodeStatePersistenceTests.kt index 83f6ff4bf0..ef0bc88694 100644 --- a/node/src/integration-test/kotlin/net/corda/test/node/NodeStatePersistenceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/test/node/NodeStatePersistenceTests.kt @@ -50,7 +50,8 @@ import kotlin.test.assertNotNull class NodeStatePersistenceTests : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(*listOf(ALICE_NAME, BOB_NAME, DUMMY_BANK_A_NAME, DUMMY_NOTARY_NAME) .map { it.toDatabaseSchemaName() }.toTypedArray()) } diff --git a/node/src/integration-test/kotlin/net/corda/test/node/NodeSuspendAndResumeTest.kt b/node/src/integration-test/kotlin/net/corda/test/node/NodeSuspendAndResumeTest.kt index 0aefc81211..f637bdd26c 100644 --- a/node/src/integration-test/kotlin/net/corda/test/node/NodeSuspendAndResumeTest.kt +++ b/node/src/integration-test/kotlin/net/corda/test/node/NodeSuspendAndResumeTest.kt @@ -27,17 +27,27 @@ import net.corda.node.internal.Node import net.corda.node.services.Permissions import net.corda.node.services.messaging.P2PMessagingClient import net.corda.testing.core.ALICE_NAME +import net.corda.testing.core.DUMMY_NOTARY_NAME +import net.corda.testing.internal.IntegrationTestSchemas +import net.corda.testing.internal.toDatabaseSchemaName import net.corda.testing.node.User import net.corda.testing.node.internal.NodeBasedTest import org.apache.activemq.artemis.api.core.ActiveMQNotConnectedException import org.apache.activemq.artemis.api.core.ActiveMQSecurityException import org.assertj.core.api.Assertions +import org.junit.ClassRule import org.junit.Test import java.util.* import kotlin.concurrent.thread import kotlin.test.assertEquals class NodeSuspendAndResumeTest : NodeBasedTest(listOf("net.corda.finance.contracts", CashSchemaV1::class.packageName)) { + companion object { + @ClassRule + @JvmField + val databaseSchemas = IntegrationTestSchemas(*listOf(ALICE_NAME, DUMMY_NOTARY_NAME) + .map { it.toDatabaseSchemaName() }.toTypedArray()) + } private val rpcUser = User("user1", "test", permissions = setOf( Permissions.startFlow(), diff --git a/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt b/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt index 83945a921f..9307205dea 100644 --- a/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt +++ b/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt @@ -44,7 +44,7 @@ object ConfigHelper { val parseOptions = ConfigParseOptions.defaults() val defaultConfig = ConfigFactory.parseResources("reference.conf", parseOptions.setAllowMissing(false)) val appConfig = ConfigFactory.parseFile(configFile.toFile(), parseOptions.setAllowMissing(allowMissingConfig)) - val databaseConfig = ConfigFactory.parseResources(System.getProperty("databaseProvider")+".conf", parseOptions.setAllowMissing(true)) + val databaseConfig = ConfigFactory.parseResources(System.getProperty("custom.databaseProvider")+".conf", parseOptions.setAllowMissing(true)) val systemOverrides = systemProperties().cordaEntriesOnly() val environmentOverrides = systemEnvironment().cordaEntriesOnly() diff --git a/node/src/main/resources/migration/node-core.changelog-master.xml b/node/src/main/resources/migration/node-core.changelog-master.xml index 2ffe137789..2ef60795b7 100644 --- a/node/src/main/resources/migration/node-core.changelog-master.xml +++ b/node/src/main/resources/migration/node-core.changelog-master.xml @@ -15,5 +15,6 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> + diff --git a/node/src/main/resources/migration/node-core.changelog-v3.xml b/node/src/main/resources/migration/node-core.changelog-v3.xml new file mode 100644 index 0000000000..dc2761a97c --- /dev/null +++ b/node/src/main/resources/migration/node-core.changelog-v3.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/node/src/main/resources/migration/vault-schema.changelog-master.xml b/node/src/main/resources/migration/vault-schema.changelog-master.xml index 57619f5468..ae0c268e9e 100644 --- a/node/src/main/resources/migration/vault-schema.changelog-master.xml +++ b/node/src/main/resources/migration/vault-schema.changelog-master.xml @@ -15,5 +15,6 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> + diff --git a/node/src/main/resources/migration/vault-schema.changelog-v3.xml b/node/src/main/resources/migration/vault-schema.changelog-v3.xml new file mode 100644 index 0000000000..65a2707423 --- /dev/null +++ b/node/src/main/resources/migration/vault-schema.changelog-v3.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + diff --git a/perftestcordapp/src/integrationTest/kotlin/com/r3/corda/enterprise/perftestcordapp/NodePerformanceTests.kt b/perftestcordapp/src/integrationTest/kotlin/com/r3/corda/enterprise/perftestcordapp/NodePerformanceTests.kt index 5f45a63930..a9433946d5 100644 --- a/perftestcordapp/src/integrationTest/kotlin/com/r3/corda/enterprise/perftestcordapp/NodePerformanceTests.kt +++ b/perftestcordapp/src/integrationTest/kotlin/com/r3/corda/enterprise/perftestcordapp/NodePerformanceTests.kt @@ -51,7 +51,8 @@ import java.util.concurrent.TimeUnit class NodePerformanceTests : IntegrationTest() { companion object { val ALICE = TestIdentity(ALICE_NAME, 70).party - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(*DUMMY_NOTARY_NAME.toDatabaseSchemaNames("_0", "_1", "_2").toTypedArray(), DUMMY_BANK_A_NAME.toDatabaseSchemaName()) } diff --git a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaCordformTest.kt b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaCordformTest.kt index 2c49d66713..07dd9bf4fa 100644 --- a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaCordformTest.kt +++ b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaCordformTest.kt @@ -20,7 +20,8 @@ import org.junit.Test class BankOfCordaCordformTest : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas("NotaryService", "BankOfCorda", BIGCORP_NAME.organisation) } diff --git a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt index ec279b19da..ee4ab7bb84 100644 --- a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt +++ b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt @@ -34,7 +34,8 @@ import org.junit.Test class BankOfCordaRPCClientTest : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(BOC_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName(), BIGCORP_NAME.organisation) } diff --git a/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt b/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt index 21aff309c8..9fd0c4740d 100644 --- a/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt +++ b/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt @@ -56,7 +56,8 @@ class IRSDemoTest : IntegrationTest() { companion object { private val log = contextLogger() - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(DUMMY_BANK_A_NAME.toDatabaseSchemaName(), DUMMY_BANK_B_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName(), "Regulator") } diff --git a/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt b/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt index 0f8f6d6841..67177b37ed 100644 --- a/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt +++ b/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt @@ -40,7 +40,8 @@ class SimmValuationTest : IntegrationTest() { val nodeBLegalName = DUMMY_BANK_B_NAME val testTradeId = "trade1" - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(*listOf(DUMMY_BANK_A_NAME, DUMMY_BANK_B_NAME, DUMMY_NOTARY_NAME) .map { it.toDatabaseSchemaName() }.toTypedArray()) } diff --git a/testing/node-driver/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt b/testing/node-driver/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt index a4f94f473b..6b5302e8f9 100644 --- a/testing/node-driver/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt +++ b/testing/node-driver/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt @@ -58,7 +58,8 @@ class DriverTests : IntegrationTest() { addressMustNotBeBound(executorService, hostAndPort) } - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(DUMMY_BANK_A_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName(), DUMMY_REGULATOR_NAME.toDatabaseSchemaName()) } diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt index f6d5e22528..db43d527df 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt @@ -34,6 +34,7 @@ import net.corda.node.internal.cordapp.CordappLoader import net.corda.node.services.api.SchemaService import net.corda.node.services.api.VaultServiceInternal import net.corda.node.services.api.WritableTransactionStorage +import net.corda.node.services.config.ConfigHelper import net.corda.node.services.config.configOf import net.corda.node.services.config.parseToDbSchemaFriendlyName import net.corda.node.services.identity.InMemoryIdentityService @@ -330,14 +331,12 @@ fun databaseProviderDataSourceConfig(nodeName: String? = null, postfix: String? val parseOptions = ConfigParseOptions.defaults() //read overrides from command line (passed by Gradle as system properties) - val dataSourceKeys = listOf(DATA_SOURCE_URL, DATA_SOURCE_CLASSNAME, DATA_SOURCE_USER, DATA_SOURCE_PASSWORD) - val dataSourceSystemProperties = Properties() - val allSystemProperties = System.getProperties().toList().map { it.first.toString() to it.second.toString() }.toMap() - dataSourceKeys.filter { allSystemProperties.containsKey(it) }.forEach { dataSourceSystemProperties.setProperty(it, allSystemProperties[it]) } - val systemConfigOverride = ConfigFactory.parseProperties(dataSourceSystemProperties, parseOptions) + val systemConfigOverride = ConfigFactory.parseMap(System.getProperties().filterKeys { (it as String).startsWith(ConfigHelper.CORDA_PROPERTY_PREFIX) } + .mapKeys { (it.key as String).removePrefix(ConfigHelper.CORDA_PROPERTY_PREFIX) } + .filterKeys { listOf(DATA_SOURCE_URL, DATA_SOURCE_CLASSNAME, DATA_SOURCE_USER, DATA_SOURCE_PASSWORD).contains(it) }) //read from db vendor specific configuration file - val databaseConfig = ConfigFactory.parseResources(System.getProperty("databaseProvider") + ".conf", parseOptions.setAllowMissing(true)) + val databaseConfig = ConfigFactory.parseResources(System.getProperty("custom.databaseProvider") + ".conf", parseOptions.setAllowMissing(true)) val fixedOverride = ConfigFactory.parseString("baseDirectory = \"\"") //implied property custom.nodeOrganizationName to fill the potential placeholders in db schema/ db user properties diff --git a/testing/test-utils/src/main/kotlin/net/corda/testing/database/DbScriptRunner.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/database/DbScriptRunner.kt index 1784d01db3..be8c113294 100644 --- a/testing/test-utils/src/main/kotlin/net/corda/testing/database/DbScriptRunner.kt +++ b/testing/test-utils/src/main/kotlin/net/corda/testing/database/DbScriptRunner.kt @@ -11,8 +11,8 @@ package net.corda.testing.database import com.typesafe.config.ConfigFactory -import com.typesafe.config.ConfigParseOptions import net.corda.core.utilities.loggerFor +import net.corda.node.services.config.ConfigHelper import net.corda.testing.database.DatabaseConstants.DATA_SOURCE_CLASSNAME import net.corda.testing.database.DatabaseConstants.DATA_SOURCE_PASSWORD import net.corda.testing.database.DatabaseConstants.DATA_SOURCE_URL @@ -25,7 +25,6 @@ import org.springframework.util.StringUtils import java.sql.Connection import java.sql.SQLException import java.sql.SQLWarning -import java.util.* object DbScriptRunner { private val logger = loggerFor() @@ -34,22 +33,25 @@ object DbScriptRunner { private const val TEST_DB_ADMIN_USER = "test.db.admin.user" private const val TEST_DB_ADMIN_PASSWORD = "test.db.admin.password" - private fun createDataSource(dbProvider: String) : DriverManagerDataSource { - val parseOptions = ConfigParseOptions.defaults() - val allSystemProperties = System.getProperties().toList().map { it.first.toString() to it.second.toString() }.toMap() - val dataSourceSystemProperties = Properties() - val dataSourceKeys = listOf(TEST_DB_ADMIN_USER, TEST_DB_ADMIN_PASSWORD, DATA_SOURCE_URL, DATA_SOURCE_CLASSNAME, - DATA_SOURCE_USER, DATA_SOURCE_PASSWORD) - dataSourceKeys.filter { allSystemProperties.containsKey(it) }.forEach { dataSourceSystemProperties.setProperty(it, allSystemProperties[it]) } - val databaseConfig = ConfigFactory.parseProperties(dataSourceSystemProperties, parseOptions) - .withFallback(ConfigFactory.parseResources("$dbProvider.conf", parseOptions.setAllowMissing(false))) + private fun createDataSource(dbProvider: String): DriverManagerDataSource { - val dataSource = DriverManagerDataSource() - dataSource.setDriverClassName(databaseConfig.getString(DATA_SOURCE_CLASSNAME)) - dataSource.url = databaseConfig.getString(DATA_SOURCE_URL) - dataSource.username = databaseConfig.getString(TEST_DB_ADMIN_USER) - dataSource.password = databaseConfig.getString(TEST_DB_ADMIN_PASSWORD) - return dataSource + val cordaConfigs = ConfigFactory.parseMap(System.getProperties().filterKeys { (it as String).startsWith(ConfigHelper.CORDA_PROPERTY_PREFIX) } + .mapKeys { (it.key as String).removePrefix(ConfigHelper.CORDA_PROPERTY_PREFIX) } + .filterKeys { listOf(DATA_SOURCE_URL, DATA_SOURCE_CLASSNAME, DATA_SOURCE_USER, DATA_SOURCE_PASSWORD).contains(it) }) + + val testConfigs = ConfigFactory.parseMap(System.getProperties().filterKeys { listOf(TEST_DB_ADMIN_USER, TEST_DB_ADMIN_PASSWORD).contains(it) } + .mapKeys { (it.key as String) }) + + val databaseConfig = cordaConfigs + .withFallback(testConfigs) + .withFallback(ConfigFactory.parseResources("$dbProvider.conf")) + + return (DriverManagerDataSource()).also { + it.setDriverClassName(databaseConfig.getString(DATA_SOURCE_CLASSNAME)) + it.url = databaseConfig.getString(DATA_SOURCE_URL) + it.username = databaseConfig.getString(TEST_DB_ADMIN_USER) + it.password = databaseConfig.getString(TEST_DB_ADMIN_PASSWORD) + } } fun runDbScript(dbProvider: String, initScript: String? = null, databaseSchemas: List = emptyList()) { @@ -70,7 +72,7 @@ object DbScriptRunner { scripts.map { it.replace("\${schema}", schema) } fun merge(scripts: List, schemas: List): List = - if(schemas.isEmpty()) scripts else schemas.map { merge(scripts, it) }.flatten() + if (schemas.isEmpty()) scripts else schemas.map { merge(scripts, it) }.flatten() } //rewritten version of org.springframework.jdbc.datasource.init.ResourceDatabasePopulator diff --git a/testing/test-utils/src/main/kotlin/net/corda/testing/internal/IntegrationTest.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/internal/IntegrationTest.kt index 70eb758922..f25e5a2bef 100644 --- a/testing/test-utils/src/main/kotlin/net/corda/testing/internal/IntegrationTest.kt +++ b/testing/test-utils/src/main/kotlin/net/corda/testing/internal/IntegrationTest.kt @@ -29,7 +29,7 @@ abstract class IntegrationTest { // dataSource.password = [PASSWORD] // where [PASSWORD] must be the same for all ${custom.nodeOrganizationName} companion object { - private val DATABASE_PROVIDER = "databaseProvider" + private val DATABASE_PROVIDER = "custom.databaseProvider" private val dbProvider = System.getProperty(DATABASE_PROVIDER, "") private val TEST_DB_SCRIPT_DIR = "test.db.script.dir" private val testDbScriptDir = System.getProperty(TEST_DB_SCRIPT_DIR, "database-scripts") diff --git a/testing/test-utils/src/main/resources/database-scripts/azure-sql/db-global-cleanup.sql b/testing/test-utils/src/main/resources/database-scripts/azure-sql/db-global-cleanup.sql index bfd9d28209..70cefb78e2 100644 --- a/testing/test-utils/src/main/resources/database-scripts/azure-sql/db-global-cleanup.sql +++ b/testing/test-utils/src/main/resources/database-scripts/azure-sql/db-global-cleanup.sql @@ -4,6 +4,7 @@ DROP TABLE IF EXISTS ${schema}.cp_states_v2_participants; DROP TABLE IF EXISTS ${schema}.dummy_linear_state_parts; DROP TABLE IF EXISTS ${schema}.dummy_linear_states_v2_parts; DROP TABLE IF EXISTS ${schema}.dummy_deal_states_parts; +DROP TABLE IF EXISTS ${schema}.node_attchments_contracts; DROP TABLE IF EXISTS ${schema}.node_attachments; DROP TABLE IF EXISTS ${schema}.node_checkpoints; DROP TABLE IF EXISTS ${schema}.node_transactions; @@ -32,6 +33,7 @@ DROP TABLE IF EXISTS ${schema}.cp_states; DROP TABLE IF EXISTS ${schema}.node_contract_upgrades; DROP TABLE IF EXISTS ${schema}.node_identities; DROP TABLE IF EXISTS ${schema}.node_named_identities; +DROP TABLE IF EXISTS ${schema}.node_properties; DROP TABLE IF EXISTS ${schema}.children; DROP TABLE IF EXISTS ${schema}.parents; DROP TABLE IF EXISTS ${schema}.contract_cash_states; diff --git a/testing/test-utils/src/main/resources/database-scripts/azure-sql/db-setup.sql b/testing/test-utils/src/main/resources/database-scripts/azure-sql/db-setup.sql index 1a50f9c050..8fdbeb198b 100644 --- a/testing/test-utils/src/main/resources/database-scripts/azure-sql/db-setup.sql +++ b/testing/test-utils/src/main/resources/database-scripts/azure-sql/db-setup.sql @@ -4,6 +4,7 @@ DROP TABLE IF EXISTS ${schema}.cp_states_v2_participants; DROP TABLE IF EXISTS ${schema}.dummy_linear_state_parts; DROP TABLE IF EXISTS ${schema}.dummy_linear_states_v2_parts; DROP TABLE IF EXISTS ${schema}.dummy_deal_states_parts; +DROP TABLE IF EXISTS ${schema}.node_attchments_contracts; DROP TABLE IF EXISTS ${schema}.node_attachments; DROP TABLE IF EXISTS ${schema}.node_checkpoints; DROP TABLE IF EXISTS ${schema}.node_transactions; @@ -32,6 +33,7 @@ DROP TABLE IF EXISTS ${schema}.cp_states; DROP TABLE IF EXISTS ${schema}.node_contract_upgrades; DROP TABLE IF EXISTS ${schema}.node_identities; DROP TABLE IF EXISTS ${schema}.node_named_identities; +DROP TABLE IF EXISTS ${schema}.node_properties; DROP TABLE IF EXISTS ${schema}.children; DROP TABLE IF EXISTS ${schema}.parents; DROP TABLE IF EXISTS ${schema}.contract_cash_states; diff --git a/testing/test-utils/src/main/resources/database-scripts/sql-server/db-global-cleanup.sql b/testing/test-utils/src/main/resources/database-scripts/sql-server/db-global-cleanup.sql index 2ec1694431..7d517ee0b0 100644 --- a/testing/test-utils/src/main/resources/database-scripts/sql-server/db-global-cleanup.sql +++ b/testing/test-utils/src/main/resources/database-scripts/sql-server/db-global-cleanup.sql @@ -4,6 +4,7 @@ DROP TABLE IF EXISTS ${schema}.cp_states_v2_participants; DROP TABLE IF EXISTS ${schema}.dummy_linear_state_parts; DROP TABLE IF EXISTS ${schema}.dummy_linear_states_v2_parts; DROP TABLE IF EXISTS ${schema}.dummy_deal_states_parts; +DROP TABLE IF EXISTS ${schema}.node_attchments_contracts; DROP TABLE IF EXISTS ${schema}.node_attachments; DROP TABLE IF EXISTS ${schema}.node_checkpoints; DROP TABLE IF EXISTS ${schema}.node_transactions; @@ -32,6 +33,7 @@ DROP TABLE IF EXISTS ${schema}.cp_states; DROP TABLE IF EXISTS ${schema}.node_contract_upgrades; DROP TABLE IF EXISTS ${schema}.node_identities; DROP TABLE IF EXISTS ${schema}.node_named_identities; +DROP TABLE IF EXISTS ${schema}.node_properties; DROP TABLE IF EXISTS ${schema}.children; DROP TABLE IF EXISTS ${schema}.parents; DROP TABLE IF EXISTS ${schema}.contract_cash_states; diff --git a/testing/test-utils/src/main/resources/database-scripts/sql-server/db-global-setup.sql b/testing/test-utils/src/main/resources/database-scripts/sql-server/db-global-setup.sql index 499c7df9ca..2af01ff5a7 100644 --- a/testing/test-utils/src/main/resources/database-scripts/sql-server/db-global-setup.sql +++ b/testing/test-utils/src/main/resources/database-scripts/sql-server/db-global-setup.sql @@ -4,6 +4,7 @@ DROP TABLE IF EXISTS ${schema}.cp_states_v2_participants; DROP TABLE IF EXISTS ${schema}.dummy_linear_state_parts; DROP TABLE IF EXISTS ${schema}.dummy_linear_states_v2_parts; DROP TABLE IF EXISTS ${schema}.dummy_deal_states_parts; +DROP TABLE IF EXISTS ${schema}.node_attchments_contracts; DROP TABLE IF EXISTS ${schema}.node_attachments; DROP TABLE IF EXISTS ${schema}.node_checkpoints; DROP TABLE IF EXISTS ${schema}.node_transactions; @@ -32,6 +33,7 @@ DROP TABLE IF EXISTS ${schema}.cp_states; DROP TABLE IF EXISTS ${schema}.node_contract_upgrades; DROP TABLE IF EXISTS ${schema}.node_identities; DROP TABLE IF EXISTS ${schema}.node_named_identities; +DROP TABLE IF EXISTS ${schema}.node_properties; DROP TABLE IF EXISTS ${schema}.children; DROP TABLE IF EXISTS ${schema}.parents; DROP TABLE IF EXISTS ${schema}.contract_cash_states; diff --git a/testing/test-utils/src/main/resources/database-scripts/sql-server/db-setup.sql b/testing/test-utils/src/main/resources/database-scripts/sql-server/db-setup.sql index b9dddc02fe..91f5d005f3 100644 --- a/testing/test-utils/src/main/resources/database-scripts/sql-server/db-setup.sql +++ b/testing/test-utils/src/main/resources/database-scripts/sql-server/db-setup.sql @@ -4,6 +4,7 @@ DROP TABLE IF EXISTS ${schema}.cp_states_v2_participants; DROP TABLE IF EXISTS ${schema}.dummy_linear_state_parts; DROP TABLE IF EXISTS ${schema}.dummy_linear_states_v2_parts; DROP TABLE IF EXISTS ${schema}.dummy_deal_states_parts; +DROP TABLE IF EXISTS ${schema}.node_attchments_contracts; DROP TABLE IF EXISTS ${schema}.node_attachments; DROP TABLE IF EXISTS ${schema}.node_checkpoints; DROP TABLE IF EXISTS ${schema}.node_transactions; @@ -32,6 +33,7 @@ DROP TABLE IF EXISTS ${schema}.cp_states; DROP TABLE IF EXISTS ${schema}.node_contract_upgrades; DROP TABLE IF EXISTS ${schema}.node_identities; DROP TABLE IF EXISTS ${schema}.node_named_identities; +DROP TABLE IF EXISTS ${schema}.node_properties; DROP TABLE IF EXISTS ${schema}.children; DROP TABLE IF EXISTS ${schema}.parents; DROP TABLE IF EXISTS ${schema}.contract_cash_states; diff --git a/testing/test-utils/src/main/resources/integration-azure-sql.conf b/testing/test-utils/src/main/resources/integration-azure-sql.conf index aad07c97d0..7aa38f3229 100644 --- a/testing/test-utils/src/main/resources/integration-azure-sql.conf +++ b/testing/test-utils/src/main/resources/integration-azure-sql.conf @@ -6,6 +6,6 @@ dataSourceProperties = { } database = { transactionIsolationLevel = READ_COMMITTED - initDatabase = true schema = ${custom.nodeOrganizationName} + runMigration = true } \ No newline at end of file diff --git a/testing/test-utils/src/main/resources/integration-oracle-11.conf b/testing/test-utils/src/main/resources/integration-oracle-11.conf index 95ab972a53..72c4a2ae4f 100644 --- a/testing/test-utils/src/main/resources/integration-oracle-11.conf +++ b/testing/test-utils/src/main/resources/integration-oracle-11.conf @@ -7,4 +7,5 @@ dataSourceProperties = { database = { transactionIsolationLevel = READ_COMMITTED schema = ${custom.nodeOrganizationName} + runMigration = true } \ No newline at end of file diff --git a/testing/test-utils/src/main/resources/integration-oracle.conf b/testing/test-utils/src/main/resources/integration-oracle.conf index 95ab972a53..72c4a2ae4f 100644 --- a/testing/test-utils/src/main/resources/integration-oracle.conf +++ b/testing/test-utils/src/main/resources/integration-oracle.conf @@ -7,4 +7,5 @@ dataSourceProperties = { database = { transactionIsolationLevel = READ_COMMITTED schema = ${custom.nodeOrganizationName} + runMigration = true } \ No newline at end of file diff --git a/testing/test-utils/src/main/resources/integration-postgres.conf b/testing/test-utils/src/main/resources/integration-postgres.conf index a17b36dcc4..c8edcb1e7a 100644 --- a/testing/test-utils/src/main/resources/integration-postgres.conf +++ b/testing/test-utils/src/main/resources/integration-postgres.conf @@ -7,4 +7,5 @@ dataSourceProperties = { database = { transactionIsolationLevel = READ_COMMITTED schema = ${custom.nodeOrganizationName} + runMigration = true } \ No newline at end of file diff --git a/testing/test-utils/src/main/resources/integration-sql-server.conf b/testing/test-utils/src/main/resources/integration-sql-server.conf index d77cc8e591..dbca212cba 100644 --- a/testing/test-utils/src/main/resources/integration-sql-server.conf +++ b/testing/test-utils/src/main/resources/integration-sql-server.conf @@ -6,6 +6,6 @@ dataSourceProperties = { } database = { transactionIsolationLevel = READ_COMMITTED - initDatabase = true schema = ${custom.nodeOrganizationName} + runMigration = true } diff --git a/tools/shell/src/integration-test/kotlin/net/corda/tools/shell/SSHServerTest.kt b/tools/shell/src/integration-test/kotlin/net/corda/tools/shell/SSHServerTest.kt index c09687b93f..1815269f50 100644 --- a/tools/shell/src/integration-test/kotlin/net/corda/tools/shell/SSHServerTest.kt +++ b/tools/shell/src/integration-test/kotlin/net/corda/tools/shell/SSHServerTest.kt @@ -42,7 +42,8 @@ import kotlin.test.fail class SSHServerTest : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName()) } diff --git a/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierTests.kt b/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierTests.kt index 443eb77faf..f7cf57b85b 100644 --- a/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierTests.kt +++ b/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierTests.kt @@ -42,7 +42,8 @@ import kotlin.test.assertTrue class VerifierTests : IntegrationTest() { companion object { - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName()) } @Rule diff --git a/webserver/src/integration-test/kotlin/net/corda/webserver/WebserverDriverTests.kt b/webserver/src/integration-test/kotlin/net/corda/webserver/WebserverDriverTests.kt index 51b0abd78d..8926a04c9a 100644 --- a/webserver/src/integration-test/kotlin/net/corda/webserver/WebserverDriverTests.kt +++ b/webserver/src/integration-test/kotlin/net/corda/webserver/WebserverDriverTests.kt @@ -37,7 +37,8 @@ class WebserverDriverTests : IntegrationTest() { addressMustNotBeBound(executorService, webserverAddr) } - @ClassRule @JvmField + @ClassRule + @JvmField val databaseSchemas = IntegrationTestSchemas(DUMMY_BANK_A_NAME.toDatabaseSchemaName()) }