feat: update client to new v0.1.1

This commit is contained in:
2026-08-06 19:47:26 +02:00
parent aa9d403d09
commit 103efa8b1c
4 changed files with 818 additions and 92 deletions

View File

@@ -42,12 +42,17 @@ type testService struct {
deleteFileRequests chan *zwdaemonv1.DeleteFileRequest
deleteFileErr error
moveFileRequests chan *zwdaemonv1.MoveFileRequest
moveFileErr error
copyFileRequests chan *zwdaemonv1.CopyFileRequest
copyFileErr error
compactCalls chan struct{}
compactErr error
getFile func(*zwdaemonv1.GetFileRequest, grpc.ServerStreamingServer[zwdaemonv1.GetFileResponse]) error
getFileRange func(*zwdaemonv1.GetFileRangeRequest, grpc.ServerStreamingServer[zwdaemonv1.GetFileRangeResponse]) error
addFile func(grpc.ClientStreamingServer[zwdaemonv1.AddFileRequest, zwdaemonv1.AddFileResponse]) error
replaceFile func(grpc.ClientStreamingServer[zwdaemonv1.ReplaceFileRequest, zwdaemonv1.ReplaceFileResponse]) error
}
func (s *testService) GetServerInfo(
@@ -120,6 +125,26 @@ func (s *testService) Compact(
return &zwdaemonv1.CompactResponse{}, s.compactErr
}
func (s *testService) MoveFile(
_ context.Context,
request *zwdaemonv1.MoveFileRequest,
) (*zwdaemonv1.MoveFileResponse, error) {
if s.moveFileRequests != nil {
s.moveFileRequests <- request
}
return &zwdaemonv1.MoveFileResponse{}, s.moveFileErr
}
func (s *testService) CopyFile(
_ context.Context,
request *zwdaemonv1.CopyFileRequest,
) (*zwdaemonv1.CopyFileResponse, error) {
if s.copyFileRequests != nil {
s.copyFileRequests <- request
}
return &zwdaemonv1.CopyFileResponse{}, s.copyFileErr
}
func (s *testService) GetFile(
request *zwdaemonv1.GetFileRequest,
stream grpc.ServerStreamingServer[zwdaemonv1.GetFileResponse],
@@ -149,6 +174,15 @@ func (s *testService) AddFile(
return s.addFile(stream)
}
func (s *testService) ReplaceFile(
stream grpc.ClientStreamingServer[zwdaemonv1.ReplaceFileRequest, zwdaemonv1.ReplaceFileResponse],
) error {
if s.replaceFile == nil {
return stream.SendAndClose(&zwdaemonv1.ReplaceFileResponse{})
}
return s.replaceFile(stream)
}
func startTestServer(t *testing.T, service *testService) string {
t.Helper()
@@ -536,6 +570,32 @@ func TestDeleteFileMapsRequestAndStructuredError(t *testing.T) {
}
}
func TestMoveAndCopyFileMapRequests(t *testing.T) {
service := &testService{
moveFileRequests: make(chan *zwdaemonv1.MoveFileRequest, 1),
copyFileRequests: make(chan *zwdaemonv1.CopyFileRequest, 1),
}
client := startConnectedTestClient(t, service)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := client.MoveFile(ctx, "source.txt", "renamed.txt"); err != nil {
t.Fatalf("MoveFile() error = %v", err)
}
moveRequest := <-service.moveFileRequests
if moveRequest.GetSourcePath() != "source.txt" || moveRequest.GetDestinationPath() != "renamed.txt" {
t.Errorf("MoveFile request = %#v", moveRequest)
}
if err := client.CopyFile(ctx, "source.txt", "copy.txt"); err != nil {
t.Fatalf("CopyFile() error = %v", err)
}
copyRequest := <-service.copyFileRequests
if copyRequest.GetSourcePath() != "source.txt" || copyRequest.GetDestinationPath() != "copy.txt" {
t.Errorf("CopyFile request = %#v", copyRequest)
}
}
func TestConvertRPCErrorAcceptsNil(t *testing.T) {
if err := convertRPCError(nil); err != nil {
t.Fatalf("convertRPCError(nil) = %v", err)
@@ -827,6 +887,41 @@ func TestAddFileProcessesDataReturnedWithEOF(t *testing.T) {
}
}
func TestReplaceFileSendsHeaderAndChunks(t *testing.T) {
received := make(chan receivedReplaceUpload, 1)
service := &testService{
replaceFile: func(
stream grpc.ClientStreamingServer[zwdaemonv1.ReplaceFileRequest, zwdaemonv1.ReplaceFileResponse],
) error {
upload, err := receiveReplaceUpload(stream)
if err != nil {
return err
}
received <- upload
return stream.SendAndClose(&zwdaemonv1.ReplaceFileResponse{})
},
}
client := startConnectedTestClient(t, service)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
contents := []byte("replacement contents")
if err := client.ReplaceFile(ctx, "existing.bin", bytes.NewReader(contents), uint64(len(contents))); err != nil {
t.Fatalf("ReplaceFile() error = %v", err)
}
upload := <-received
if upload.header.GetLogicalPath() != "existing.bin" {
t.Errorf("logical path = %q", upload.header.GetLogicalPath())
}
if upload.header.GetSourceLen() != uint64(len(contents)) {
t.Errorf("source length = %d", upload.header.GetSourceLen())
}
if !bytes.Equal(upload.contents, contents) {
t.Errorf("replacement contents differ")
}
}
func TestAddFileReturnsLengthRejectionFromCloseAndRecv(t *testing.T) {
serverStatus, err := status.New(codes.InvalidArgument, "declared length does not match source").WithDetails(
&zwdaemonv1.ZwErrorDetail{
@@ -977,6 +1072,40 @@ func receiveUpload(
}
}
type receivedReplaceUpload struct {
header *zwdaemonv1.ReplaceFileHeader
contents []byte
}
func receiveReplaceUpload(
stream grpc.ClientStreamingServer[zwdaemonv1.ReplaceFileRequest, zwdaemonv1.ReplaceFileResponse],
) (receivedReplaceUpload, error) {
first, err := stream.Recv()
if err != nil {
return receivedReplaceUpload{}, err
}
header := first.GetHeader()
if header == nil {
return receivedReplaceUpload{}, status.Error(codes.InvalidArgument, "first replacement message is not a header")
}
upload := receivedReplaceUpload{header: header}
for {
request, err := stream.Recv()
if err == io.EOF {
return upload, nil
}
if err != nil {
return upload, err
}
payload, ok := request.GetPayload().(*zwdaemonv1.ReplaceFileRequest_Chunk)
if !ok {
return upload, status.Error(codes.InvalidArgument, "replacement message after header is not a chunk")
}
upload.contents = append(upload.contents, payload.Chunk...)
}
}
type dataAndEOFReader struct {
data []byte
done bool