package mesh import ( "context" "net/http/httptest" "testing" "time" "github.com/example/remote-access-platform/agents/rap-node-agent/internal/fabricproto" ) func TestClientFabricSessionFrameRoundTrip(t *testing.T) { server := httptest.NewServer(Server{ Local: PeerIdentity{ClusterID: "cluster-1", NodeID: "node-a"}, FabricSessionEnabled: true, }.Handler()) defer server.Close() client := NewClient(server.URL) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() response, err := client.SendFabricSessionFrame(ctx, FabricSessionDialOptions{ Token: "rap_fsn_clienttest", Timeout: time.Second, }, fabricproto.Frame{ Type: fabricproto.FramePing, Sequence: 12, Payload: []byte("probe"), }) if err != nil { t.Fatalf("send fabric session frame: %v", err) } if response.Type != fabricproto.FramePong || response.Sequence != 12 || string(response.Payload) != "probe" { t.Fatalf("response = %+v, want pong seq 12", response) } } func TestClientFabricSessionReportsRejectedStatus(t *testing.T) { server := httptest.NewServer(Server{ Local: PeerIdentity{ClusterID: "cluster-1", NodeID: "node-a"}, FabricSessionEnabled: true, }.Handler()) defer server.Close() client := NewClient(server.URL) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() _, err := client.SendFabricSessionFrame(ctx, FabricSessionDialOptions{}, fabricproto.Frame{Type: fabricproto.FramePing}) if err == nil { t.Fatal("send fabric session without token unexpectedly succeeded") } } func TestClientFabricSessionWebSocketURL(t *testing.T) { cases := []struct { base string want string }{ {base: "http://node.example", want: "ws://node.example/mesh/v1/fabric/session/ws"}, {base: "https://node.example/base/", want: "wss://node.example/base/mesh/v1/fabric/session/ws"}, {base: "ws://node.example", want: "ws://node.example/mesh/v1/fabric/session/ws"}, } for _, tc := range cases { client := NewClient(tc.base) got, err := client.fabricSessionWebSocketURL() if err != nil { t.Fatalf("fabricSessionWebSocketURL(%q): %v", tc.base, err) } if got != tc.want { t.Fatalf("fabricSessionWebSocketURL(%q) = %q, want %q", tc.base, got, tc.want) } } }