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

66 lines
2.5 KiB
Go

package rpc
import (
"context"
"encoding/json"
"strings"
"testing"
"time"
agentpb "git.ipao.vip/rogee/go-sip/gen/agent"
ossclient "git.ipao.vip/rogee/go-sip/internal/oss"
"git.ipao.vip/rogee/go-sip/internal/store"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func TestUploadFactKeepsOriginallyGrantedBucketAfterConfigurationChange(t *testing.T) {
st, err := store.Open(":memory:")
if err != nil {
t.Fatal(err)
}
defer st.Close()
if err := st.BindDispatcherID("11111111-1111-4111-8111-111111111111"); err != nil {
t.Fatal(err)
}
makeServer := func(bucket string) *DispatcherUploadServer {
signer, err := ossclient.NewClient(ossclient.Config{Endpoint: "https://oss.invalid", Region: "cn-beijing", Bucket: bucket, AccessKeyID: "local-test", AccessKeySecret: "local-test", MaxAssetBytes: 1024})
if err != nil {
t.Fatal(err)
}
server, err := NewDispatcherUploadServer(st, signer, time.Now, false)
if err != nil {
t.Fatal(err)
}
return server
}
binding := &agentpb.ExecutionBinding{TenantId: "tenant-a", TenantKey: "tenant-a", TaskId: "task-a", ExecutionId: "execution-a", CallId: "call-a"}
asset := &agentpb.AssetDescriptor{Kind: agentpb.AssetKind_ASSET_KIND_RECORDING, AssetId: "recording-a", CallId: "call-a", Format: "wav", Channels: 1, SampleRateHz: 8000, DurationMs: 10, SizeBytes: 4, ChecksumSha256: strings.Repeat("a", 64)}
meta := &agentpb.RequestMeta{AgentId: "agent-a", CellId: "cell-a", OperationId: "op-a", IdempotencyKey: "key-a", TraceId: "trace-a"}
first := makeServer("original-bucket")
response, err := first.RequestUpload(context.Background(), &agentpb.RequestUploadRequest{Meta: meta, Binding: binding, Asset: asset, UploadId: "upload-a"})
if err != nil || response.GetGrant() == nil {
t.Fatalf("grant: %v", err)
}
restarted := makeServer("new-bucket")
_, err = restarted.CompleteUpload(context.Background(), &agentpb.CompleteUploadRequest{Meta: meta, Binding: binding, Asset: asset, UploadId: "upload-a", UploadedSizeBytes: 4, UploadedChecksumSha256: asset.ChecksumSha256})
if status.Code(err) != codes.Unavailable {
t.Fatalf("pending notification: %v", err)
}
var body []byte
if err := st.DB().QueryRow(`SELECT body FROM outbox`).Scan(&body); err != nil {
t.Fatal(err)
}
var event struct {
Payload struct {
Bucket string `json:"bucket"`
} `json:"payload"`
}
if err := json.Unmarshal(body, &event); err != nil {
t.Fatal(err)
}
if event.Payload.Bucket != "original-bucket" {
t.Fatalf("reported wrong object location: %s", event.Payload.Bucket)
}
}