49
49
import com .google .bytestream .ByteStreamGrpc .ByteStreamBlockingStub ;
50
50
import com .google .bytestream .ByteStreamGrpc .ByteStreamImplBase ;
51
51
import com .google .bytestream .ByteStreamGrpc .ByteStreamStub ;
52
+ import com .google .bytestream .ByteStreamProto .QueryWriteStatusRequest ;
53
+ import com .google .bytestream .ByteStreamProto .QueryWriteStatusResponse ;
52
54
import com .google .bytestream .ByteStreamProto .ReadRequest ;
53
55
import com .google .bytestream .ByteStreamProto .ReadResponse ;
54
56
import com .google .bytestream .ByteStreamProto .WriteRequest ;
58
60
import com .google .devtools .build .lib .remote .logging .RemoteExecutionLog .GetActionResultDetails ;
59
61
import com .google .devtools .build .lib .remote .logging .RemoteExecutionLog .GetCapabilitiesDetails ;
60
62
import com .google .devtools .build .lib .remote .logging .RemoteExecutionLog .LogEntry ;
63
+ import com .google .devtools .build .lib .remote .logging .RemoteExecutionLog .QueryWriteStatusDetails ;
61
64
import com .google .devtools .build .lib .remote .logging .RemoteExecutionLog .ReadDetails ;
62
65
import com .google .devtools .build .lib .remote .logging .RemoteExecutionLog .RpcCallDetails ;
63
66
import com .google .devtools .build .lib .remote .logging .RemoteExecutionLog .UpdateActionResultDetails ;
@@ -854,6 +857,10 @@ public void onCompleted() {
854
857
WriteDetails .newBuilder ()
855
858
.addResourceNames ("test1" )
856
859
.addResourceNames ("test2" )
860
+ .addOffsets (0 )
861
+ .addOffsets (0 )
862
+ .addOffsets (0 )
863
+ // finish write is empty
857
864
.setResponse (response )
858
865
.setBytesSent (9 )
859
866
.setNumWrites (3 )))
@@ -865,6 +872,81 @@ public void onCompleted() {
865
872
verify (logStream ).write (expectedEntry );
866
873
}
867
874
875
+ @ Test
876
+ public void testWriteCallOffsetAndFinishWriteCompounding () {
877
+ WriteRequest request1 =
878
+ WriteRequest .newBuilder ()
879
+ .setResourceName ("test1" )
880
+ .setData (ByteString .copyFromUtf8 ("abc" ))
881
+ .setWriteOffset (10 )
882
+ .build ();
883
+ WriteRequest request2 =
884
+ WriteRequest .newBuilder ()
885
+ .setData (ByteString .copyFromUtf8 ("def" ))
886
+ .setWriteOffset (request1 .getWriteOffset () + request1 .getData ().size ())
887
+ .build ();
888
+ WriteResponse response = WriteResponse .newBuilder ().setCommittedSize (6 ).build ();
889
+ serviceRegistry .addService (
890
+ new ByteStreamImplBase () {
891
+ @ Override
892
+ public StreamObserver <WriteRequest > write (StreamObserver <WriteResponse > streamObserver ) {
893
+ return new StreamObserver <WriteRequest >() {
894
+ @ Override
895
+ public void onNext (WriteRequest writeRequest ) {}
896
+
897
+ @ Override
898
+ public void onError (Throwable throwable ) {}
899
+
900
+ @ Override
901
+ public void onCompleted () {
902
+ streamObserver .onNext (response );
903
+ streamObserver .onCompleted ();
904
+ }
905
+ };
906
+ }
907
+ });
908
+ ByteStreamStub stub = ByteStreamGrpc .newStub (loggedChannel );
909
+ @ SuppressWarnings ("unchecked" )
910
+ StreamObserver <WriteResponse > responseObserver = Mockito .mock (StreamObserver .class );
911
+
912
+ clock .advanceMillis (10000 );
913
+ // Request three writes, the first identical with the third, but offset correctly and
914
+ // finish_writing
915
+ StreamObserver <WriteRequest > requester = stub .write (responseObserver );
916
+ requester .onNext (request1 );
917
+ clock .advanceMillis (100 );
918
+ requester .onNext (request2 );
919
+ clock .advanceMillis (200 );
920
+ requester .onNext (
921
+ request1 .toBuilder ()
922
+ .setWriteOffset (request2 .getWriteOffset () + request2 .getData ().size ())
923
+ .setFinishWrite (true )
924
+ .build ());
925
+ clock .advanceMillis (100 );
926
+ requester .onCompleted ();
927
+
928
+ LogEntry expectedEntry =
929
+ LogEntry .newBuilder ()
930
+ .setMethodName (ByteStreamGrpc .getWriteMethod ().getFullMethodName ())
931
+ .setDetails (
932
+ RpcCallDetails .newBuilder ()
933
+ .setWrite (
934
+ WriteDetails .newBuilder ()
935
+ .addResourceNames ("test1" )
936
+ .addResourceNames ("" )
937
+ .addOffsets (request1 .getWriteOffset ())
938
+ .addFinishWrites (
939
+ 10 + request1 .getData ().size () * 2 + request2 .getData ().size ())
940
+ .setResponse (response )
941
+ .setBytesSent (9 )
942
+ .setNumWrites (3 )))
943
+ .setStatus (com .google .rpc .Status .getDefaultInstance ())
944
+ .setStartTime (Timestamp .newBuilder ().setSeconds (10 ))
945
+ .setEndTime (Timestamp .newBuilder ().setSeconds (10 ).setNanos (400000000 ))
946
+ .build ();
947
+ verify (logStream ).write (expectedEntry );
948
+ }
949
+
868
950
@ Test
869
951
public void testWriteCallFail () {
870
952
WriteRequest request =
@@ -881,7 +963,6 @@ public StreamObserver<WriteRequest> write(StreamObserver<WriteResponse> streamOb
881
963
return Mockito .mock (StreamObserver .class );
882
964
}
883
965
});
884
-
885
966
ByteStreamStub stub = ByteStreamGrpc .newStub (loggedChannel );
886
967
@ SuppressWarnings ("unchecked" )
887
968
StreamObserver <WriteResponse > responseObserver = Mockito .mock (StreamObserver .class );
@@ -894,7 +975,6 @@ public StreamObserver<WriteRequest> write(StreamObserver<WriteResponse> streamOb
894
975
requester .onError (error .asRuntimeException ());
895
976
896
977
Status expectedCancel = Status .CANCELLED .withCause (error .asRuntimeException ());
897
-
898
978
LogEntry expectedEntry =
899
979
LogEntry .newBuilder ()
900
980
.setMethodName (ByteStreamGrpc .getWriteMethod ().getFullMethodName ())
@@ -907,12 +987,50 @@ public StreamObserver<WriteRequest> write(StreamObserver<WriteResponse> streamOb
907
987
.setWrite (
908
988
WriteDetails .newBuilder ()
909
989
.addResourceNames ("test" )
990
+ .addOffsets (0 )
910
991
.setNumWrites (1 )
911
992
.setBytesSent (3 )))
912
993
.setStartTime (Timestamp .newBuilder ().setSeconds (10000000 ))
913
994
.setEndTime (Timestamp .newBuilder ().setSeconds (20000000 ))
914
995
.build ();
996
+ verify (logStream ).write (expectedEntry );
997
+ }
915
998
999
+ @ Test
1000
+ public void testQueryWriteStatusCallOk () {
1001
+ QueryWriteStatusRequest request =
1002
+ QueryWriteStatusRequest .newBuilder ().setResourceName ("test" ).build ();
1003
+ QueryWriteStatusResponse response =
1004
+ QueryWriteStatusResponse .newBuilder ().setCommittedSize (10 ).build ();
1005
+ serviceRegistry .addService (
1006
+ new ByteStreamImplBase () {
1007
+ @ Override
1008
+ public void queryWriteStatus (
1009
+ QueryWriteStatusRequest request ,
1010
+ StreamObserver <QueryWriteStatusResponse > responseObserver ) {
1011
+ clock .advanceMillis (22222 );
1012
+ responseObserver .onNext (response );
1013
+ responseObserver .onCompleted ();
1014
+ }
1015
+ });
1016
+ ByteStreamBlockingStub stub = ByteStreamGrpc .newBlockingStub (loggedChannel );
1017
+
1018
+ clock .advanceMillis (11111 );
1019
+ stub .queryWriteStatus (request );
1020
+
1021
+ LogEntry expectedEntry =
1022
+ LogEntry .newBuilder ()
1023
+ .setMethodName (ByteStreamGrpc .getQueryWriteStatusMethod ().getFullMethodName ())
1024
+ .setDetails (
1025
+ RpcCallDetails .newBuilder ()
1026
+ .setQueryWriteStatus (
1027
+ QueryWriteStatusDetails .newBuilder ()
1028
+ .setRequest (request )
1029
+ .setResponse (response )))
1030
+ .setStatus (com .google .rpc .Status .getDefaultInstance ())
1031
+ .setStartTime (Timestamp .newBuilder ().setSeconds (11 ).setNanos (111000000 ))
1032
+ .setEndTime (Timestamp .newBuilder ().setSeconds (33 ).setNanos (333000000 ))
1033
+ .build ();
916
1034
verify (logStream ).write (expectedEntry );
917
1035
}
918
1036
}
0 commit comments