Loading go-packages/meep-simu5g-bridge/config_test.go 0 → 100644 +78 −0 Changes for go-packages/meep-simu5g-bridge/config_test.go: 78 added lines, 0 removed lines. Original line number Diff line number Diff line package bridge import ( "path/filepath" "runtime" "testing" ) func repoToolsSimu5g(name string) string { _, thisFile, _, _ := runtime.Caller(0) return filepath.Join(filepath.Dir(thisFile), "..", "..", "tools", "simu5g", name) } /** @brief Example integration config listens on UDP 9100 (not 9110). */ func TestExampleIntegrationConfigTelemetryPort(t *testing.T) { cfg, err := LoadIntegrationConfig(repoToolsSimu5g("example-integration-config.json")) if err != nil { t.Fatal(err) } if err := cfg.ValidateForMobilityAdapter(); err != nil { t.Fatal(err) } if cfg.Telemetry.ListenPort != 9100 { t.Fatalf("listenPort %d want 9100", cfg.Telemetry.ListenPort) } } /** @brief monaco-harbor Phase 0 config: port 9100, scene origin, ue-car-0 mapping. */ func TestMonacoHarborIntegrationConfig(t *testing.T) { cfg, err := LoadIntegrationConfig(repoToolsSimu5g("monaco-harbor-integration-config.json")) if err != nil { t.Fatal(err) } if err := cfg.ValidateForMobilityAdapter(); err != nil { t.Fatal(err) } if cfg.Deployment.ScenarioID != "monaco-harbor" { t.Fatalf("scenarioId %q", cfg.Deployment.ScenarioID) } if cfg.Telemetry.ListenPort != 9100 { t.Fatalf("listenPort %d want 9100", cfg.Telemetry.ListenPort) } if cfg.TelemetryListenAddr() != "0.0.0.0:9100" { t.Fatalf("listen %s", cfg.TelemetryListenAddr()) } if cfg.Telemetry.SceneLatDeg != 43.734042 || cfg.Telemetry.SceneLonDeg != 7.416587 { t.Fatalf("scene origin %v,%v", cfg.Telemetry.SceneLatDeg, cfg.Telemetry.SceneLonDeg) } if len(cfg.UEMappings) != 8 { t.Fatalf("ueMappings %d want 8", len(cfg.UEMappings)) } if cfg.UEMappings[0].UeID != "ue-car-0" { t.Fatalf("first ueId %q", cfg.UEMappings[0].UeID) } if cfg.UEMappings[0].Simu5gModulePath != "MonacoHarbor.ue_car[0]" { t.Fatalf("module path %q", cfg.UEMappings[0].Simu5gModulePath) } id, ok := cfg.ResolveSandboxUeID("MonacoHarbor.ue_car[0]", "") if !ok || id != "ue-car-0" { t.Fatalf("module map %q %v", id, ok) } id, ok = cfg.ResolveSandboxUeID("unknown", "10.0.0.14") if !ok || id != "ue-ped-3" { t.Fatalf("ipv4 map %q %v", id, ok) } if _, ok := cfg.ResolveSandboxUeID("MonacoHarbor.ue_car[99]", "10.9.9.9"); ok { t.Fatal("unmapped UE must not resolve") } foundEnb := false for _, c := range cfg.Cells { if c.PoaID == "poa-enb" && c.CellID == 100 { foundEnb = true } } if !foundEnb { t.Fatal("cells missing poa-enb cellId 100") } } go-packages/meep-simu5g-bridge/telemetry_test.go 0 → 100644 +68 −0 Changes for go-packages/meep-simu5g-bridge/telemetry_test.go: 68 added lines, 0 removed lines. Original line number Diff line number Diff line package bridge import ( "encoding/binary" "math" "net" "testing" ) func putF64(b []byte, v float64) { binary.LittleEndian.PutUint64(b, math.Float64bits(v)) } func encodeTelemetryV3(seq uint64, simTime float64, id, ipv4 string, sceneX, sceneY, sceneZ, speed float64) []byte { pkt := make([]byte, headerSize+recordSizeV3) le := binary.LittleEndian le.PutUint32(pkt[0:4], magicUET1) le.PutUint16(pkt[4:6], protoVersion3) le.PutUint64(pkt[8:16], seq) putF64(pkt[16:24], simTime) le.PutUint16(pkt[24:26], 1) rec := pkt[headerSize:] if len(id) > 63 { id = id[:63] } rec[0] = byte(len(id)) copy(rec[1:], id) putF64(rec[65:73], sceneX) putF64(rec[73:81], sceneY) putF64(rec[81:89], sceneZ) putF64(rec[113:121], speed) ip := net.ParseIP(ipv4).To4() if ip != nil { copy(rec[153:157], ip) } return pkt } /** @brief ParseTelemetryDatagram decodes a v3 scene-coordinate record to WGS-84. */ func TestParseTelemetryDatagramV3(t *testing.T) { nextSeq = 0 opts := TelemetryOptions{ SceneLatDeg: 43.734042, SceneLonDeg: 7.416587, MetersPerDeg: 111320, } pkt := encodeTelemetryV3(1, 12.5, "MonacoHarbor.ue_car[0]", "10.10.1.10", 499.7, 338.6, 1.5, 8.25) got, err := ParseTelemetryDatagram(pkt, opts) if err != nil { t.Fatal(err) } if got.NumUE != 1 || got.Seq != 1 || got.ProtoVersion != protoVersion3 { t.Fatalf("header %+v", got) } ue := got.UEs[0] if ue.ID != "MonacoHarbor.ue_car[0]" { t.Fatalf("id %q", ue.ID) } if ue.IPv4 != "10.10.1.10" { t.Fatalf("ipv4 %q", ue.IPv4) } if ue.LatDeg == 0 || ue.LonDeg == 0 { t.Fatalf("wgs84 lat=%v lon=%v", ue.LatDeg, ue.LonDeg) } if math.Abs(ue.SpeedMps-8.25) > 1e-9 { t.Fatalf("speed %v", ue.SpeedMps) } } Loading
go-packages/meep-simu5g-bridge/config_test.go 0 → 100644 +78 −0 Changes for go-packages/meep-simu5g-bridge/config_test.go: 78 added lines, 0 removed lines. Original line number Diff line number Diff line package bridge import ( "path/filepath" "runtime" "testing" ) func repoToolsSimu5g(name string) string { _, thisFile, _, _ := runtime.Caller(0) return filepath.Join(filepath.Dir(thisFile), "..", "..", "tools", "simu5g", name) } /** @brief Example integration config listens on UDP 9100 (not 9110). */ func TestExampleIntegrationConfigTelemetryPort(t *testing.T) { cfg, err := LoadIntegrationConfig(repoToolsSimu5g("example-integration-config.json")) if err != nil { t.Fatal(err) } if err := cfg.ValidateForMobilityAdapter(); err != nil { t.Fatal(err) } if cfg.Telemetry.ListenPort != 9100 { t.Fatalf("listenPort %d want 9100", cfg.Telemetry.ListenPort) } } /** @brief monaco-harbor Phase 0 config: port 9100, scene origin, ue-car-0 mapping. */ func TestMonacoHarborIntegrationConfig(t *testing.T) { cfg, err := LoadIntegrationConfig(repoToolsSimu5g("monaco-harbor-integration-config.json")) if err != nil { t.Fatal(err) } if err := cfg.ValidateForMobilityAdapter(); err != nil { t.Fatal(err) } if cfg.Deployment.ScenarioID != "monaco-harbor" { t.Fatalf("scenarioId %q", cfg.Deployment.ScenarioID) } if cfg.Telemetry.ListenPort != 9100 { t.Fatalf("listenPort %d want 9100", cfg.Telemetry.ListenPort) } if cfg.TelemetryListenAddr() != "0.0.0.0:9100" { t.Fatalf("listen %s", cfg.TelemetryListenAddr()) } if cfg.Telemetry.SceneLatDeg != 43.734042 || cfg.Telemetry.SceneLonDeg != 7.416587 { t.Fatalf("scene origin %v,%v", cfg.Telemetry.SceneLatDeg, cfg.Telemetry.SceneLonDeg) } if len(cfg.UEMappings) != 8 { t.Fatalf("ueMappings %d want 8", len(cfg.UEMappings)) } if cfg.UEMappings[0].UeID != "ue-car-0" { t.Fatalf("first ueId %q", cfg.UEMappings[0].UeID) } if cfg.UEMappings[0].Simu5gModulePath != "MonacoHarbor.ue_car[0]" { t.Fatalf("module path %q", cfg.UEMappings[0].Simu5gModulePath) } id, ok := cfg.ResolveSandboxUeID("MonacoHarbor.ue_car[0]", "") if !ok || id != "ue-car-0" { t.Fatalf("module map %q %v", id, ok) } id, ok = cfg.ResolveSandboxUeID("unknown", "10.0.0.14") if !ok || id != "ue-ped-3" { t.Fatalf("ipv4 map %q %v", id, ok) } if _, ok := cfg.ResolveSandboxUeID("MonacoHarbor.ue_car[99]", "10.9.9.9"); ok { t.Fatal("unmapped UE must not resolve") } foundEnb := false for _, c := range cfg.Cells { if c.PoaID == "poa-enb" && c.CellID == 100 { foundEnb = true } } if !foundEnb { t.Fatal("cells missing poa-enb cellId 100") } }
go-packages/meep-simu5g-bridge/telemetry_test.go 0 → 100644 +68 −0 Changes for go-packages/meep-simu5g-bridge/telemetry_test.go: 68 added lines, 0 removed lines. Original line number Diff line number Diff line package bridge import ( "encoding/binary" "math" "net" "testing" ) func putF64(b []byte, v float64) { binary.LittleEndian.PutUint64(b, math.Float64bits(v)) } func encodeTelemetryV3(seq uint64, simTime float64, id, ipv4 string, sceneX, sceneY, sceneZ, speed float64) []byte { pkt := make([]byte, headerSize+recordSizeV3) le := binary.LittleEndian le.PutUint32(pkt[0:4], magicUET1) le.PutUint16(pkt[4:6], protoVersion3) le.PutUint64(pkt[8:16], seq) putF64(pkt[16:24], simTime) le.PutUint16(pkt[24:26], 1) rec := pkt[headerSize:] if len(id) > 63 { id = id[:63] } rec[0] = byte(len(id)) copy(rec[1:], id) putF64(rec[65:73], sceneX) putF64(rec[73:81], sceneY) putF64(rec[81:89], sceneZ) putF64(rec[113:121], speed) ip := net.ParseIP(ipv4).To4() if ip != nil { copy(rec[153:157], ip) } return pkt } /** @brief ParseTelemetryDatagram decodes a v3 scene-coordinate record to WGS-84. */ func TestParseTelemetryDatagramV3(t *testing.T) { nextSeq = 0 opts := TelemetryOptions{ SceneLatDeg: 43.734042, SceneLonDeg: 7.416587, MetersPerDeg: 111320, } pkt := encodeTelemetryV3(1, 12.5, "MonacoHarbor.ue_car[0]", "10.10.1.10", 499.7, 338.6, 1.5, 8.25) got, err := ParseTelemetryDatagram(pkt, opts) if err != nil { t.Fatal(err) } if got.NumUE != 1 || got.Seq != 1 || got.ProtoVersion != protoVersion3 { t.Fatalf("header %+v", got) } ue := got.UEs[0] if ue.ID != "MonacoHarbor.ue_car[0]" { t.Fatalf("id %q", ue.ID) } if ue.IPv4 != "10.10.1.10" { t.Fatalf("ipv4 %q", ue.IPv4) } if ue.LatDeg == 0 || ue.LonDeg == 0 { t.Fatalf("wgs84 lat=%v lon=%v", ue.LatDeg, ue.LonDeg) } if math.Abs(ue.SpeedMps-8.25) > 1e-9 { t.Fatalf("speed %v", ue.SpeedMps) } }