Files
go-sip/internal/rpc/upload_test.go
T

72 lines
3.1 KiB
Go

package rpc
import (
"context"
"strings"
"testing"
"time"
agentv1 "git.ipao.vip/rogee/go-sip/gen/agent/v1"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/proto"
)
func TestUploadBindingAndExpiryGuards(t *testing.T) {
now := time.Unix(100, 0)
server := NewServer(ServerOptions{
Now: func() time.Time { return now },
UploadPolicy: &agentv1.UploadPolicy{Enabled: true, MaxAssetBytes: 1024},
})
_, err := server.ActivateAgent(context.Background(), &agentv1.ActivateAgentRequest{
Meta: testMeta("activate-upload", "", 0),
Binding: &agentv1.AgentBinding{AgentId: "agent-1", CellId: "cell-1", ExpectedBootId: "boot-1", DispatcherEpoch: "epoch-1", SessionGeneration: 1},
ActivationOperationId: "activate-upload",
SessionExpiresAtUnixMs: now.Add(time.Hour).UnixMilli(),
})
if err != nil {
t.Fatal(err)
}
binding := &agentv1.ExecutionBinding{TenantId: "tenant-1", TenantKey: "tenant-demo-key", ExecutionId: "execution-upload", TaskId: "task-upload", TaskItemId: "item-upload", TaskRevision: 1}
asset := &agentv1.AssetDescriptor{Kind: agentv1.AssetKind_ASSET_KIND_RECORDING, AssetId: "recording-upload", ExecutionId: binding.ExecutionId, Format: "wav", SizeBytes: 4, ChecksumSha256: strings.Repeat("a", 64), Channels: 1, SampleRateHz: 16000, DurationMs: 1}
request := &agentv1.RequestUploadRequest{Meta: testMeta("upload-request", "upload-request-key", 1), Binding: binding, Asset: asset, UploadId: "upload-binding"}
created, err := server.RequestUpload(context.Background(), request)
if err != nil {
t.Fatal(err)
}
if created.Grant == nil || created.Grant.ExpiresAtUnixMs <= now.UnixMilli() {
t.Fatalf("invalid grant: %+v", created.Grant)
}
mismatched := proto.Clone(request).(*agentv1.RequestUploadRequest)
mismatched.Meta = testMeta("upload-conflict", "upload-conflict-key", 1)
mismatched.Binding = proto.Clone(binding).(*agentv1.ExecutionBinding)
mismatched.Binding.ExecutionId = "other-execution"
conflict, err := server.RequestUpload(context.Background(), mismatched)
if err != nil {
t.Fatal(err)
}
if conflict.Receipt == nil || conflict.Receipt.Result != agentv1.ResultCode_RESULT_CODE_CONFLICT {
t.Fatalf("unexpected upload conflict: %+v", conflict)
}
now = now.Add(6 * time.Minute)
completed, err := server.CompleteUpload(context.Background(), &agentv1.CompleteUploadRequest{
Meta: testMeta("upload-complete-expired", "upload-complete-expired-key", 1),
Binding: binding,
Asset: asset,
UploadId: request.UploadId,
UploadedSizeBytes: asset.SizeBytes,
UploadedChecksumSha256: asset.ChecksumSha256,
})
if err != nil {
t.Fatal(err)
}
if completed.Receipt == nil || completed.Receipt.Result != agentv1.ResultCode_RESULT_CODE_REJECTED || completed.Receipt.Failure == nil || completed.Receipt.Failure.Code != agentv1.FailureCode_FAILURE_CODE_FAILED_PRECONDITION {
t.Fatalf("unexpected expired completion: %+v", completed)
}
if status.Code(err) != codes.OK {
t.Fatalf("unexpected status code: %s", status.Code(err))
}
}