72 lines
3.1 KiB
Go
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))
|
|
}
|
|
}
|