From 0bf4bbc3d1deb2a1c7ca613c2b8df04b54e43d3e Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Thu, 10 Aug 2023 15:25:27 +0800 Subject: [PATCH] feat(api): add gRPC implementation for certain interfaces --- .../src/main/java/org/tron/core/Wallet.java | 15 +++-- .../org/tron/core/services/RpcApiService.java | 45 ++++++++++++++ .../http/GetBandwidthPricesServlet.java | 15 ++--- .../services/http/GetEnergyPricesServlet.java | 15 ++--- .../interfaceOnPBFT/RpcApiServiceOnPBFT.java | 18 +++++- .../RpcApiServiceOnSolidity.java | 19 ++++-- .../common/utils/client/utils/HttpMethed.java | 8 +++ .../filter/RpcApiAccessInterceptorTest.java | 49 ++++++++++----- .../http/GetBandwidthPricesServletTest.java | 62 +++++++++++++++++++ .../http/GetEnergyPricesServletTest.java | 62 +++++++++++++++++++ protocol/src/main/protos/api/api.proto | 15 +++++ 11 files changed, 275 insertions(+), 48 deletions(-) create mode 100644 framework/src/test/java/org/tron/core/services/http/GetBandwidthPricesServletTest.java create mode 100644 framework/src/test/java/org/tron/core/services/http/GetEnergyPricesServletTest.java diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 3560a7032bc..c7110556b7b 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -87,6 +87,7 @@ import org.tron.api.GrpcAPI.PrivateShieldedTRC20ParametersWithoutAsk; import org.tron.api.GrpcAPI.ProposalList; import org.tron.api.GrpcAPI.ReceiveNote; +import org.tron.api.GrpcAPI.ResourcePricesResponseMessage; import org.tron.api.GrpcAPI.Return; import org.tron.api.GrpcAPI.Return.response_code; import org.tron.api.GrpcAPI.ShieldedAddressInfo; @@ -4309,23 +4310,25 @@ public long getEnergyFee(long timestamp) { } } - public String getEnergyPrices() { + public ResourcePricesResponseMessage getEnergyPrices() { + ResourcePricesResponseMessage.Builder builder = ResourcePricesResponseMessage.newBuilder(); try { - return chainBaseManager.getDynamicPropertiesStore().getEnergyPriceHistory(); + builder.setPrices(chainBaseManager.getDynamicPropertiesStore().getEnergyPriceHistory()); + return builder.build(); } catch (Exception e) { logger.error("GetEnergyPrices failed", e); } - return null; } - public String getBandwidthPrices() { + public ResourcePricesResponseMessage getBandwidthPrices() { + ResourcePricesResponseMessage.Builder builder = ResourcePricesResponseMessage.newBuilder(); try { - return chainBaseManager.getDynamicPropertiesStore().getBandwidthPriceHistory(); + builder.setPrices(chainBaseManager.getDynamicPropertiesStore().getBandwidthPriceHistory()); + return builder.build(); } catch (Exception e) { logger.error("GetBandwidthPrices failed", e); } - return null; } diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index 2a4ebca95b4..3087f153c3c 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -55,6 +55,7 @@ import org.tron.api.GrpcAPI.PrivateShieldedTRC20Parameters; import org.tron.api.GrpcAPI.PrivateShieldedTRC20ParametersWithoutAsk; import org.tron.api.GrpcAPI.ProposalList; +import org.tron.api.GrpcAPI.ResourcePricesResponseMessage; import org.tron.api.GrpcAPI.Return; import org.tron.api.GrpcAPI.Return.response_code; import org.tron.api.GrpcAPI.ShieldedAddressInfo; @@ -994,6 +995,28 @@ public void getBlock(GrpcAPI.BlockReq request, StreamObserver responseObserver) { getBlockCommon(request, responseObserver); } + + @Override + public void getBandwidthPrices(EmptyMessage request, + StreamObserver responseObserver) { + try { + responseObserver.onNext(wallet.getBandwidthPrices()); + } catch (Exception e) { + responseObserver.onError(getRunTimeException(e)); + } + responseObserver.onCompleted(); + } + + @Override + public void getEnergyPrices(EmptyMessage request, + StreamObserver responseObserver) { + try { + responseObserver.onNext(wallet.getEnergyPrices()); + } catch (Exception e) { + responseObserver.onError(getRunTimeException(e)); + } + responseObserver.onCompleted(); + } } /** @@ -2027,6 +2050,28 @@ public void getCanWithdrawUnfreezeAmount(CanWithdrawUnfreezeAmountRequestMessage responseObserver.onCompleted(); } + @Override + public void getBandwidthPrices(EmptyMessage request, + StreamObserver responseObserver) { + try { + responseObserver.onNext(wallet.getBandwidthPrices()); + } catch (Exception e) { + responseObserver.onError(getRunTimeException(e)); + } + responseObserver.onCompleted(); + } + + @Override + public void getEnergyPrices(EmptyMessage request, + StreamObserver responseObserver) { + try { + responseObserver.onNext(wallet.getEnergyPrices()); + } catch (Exception e) { + responseObserver.onError(getRunTimeException(e)); + } + responseObserver.onCompleted(); + } + @Override public void getPaginatedProposalList(PaginatedMessage request, StreamObserver responseObserver) { diff --git a/framework/src/main/java/org/tron/core/services/http/GetBandwidthPricesServlet.java b/framework/src/main/java/org/tron/core/services/http/GetBandwidthPricesServlet.java index ea4b535af39..b4350412930 100644 --- a/framework/src/main/java/org/tron/core/services/http/GetBandwidthPricesServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/GetBandwidthPricesServlet.java @@ -1,14 +1,13 @@ package org.tron.core.services.http; -import com.alibaba.fastjson.JSONObject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.tron.api.GrpcAPI.ResourcePricesResponseMessage; import org.tron.core.Wallet; - @Component @Slf4j(topic = "API") public class GetBandwidthPricesServlet extends RateLimiterServlet { @@ -16,21 +15,17 @@ public class GetBandwidthPricesServlet extends RateLimiterServlet { @Autowired private Wallet wallet; + @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) { try { - String reply = wallet.getBandwidthPrices(); - if (reply != null) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("prices", reply); - response.getWriter().println(jsonObject); - } else { - response.getWriter().println("{}"); - } + ResourcePricesResponseMessage reply = wallet.getBandwidthPrices(); + response.getWriter().println(reply == null ? "{}" : JsonFormat.printToString(reply)); } catch (Exception e) { Util.processError(e, response); } } + @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) { doGet(request, response); } diff --git a/framework/src/main/java/org/tron/core/services/http/GetEnergyPricesServlet.java b/framework/src/main/java/org/tron/core/services/http/GetEnergyPricesServlet.java index 36129d8ffdb..3f0a4fa8177 100644 --- a/framework/src/main/java/org/tron/core/services/http/GetEnergyPricesServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/GetEnergyPricesServlet.java @@ -1,14 +1,13 @@ package org.tron.core.services.http; -import com.alibaba.fastjson.JSONObject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.tron.api.GrpcAPI.ResourcePricesResponseMessage; import org.tron.core.Wallet; - @Component @Slf4j(topic = "API") public class GetEnergyPricesServlet extends RateLimiterServlet { @@ -16,21 +15,17 @@ public class GetEnergyPricesServlet extends RateLimiterServlet { @Autowired private Wallet wallet; + @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) { try { - String reply = wallet.getEnergyPrices(); - if (reply != null) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("prices", reply); - response.getWriter().println(jsonObject); - } else { - response.getWriter().println("{}"); - } + ResourcePricesResponseMessage reply = wallet.getEnergyPrices(); + response.getWriter().println(reply == null ? "{}" : JsonFormat.printToString(reply)); } catch (Exception e) { Util.processError(e, response); } } + @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) { doGet(request, response); } diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java index c003f9d3994..73aef934dbf 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java @@ -32,15 +32,13 @@ import org.tron.api.GrpcAPI.NumberMessage; import org.tron.api.GrpcAPI.OvkDecryptTRC20Parameters; import org.tron.api.GrpcAPI.PaginatedMessage; +import org.tron.api.GrpcAPI.ResourcePricesResponseMessage; import org.tron.api.GrpcAPI.SpendResult; import org.tron.api.GrpcAPI.TransactionExtention; import org.tron.api.GrpcAPI.WitnessList; import org.tron.api.WalletSolidityGrpc.WalletSolidityImplBase; import org.tron.common.application.Service; -import org.tron.common.crypto.ECKey; import org.tron.common.parameter.CommonParameter; -import org.tron.common.utils.StringUtil; -import org.tron.common.utils.Utils; import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor; @@ -554,5 +552,19 @@ public void getBlock(GrpcAPI.BlockReq request, () -> rpcApiService.getWalletSolidityApi().getBlock(request, responseObserver)); } + @Override + public void getBandwidthPrices(EmptyMessage request, + StreamObserver responseObserver) { + walletOnPBFT.futureGet( + () -> rpcApiService.getWalletSolidityApi().getBandwidthPrices(request, responseObserver)); + } + + @Override + public void getEnergyPrices(EmptyMessage request, + StreamObserver responseObserver) { + walletOnPBFT.futureGet( + () -> rpcApiService.getWalletSolidityApi().getEnergyPrices(request, responseObserver)); + } + } } diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java index 3f4bfeda731..bb29814ac8d 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java @@ -28,6 +28,7 @@ import org.tron.api.GrpcAPI.NoteParameters; import org.tron.api.GrpcAPI.NumberMessage; import org.tron.api.GrpcAPI.PaginatedMessage; +import org.tron.api.GrpcAPI.ResourcePricesResponseMessage; import org.tron.api.GrpcAPI.Return; import org.tron.api.GrpcAPI.Return.response_code; import org.tron.api.GrpcAPI.SpendResult; @@ -36,12 +37,8 @@ import org.tron.api.GrpcAPI.WitnessList; import org.tron.api.WalletSolidityGrpc.WalletSolidityImplBase; import org.tron.common.application.Service; -import org.tron.common.crypto.SignInterface; -import org.tron.common.crypto.SignUtils; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.Sha256Hash; -import org.tron.common.utils.StringUtil; -import org.tron.common.utils.Utils; import org.tron.core.capsule.BlockCapsule; import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; @@ -537,5 +534,19 @@ public void getBlock(GrpcAPI.BlockReq request, () -> rpcApiService.getWalletSolidityApi().getBlock(request, responseObserver)); } + @Override + public void getBandwidthPrices(EmptyMessage request, + StreamObserver responseObserver) { + walletOnSolidity.futureGet( + () -> rpcApiService.getWalletSolidityApi().getBandwidthPrices(request, responseObserver)); + } + + @Override + public void getEnergyPrices(EmptyMessage request, + StreamObserver responseObserver) { + walletOnSolidity.futureGet( + () -> rpcApiService.getWalletSolidityApi().getEnergyPrices(request, responseObserver)); + } + } } diff --git a/framework/src/test/java/org/tron/common/utils/client/utils/HttpMethed.java b/framework/src/test/java/org/tron/common/utils/client/utils/HttpMethed.java index 6839de47434..ee872be6330 100644 --- a/framework/src/test/java/org/tron/common/utils/client/utils/HttpMethed.java +++ b/framework/src/test/java/org/tron/common/utils/client/utils/HttpMethed.java @@ -23,6 +23,7 @@ import org.apache.http.params.CoreConnectionPNames; import org.apache.http.util.EntityUtils; import org.junit.Assert; +import org.springframework.mock.web.MockHttpServletRequest; import org.tron.api.GrpcAPI; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; @@ -4876,4 +4877,11 @@ public static HttpResponse getTransactionFromPending(String httpNode, String txi } return response; } + + public static MockHttpServletRequest createRequest(String method) { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setMethod(method); + request.setCharacterEncoding("UTF-8"); + return request; + } } diff --git a/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java b/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java index edd15fc19de..33f9437028b 100644 --- a/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java @@ -16,7 +16,10 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.tron.api.GrpcAPI; +import org.tron.api.GrpcAPI.BlockReq; +import org.tron.api.GrpcAPI.BytesMessage; +import org.tron.api.GrpcAPI.EmptyMessage; +import org.tron.api.GrpcAPI.NumberMessage; import org.tron.api.WalletGrpc; import org.tron.api.WalletSolidityGrpc; import org.tron.common.application.Application; @@ -41,7 +44,7 @@ public class RpcApiAccessInterceptorTest { private static WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubPBFT = null; private static Application appTest; - private static String dbPath = "output_rpc_api_access_interceptor_test"; + private static final String dbPath = "output_rpc_api_access_interceptor_test"; @Rule public ExpectedException thrown = ExpectedException.none(); @@ -115,7 +118,7 @@ public void testAccessDisabledFullNode() { disabledApiList.add("getblockbynum"); Args.getInstance().setDisabledApiList(disabledApiList); - final GrpcAPI.NumberMessage message = GrpcAPI.NumberMessage.newBuilder().setNum(0).build(); + final NumberMessage message = NumberMessage.newBuilder().setNum(0).build(); thrown.expect(StatusRuntimeException.class); thrown.expectMessage("this API is unavailable due to config"); blockingStubFull.getBlockByNum(message); @@ -125,42 +128,42 @@ public void testAccessDisabledFullNode() { public void testRpcApiService() { RpcApiService rpcApiService = context.getBean(RpcApiService.class); ServerCallStreamObserverTest serverCallStreamObserverTest = new ServerCallStreamObserverTest(); - rpcApiService.getBlockCommon(GrpcAPI.BlockReq.getDefaultInstance(), + rpcApiService.getBlockCommon(BlockReq.getDefaultInstance(), serverCallStreamObserverTest); Assert.assertTrue("Get block Common failed!", serverCallStreamObserverTest.isReady()); serverCallStreamObserverTest.isCancelled(); - rpcApiService.getBrokerageInfoCommon(GrpcAPI.BytesMessage.newBuilder().build(), + rpcApiService.getBrokerageInfoCommon(BytesMessage.newBuilder().build(), serverCallStreamObserverTest); Assert.assertTrue("Get brokerage info Common failed!", serverCallStreamObserverTest.isReady()); serverCallStreamObserverTest.isCancelled(); - rpcApiService.getBurnTrxCommon(GrpcAPI.EmptyMessage.newBuilder().build(), + rpcApiService.getBurnTrxCommon(EmptyMessage.newBuilder().build(), serverCallStreamObserverTest); Assert.assertTrue("Get burn trx common failed!", serverCallStreamObserverTest.isReady()); serverCallStreamObserverTest.isCancelled(); - rpcApiService.getPendingSizeCommon(GrpcAPI.EmptyMessage.getDefaultInstance(), + rpcApiService.getPendingSizeCommon(EmptyMessage.getDefaultInstance(), serverCallStreamObserverTest); Assert.assertTrue("Get pending size common failed!", serverCallStreamObserverTest.isReady()); serverCallStreamObserverTest.isCancelled(); - rpcApiService.getRewardInfoCommon(GrpcAPI.BytesMessage.newBuilder().build(), + rpcApiService.getRewardInfoCommon(BytesMessage.newBuilder().build(), serverCallStreamObserverTest); Assert.assertTrue("Get reward info common failed!", serverCallStreamObserverTest.isReady()); serverCallStreamObserverTest.isCancelled(); rpcApiService.getTransactionCountByBlockNumCommon( - GrpcAPI.NumberMessage.newBuilder().getDefaultInstanceForType(), + NumberMessage.newBuilder().getDefaultInstanceForType(), serverCallStreamObserverTest); Assert.assertTrue("Get transaction count by block num failed!", serverCallStreamObserverTest.isReady()); serverCallStreamObserverTest.isCancelled(); - rpcApiService.getTransactionFromPendingCommon(GrpcAPI.BytesMessage.newBuilder().build(), + rpcApiService.getTransactionFromPendingCommon(BytesMessage.newBuilder().build(), serverCallStreamObserverTest); Assert.assertTrue("Get transaction from pending failed!", serverCallStreamObserverTest.isReady() == false); serverCallStreamObserverTest.isCancelled(); - rpcApiService.getTransactionListFromPendingCommon(GrpcAPI.EmptyMessage.newBuilder() + rpcApiService.getTransactionListFromPendingCommon(EmptyMessage.newBuilder() .getDefaultInstanceForType(), serverCallStreamObserverTest); Assert.assertTrue("Get transaction list from pending failed!", serverCallStreamObserverTest.isReady()); @@ -228,7 +231,7 @@ public void testAccessDisabledSolidityNode() { disabledApiList.add("getblockbynum"); Args.getInstance().setDisabledApiList(disabledApiList); - final GrpcAPI.NumberMessage message = GrpcAPI.NumberMessage.newBuilder().setNum(0).build(); + final NumberMessage message = NumberMessage.newBuilder().setNum(0).build(); thrown.expect(StatusRuntimeException.class); thrown.expectMessage("this API is unavailable due to config"); blockingStubSolidity.getBlockByNum(message); @@ -241,7 +244,7 @@ public void testAccessDisabledPBFTNode() { disabledApiList.add("getblockbynum"); Args.getInstance().setDisabledApiList(disabledApiList); - final GrpcAPI.NumberMessage message = GrpcAPI.NumberMessage.newBuilder().setNum(0).build(); + final NumberMessage message = NumberMessage.newBuilder().setNum(0).build(); thrown.expect(StatusRuntimeException.class); thrown.expectMessage("this API is unavailable due to config"); blockingStubPBFT.getBlockByNum(message); @@ -251,7 +254,7 @@ public void testAccessDisabledPBFTNode() { public void testAccessNoDisabled() { Args.getInstance().setDisabledApiList(Collections.emptyList()); - final GrpcAPI.NumberMessage message = GrpcAPI.NumberMessage.newBuilder().setNum(0).build(); + final NumberMessage message = NumberMessage.newBuilder().setNum(0).build(); Assert.assertNotNull(blockingStubFull.getBlockByNum(message)); Assert.assertNotNull(blockingStubSolidity.getBlockByNum(message)); Assert.assertNotNull(blockingStubPBFT.getBlockByNum(message)); @@ -263,11 +266,27 @@ public void testAccessDisabledNotIncluded() { disabledApiList.add("getaccount"); Args.getInstance().setDisabledApiList(disabledApiList); - final GrpcAPI.NumberMessage message = GrpcAPI.NumberMessage.newBuilder().setNum(0).build(); + final NumberMessage message = NumberMessage.newBuilder().setNum(0).build(); Assert.assertNotNull(blockingStubFull.getBlockByNum(message)); Assert.assertNotNull(blockingStubSolidity.getBlockByNum(message)); Assert.assertNotNull(blockingStubPBFT.getBlockByNum(message)); } + @Test + public void testGetBandwidthPrices() { + EmptyMessage message = EmptyMessage.newBuilder().build(); + Assert.assertNotNull(blockingStubFull.getBandwidthPrices(message)); + Assert.assertNotNull(blockingStubSolidity.getBandwidthPrices(message)); + Assert.assertNotNull(blockingStubPBFT.getBandwidthPrices(message)); + } + + @Test + public void testGetEnergyPrices() { + EmptyMessage message = EmptyMessage.newBuilder().build(); + Assert.assertNotNull(blockingStubFull.getEnergyPrices(message)); + Assert.assertNotNull(blockingStubSolidity.getEnergyPrices(message)); + Assert.assertNotNull(blockingStubPBFT.getEnergyPrices(message)); + } + } diff --git a/framework/src/test/java/org/tron/core/services/http/GetBandwidthPricesServletTest.java b/framework/src/test/java/org/tron/core/services/http/GetBandwidthPricesServletTest.java new file mode 100644 index 00000000000..90d2794be9a --- /dev/null +++ b/framework/src/test/java/org/tron/core/services/http/GetBandwidthPricesServletTest.java @@ -0,0 +1,62 @@ +package org.tron.core.services.http; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.tron.common.utils.client.utils.HttpMethed.createRequest; + +import com.alibaba.fastjson.JSONObject; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import javax.annotation.Resource; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.tron.common.BaseTest; +import org.tron.core.Constant; +import org.tron.core.config.args.Args; + +public class GetBandwidthPricesServletTest extends BaseTest { + + @ClassRule + public static final TemporaryFolder temporaryFolder = new TemporaryFolder(); + @Resource + private GetBandwidthPricesServlet getBandwidthPricesServlet; + + @BeforeClass + public static void init() throws IOException { + Args.setParam(new String[]{"-d", temporaryFolder.newFolder().toString()}, Constant.TEST_CONF); + } + + @Test + public void testGet() { + MockHttpServletRequest request = createRequest(HttpGet.METHOD_NAME); + MockHttpServletResponse response = new MockHttpServletResponse(); + getBandwidthPricesServlet.doPost(request, response); + try { + String contentAsString = response.getContentAsString(); + JSONObject result = JSONObject.parseObject(contentAsString); + assertTrue(result.containsKey("prices")); + } catch (UnsupportedEncodingException e) { + fail(e.getMessage()); + } + } + + @Test + public void testPost() { + MockHttpServletRequest request = createRequest(HttpPost.METHOD_NAME); + try { + MockHttpServletResponse response = new MockHttpServletResponse(); + getBandwidthPricesServlet.doPost(request, response); + String contentAsString = response.getContentAsString(); + JSONObject result = JSONObject.parseObject(contentAsString); + assertTrue(result.containsKey("prices")); + } catch (UnsupportedEncodingException e) { + fail(e.getMessage()); + } + } +} diff --git a/framework/src/test/java/org/tron/core/services/http/GetEnergyPricesServletTest.java b/framework/src/test/java/org/tron/core/services/http/GetEnergyPricesServletTest.java new file mode 100644 index 00000000000..391f2c2d4a7 --- /dev/null +++ b/framework/src/test/java/org/tron/core/services/http/GetEnergyPricesServletTest.java @@ -0,0 +1,62 @@ +package org.tron.core.services.http; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.tron.common.utils.client.utils.HttpMethed.createRequest; + +import com.alibaba.fastjson.JSONObject; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import javax.annotation.Resource; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.tron.common.BaseTest; +import org.tron.core.Constant; +import org.tron.core.config.args.Args; + +public class GetEnergyPricesServletTest extends BaseTest { + + @ClassRule + public static final TemporaryFolder temporaryFolder = new TemporaryFolder(); + @Resource + private GetEnergyPricesServlet getEnergyPricesServlet; + + @BeforeClass + public static void init() throws IOException { + Args.setParam(new String[]{"-d", temporaryFolder.newFolder().toString()}, Constant.TEST_CONF); + } + + @Test + public void testGet() { + MockHttpServletRequest request = createRequest(HttpGet.METHOD_NAME); + MockHttpServletResponse response = new MockHttpServletResponse(); + getEnergyPricesServlet.doPost(request, response); + try { + String contentAsString = response.getContentAsString(); + JSONObject result = JSONObject.parseObject(contentAsString); + assertTrue(result.containsKey("prices")); + } catch (UnsupportedEncodingException e) { + fail(e.getMessage()); + } + } + + @Test + public void testPost() { + MockHttpServletRequest request = createRequest(HttpPost.METHOD_NAME); + try { + MockHttpServletResponse response = new MockHttpServletResponse(); + getEnergyPricesServlet.doPost(request, response); + String contentAsString = response.getContentAsString(); + JSONObject result = JSONObject.parseObject(contentAsString); + assertTrue(result.containsKey("prices")); + } catch (UnsupportedEncodingException e) { + fail(e.getMessage()); + } + } +} diff --git a/protocol/src/main/protos/api/api.proto b/protocol/src/main/protos/api/api.proto index d23d6e01729..e9dc851dcd8 100644 --- a/protocol/src/main/protos/api/api.proto +++ b/protocol/src/main/protos/api/api.proto @@ -767,6 +767,12 @@ service Wallet { rpc GetBlock (BlockReq) returns (BlockExtention) { } + + rpc GetBandwidthPrices (EmptyMessage) returns (ResourcePricesResponseMessage) { + } + + rpc GetEnergyPrices (EmptyMessage) returns (ResourcePricesResponseMessage) { + } }; service WalletSolidity { @@ -963,6 +969,11 @@ service WalletSolidity { } rpc GetBlock (BlockReq) returns (BlockExtention) { } + rpc GetBandwidthPrices (EmptyMessage) returns (ResourcePricesResponseMessage) { + } + + rpc GetEnergyPrices (EmptyMessage) returns (ResourcePricesResponseMessage) { + } }; service WalletExtension { @@ -1107,6 +1118,10 @@ message CanWithdrawUnfreezeAmountResponseMessage { int64 amount = 1; } +message ResourcePricesResponseMessage { + string prices = 1; +} + // Gossip node list message NodeList { repeated Node nodes = 1;