Files
go-sip/internal/rpc/control_policy_test.go

33 lines
2.0 KiB
Go

package rpc
import (
"context"
"testing"
"time"
agentv1 "git.ipao.vip/rogee/go-sip/gen/agent/v1"
"git.ipao.vip/rogee/go-sip/internal/contract"
"git.ipao.vip/rogee/go-sip/internal/testfixture"
)
func TestStopDrainPreservesCallAndCannotResume(t *testing.T) {
s := activatedServer(time.Date(2026, 9, 18, 1, 0, 0, 0, time.UTC), t)
raw, err := testfixture.Execute()
require.NoError(t, err)
envelope, payload, err := contract.DecodeExecute(raw)
require.NoError(t, err)
binding := &agentv1.ExecutionBinding{TenantId: envelope.TenantID, TenantKey: envelope.TenantKey, ExecutionId: payload.ExecutionID, TaskId: payload.TaskID, TaskItemId: payload.TaskItemID, TaskRevision: payload.TaskRevision, AgentVersionId: payload.AgentVersionID}
_, err = s.Execute(context.Background(), &agentv1.ExecuteRequest{Meta: testMeta("execute", "execute-key", 1), Binding: binding, CallExecuteJson: raw})
require.NoError(t, err)
s.executions[binding.ExecutionId].state = agentv1.ExecutionState_EXECUTION_STATE_OBSERVED
stopped, err := s.ApplyTaskControl(context.Background(), &agentv1.ApplyTaskControlRequest{Meta: testMeta("stop", "stop-key", 1), Binding: binding, ExpectedTaskRevision: binding.TaskRevision, Action: agentv1.ControlAction_CONTROL_ACTION_STOP, ActiveCallPolicy: agentv1.ActiveCallPolicy_ACTIVE_CALL_POLICY_DRAIN})
require.NoError(t, err)
require.Equal(t, agentv1.ResultCode_RESULT_CODE_APPLIED, stopped.Receipt.Result)
require.Equal(t, agentv1.ExecutionState_EXECUTION_STATE_OBSERVED, stopped.State)
binding.TaskRevision = stopped.AppliedTaskRevision
resumed, err := s.ApplyTaskControl(context.Background(), &agentv1.ApplyTaskControlRequest{Meta: testMeta("resume", "resume-key", 1), Binding: binding, ExpectedTaskRevision: binding.TaskRevision, Action: agentv1.ControlAction_CONTROL_ACTION_RESUME, ActiveCallPolicy: agentv1.ActiveCallPolicy_ACTIVE_CALL_POLICY_DRAIN})
require.NoError(t, err)
require.Equal(t, agentv1.ResultCode_RESULT_CODE_REJECTED, resumed.Receipt.Result)
require.Equal(t, stopped.AppliedTaskRevision, resumed.AppliedTaskRevision)
}