diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index d99a254fff..ae292a8b71 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -7,6 +7,8 @@ release, see :doc:`upgrade-notes`. Unreleased ========== +* Fixed incorrect computation of ``totalStates`` from ``otherResults`` in ``NodeVaultService``. + * Refactor AMQP Serializer to pass context object down the serialization call hierarchy. Will allow per thread extensions to be set and used by the RPC work (Observable Context Key) diff --git a/docs/source/example-code/src/test/kotlin/net/corda/docs/CustomVaultQueryTest.kt b/docs/source/example-code/src/test/kotlin/net/corda/docs/CustomVaultQueryTest.kt index 36a807f5ce..2d43cb34ed 100644 --- a/docs/source/example-code/src/test/kotlin/net/corda/docs/CustomVaultQueryTest.kt +++ b/docs/source/example-code/src/test/kotlin/net/corda/docs/CustomVaultQueryTest.kt @@ -1,15 +1,31 @@ package net.corda.docs import net.corda.core.contracts.Amount +import net.corda.core.contracts.ContractState import net.corda.core.identity.Party +import net.corda.core.node.services.queryBy +import net.corda.core.node.services.vault.DEFAULT_PAGE_NUM +import net.corda.core.node.services.vault.DEFAULT_PAGE_SIZE +import net.corda.core.node.services.vault.PageSpecification +import net.corda.core.node.services.vault.QueryCriteria +import net.corda.core.node.services.vault.builder import net.corda.core.utilities.OpaqueBytes import net.corda.core.utilities.getOrThrow -import net.corda.finance.* +import net.corda.docs.java.tutorial.helloworld.IOUFlow +import net.corda.finance.CHF +import net.corda.finance.DOLLARS +import net.corda.finance.GBP +import net.corda.finance.POUNDS +import net.corda.finance.SWISS_FRANCS +import net.corda.finance.USD import net.corda.finance.contracts.getCashBalances import net.corda.finance.flows.CashIssueFlow +import net.corda.node.services.vault.VaultSchemaV1 import net.corda.testing.core.singleIdentity import net.corda.testing.node.MockNetwork import net.corda.testing.node.StartedMockNode +import org.assertj.core.api.Assertions.assertThat +import org.assertj.core.api.Assertions.assertThatCode import org.junit.After import org.junit.Assert import org.junit.Before @@ -24,7 +40,7 @@ class CustomVaultQueryTest { @Before fun setup() { - mockNet = MockNetwork(threadPerNode = true, cordappPackages = listOf("net.corda.finance", "net.corda.docs")) + mockNet = MockNetwork(threadPerNode = true, cordappPackages = listOf("net.corda.finance", "net.corda.docs", "com.template")) nodeA = mockNet.createPartyNode() nodeB = mockNet.createPartyNode() nodeA.registerInitiatedFlow(TopupIssuerFlow.TopupIssuer::class.java) @@ -36,6 +52,22 @@ class CustomVaultQueryTest { mockNet.stopNodes() } + @Test + fun `query by max recorded time`() { + + nodeA.startFlow(IOUFlow(1000, nodeB.info.singleIdentity())).getOrThrow() + nodeA.startFlow(IOUFlow(500, nodeB.info.singleIdentity())).getOrThrow() + + val max = builder { VaultSchemaV1.VaultStates::recordedTime.max() } + val maxCriteria = QueryCriteria.VaultCustomQueryCriteria(max) + + val results = nodeA.transaction { + val pageSpecification = PageSpecification(pageNumber = DEFAULT_PAGE_NUM, pageSize = DEFAULT_PAGE_SIZE) + nodeA.services.vaultService.queryBy(criteria = maxCriteria, paging = pageSpecification) + } + assertThatCode { results.otherResults.single() }.doesNotThrowAnyException() + } + @Test fun `test custom vault query`() { // issue some cash in several currencies @@ -82,4 +114,4 @@ class CustomVaultQueryTest { return Pair(balancesNodesA, balancesNodesB) } -} +} \ No newline at end of file diff --git a/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt b/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt index 5dc658b093..038d25b562 100644 --- a/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt +++ b/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt @@ -395,7 +395,7 @@ class NodeVaultService( val count = builder { VaultSchemaV1.VaultStates::recordedTime.count() } val countCriteria = QueryCriteria.VaultCustomQueryCriteria(count, Vault.StateStatus.ALL) val results = queryBy(contractStateType, criteria.and(countCriteria)) - totalStates = results.otherResults[0] as Long + totalStates = results.otherResults.last() as Long } val session = getSession() diff --git a/testing/test-utils/build.gradle b/testing/test-utils/build.gradle index 9b3eb8c31e..e11cea5ebc 100644 --- a/testing/test-utils/build.gradle +++ b/testing/test-utils/build.gradle @@ -22,6 +22,7 @@ dependencies { compile "junit:junit:$junit_version" compile 'org.hamcrest:hamcrest-library:1.3' compile "com.nhaarman:mockito-kotlin:1.1.0" + compile "org.assertj:assertj-core:$assertj_version" // Guava: Google test library (collections test suite) compile "com.google.guava:guava-testlib:$guava_version"