feat: add client agent handshake transport

This commit is contained in:
2026-09-06 07:01:24 +00:00
parent e3d22d256e
commit bcb31a7f4e
5 changed files with 240 additions and 0 deletions
+18
View File
@@ -158,12 +158,30 @@ layer = "unit"
status = "implemented"
tests = ["internal/domain/protocol_test.go:TestSelectHighestCompatibleProtocol_HP_SES_01"]
[[requirements]]
id = "HP-SES-07"
layer = "unit"
status = "implemented"
tests = ["internal/client/agent/handshake_test.go:TestHandshakeHelloWelcome_HP_SES_07"]
[[requirements]]
id = "BH-SES-07"
layer = "unit"
status = "implemented"
tests = ["internal/client/agent/handshake_test.go:TestHandshakeRejectsNonWelcome_BH_SES_07"]
[[requirements]]
id = "HP-SES-05"
layer = "integration"
status = "implemented"
tests = ["internal/server/session/agent_server_test.go:TestAgentServerRegistrationAndReplacement_HP_SES_05"]
[[requirements]]
id = "HP-SES-06"
layer = "integration"
status = "implemented"
tests = ["test/integration/clientagent/clientagent_integration_test.go:TestWebSocketHelloWelcome_HP_SES_06"]
[[requirements]]
id = "BH-SES-04"
layer = "integration"
@@ -0,0 +1,42 @@
package clientagent_test
import (
"context"
"net/http/httptest"
"path/filepath"
"strings"
"testing"
"time"
rvboxv1 "github.com/rvbox/rvbox/gen/go/rvbox/v1"
"github.com/rvbox/rvbox/internal/agentproto"
"github.com/rvbox/rvbox/internal/client/agent"
"github.com/rvbox/rvbox/internal/server/session"
"github.com/rvbox/rvbox/internal/server/store"
"google.golang.org/protobuf/types/known/timestamppb"
)
func TestWebSocketHelloWelcome_HP_SES_06(t *testing.T) {
ctx := context.Background()
persistence, err := store.Open(ctx, store.Options{DataDir: filepath.Join(t.TempDir(), "state"), BusyTimeout: time.Second})
if err != nil {
t.Fatal(err)
}
defer persistence.Close()
server := httptest.NewServer(&session.AgentServer{Store: persistence, Registry: session.NewRegistry(), Path: "/v1/agent", Limits: agentproto.DefaultLimits()})
defer server.Close()
address := "ws" + strings.TrimPrefix(server.URL, "http") + "/v1/agent"
transport, err := agent.DialWebSocket(ctx, address, nil)
if err != nil {
t.Fatal(err)
}
defer transport.Close()
hello := &rvboxv1.ClientHello{ClientId: "win-client", SupportedProtocol: &rvboxv1.ProtocolRange{Major: 1, MinMinor: 0, MaxMinor: 0}, DaemonVersion: "test", Platform: rvboxv1.Platform_PLATFORM_WINDOWS, Architecture: "amd64", DaemonCwd: `C:\`, SupportedShells: []rvboxv1.ShellType{rvboxv1.ShellType_SHELL_POWERSHELL}, ClientInstanceId: "019c46f1-1d02-7000-8000-000000000071", MaxRunningCommands: 1, MaxQueuedCommands: 1, SentAt: timestamppb.Now()}
result, err := agent.Handshake(ctx, transport, hello, agentproto.DefaultLimits())
if err != nil {
t.Fatal(err)
}
if result.ID == "" || result.Generation != 1 || result.Protocol.GetMajor() != 1 {
t.Fatalf("handshake result = %#v", result)
}
}