599 lines
29 KiB
Go
599 lines
29 KiB
Go
package supervisor
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/example/remote-access-platform/agents/rap-node-agent/internal/client"
|
|
)
|
|
|
|
func TestStubSupervisorReportsDegradedForEnabledWorkload(t *testing.T) {
|
|
statuses, err := (StubSupervisor{Version: "test"}).Apply(context.Background(), []client.DesiredWorkload{
|
|
{ServiceType: "rdp-worker", DesiredState: "enabled", RuntimeMode: "container"},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("apply desired workload: %v", err)
|
|
}
|
|
if len(statuses) != 1 {
|
|
t.Fatalf("statuses length = %d", len(statuses))
|
|
}
|
|
if statuses[0].ReportedState != "degraded" {
|
|
t.Fatalf("ReportedState = %q", statuses[0].ReportedState)
|
|
}
|
|
}
|
|
|
|
func TestStubSupervisorReportsStoppedForDisabledWorkload(t *testing.T) {
|
|
statuses, err := (StubSupervisor{Version: "test"}).Apply(context.Background(), []client.DesiredWorkload{
|
|
{ServiceType: "relay-node", DesiredState: "disabled", RuntimeMode: "container"},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("apply desired workload: %v", err)
|
|
}
|
|
if statuses[0].ReportedState != "stopped" {
|
|
t.Fatalf("ReportedState = %q", statuses[0].ReportedState)
|
|
}
|
|
}
|
|
|
|
func TestStubSupervisorRunsInternalSyntheticEchoWorkload(t *testing.T) {
|
|
statuses, err := (StubSupervisor{Version: "test"}).Apply(context.Background(), []client.DesiredWorkload{
|
|
{ServiceType: "synthetic.echo", DesiredState: "enabled", RuntimeMode: "native"},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("apply desired workload: %v", err)
|
|
}
|
|
if statuses[0].ReportedState != "running" {
|
|
t.Fatalf("ReportedState = %q", statuses[0].ReportedState)
|
|
}
|
|
if statuses[0].StatusPayload["reason"] != "internal_synthetic_echo_ready" {
|
|
t.Fatalf("reason = %v", statuses[0].StatusPayload["reason"])
|
|
}
|
|
if statuses[0].StatusPayload["execution_mode"] != "builtin" {
|
|
t.Fatalf("execution_mode = %v", statuses[0].StatusPayload["execution_mode"])
|
|
}
|
|
}
|
|
|
|
func TestStubSupervisorReportsBuiltinFabricServicesRunning(t *testing.T) {
|
|
statuses, err := (StubSupervisor{Version: "test"}).Apply(context.Background(), []client.DesiredWorkload{
|
|
{ServiceType: "core-mesh", DesiredState: "enabled", RuntimeMode: "container"},
|
|
{ServiceType: "mesh-listener", DesiredState: "enabled", RuntimeMode: "container"},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("apply desired workload: %v", err)
|
|
}
|
|
if len(statuses) != 2 {
|
|
t.Fatalf("statuses length = %d", len(statuses))
|
|
}
|
|
for _, status := range statuses {
|
|
if status.ReportedState != "running" {
|
|
t.Fatalf("ReportedState = %q", status.ReportedState)
|
|
}
|
|
if status.StatusPayload["reason"] != "builtin_node_agent_service_ready" {
|
|
t.Fatalf("reason = %v", status.StatusPayload["reason"])
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestStubSupervisorKeepsUnsupportedEnabledWorkloadDegraded(t *testing.T) {
|
|
statuses, err := (StubSupervisor{Version: "test"}).Apply(context.Background(), []client.DesiredWorkload{
|
|
{ServiceType: "rdp-worker", DesiredState: "enabled", RuntimeMode: "container"},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("apply desired workload: %v", err)
|
|
}
|
|
if statuses[0].ReportedState != "degraded" {
|
|
t.Fatalf("ReportedState = %q", statuses[0].ReportedState)
|
|
}
|
|
if statuses[0].StatusPayload["reason"] != "service_runtime_not_implemented" {
|
|
t.Fatalf("reason = %v", statuses[0].StatusPayload["reason"])
|
|
}
|
|
}
|
|
|
|
func TestStubSupervisorRunsRDPWorkerAdapterContractProbeOnly(t *testing.T) {
|
|
statuses, err := (StubSupervisor{Version: "test"}).Apply(context.Background(), []client.DesiredWorkload{
|
|
{
|
|
ServiceType: "rdp-worker",
|
|
DesiredState: "enabled",
|
|
RuntimeMode: "native",
|
|
Config: map[string]any{
|
|
"adapter_contract_probe": true,
|
|
},
|
|
},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("apply desired workload: %v", err)
|
|
}
|
|
if statuses[0].ReportedState != "running" {
|
|
t.Fatalf("ReportedState = %q", statuses[0].ReportedState)
|
|
}
|
|
if statuses[0].StatusPayload["reason"] != "remote_workspace_adapter_contract_probe_ready" {
|
|
t.Fatalf("reason = %v", statuses[0].StatusPayload["reason"])
|
|
}
|
|
if statuses[0].StatusPayload["service_class"] != "remote_workspace" {
|
|
t.Fatalf("service_class = %v", statuses[0].StatusPayload["service_class"])
|
|
}
|
|
if statuses[0].StatusPayload["backend_relay_steady_state"] != false {
|
|
t.Fatalf("backend_relay_steady_state = %v", statuses[0].StatusPayload["backend_relay_steady_state"])
|
|
}
|
|
channels, ok := statuses[0].StatusPayload["channels"].([]map[string]any)
|
|
if !ok || len(channels) != 9 {
|
|
t.Fatalf("channels = %#v", statuses[0].StatusPayload["channels"])
|
|
}
|
|
if channels[0]["name"] != "input" || channels[0]["priority"] != "critical" || channels[0]["droppable"] != true || channels[0]["may_block_input"] != false {
|
|
t.Fatalf("unexpected input channel: %#v", channels[0])
|
|
}
|
|
frameBatch, ok := statuses[0].StatusPayload["frame_batch_contract"].(map[string]any)
|
|
if !ok {
|
|
t.Fatalf("frame_batch_contract = %#v", statuses[0].StatusPayload["frame_batch_contract"])
|
|
}
|
|
if frameBatch["schema_version"] != "rap.remote_workspace_frame_batch.v1" ||
|
|
frameBatch["payload_forwarding"] != "not_implemented" ||
|
|
frameBatch["service_class"] != "remote_workspace" {
|
|
t.Fatalf("unexpected frame batch contract: %#v", frameBatch)
|
|
}
|
|
realAdapter, ok := statuses[0].StatusPayload["real_adapter_supervision"].(map[string]any)
|
|
if !ok {
|
|
t.Fatalf("real_adapter_supervision = %#v", statuses[0].StatusPayload["real_adapter_supervision"])
|
|
}
|
|
if realAdapter["schema_version"] != "rap.remote_workspace_real_adapter_supervision.v1" ||
|
|
realAdapter["enabled"] != false ||
|
|
realAdapter["activation_state"] != "disabled_until_real_runtime_stage" ||
|
|
realAdapter["payload_traffic"] != "none" {
|
|
t.Fatalf("unexpected real adapter supervision contract: %#v", realAdapter)
|
|
}
|
|
if !realAdapterSupervisionContractCompatible(realAdapter) {
|
|
t.Fatalf("real adapter supervision contract is not compatible: %#v", realAdapter)
|
|
}
|
|
}
|
|
|
|
func TestStubSupervisorKeepsContractProbePrecedenceWhenRealAdapterAlsoRequested(t *testing.T) {
|
|
statuses, err := (StubSupervisor{
|
|
Version: "test",
|
|
RemoteWorkspaceRealAdapter: RemoteWorkspaceRealAdapterConfig{
|
|
EnabledRequested: true,
|
|
Command: "/opt/rap/bin/rdp-worker",
|
|
ArgsJSON: `["--future-probe"]`,
|
|
WorkDir: "/var/lib/rap-node-agent/rdp-worker",
|
|
},
|
|
}).Apply(context.Background(), []client.DesiredWorkload{
|
|
{
|
|
ServiceType: "rdp-worker",
|
|
DesiredState: "enabled",
|
|
RuntimeMode: "native",
|
|
Config: map[string]any{
|
|
"adapter_contract_probe": true,
|
|
"real_adapter_supervision": true,
|
|
},
|
|
},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("apply desired workload: %v", err)
|
|
}
|
|
if statuses[0].ReportedState != "running" {
|
|
t.Fatalf("ReportedState = %q", statuses[0].ReportedState)
|
|
}
|
|
payload := statuses[0].StatusPayload
|
|
if payload["execution_mode"] != "contract_probe" ||
|
|
payload["reason"] != "remote_workspace_adapter_contract_probe_ready" ||
|
|
payload["traffic"] != "none" {
|
|
t.Fatalf("contract probe did not retain precedence: %#v", payload)
|
|
}
|
|
realAdapter, ok := payload["real_adapter_supervision"].(map[string]any)
|
|
if !ok || !realAdapterSupervisionContractCompatible(realAdapter) {
|
|
t.Fatalf("real_adapter_supervision = %#v", payload["real_adapter_supervision"])
|
|
}
|
|
decision := realAdapter["activation_decision"].(map[string]any)
|
|
if realAdapter["enabled"] != false ||
|
|
decision["decision"] != "blocked" ||
|
|
decision["reason"] != "real_runtime_stage_not_enabled" ||
|
|
decision["payload_traffic"] != "none" {
|
|
t.Fatalf("unexpected activation decision under contract-probe precedence: %#v", realAdapter)
|
|
}
|
|
}
|
|
|
|
func TestStubSupervisorKeepsRealAdapterSupervisionDisabled(t *testing.T) {
|
|
statuses, err := (StubSupervisor{
|
|
Version: "test",
|
|
RemoteWorkspaceRealAdapter: RemoteWorkspaceRealAdapterConfig{
|
|
EnabledRequested: true,
|
|
Command: "/opt/rap/bin/rdp-worker",
|
|
ArgsJSON: `["--future-probe"]`,
|
|
WorkDir: "/var/lib/rap-node-agent/rdp-worker",
|
|
},
|
|
}).Apply(context.Background(), []client.DesiredWorkload{
|
|
{
|
|
ServiceType: "rdp-worker",
|
|
DesiredState: "enabled",
|
|
RuntimeMode: "native",
|
|
Config: map[string]any{
|
|
"real_adapter_supervision": true,
|
|
},
|
|
},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("apply desired workload: %v", err)
|
|
}
|
|
if statuses[0].ReportedState != "degraded" {
|
|
t.Fatalf("ReportedState = %q", statuses[0].ReportedState)
|
|
}
|
|
if statuses[0].StatusPayload["reason"] != "remote_workspace_real_adapter_supervision_disabled" ||
|
|
statuses[0].StatusPayload["execution_mode"] != "real_adapter_supervision_disabled" ||
|
|
statuses[0].StatusPayload["traffic"] != "blocked" ||
|
|
statuses[0].StatusPayload["payload_traffic"] != "none" {
|
|
t.Fatalf("unexpected real adapter disabled payload: %#v", statuses[0].StatusPayload)
|
|
}
|
|
realAdapter, ok := statuses[0].StatusPayload["real_adapter_supervision"].(map[string]any)
|
|
if !ok || !realAdapterSupervisionContractCompatible(realAdapter) {
|
|
t.Fatalf("real adapter supervision contract = %#v", statuses[0].StatusPayload["real_adapter_supervision"])
|
|
}
|
|
projection, ok := realAdapter["config_projection"].(map[string]any)
|
|
if !ok {
|
|
t.Fatalf("config_projection = %#v", realAdapter["config_projection"])
|
|
}
|
|
if realAdapter["enabled"] != false ||
|
|
projection["enabled_requested"] != true ||
|
|
projection["activation_allowed"] != false ||
|
|
projection["command_present"] != true ||
|
|
projection["args_json_present"] != true ||
|
|
projection["args_json_shape"] != "json_array" ||
|
|
projection["workdir_present"] != true ||
|
|
projection["raw_values_redacted"] != true {
|
|
t.Fatalf("unexpected config projection: %#v", projection)
|
|
}
|
|
decision, ok := realAdapter["activation_decision"].(map[string]any)
|
|
if !ok {
|
|
t.Fatalf("activation_decision = %#v", realAdapter["activation_decision"])
|
|
}
|
|
if decision["decision"] != "blocked" ||
|
|
decision["reason"] != "real_runtime_stage_not_enabled" ||
|
|
decision["enabled_requested"] != true ||
|
|
decision["activation_allowed"] != false ||
|
|
decision["payload_traffic"] != "none" {
|
|
t.Fatalf("unexpected activation decision: %#v", decision)
|
|
}
|
|
features, ok := realAdapter["features"].(map[string]any)
|
|
if !ok ||
|
|
features["config_projection"] != true ||
|
|
features["activation_decision"] != true ||
|
|
features["process_supervisor_preconditions"] != true ||
|
|
features["process_supervisor_start_disabled"] != true ||
|
|
features["missing_gates"] != true ||
|
|
features["raw_values_redacted"] != true {
|
|
t.Fatalf("unexpected real adapter features: %#v", realAdapter["features"])
|
|
}
|
|
preconditions, ok := realAdapter["process_supervisor_preconditions"].(map[string]any)
|
|
if !ok ||
|
|
preconditions["schema_version"] != "rap.remote_workspace_real_adapter_process_supervisor_preconditions.v1" ||
|
|
preconditions["process_start_allowed"] != false ||
|
|
preconditions["command_config_present"] != true ||
|
|
preconditions["args_config_present"] != true ||
|
|
preconditions["workdir_config_present"] != true {
|
|
t.Fatalf("unexpected process supervisor preconditions: %#v", realAdapter["process_supervisor_preconditions"])
|
|
}
|
|
healthProbe, ok := realAdapter["process_health_probe"].(map[string]any)
|
|
if !ok ||
|
|
healthProbe["schema_version"] != "rap.remote_workspace_real_adapter_process_health_probe.v1" ||
|
|
healthProbe["health_probe_enabled"] != false ||
|
|
healthProbe["payload_traffic"] != "none" {
|
|
t.Fatalf("unexpected process health probe: %#v", realAdapter["process_health_probe"])
|
|
}
|
|
}
|
|
|
|
func TestRealAdapterSupervisionContractCompatibility(t *testing.T) {
|
|
compatible := remoteWorkspaceRealAdapterSupervisionContract()
|
|
if !realAdapterSupervisionContractCompatible(compatible) {
|
|
t.Fatalf("expected real adapter supervision contract to be compatible")
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
contract map[string]any
|
|
}{
|
|
{
|
|
name: "enabled",
|
|
contract: map[string]any{
|
|
"schema_version": "rap.remote_workspace_real_adapter_supervision.v1",
|
|
"enabled": true,
|
|
"activation_state": "disabled_until_real_runtime_stage",
|
|
"payload_traffic": "none",
|
|
"config_projection": map[string]any{"schema_version": "rap.remote_workspace_real_adapter_config_projection.v1", "activation_allowed": false, "raw_values_redacted": true},
|
|
"activation_decision": map[string]any{"schema_version": "rap.remote_workspace_real_adapter_activation_decision.v1", "decision": "blocked", "reason": "real_runtime_stage_not_enabled", "activation_allowed": false, "payload_traffic": "none", "required_gates": []string{"real_runtime_stage_enabled", "fabric_service_channel_runtime_ready", "adapter_process_supervisor_enabled", "payload_forwarding_contract_enabled"}, "missing_gates": []string{"real_runtime_stage_enabled", "fabric_service_channel_runtime_ready", "adapter_process_supervisor_enabled", "payload_forwarding_contract_enabled"}},
|
|
"process_supervisor_preconditions": map[string]any{"schema_version": "rap.remote_workspace_real_adapter_process_supervisor_preconditions.v1", "process_start_allowed": false, "reason": "disabled_until_real_runtime_stage", "required_checks": []string{"real_runtime_stage_enabled", "command_config_validated", "workdir_config_validated", "process_identity_policy_bound", "fabric_service_channel_runtime_ready", "payload_forwarding_contract_enabled", "health_probe_contract_enabled"}, "missing_checks": []string{"real_runtime_stage_enabled", "command_config_validated", "workdir_config_validated", "process_identity_policy_bound", "fabric_service_channel_runtime_ready", "payload_forwarding_contract_enabled", "health_probe_contract_enabled"}},
|
|
"process_health_probe": map[string]any{"schema_version": "rap.remote_workspace_real_adapter_process_health_probe.v1", "health_probe_enabled": false, "reason": "disabled_until_real_runtime_stage", "payload_traffic": "none", "probe_model": "external_process_health", "required_signals": []string{"process_started", "process_exit_status", "adapter_control_channel_ready", "fabric_service_channel_bound", "payload_forwarding_contract_ready"}, "missing_signals": []string{"process_started", "process_exit_status", "adapter_control_channel_ready", "fabric_service_channel_bound", "payload_forwarding_contract_ready"}},
|
|
"features": map[string]any{"config_projection": true, "activation_decision": true, "missing_gates": true, "process_health_probe": true, "process_health_probe_disabled": true, "process_supervisor_preconditions": true, "process_supervisor_start_disabled": true, "raw_values_redacted": true},
|
|
"config_env": []string{"RAP_REMOTE_WORKSPACE_REAL_ADAPTER_ENABLED", "RAP_REMOTE_WORKSPACE_REAL_ADAPTER_COMMAND", "RAP_REMOTE_WORKSPACE_REAL_ADAPTER_ARGS_JSON", "RAP_REMOTE_WORKSPACE_REAL_ADAPTER_WORKDIR"},
|
|
"status_contract": []string{"schema_version", "enabled", "activation_state", "execution_mode", "payload_traffic", "process_model", "config_projection", "activation_decision", "process_supervisor_preconditions", "process_health_probe", "features", "config_env", "status_contract"},
|
|
"guardrails": []string{"contract_probe_remains_default", "no_payload_forwarding_until_real_runtime_stage", "backend_relay_not_steady_state", "fabric_service_channel_required"},
|
|
},
|
|
},
|
|
{
|
|
name: "missing env",
|
|
contract: map[string]any{
|
|
"schema_version": "rap.remote_workspace_real_adapter_supervision.v1",
|
|
"enabled": false,
|
|
"activation_state": "disabled_until_real_runtime_stage",
|
|
"payload_traffic": "none",
|
|
"config_projection": map[string]any{"schema_version": "rap.remote_workspace_real_adapter_config_projection.v1", "activation_allowed": false, "raw_values_redacted": true},
|
|
"activation_decision": map[string]any{"schema_version": "rap.remote_workspace_real_adapter_activation_decision.v1", "decision": "blocked", "reason": "real_runtime_stage_not_enabled", "activation_allowed": false, "payload_traffic": "none", "required_gates": []string{"real_runtime_stage_enabled", "fabric_service_channel_runtime_ready", "adapter_process_supervisor_enabled", "payload_forwarding_contract_enabled"}, "missing_gates": []string{"real_runtime_stage_enabled", "fabric_service_channel_runtime_ready", "adapter_process_supervisor_enabled", "payload_forwarding_contract_enabled"}},
|
|
"process_supervisor_preconditions": map[string]any{"schema_version": "rap.remote_workspace_real_adapter_process_supervisor_preconditions.v1", "process_start_allowed": false, "reason": "disabled_until_real_runtime_stage", "required_checks": []string{"real_runtime_stage_enabled", "command_config_validated", "workdir_config_validated", "process_identity_policy_bound", "fabric_service_channel_runtime_ready", "payload_forwarding_contract_enabled", "health_probe_contract_enabled"}, "missing_checks": []string{"real_runtime_stage_enabled", "command_config_validated", "workdir_config_validated", "process_identity_policy_bound", "fabric_service_channel_runtime_ready", "payload_forwarding_contract_enabled", "health_probe_contract_enabled"}},
|
|
"process_health_probe": map[string]any{"schema_version": "rap.remote_workspace_real_adapter_process_health_probe.v1", "health_probe_enabled": false, "reason": "disabled_until_real_runtime_stage", "payload_traffic": "none", "probe_model": "external_process_health", "required_signals": []string{"process_started", "process_exit_status", "adapter_control_channel_ready", "fabric_service_channel_bound", "payload_forwarding_contract_ready"}, "missing_signals": []string{"process_started", "process_exit_status", "adapter_control_channel_ready", "fabric_service_channel_bound", "payload_forwarding_contract_ready"}},
|
|
"features": map[string]any{"config_projection": true, "activation_decision": true, "missing_gates": true, "process_health_probe": true, "process_health_probe_disabled": true, "process_supervisor_preconditions": true, "process_supervisor_start_disabled": true, "raw_values_redacted": true},
|
|
"config_env": []string{"RAP_REMOTE_WORKSPACE_REAL_ADAPTER_ENABLED"},
|
|
"status_contract": []string{"schema_version", "enabled", "activation_state", "execution_mode", "payload_traffic", "process_model", "config_projection", "activation_decision", "process_supervisor_preconditions", "process_health_probe", "features", "config_env", "status_contract"},
|
|
"guardrails": []string{"contract_probe_remains_default", "no_payload_forwarding_until_real_runtime_stage", "backend_relay_not_steady_state", "fabric_service_channel_required"},
|
|
},
|
|
},
|
|
{
|
|
name: "missing guardrail",
|
|
contract: map[string]any{
|
|
"schema_version": "rap.remote_workspace_real_adapter_supervision.v1",
|
|
"enabled": false,
|
|
"activation_state": "disabled_until_real_runtime_stage",
|
|
"payload_traffic": "none",
|
|
"config_projection": map[string]any{"schema_version": "rap.remote_workspace_real_adapter_config_projection.v1", "activation_allowed": false, "raw_values_redacted": true},
|
|
"activation_decision": map[string]any{"schema_version": "rap.remote_workspace_real_adapter_activation_decision.v1", "decision": "blocked", "reason": "real_runtime_stage_not_enabled", "activation_allowed": false, "payload_traffic": "none", "required_gates": []string{"real_runtime_stage_enabled", "fabric_service_channel_runtime_ready", "adapter_process_supervisor_enabled", "payload_forwarding_contract_enabled"}, "missing_gates": []string{"real_runtime_stage_enabled", "fabric_service_channel_runtime_ready", "adapter_process_supervisor_enabled", "payload_forwarding_contract_enabled"}},
|
|
"process_supervisor_preconditions": map[string]any{"schema_version": "rap.remote_workspace_real_adapter_process_supervisor_preconditions.v1", "process_start_allowed": false, "reason": "disabled_until_real_runtime_stage", "required_checks": []string{"real_runtime_stage_enabled", "command_config_validated", "workdir_config_validated", "process_identity_policy_bound", "fabric_service_channel_runtime_ready", "payload_forwarding_contract_enabled", "health_probe_contract_enabled"}, "missing_checks": []string{"real_runtime_stage_enabled", "command_config_validated", "workdir_config_validated", "process_identity_policy_bound", "fabric_service_channel_runtime_ready", "payload_forwarding_contract_enabled", "health_probe_contract_enabled"}},
|
|
"process_health_probe": map[string]any{"schema_version": "rap.remote_workspace_real_adapter_process_health_probe.v1", "health_probe_enabled": false, "reason": "disabled_until_real_runtime_stage", "payload_traffic": "none", "probe_model": "external_process_health", "required_signals": []string{"process_started", "process_exit_status", "adapter_control_channel_ready", "fabric_service_channel_bound", "payload_forwarding_contract_ready"}, "missing_signals": []string{"process_started", "process_exit_status", "adapter_control_channel_ready", "fabric_service_channel_bound", "payload_forwarding_contract_ready"}},
|
|
"features": map[string]any{"config_projection": true, "activation_decision": true, "missing_gates": true, "process_health_probe": true, "process_health_probe_disabled": true, "process_supervisor_preconditions": true, "process_supervisor_start_disabled": true, "raw_values_redacted": true},
|
|
"config_env": []string{"RAP_REMOTE_WORKSPACE_REAL_ADAPTER_ENABLED", "RAP_REMOTE_WORKSPACE_REAL_ADAPTER_COMMAND", "RAP_REMOTE_WORKSPACE_REAL_ADAPTER_ARGS_JSON", "RAP_REMOTE_WORKSPACE_REAL_ADAPTER_WORKDIR"},
|
|
"status_contract": []string{"schema_version", "enabled", "activation_state", "execution_mode", "payload_traffic", "process_model", "config_projection", "activation_decision", "process_supervisor_preconditions", "process_health_probe", "features", "config_env", "status_contract"},
|
|
"guardrails": []string{"contract_probe_remains_default"},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if realAdapterSupervisionContractCompatible(tt.contract) {
|
|
t.Fatalf("expected incompatible contract for %+v", tt.contract)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestRealAdapterConfigProjectionCompatibility(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
config RemoteWorkspaceRealAdapterConfig
|
|
enabledRequested bool
|
|
commandPresent bool
|
|
argsJSONPresent bool
|
|
argsJSONShape string
|
|
workdirPresent bool
|
|
}{
|
|
{
|
|
name: "default empty",
|
|
argsJSONShape: "absent",
|
|
},
|
|
{
|
|
name: "requested array args",
|
|
config: RemoteWorkspaceRealAdapterConfig{
|
|
EnabledRequested: true,
|
|
Command: "/opt/rap/bin/rdp-worker",
|
|
ArgsJSON: `["--future-probe"]`,
|
|
WorkDir: "/var/lib/rap-node-agent/rdp-worker",
|
|
},
|
|
enabledRequested: true,
|
|
commandPresent: true,
|
|
argsJSONPresent: true,
|
|
argsJSONShape: "json_array",
|
|
workdirPresent: true,
|
|
},
|
|
{
|
|
name: "object args shape",
|
|
config: RemoteWorkspaceRealAdapterConfig{
|
|
ArgsJSON: `{"arg":"value"}`,
|
|
},
|
|
argsJSONPresent: true,
|
|
argsJSONShape: "json_object",
|
|
},
|
|
{
|
|
name: "opaque args shape",
|
|
config: RemoteWorkspaceRealAdapterConfig{
|
|
ArgsJSON: "--future-probe",
|
|
},
|
|
argsJSONPresent: true,
|
|
argsJSONShape: "opaque",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
contract := remoteWorkspaceRealAdapterSupervisionContract(tt.config)
|
|
if !realAdapterSupervisionContractCompatible(contract) {
|
|
t.Fatalf("contract is not compatible: %#v", contract)
|
|
}
|
|
projection := contract["config_projection"].(map[string]any)
|
|
if projection["enabled_requested"] != tt.enabledRequested ||
|
|
projection["activation_allowed"] != false ||
|
|
projection["command_present"] != tt.commandPresent ||
|
|
projection["args_json_present"] != tt.argsJSONPresent ||
|
|
projection["args_json_shape"] != tt.argsJSONShape ||
|
|
projection["workdir_present"] != tt.workdirPresent ||
|
|
projection["raw_values_redacted"] != true {
|
|
t.Fatalf("unexpected config projection: %#v", projection)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestRealAdapterProjectionAndActivationDecisionStayAligned(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
config RemoteWorkspaceRealAdapterConfig
|
|
enabledRequested bool
|
|
}{
|
|
{name: "default"},
|
|
{
|
|
name: "requested",
|
|
config: RemoteWorkspaceRealAdapterConfig{
|
|
EnabledRequested: true,
|
|
Command: "/opt/rap/bin/rdp-worker",
|
|
ArgsJSON: `["--future-probe"]`,
|
|
WorkDir: "/var/lib/rap-node-agent/rdp-worker",
|
|
},
|
|
enabledRequested: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
contract := remoteWorkspaceRealAdapterSupervisionContract(tt.config)
|
|
projection := contract["config_projection"].(map[string]any)
|
|
decision := contract["activation_decision"].(map[string]any)
|
|
if projection["enabled_requested"] != decision["enabled_requested"] ||
|
|
projection["enabled_requested"] != tt.enabledRequested ||
|
|
projection["activation_allowed"] != false ||
|
|
decision["activation_allowed"] != false ||
|
|
contract["enabled"] != false ||
|
|
contract["payload_traffic"] != decision["payload_traffic"] {
|
|
t.Fatalf("projection and activation decision are not aligned: contract=%#v", contract)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func realAdapterSupervisionContractCompatible(contract map[string]any) bool {
|
|
if contract["schema_version"] != "rap.remote_workspace_real_adapter_supervision.v1" ||
|
|
contract["enabled"] != false ||
|
|
contract["activation_state"] != "disabled_until_real_runtime_stage" ||
|
|
contract["payload_traffic"] != "none" {
|
|
return false
|
|
}
|
|
projection, ok := contract["config_projection"].(map[string]any)
|
|
if !ok ||
|
|
projection["schema_version"] != "rap.remote_workspace_real_adapter_config_projection.v1" ||
|
|
projection["activation_allowed"] != false ||
|
|
projection["raw_values_redacted"] != true {
|
|
return false
|
|
}
|
|
decision, ok := contract["activation_decision"].(map[string]any)
|
|
if !ok ||
|
|
decision["schema_version"] != "rap.remote_workspace_real_adapter_activation_decision.v1" ||
|
|
decision["decision"] != "blocked" ||
|
|
decision["reason"] != "real_runtime_stage_not_enabled" ||
|
|
decision["activation_allowed"] != false ||
|
|
decision["payload_traffic"] != "none" {
|
|
return false
|
|
}
|
|
for _, item := range []string{
|
|
"real_runtime_stage_enabled",
|
|
"fabric_service_channel_runtime_ready",
|
|
"adapter_process_supervisor_enabled",
|
|
"payload_forwarding_contract_enabled",
|
|
} {
|
|
if !anyStringSliceContains(decision["required_gates"], item) || !anyStringSliceContains(decision["missing_gates"], item) {
|
|
return false
|
|
}
|
|
}
|
|
preconditions, ok := contract["process_supervisor_preconditions"].(map[string]any)
|
|
if !ok ||
|
|
preconditions["schema_version"] != "rap.remote_workspace_real_adapter_process_supervisor_preconditions.v1" ||
|
|
preconditions["process_start_allowed"] != false ||
|
|
preconditions["reason"] != "disabled_until_real_runtime_stage" {
|
|
return false
|
|
}
|
|
for _, item := range []string{
|
|
"real_runtime_stage_enabled",
|
|
"command_config_validated",
|
|
"workdir_config_validated",
|
|
"process_identity_policy_bound",
|
|
"fabric_service_channel_runtime_ready",
|
|
"payload_forwarding_contract_enabled",
|
|
"health_probe_contract_enabled",
|
|
} {
|
|
if !anyStringSliceContains(preconditions["required_checks"], item) || !anyStringSliceContains(preconditions["missing_checks"], item) {
|
|
return false
|
|
}
|
|
}
|
|
healthProbe, ok := contract["process_health_probe"].(map[string]any)
|
|
if !ok ||
|
|
healthProbe["schema_version"] != "rap.remote_workspace_real_adapter_process_health_probe.v1" ||
|
|
healthProbe["health_probe_enabled"] != false ||
|
|
healthProbe["reason"] != "disabled_until_real_runtime_stage" ||
|
|
healthProbe["payload_traffic"] != "none" ||
|
|
healthProbe["probe_model"] != "external_process_health" {
|
|
return false
|
|
}
|
|
for _, item := range []string{
|
|
"process_started",
|
|
"process_exit_status",
|
|
"adapter_control_channel_ready",
|
|
"fabric_service_channel_bound",
|
|
"payload_forwarding_contract_ready",
|
|
} {
|
|
if !anyStringSliceContains(healthProbe["required_signals"], item) || !anyStringSliceContains(healthProbe["missing_signals"], item) {
|
|
return false
|
|
}
|
|
}
|
|
features, ok := contract["features"].(map[string]any)
|
|
if !ok ||
|
|
features["config_projection"] != true ||
|
|
features["activation_decision"] != true ||
|
|
features["missing_gates"] != true ||
|
|
features["process_health_probe"] != true ||
|
|
features["process_health_probe_disabled"] != true ||
|
|
features["process_supervisor_preconditions"] != true ||
|
|
features["process_supervisor_start_disabled"] != true ||
|
|
features["raw_values_redacted"] != true {
|
|
return false
|
|
}
|
|
for _, item := range []string{
|
|
"RAP_REMOTE_WORKSPACE_REAL_ADAPTER_ENABLED",
|
|
"RAP_REMOTE_WORKSPACE_REAL_ADAPTER_COMMAND",
|
|
"RAP_REMOTE_WORKSPACE_REAL_ADAPTER_ARGS_JSON",
|
|
"RAP_REMOTE_WORKSPACE_REAL_ADAPTER_WORKDIR",
|
|
} {
|
|
if !anyStringSliceContains(contract["config_env"], item) {
|
|
return false
|
|
}
|
|
}
|
|
for _, item := range []string{
|
|
"schema_version",
|
|
"enabled",
|
|
"activation_state",
|
|
"execution_mode",
|
|
"payload_traffic",
|
|
"process_model",
|
|
"config_projection",
|
|
"activation_decision",
|
|
"process_supervisor_preconditions",
|
|
"process_health_probe",
|
|
"features",
|
|
"config_env",
|
|
"status_contract",
|
|
} {
|
|
if !anyStringSliceContains(contract["status_contract"], item) {
|
|
return false
|
|
}
|
|
}
|
|
for _, item := range []string{
|
|
"contract_probe_remains_default",
|
|
"no_payload_forwarding_until_real_runtime_stage",
|
|
"backend_relay_not_steady_state",
|
|
"fabric_service_channel_required",
|
|
} {
|
|
if !anyStringSliceContains(contract["guardrails"], item) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func anyStringSliceContains(value any, want string) bool {
|
|
switch items := value.(type) {
|
|
case []string:
|
|
for _, item := range items {
|
|
if item == want {
|
|
return true
|
|
}
|
|
}
|
|
case []any:
|
|
for _, item := range items {
|
|
if item == want {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|