From 522c339b6c1e9a7845987454486635c28868e9e8 Mon Sep 17 00:00:00 2001 From: dennis guye Date: Thu, 12 Dec 2019 11:49:39 -0400 Subject: [PATCH] AKI-626: added missing blockEnums in RPCMethods - Changed rpc returntype to bigint - updated test cases --- ...-69e3f8a.jar => rpc-lib4j-1.0-a72ec68.jar} | Bin 157300 -> 157489 bytes modApiServer/build.gradle | 2 +- .../org/aion/api/server/rpc3/RPCMethods.java | 35 +++++-- .../aion/api/server/rpc3/EthRPCImplTest.java | 98 ++++++++++++++---- 4 files changed, 104 insertions(+), 31 deletions(-) rename lib/{rpc-lib4j-1.0-69e3f8a.jar => rpc-lib4j-1.0-a72ec68.jar} (76%) diff --git a/lib/rpc-lib4j-1.0-69e3f8a.jar b/lib/rpc-lib4j-1.0-a72ec68.jar similarity index 76% rename from lib/rpc-lib4j-1.0-69e3f8a.jar rename to lib/rpc-lib4j-1.0-a72ec68.jar index 2c398676c408e21f4c0f786982a8219c66853fdf..3c50065acba37724dffaf3e1f2c893e338863200 100644 GIT binary patch delta 23801 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 L0PVIMY?tDH5V1=# delta 23629 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 HOiA!Rbal-X diff --git a/modApiServer/build.gradle b/modApiServer/build.gradle index eb3aed32b3..418c252064 100644 --- a/modApiServer/build.gradle +++ b/modApiServer/build.gradle @@ -52,7 +52,7 @@ dependencies { compile project(':3rdParty.libnzmq') compile files("${rootProject.projectDir}/lib/aion-types-22a3be9.jar") compile files("${rootProject.projectDir}/lib/AionRpc.jar") - compile files("${rootProject.projectDir}/lib/rpc-lib4j-1.0-69e3f8a.jar") + compile files("${rootProject.projectDir}/lib/rpc-lib4j-1.0-a72ec68.jar") compile 'org.json:json:20180813' compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.5.0' compile group: 'org.apache.commons', name: 'commons-collections4', version: '4.0' diff --git a/modApiServer/src/org/aion/api/server/rpc3/RPCMethods.java b/modApiServer/src/org/aion/api/server/rpc3/RPCMethods.java index a78b35885f..49462a319b 100644 --- a/modApiServer/src/org/aion/api/server/rpc3/RPCMethods.java +++ b/modApiServer/src/org/aion/api/server/rpc3/RPCMethods.java @@ -114,6 +114,9 @@ public BlockDetails blockDetailsByEnum(BlockEnum block) { switch (block) { case LATEST: return serializeBlockDetails(chainHolder.getBestBlock()); + case EARLIEST: + return serializeBlockDetails(chainHolder.getBlockByNumber(0L)); + case PENDING: default: throw RPCExceptions.InvalidParamsRPCException.INSTANCE; } @@ -408,23 +411,35 @@ public BlockDetails ops_getBlockDetailsByHash(ByteArray blockHash) { } @Override - public BigInteger eth_getBalance(AionAddress aionAddress, - BlockNumberEnumUnion blockNumberEnumUnion) { - if (blockNumberEnumUnion.blockEnum == BlockEnum.LATEST){ - return chainHolder.getAccountBalance(aionAddress); + public BigInteger eth_getBalance( + AionAddress aionAddress, BlockNumberEnumUnion blockNumberEnumUnion) { + final BigInteger res; + if (blockNumberEnumUnion.blockEnum == BlockEnum.LATEST) { // best block + res = chainHolder.getAccountBalance(aionAddress, chainHolder.blockNumber()); + } else if (blockNumberEnumUnion.blockEnum == BlockEnum.PENDING) { // pending block + res = chainHolder.getAccountBalance(aionAddress); + } else if (blockNumberEnumUnion.blockEnum == BlockEnum.EARLIEST) { // genesis block + res = chainHolder.getAccountBalance(aionAddress, 0L); } else { - return chainHolder.getAccountBalance(aionAddress, blockNumberEnumUnion.blockNumber); + res = chainHolder.getAccountBalance(aionAddress, blockNumberEnumUnion.blockNumber); } + return res; } @Override - public BigInteger eth_getTransactionCount(AionAddress aionAddress, - BlockNumberEnumUnion blockNumberEnumUnion) { - if (blockNumberEnumUnion.blockEnum == BlockEnum.LATEST){ - return chainHolder.getAccountNonce(aionAddress); + public BigInteger eth_getTransactionCount( + AionAddress aionAddress, BlockNumberEnumUnion blockNumberEnumUnion) { + final BigInteger res; + if (blockNumberEnumUnion.blockEnum == BlockEnum.LATEST) { // best block + res = chainHolder.getAccountNonce(aionAddress, chainHolder.blockNumber()); + } else if (blockNumberEnumUnion.blockEnum == BlockEnum.PENDING) { // pending block + res = chainHolder.getAccountNonce(aionAddress); + } else if (blockNumberEnumUnion.blockEnum == BlockEnum.EARLIEST) { // genesis block + res = chainHolder.getAccountNonce(aionAddress, 0L); } else { - return chainHolder.getAccountNonce(aionAddress, blockNumberEnumUnion.blockNumber); + res = chainHolder.getAccountNonce(aionAddress, blockNumberEnumUnion.blockNumber); } + return res; } diff --git a/modApiServer/test/org/aion/api/server/rpc3/EthRPCImplTest.java b/modApiServer/test/org/aion/api/server/rpc3/EthRPCImplTest.java index 6e8ebb496e..1e3cc303d4 100644 --- a/modApiServer/test/org/aion/api/server/rpc3/EthRPCImplTest.java +++ b/modApiServer/test/org/aion/api/server/rpc3/EthRPCImplTest.java @@ -18,8 +18,7 @@ import org.aion.rpc.types.RPCTypes.Request; import org.aion.rpc.types.RPCTypes.VersionType; import org.aion.rpc.types.RPCTypesConverter.AddressBlockParamsConverter; -import org.aion.rpc.types.RPCTypesConverter.Uint128Converter; -import org.aion.rpc.types.RPCTypesConverter.Uint128HexStringConverter; +import org.aion.rpc.types.RPCTypesConverter.BigIntHexStringConverter; import org.aion.rpc.types.RPCTypesConverter.Uint256HexStringConverter; import org.aion.types.AionAddress; import org.aion.util.conversions.Hex; @@ -33,6 +32,7 @@ public class EthRPCImplTest { new AionAddress( Hex.decode("a0fe13f22d73a80743d9d3afc5b7ed02566a23df12e3f4438f8b46921bc38ef5")); private final long blockNumber = 10; + private final long bestBlock = 11; private final IDGeneratorStrategy idGenerator = new SimpleIDGenerator(); private final String ethGetAccountBalanceMethod = "eth_getBalance"; private final String ethGetTransactionCountMethod = "eth_getTransactionCount"; @@ -43,16 +43,13 @@ public class EthRPCImplTest { public void setup() { chainHolder = mock(ChainHolder.class); rpcMethods = new RPCMethods(chainHolder); - doReturn(BigInteger.TEN).when(chainHolder).getAccountBalance(eq(address), eq(blockNumber)); - doReturn(BigInteger.TWO).when(chainHolder).getAccountNonce(eq(address), eq(blockNumber)); - - doReturn(BigInteger.TWO).when(chainHolder).getAccountBalance(eq(address)); - doReturn(BigInteger.ONE).when(chainHolder).getAccountNonce(eq(address)); + doReturn(bestBlock).when(chainHolder).blockNumber(); } @Test public void testEth_getAccountBalance() { // get account by explicitly setting the block number + doReturn(BigInteger.TEN).when(chainHolder).getAccountBalance(eq(address), eq(blockNumber)); assertEquals( BigInteger.TEN, RPCTestUtils.executeRequest( @@ -66,8 +63,9 @@ public void testEth_getAccountBalance() { rpcMethods, Uint256HexStringConverter::decode)); // get account by requesting the best block + doReturn(BigInteger.valueOf(12L)).when(chainHolder).getAccountBalance(eq(address), eq(bestBlock)); assertEquals( - BigInteger.TWO, + BigInteger.valueOf(12L), RPCTestUtils.executeRequest( new Request( idGenerator.generateID(), @@ -79,27 +77,57 @@ public void testEth_getAccountBalance() { VersionType.Version2), rpcMethods, Uint256HexStringConverter::decode)); - // test the default value + // test the pending value + doReturn(BigInteger.ONE).when(chainHolder).getAccountBalance(eq(address)); assertEquals( - BigInteger.TWO, + BigInteger.ONE, RPCTestUtils.executeRequest( new Request( idGenerator.generateID(), ethGetAccountBalanceMethod, AddressBlockParamsConverter.encode( - new AddressBlockParams(address, null)), + new AddressBlockParams(address, + BlockNumberEnumUnion.wrap(BlockEnum.PENDING))), VersionType.Version2), rpcMethods, Uint256HexStringConverter::decode)); + // test the default value + assertEquals( + BigInteger.valueOf(12), + RPCTestUtils.executeRequest( + new Request( + idGenerator.generateID(), + ethGetAccountBalanceMethod, + AddressBlockParamsConverter.encode( + new AddressBlockParams(address, null)), + VersionType.Version2), + rpcMethods, + Uint256HexStringConverter::decode)); + + // test the genesis value + doReturn(BigInteger.ZERO).when(chainHolder).getAccountBalance(eq(address), eq(0L)); + assertEquals( + BigInteger.ZERO, + RPCTestUtils.executeRequest( + new Request( + idGenerator.generateID(), + ethGetAccountBalanceMethod, + AddressBlockParamsConverter.encode( + new AddressBlockParams(address, + BlockNumberEnumUnion.wrap(BlockEnum.EARLIEST))), + VersionType.Version2), + rpcMethods, + Uint256HexStringConverter::decode)); // test that mock was called as expected - Mockito.verify(chainHolder, times(2)).getAccountBalance(any()); - Mockito.verify(chainHolder, times(1)).getAccountBalance(any(), anyLong()); + Mockito.verify(chainHolder, times(1)).getAccountBalance(any()); + Mockito.verify(chainHolder, times(4)).getAccountBalance(any(), anyLong()); } @Test public void testEth_getTransactionCount() { // get account by explicitly setting the block number + doReturn(BigInteger.TWO).when(chainHolder).getAccountNonce(eq(address),eq(blockNumber)); assertEquals( BigInteger.TWO, RPCTestUtils.executeRequest( @@ -111,10 +139,11 @@ public void testEth_getTransactionCount() { address, BlockNumberEnumUnion.wrap(blockNumber))), VersionType.Version2), rpcMethods, - Uint128HexStringConverter::decode)); + BigIntHexStringConverter::decode)); // get account by requesting the best block + doReturn(BigInteger.TWO).when(chainHolder).getAccountNonce(eq(address),eq(bestBlock)); assertEquals( - BigInteger.ONE, + BigInteger.TWO, RPCTestUtils.executeRequest( new Request( idGenerator.generateID(), @@ -125,10 +154,10 @@ public void testEth_getTransactionCount() { BlockNumberEnumUnion.wrap(BlockEnum.LATEST))), VersionType.Version2), rpcMethods, - Uint128HexStringConverter::decode)); + BigIntHexStringConverter::decode)); // test the default value assertEquals( - BigInteger.ONE, + BigInteger.TWO, RPCTestUtils.executeRequest( new Request( idGenerator.generateID(), @@ -137,10 +166,39 @@ public void testEth_getTransactionCount() { new AddressBlockParams(address, null)), VersionType.Version2), rpcMethods, - Uint128HexStringConverter::decode)); + BigIntHexStringConverter::decode)); + + + // test pending value + doReturn(BigInteger.TEN).when(chainHolder).getAccountNonce(eq(address)); + assertEquals( + BigInteger.TEN, + RPCTestUtils.executeRequest( + new Request( + idGenerator.generateID(), + ethGetTransactionCountMethod, + AddressBlockParamsConverter.encode( + new AddressBlockParams(address, BlockNumberEnumUnion.wrap(BlockEnum.PENDING))), + VersionType.Version2), + rpcMethods, + BigIntHexStringConverter::decode)); + // test the genesis value + doReturn(BigInteger.ZERO).when(chainHolder).getAccountNonce(eq(address), eq(0L)); + assertEquals( + BigInteger.ZERO, + RPCTestUtils.executeRequest( + new Request( + idGenerator.generateID(), + ethGetTransactionCountMethod, + AddressBlockParamsConverter.encode( + new AddressBlockParams(address, + BlockNumberEnumUnion.wrap(BlockEnum.EARLIEST))), + VersionType.Version2), + rpcMethods, + BigIntHexStringConverter::decode)); // test that mock was called as expected - Mockito.verify(chainHolder, times(2)).getAccountNonce(any()); - Mockito.verify(chainHolder, times(1)).getAccountNonce(any(), anyLong()); + Mockito.verify(chainHolder, times(1)).getAccountNonce(any()); + Mockito.verify(chainHolder, times(4)).getAccountNonce(any(), anyLong()); } }