56 lines
2.3 KiB
Go
56 lines
2.3 KiB
Go
package runtime
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"browser.local/run/protocol"
|
|
)
|
|
|
|
func TestRemoteAdapterRegistryHonorsTimeoutAndCancellation(t *testing.T) {
|
|
registry := NewRemoteAdapterRegistry()
|
|
if err := registry.Register("database", RemoteAdapterFunc(func(ctx context.Context, request RemoteAdapterRequest) (RemoteAdapterOutcome, error) {
|
|
<-ctx.Done()
|
|
return RemoteAdapterOutcome{}, ctx.Err()
|
|
})); err != nil {
|
|
t.Fatalf("register blocking adapter: %v", err)
|
|
}
|
|
assignment := lifecycleAssignment(protocol.RunCapabilityRemoteRunDBSQLiteQuery)
|
|
assignment.TargetKey = "db/sqlite/query"
|
|
assignment.InputRef = "input://server-1/db/sqlite/query/1"
|
|
assignment.ExecutionInput.RemoteAdapterKind = "database"
|
|
assignment.ExecutionInput.RemoteAdapterKey = "db-sqlite"
|
|
assignment.ExecutionInput.TimeoutSeconds = 1
|
|
started := time.Now()
|
|
result := ExecuteRemoteAccessJobWithRegistry(context.Background(), assignment, registry)
|
|
if result.ErrorCode != "remote_adapter_timeout" || !result.Retryable || time.Since(started) > 3*time.Second {
|
|
t.Fatalf("expected bounded remote timeout, got %+v", result)
|
|
}
|
|
|
|
cancelCtx, cancel := context.WithCancel(context.Background())
|
|
cancel()
|
|
result = ExecuteRemoteAccessJobWithRegistry(cancelCtx, assignment, NewRemoteAdapterRegistry())
|
|
if result.ErrorCode != "remote_adapter_cancelled" || result.State != "cancelled" {
|
|
t.Fatalf("expected remote cancellation, got %+v", result)
|
|
}
|
|
}
|
|
|
|
func TestRemoteAdapterRejectsKindMismatchAndUnsafeProjection(t *testing.T) {
|
|
assignment := lifecycleAssignment(protocol.RunCapabilityRemoteRunDBSQLiteQuery)
|
|
assignment.TargetKey = "db/sqlite/query"
|
|
assignment.InputRef = "input://server-1/db/sqlite/query/1"
|
|
assignment.ExecutionInput.RemoteAdapterKind = "rcon"
|
|
result := ExecuteRemoteAccessJob(context.Background(), assignment)
|
|
if result.ErrorCode != "remote_adapter_capability_mismatch" {
|
|
t.Fatalf("expected kind mismatch rejection, got %+v", result)
|
|
}
|
|
assignment.ExecutionInput.RemoteAdapterKind = "database"
|
|
assignment.ExecutionInput.RemoteAdapterKey = "tcp://unapproved"
|
|
result = ExecuteRemoteAccessJob(context.Background(), assignment)
|
|
if result.ErrorCode != "unsafe_remote_adapter_target" || strings.Contains(result.Message, "tcp://") {
|
|
t.Fatalf("expected unsafe adapter target rejection, got %+v", result)
|
|
}
|
|
}
|