157 lines
6.7 KiB
Go
157 lines
6.7 KiB
Go
package config
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestLoadConfigFromEnvAndArgs(t *testing.T) {
|
|
cfg, err := Load([]string{"-node-name", "node-b"}, map[string]string{
|
|
"RAP_BACKEND_URL": "http://backend/api/v1/",
|
|
"RAP_CLUSTER_ID": "cluster-1",
|
|
"RAP_CLUSTER_AUTHORITY_PUBLIC_KEY": "public-key-b64",
|
|
"RAP_CLUSTER_AUTHORITY_FINGERPRINT": "rap-ca-ed25519-test",
|
|
"RAP_JOIN_TOKEN": "join-token",
|
|
"RAP_NODE_NAME": "node-a",
|
|
"RAP_NODE_STATE_DIR": "/tmp/rap-node",
|
|
"RAP_WORKLOAD_SUPERVISION_ENABLED": "true",
|
|
"RAP_HEARTBEAT_INTERVAL_SECONDS": "7",
|
|
"RAP_ENROLLMENT_POLL_INTERVAL_SECONDS": "3",
|
|
"RAP_ENROLLMENT_POLL_TIMEOUT_SECONDS": "30",
|
|
"RAP_MESH_SYNTHETIC_RUNTIME_ENABLED": "true",
|
|
"RAP_MESH_PRODUCTION_FORWARDING_ENABLED": "true",
|
|
"RAP_MESH_FABRIC_SESSION_ENABLED": "true",
|
|
"RAP_VPN_FABRIC_SESSION_TRANSPORT_ENABLED": "true",
|
|
"RAP_MESH_QUIC_FABRIC_ENABLED": "true",
|
|
"RAP_MESH_QUIC_FABRIC_LISTEN_ADDR": ":19443",
|
|
"RAP_VPN_FABRIC_QUIC_MAX_STREAMS_PER_CONN": "24",
|
|
"RAP_MESH_PRODUCTION_OBSERVATION_SINK_CAPACITY": "5",
|
|
"RAP_MESH_LISTEN_ADDR": "127.0.0.1:19001",
|
|
"RAP_MESH_LISTEN_PORT_MODE": "auto",
|
|
"RAP_MESH_LISTEN_AUTO_PORT_START": "19010",
|
|
"RAP_MESH_LISTEN_AUTO_PORT_END": "19020",
|
|
"RAP_MESH_ADVERTISE_ENDPOINT": "https://node-a.example.test:443/",
|
|
"RAP_MESH_ADVERTISE_ENDPOINTS_JSON": `[{"endpoint_id":"node-a-lan","address":"10.10.0.20:19001"}]`,
|
|
"RAP_MESH_ADVERTISE_TRANSPORT": "wss",
|
|
"RAP_MESH_CONNECTIVITY_MODE": "outbound_only",
|
|
"RAP_MESH_NAT_TYPE": "symmetric",
|
|
"RAP_MESH_REGION": "eu",
|
|
"RAP_MESH_SYNTHETIC_CONFIG": "/tmp/rap-node/mesh-synthetic.json",
|
|
"RAP_MESH_PEER_ENDPOINTS_JSON": `{"node-b":"http://127.0.0.1:19002"}`,
|
|
"RAP_MESH_SYNTHETIC_ROUTES_JSON": `[{"route_id":"route-1"}]`,
|
|
"RAP_REMOTE_WORKSPACE_REAL_ADAPTER_ENABLED": "true",
|
|
"RAP_REMOTE_WORKSPACE_REAL_ADAPTER_COMMAND": " /opt/rap/bin/rdp-worker ",
|
|
"RAP_REMOTE_WORKSPACE_REAL_ADAPTER_ARGS_JSON": ` ["--future-probe"] `,
|
|
"RAP_REMOTE_WORKSPACE_REAL_ADAPTER_WORKDIR": " /var/lib/rap-node-agent/rdp-worker ",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("load config: %v", err)
|
|
}
|
|
if cfg.BackendURL != "http://backend/api/v1" {
|
|
t.Fatalf("BackendURL = %q", cfg.BackendURL)
|
|
}
|
|
if cfg.NodeName != "node-b" {
|
|
t.Fatalf("NodeName = %q", cfg.NodeName)
|
|
}
|
|
if cfg.ClusterAuthorityPublicKey != "public-key-b64" || cfg.ClusterAuthorityFingerprint != "rap-ca-ed25519-test" {
|
|
t.Fatalf("unexpected cluster authority pin config: %+v", cfg)
|
|
}
|
|
if cfg.HeartbeatInterval != 7*time.Second {
|
|
t.Fatalf("HeartbeatInterval = %s", cfg.HeartbeatInterval)
|
|
}
|
|
if cfg.EnrollmentPollInterval != 3*time.Second || cfg.EnrollmentPollTimeout != 30*time.Second {
|
|
t.Fatalf("unexpected enrollment polling config: %+v", cfg)
|
|
}
|
|
if !cfg.WorkloadSupervisionEnabled {
|
|
t.Fatal("WorkloadSupervisionEnabled = false, want true")
|
|
}
|
|
if !cfg.MeshSyntheticRuntimeEnabled {
|
|
t.Fatal("MeshSyntheticRuntimeEnabled = false, want true")
|
|
}
|
|
if !cfg.MeshProductionForwardingEnabled {
|
|
t.Fatal("MeshProductionForwardingEnabled = false, want true")
|
|
}
|
|
if !cfg.MeshFabricSessionEnabled {
|
|
t.Fatal("MeshFabricSessionEnabled = false, want true")
|
|
}
|
|
if !cfg.VPNFabricSessionTransportEnabled {
|
|
t.Fatal("VPNFabricSessionTransportEnabled = false, want true")
|
|
}
|
|
if !cfg.MeshQUICFabricEnabled || cfg.MeshQUICFabricListenAddr != ":19443" {
|
|
t.Fatalf("unexpected QUIC fabric config: %+v", cfg)
|
|
}
|
|
if cfg.VPNFabricQUICMaxStreamsPerConn != 24 {
|
|
t.Fatalf("VPNFabricQUICMaxStreamsPerConn = %d, want 24", cfg.VPNFabricQUICMaxStreamsPerConn)
|
|
}
|
|
if cfg.MeshProductionObservationSinkCapacity != 5 {
|
|
t.Fatalf("MeshProductionObservationSinkCapacity = %d, want 5", cfg.MeshProductionObservationSinkCapacity)
|
|
}
|
|
if cfg.MeshListenAddr != "127.0.0.1:19001" {
|
|
t.Fatalf("MeshListenAddr = %q", cfg.MeshListenAddr)
|
|
}
|
|
if cfg.MeshListenPortMode != "auto" || cfg.MeshListenAutoPortStart != 19010 || cfg.MeshListenAutoPortEnd != 19020 {
|
|
t.Fatalf("unexpected mesh listen port config: %+v", cfg)
|
|
}
|
|
if cfg.MeshAdvertiseEndpoint != "https://node-a.example.test:443" ||
|
|
cfg.MeshAdvertiseEndpointsJSON == "" ||
|
|
cfg.MeshAdvertiseTransport != "wss" ||
|
|
cfg.MeshConnectivityMode != "outbound_only" ||
|
|
cfg.MeshNATType != "symmetric" ||
|
|
cfg.MeshRegion != "eu" {
|
|
t.Fatalf("unexpected mesh advertise config: %+v", cfg)
|
|
}
|
|
if cfg.MeshSyntheticConfigPath != "/tmp/rap-node/mesh-synthetic.json" {
|
|
t.Fatalf("MeshSyntheticConfigPath = %q", cfg.MeshSyntheticConfigPath)
|
|
}
|
|
if cfg.MeshPeerEndpointsJSON == "" || cfg.MeshSyntheticRoutesJSON == "" {
|
|
t.Fatalf("mesh live synthetic config was not loaded: %+v", cfg)
|
|
}
|
|
if !cfg.RemoteWorkspaceRealAdapterEnabled ||
|
|
cfg.RemoteWorkspaceRealAdapterCommand != "/opt/rap/bin/rdp-worker" ||
|
|
cfg.RemoteWorkspaceRealAdapterArgsJSON != `["--future-probe"]` ||
|
|
cfg.RemoteWorkspaceRealAdapterWorkDir != "/var/lib/rap-node-agent/rdp-worker" {
|
|
t.Fatalf("unexpected remote workspace real adapter config: %+v", cfg)
|
|
}
|
|
}
|
|
|
|
func TestLoadConfigDefaultsEnrollmentPollingToNoTimeout(t *testing.T) {
|
|
cfg, err := Load(nil, map[string]string{
|
|
"RAP_BACKEND_URL": "http://backend/api/v1",
|
|
"RAP_NODE_NAME": "node-a",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("load config: %v", err)
|
|
}
|
|
if cfg.EnrollmentPollTimeout != 0 {
|
|
t.Fatalf("EnrollmentPollTimeout = %s, want no timeout", cfg.EnrollmentPollTimeout)
|
|
}
|
|
if cfg.RemoteWorkspaceRealAdapterEnabled ||
|
|
cfg.RemoteWorkspaceRealAdapterCommand != "" ||
|
|
cfg.RemoteWorkspaceRealAdapterArgsJSON != "" ||
|
|
cfg.RemoteWorkspaceRealAdapterWorkDir != "" {
|
|
t.Fatalf("real adapter config should default disabled and empty: %+v", cfg)
|
|
}
|
|
}
|
|
|
|
func TestLoadConfigRejectsNegativeProductionObservationSinkCapacity(t *testing.T) {
|
|
_, err := Load(nil, map[string]string{
|
|
"RAP_BACKEND_URL": "http://backend/api/v1",
|
|
"RAP_NODE_NAME": "node-a",
|
|
"RAP_MESH_PRODUCTION_OBSERVATION_SINK_CAPACITY": "-1",
|
|
})
|
|
if err == nil {
|
|
t.Fatal("Load returned nil error for negative sink capacity")
|
|
}
|
|
}
|
|
|
|
func TestLoadConfigRejectsTooLargeProductionObservationSinkCapacity(t *testing.T) {
|
|
_, err := Load(nil, map[string]string{
|
|
"RAP_BACKEND_URL": "http://backend/api/v1",
|
|
"RAP_NODE_NAME": "node-a",
|
|
"RAP_MESH_PRODUCTION_OBSERVATION_SINK_CAPACITY": "10001",
|
|
})
|
|
if err == nil {
|
|
t.Fatal("Load returned nil error for too-large sink capacity")
|
|
}
|
|
}
|