Loading go-packages/meep-simu5g-bridge/protocol_test.go 0 → 100644 +123 −0 Changes for go-packages/meep-simu5g-bridge/protocol_test.go: 123 added lines, 0 removed lines. Original line number Diff line number Diff line package bridge import ( "encoding/binary" "encoding/json" "strings" "testing" ) func helloJSON(t *testing.T, frame []byte) HelloBody { t.Helper() if len(frame) < FrameHeaderSize+4 { t.Fatalf("frame too short: %d", len(frame)) } if binary.BigEndian.Uint16(frame[0:2]) != FrameMagic { t.Fatalf("magic %#x", binary.BigEndian.Uint16(frame[0:2])) } if frame[2] != FrameVersion || frame[3] != FrameTypeControl { t.Fatalf("ver/type %d/%d", frame[2], frame[3]) } payloadLen := binary.BigEndian.Uint32(frame[4:8]) if int(payloadLen) != len(frame)-FrameHeaderSize { t.Fatalf("payload len %d frame leftover %d", payloadLen, len(frame)-FrameHeaderSize) } if frame[FrameHeaderSize] != ControlCodeHello { t.Fatalf("control code %d", frame[FrameHeaderSize]) } var body HelloBody if err := json.Unmarshal(frame[FrameHeaderSize+4:], &body); err != nil { t.Fatalf("hello json: %v body=%s", err, frame[FrameHeaderSize+4:]) } return body } func TestEncodeControlHelloMinimal(t *testing.T) { body := helloJSON(t, EncodeControlHello("bridge")) if body.Role != "bridge" || body.Version != "0.1" { t.Fatalf("role/version %+v", body) } if len(body.UEMappings) != 0 || len(body.MECEndpoints) != 0 { t.Fatalf("minimal HELLO must omit NAT tables: %+v", body) } } func TestEncodeControlHelloFromConfigNATTables(t *testing.T) { cfg := &IntegrationConfig{ UEMappings: []UEMapping{ { UeID: "ue-car-0", SandboxIPCidr: "192.168.108.156/32", Simu5gModulePath: "MonacoHarbor.ue_car[0]", }, { UeID: "ue-ped-0", SandboxIPCidr: "192.168.108.155/32", Simu5gModulePath: "MonacoHarbor.ue_ped[0]", SimIP: "10.0.0.11", }, }, MECEndpoints: []MECEndpoint{ { EndpointID: "mep1", SandboxIPCidr: "192.168.108.184/32", Simu5gModulePath: "router", }, }, } body := helloJSON(t, EncodeControlHelloFromConfig("bridge", cfg)) if body.Role != "bridge" || body.Version != "0.1" { t.Fatalf("role/version %+v", body) } if len(body.UEMappings) != 2 || len(body.MECEndpoints) != 1 { t.Fatalf("NAT tables %+v", body) } if body.UEMappings[0].SandboxIPCidr != "192.168.108.156/32" { t.Fatalf("ue sandbox %q", body.UEMappings[0].SandboxIPCidr) } if body.UEMappings[0].Simu5gModulePath != "MonacoHarbor.ue_car[0]" { t.Fatalf("ue path %q", body.UEMappings[0].Simu5gModulePath) } if body.UEMappings[1].SimIP != "10.0.0.11" { t.Fatalf("optional simIp %q", body.UEMappings[1].SimIP) } if body.MECEndpoints[0].SandboxIPCidr != "192.168.108.184/32" { t.Fatalf("mec sandbox %q", body.MECEndpoints[0].SandboxIPCidr) } // S loadIntegrationJson looks for these exact keys in the HELLO body. raw := EncodeControlHelloFromConfig("bridge", cfg) js := string(raw[FrameHeaderSize+4:]) for _, key := range []string{`"ueMappings"`, `"mecEndpoints"`, `"sandboxIpCidr"`, `"simu5gModulePath"`, `"simIp"`} { if !strings.Contains(js, key) { t.Fatalf("HELLO JSON missing %s: %s", key, js) } } } func TestEncodeControlHelloFromConfigNil(t *testing.T) { body := helloJSON(t, EncodeControlHelloFromConfig("bridge", nil)) if len(body.UEMappings) != 0 || len(body.MECEndpoints) != 0 { t.Fatalf("nil cfg must omit arrays: %+v", body) } } func TestEncodeControlHelloFromLiveIntegrationConfig(t *testing.T) { cfg, err := LoadIntegrationConfig(repoToolsSimu5g("monaco-harbor-integration-config.json")) if err != nil { t.Fatal(err) } if len(cfg.UEMappings) == 0 || len(cfg.MECEndpoints) == 0 { t.Fatalf("live config missing NAT tables ue=%d mec=%d", len(cfg.UEMappings), len(cfg.MECEndpoints)) } body := helloJSON(t, EncodeControlHelloFromConfig("bridge", cfg)) if len(body.UEMappings) != len(cfg.UEMappings) || len(body.MECEndpoints) != len(cfg.MECEndpoints) { t.Fatalf("HELLO dropped mappings ue %d/%d mec %d/%d", len(body.UEMappings), len(cfg.UEMappings), len(body.MECEndpoints), len(cfg.MECEndpoints)) } if body.UEMappings[0].SandboxIPCidr != cfg.UEMappings[0].SandboxIPCidr { t.Fatalf("HELLO sandboxIpCidr %q want %q", body.UEMappings[0].SandboxIPCidr, cfg.UEMappings[0].SandboxIPCidr) } if body.MECEndpoints[0].SandboxIPCidr != cfg.MECEndpoints[0].SandboxIPCidr { t.Fatalf("HELLO mec cidr %q want %q", body.MECEndpoints[0].SandboxIPCidr, cfg.MECEndpoints[0].SandboxIPCidr) } } tools/simu5g/monaco-harbor-integration-config.json +9 −9 Changes for tools/simu5g/monaco-harbor-integration-config.json: 9 added lines, 9 removed lines. Original line number Diff line number Diff line Loading @@ -31,49 +31,49 @@ "ueMappings": [ { "ueId": "ue-car-0", "sandboxIpCidr": "192.168.108.171/32", "sandboxIpCidr": "192.168.108.130/32", "simu5gModulePath": "MonacoHarbor.ue_car[0]" }, { "ueId": "ue-car-1", "sandboxIpCidr": "192.168.108.169/32", "sandboxIpCidr": "192.168.108.185/32", "simu5gModulePath": "MonacoHarbor.ue_car[1]" }, { "ueId": "ue-car-2", "sandboxIpCidr": "192.168.108.180/32", "sandboxIpCidr": "192.168.108.164/32", "simu5gModulePath": "MonacoHarbor.ue_car[2]" }, { "ueId": "ue-car-3", "sandboxIpCidr": "192.168.108.190/32", "sandboxIpCidr": "192.168.108.151/32", "simu5gModulePath": "MonacoHarbor.ue_car[3]" }, { "ueId": "ue-ped-0", "sandboxIpCidr": "192.168.108.154/32", "sandboxIpCidr": "192.168.108.188/32", "simu5gModulePath": "MonacoHarbor.ue_ped[0]" }, { "ueId": "ue-ped-1", "sandboxIpCidr": "192.168.108.188/32", "sandboxIpCidr": "192.168.108.135/32", "simu5gModulePath": "MonacoHarbor.ue_ped[1]" }, { "ueId": "ue-ped-2", "sandboxIpCidr": "192.168.108.176/32", "sandboxIpCidr": "192.168.108.180/32", "simu5gModulePath": "MonacoHarbor.ue_ped[2]" }, { "ueId": "ue-ped-3", "sandboxIpCidr": "192.168.108.134/32", "sandboxIpCidr": "192.168.108.145/32", "simu5gModulePath": "MonacoHarbor.ue_ped[3]" } ], "mecEndpoints": [ { "endpointId": "mep1", "sandboxIpCidr": "192.168.108.130/32", "sandboxIpCidr": "192.168.108.187/32", "simu5gModulePath": "router" } ], Loading Loading
go-packages/meep-simu5g-bridge/protocol_test.go 0 → 100644 +123 −0 Changes for go-packages/meep-simu5g-bridge/protocol_test.go: 123 added lines, 0 removed lines. Original line number Diff line number Diff line package bridge import ( "encoding/binary" "encoding/json" "strings" "testing" ) func helloJSON(t *testing.T, frame []byte) HelloBody { t.Helper() if len(frame) < FrameHeaderSize+4 { t.Fatalf("frame too short: %d", len(frame)) } if binary.BigEndian.Uint16(frame[0:2]) != FrameMagic { t.Fatalf("magic %#x", binary.BigEndian.Uint16(frame[0:2])) } if frame[2] != FrameVersion || frame[3] != FrameTypeControl { t.Fatalf("ver/type %d/%d", frame[2], frame[3]) } payloadLen := binary.BigEndian.Uint32(frame[4:8]) if int(payloadLen) != len(frame)-FrameHeaderSize { t.Fatalf("payload len %d frame leftover %d", payloadLen, len(frame)-FrameHeaderSize) } if frame[FrameHeaderSize] != ControlCodeHello { t.Fatalf("control code %d", frame[FrameHeaderSize]) } var body HelloBody if err := json.Unmarshal(frame[FrameHeaderSize+4:], &body); err != nil { t.Fatalf("hello json: %v body=%s", err, frame[FrameHeaderSize+4:]) } return body } func TestEncodeControlHelloMinimal(t *testing.T) { body := helloJSON(t, EncodeControlHello("bridge")) if body.Role != "bridge" || body.Version != "0.1" { t.Fatalf("role/version %+v", body) } if len(body.UEMappings) != 0 || len(body.MECEndpoints) != 0 { t.Fatalf("minimal HELLO must omit NAT tables: %+v", body) } } func TestEncodeControlHelloFromConfigNATTables(t *testing.T) { cfg := &IntegrationConfig{ UEMappings: []UEMapping{ { UeID: "ue-car-0", SandboxIPCidr: "192.168.108.156/32", Simu5gModulePath: "MonacoHarbor.ue_car[0]", }, { UeID: "ue-ped-0", SandboxIPCidr: "192.168.108.155/32", Simu5gModulePath: "MonacoHarbor.ue_ped[0]", SimIP: "10.0.0.11", }, }, MECEndpoints: []MECEndpoint{ { EndpointID: "mep1", SandboxIPCidr: "192.168.108.184/32", Simu5gModulePath: "router", }, }, } body := helloJSON(t, EncodeControlHelloFromConfig("bridge", cfg)) if body.Role != "bridge" || body.Version != "0.1" { t.Fatalf("role/version %+v", body) } if len(body.UEMappings) != 2 || len(body.MECEndpoints) != 1 { t.Fatalf("NAT tables %+v", body) } if body.UEMappings[0].SandboxIPCidr != "192.168.108.156/32" { t.Fatalf("ue sandbox %q", body.UEMappings[0].SandboxIPCidr) } if body.UEMappings[0].Simu5gModulePath != "MonacoHarbor.ue_car[0]" { t.Fatalf("ue path %q", body.UEMappings[0].Simu5gModulePath) } if body.UEMappings[1].SimIP != "10.0.0.11" { t.Fatalf("optional simIp %q", body.UEMappings[1].SimIP) } if body.MECEndpoints[0].SandboxIPCidr != "192.168.108.184/32" { t.Fatalf("mec sandbox %q", body.MECEndpoints[0].SandboxIPCidr) } // S loadIntegrationJson looks for these exact keys in the HELLO body. raw := EncodeControlHelloFromConfig("bridge", cfg) js := string(raw[FrameHeaderSize+4:]) for _, key := range []string{`"ueMappings"`, `"mecEndpoints"`, `"sandboxIpCidr"`, `"simu5gModulePath"`, `"simIp"`} { if !strings.Contains(js, key) { t.Fatalf("HELLO JSON missing %s: %s", key, js) } } } func TestEncodeControlHelloFromConfigNil(t *testing.T) { body := helloJSON(t, EncodeControlHelloFromConfig("bridge", nil)) if len(body.UEMappings) != 0 || len(body.MECEndpoints) != 0 { t.Fatalf("nil cfg must omit arrays: %+v", body) } } func TestEncodeControlHelloFromLiveIntegrationConfig(t *testing.T) { cfg, err := LoadIntegrationConfig(repoToolsSimu5g("monaco-harbor-integration-config.json")) if err != nil { t.Fatal(err) } if len(cfg.UEMappings) == 0 || len(cfg.MECEndpoints) == 0 { t.Fatalf("live config missing NAT tables ue=%d mec=%d", len(cfg.UEMappings), len(cfg.MECEndpoints)) } body := helloJSON(t, EncodeControlHelloFromConfig("bridge", cfg)) if len(body.UEMappings) != len(cfg.UEMappings) || len(body.MECEndpoints) != len(cfg.MECEndpoints) { t.Fatalf("HELLO dropped mappings ue %d/%d mec %d/%d", len(body.UEMappings), len(cfg.UEMappings), len(body.MECEndpoints), len(cfg.MECEndpoints)) } if body.UEMappings[0].SandboxIPCidr != cfg.UEMappings[0].SandboxIPCidr { t.Fatalf("HELLO sandboxIpCidr %q want %q", body.UEMappings[0].SandboxIPCidr, cfg.UEMappings[0].SandboxIPCidr) } if body.MECEndpoints[0].SandboxIPCidr != cfg.MECEndpoints[0].SandboxIPCidr { t.Fatalf("HELLO mec cidr %q want %q", body.MECEndpoints[0].SandboxIPCidr, cfg.MECEndpoints[0].SandboxIPCidr) } }
tools/simu5g/monaco-harbor-integration-config.json +9 −9 Changes for tools/simu5g/monaco-harbor-integration-config.json: 9 added lines, 9 removed lines. Original line number Diff line number Diff line Loading @@ -31,49 +31,49 @@ "ueMappings": [ { "ueId": "ue-car-0", "sandboxIpCidr": "192.168.108.171/32", "sandboxIpCidr": "192.168.108.130/32", "simu5gModulePath": "MonacoHarbor.ue_car[0]" }, { "ueId": "ue-car-1", "sandboxIpCidr": "192.168.108.169/32", "sandboxIpCidr": "192.168.108.185/32", "simu5gModulePath": "MonacoHarbor.ue_car[1]" }, { "ueId": "ue-car-2", "sandboxIpCidr": "192.168.108.180/32", "sandboxIpCidr": "192.168.108.164/32", "simu5gModulePath": "MonacoHarbor.ue_car[2]" }, { "ueId": "ue-car-3", "sandboxIpCidr": "192.168.108.190/32", "sandboxIpCidr": "192.168.108.151/32", "simu5gModulePath": "MonacoHarbor.ue_car[3]" }, { "ueId": "ue-ped-0", "sandboxIpCidr": "192.168.108.154/32", "sandboxIpCidr": "192.168.108.188/32", "simu5gModulePath": "MonacoHarbor.ue_ped[0]" }, { "ueId": "ue-ped-1", "sandboxIpCidr": "192.168.108.188/32", "sandboxIpCidr": "192.168.108.135/32", "simu5gModulePath": "MonacoHarbor.ue_ped[1]" }, { "ueId": "ue-ped-2", "sandboxIpCidr": "192.168.108.176/32", "sandboxIpCidr": "192.168.108.180/32", "simu5gModulePath": "MonacoHarbor.ue_ped[2]" }, { "ueId": "ue-ped-3", "sandboxIpCidr": "192.168.108.134/32", "sandboxIpCidr": "192.168.108.145/32", "simu5gModulePath": "MonacoHarbor.ue_ped[3]" } ], "mecEndpoints": [ { "endpointId": "mep1", "sandboxIpCidr": "192.168.108.130/32", "sandboxIpCidr": "192.168.108.187/32", "simu5gModulePath": "router" } ], Loading