Update getBlocks, countBlocks, countTransactions

This commit is contained in:
Xiaomin Zhu 2020-03-10 00:25:43 +08:00
parent 0e3952bd49
commit 20526a8bfc
2 changed files with 143 additions and 17 deletions

View File

@ -12,6 +12,7 @@ import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder; import io.grpc.ManagedChannelBuilder;
import io.grpc.StatusRuntimeException; import io.grpc.StatusRuntimeException;
import java.time.ZonedDateTime;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -225,7 +226,7 @@ public class Client {
/** /**
* <a * <a
* href="#">返回哈希所指定区块的信息</a> * href="#">返回哈希所指定区块</a>
* 非阻塞 * 非阻塞
*/ */
public ListenableFuture<GetBlockByHashResponse> getBlockByHash( public ListenableFuture<GetBlockByHashResponse> getBlockByHash(
@ -245,7 +246,7 @@ public class Client {
/** /**
* <a * <a
* href="#">返回哈希所指定区块的信息</a> * href="#">返回哈希所指定区块</a>
* 阻塞 * 阻塞
*/ */
public GetBlockByHashResponse getBlockByHashSync(String ledger, String hash, boolean fullTransactions) { public GetBlockByHashResponse getBlockByHashSync(String ledger, String hash, boolean fullTransactions) {
@ -276,7 +277,99 @@ public class Client {
/** /**
* <a * <a
* href="#">返回符合条件的区块的数量</a> * href="#">返回时间范围内的区块</a>
* 非阻塞
*/
public ListenableFuture<GetBlocksResponse> getBlocks(String ledger, ZonedDateTime startDateTime) {
return getBlocks(ledger, startDateTime.toEpochSecond());
}
/**
* <a
* href="#">返回时间范围内的区块</a>
* 非阻塞
*/
public ListenableFuture<GetBlocksResponse> getBlocks(String ledger, ZonedDateTime startDateTime, ZonedDateTime endDateTime) {
return getBlocks(ledger, startDateTime.toEpochSecond(), endDateTime.toEpochSecond());
}
/**
* <a
* href="#">返回时间范围内的区块</a>
* 阻塞
*/
public GetBlocksResponse getBlocksSync(String ledger, ZonedDateTime startDateTime) {
return getBlocksSync(ledger, startDateTime.toEpochSecond());
}
/**
* <a
* href="#">返回时间范围内的区块</a>
* 阻塞
*/
public GetBlocksResponse getBlocksSync(String ledger, ZonedDateTime startDateTime, ZonedDateTime endDateTime) {
return getBlocksSync(ledger, startDateTime.toEpochSecond(), endDateTime.toEpochSecond());
}
/**
* <a
* href="#">返回时间范围内的区块</a>
* 非阻塞
*/
public ListenableFuture<GetBlocksResponse> getBlocks(String ledger, long startUnixTime) {
return getBlocks(ledger, startUnixTime, -1);
}
/**
* <a
* href="#">返回时间范围内的区块</a>
* 非阻塞
*/
public ListenableFuture<GetBlocksResponse> getBlocks(String ledger, long startUnixTime, long endUnixTime) {
info(
"*** getBlock: ledger={0} startUnixTime={1} endUnixTime={2}",
ledger, startUnixTime, endUnixTime);
try {
return queryFutureStub.getBlocks(getBlocksRequest(ledger, startUnixTime, endUnixTime));
} catch (StatusRuntimeException e) {
warning("RPC failed: {0}", e.getStatus());
return null;
}
}
/**
* <a
* href="#">返回时间范围内的区块</a>
* 阻塞
*/
public GetBlocksResponse getBlocksSync(String ledger, long startUnixTime) {
return getBlocksSync(ledger, startUnixTime, -1);
}
/**
* <a
* href="#">返回时间范围内的区块</a>
* 阻塞
*/
public GetBlocksResponse getBlocksSync(String ledger, long startUnixTime, long endUnixTime) {
info(
"*** getBlockSync: ledger={0} startUnixTime={1} endUnixTime={2}",
ledger, startUnixTime, endUnixTime);
try {
return queryBlockingStub.getBlocks(getBlocksRequest(ledger, startUnixTime, endUnixTime));
} catch (StatusRuntimeException e) {
warning("RPC failed: {0}", e.getStatus());
return null;
}
}
/**
* <a
* href="#">返回账本中的区块数量</a>
* 非阻塞 * 非阻塞
*/ */
public ListenableFuture<CountBlocksResponse> countBlocks(String ledger) { public ListenableFuture<CountBlocksResponse> countBlocks(String ledger) {
@ -284,7 +377,7 @@ public class Client {
info("*** blockNumber: ledger={0}", ledger); info("*** blockNumber: ledger={0}", ledger);
try { try {
return queryFutureStub.countBlocks(blocksRequest(ledger)); return queryFutureStub.countBlocks(getBlocksRequest(ledger, -1, -1));
} catch (StatusRuntimeException e) { } catch (StatusRuntimeException e) {
warning("RPC failed: {0}", e.getStatus()); warning("RPC failed: {0}", e.getStatus());
return null; return null;
@ -293,7 +386,7 @@ public class Client {
/** /**
* <a * <a
* href="#">返回符合条件的区块的数量</a> * href="#">返回账本中的区块数量</a>
* 阻塞 * 阻塞
*/ */
public CountBlocksResponse countBlocksSync(String ledger) { public CountBlocksResponse countBlocksSync(String ledger) {
@ -301,20 +394,30 @@ public class Client {
info("*** blockNumberSync: ledger={0}", ledger); info("*** blockNumberSync: ledger={0}", ledger);
try { try {
return queryBlockingStub.countBlocks(blocksRequest(ledger)); return queryBlockingStub.countBlocks(getBlocksRequest(ledger, -1, -1));
} catch (StatusRuntimeException e) { } catch (StatusRuntimeException e) {
warning("RPC failed: {0}", e.getStatus()); warning("RPC failed: {0}", e.getStatus());
return null; return null;
} }
} }
private BlocksRequest blocksRequest(String ledger) { private BlocksRequest getBlocksRequest(String ledger, long startTimestamp, long endTimestamp) {
return BlocksRequest.newBuilder().setLedger(ledger).build();
BlocksRequest.Builder reqBuilder =
BlocksRequest.newBuilder().setLedger(ledger);
if (startTimestamp != -1) {
reqBuilder.setStartTimestamp(startTimestamp);
}
if (endTimestamp != -1) {
reqBuilder.setEndTimestamp(endTimestamp);
}
return reqBuilder.build();
} }
/** /**
* <a * <a
* href="#">返回哈希所指定事务的信息</a> * href="#">返回哈希所指定事务</a>
* 非阻塞 * 非阻塞
*/ */
public ListenableFuture<GetTransactionByHashResponse> getTransactionByHash(String ledger, String hash) { public ListenableFuture<GetTransactionByHashResponse> getTransactionByHash(String ledger, String hash) {
@ -331,7 +434,7 @@ public class Client {
/** /**
* <a * <a
* href="#">返回哈希所指定事务的信息</a> * href="#">返回哈希所指定事务</a>
* 阻塞 * 阻塞
*/ */
public GetTransactionByHashResponse getTransactionByHashSync(String ledger, String hash) { public GetTransactionByHashResponse getTransactionByHashSync(String ledger, String hash) {
@ -359,7 +462,7 @@ public class Client {
/** /**
* <a * <a
* href="#">返回区块的哈希与事务的index所指定事务的信息</a> * href="#">返回区块的哈希与事务的index所指定事务</a>
* 非阻塞 * 非阻塞
*/ */
public ListenableFuture<GetTransactionByBlockHashAndIndexResponse> getTransactionByBlockHashAndIndex( public ListenableFuture<GetTransactionByBlockHashAndIndexResponse> getTransactionByBlockHashAndIndex(
@ -380,7 +483,7 @@ public class Client {
/** /**
* <a * <a
* href="#">返回区块的哈希与事务的index所指定事务的信息</a> * href="#">返回区块的哈希与事务的index所指定事务</a>
* 阻塞 * 阻塞
*/ */
public GetTransactionByBlockHashAndIndexResponse getTransactionByBlockHashAndIndexSync( public GetTransactionByBlockHashAndIndexResponse getTransactionByBlockHashAndIndexSync(
@ -414,7 +517,7 @@ public class Client {
/** /**
* <a * <a
* href="#">返回符合条件的数量</a> * href="#">返回账本中的事务数量</a>
* 非阻塞 * 非阻塞
*/ */
public ListenableFuture<CountTransactionsResponse> countTransactions(String ledger) { public ListenableFuture<CountTransactionsResponse> countTransactions(String ledger) {
@ -431,7 +534,7 @@ public class Client {
/** /**
* <a * <a
* href="#">返回符合条件的事务的数量</a> * href="#">返回账本中的事务数量</a>
* 阻塞 * 阻塞
*/ */
public CountTransactionsResponse countTransactionsSync(String ledger) { public CountTransactionsResponse countTransactionsSync(String ledger) {

View File

@ -2,8 +2,8 @@ package bdledger.api;
import bdledger.api.grpc.common.Block; import bdledger.api.grpc.common.Block;
import bdledger.api.grpc.common.Transaction; import bdledger.api.grpc.common.Transaction;
import bdledger.api.grpc.ledger.GetLedgersResponse;
import bdledger.api.grpc.common.TransactionType; import bdledger.api.grpc.common.TransactionType;
import bdledger.api.grpc.ledger.GetLedgersResponse;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import io.grpc.Status; import io.grpc.Status;
import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterAll;
@ -23,7 +23,6 @@ import static org.junit.jupiter.api.Assertions.*;
class ClientTests { class ClientTests {
private static final String ledger = "test"; private static final String ledger = "test";
private static final String[] ledgers = new String[]{"first", "second", "third"};
private static final int blockCount = 2018; private static final int blockCount = 2018;
private static final int transactionCount = 2020; private static final int transactionCount = 2020;
@ -132,7 +131,7 @@ class ClientTests {
assertEquals(3, r.getLedgersCount()); assertEquals(3, r.getLedgersCount());
String[] expected = new String[]{"first", "second", "third"}; String[] expected = new String[]{"first", "second", "third"};
assertAll( assertAll(
IntStream.range(0, 3).boxed().map(i -> () -> assertEquals(ledgers[i], r.getLedgers(i)))); IntStream.range(0, 3).boxed().map(i -> () -> assertEquals(expected[i], r.getLedgers(i))));
} }
@Test @Test
@ -175,6 +174,29 @@ class ClientTests {
assertEquals(block, b); assertEquals(block, b);
} }
// TODO
@Test
@DisplayName("getBlocks#1")
void getBlocks1() throws ExecutionException, InterruptedException {
client.getBlocks(ledger, 0).get();
}
// TODO
@Test
@DisplayName("getBlocks#2")
void getBlocks2() throws ExecutionException, InterruptedException {
client.getBlocks(ledger, 0, 0).get();
}
@Test
@DisplayName("getBlocks#3")
void getBlocks3() {
Throwable e = assertThrows(Exception.class, () -> client.getBlocks("", 0, 0).get());
Status s = Status.fromThrowable(e);
assertEquals(Status.Code.INVALID_ARGUMENT, s.getCode());
assertEquals("ledger must not be empty", s.getDescription());
}
@Test @Test
@DisplayName("CountBlocks#1") @DisplayName("CountBlocks#1")
void blockNumber1() throws ExecutionException, InterruptedException { void blockNumber1() throws ExecutionException, InterruptedException {
@ -204,6 +226,7 @@ class ClientTests {
assertEquals(tx, t); assertEquals(tx, t);
} }
@Test
@DisplayName("CountTransactions#1") @DisplayName("CountTransactions#1")
void CountTransactions1() throws ExecutionException, InterruptedException { void CountTransactions1() throws ExecutionException, InterruptedException {
assertEquals(transactionCount, client.countTransactions(ledger).get().getCount()); assertEquals(transactionCount, client.countTransactions(ledger).get().getCount());