Commit 01bdf3e5 authored by Yann Garcia's avatar Yann Garcia
Browse files

Enhance GIS engine to support simu5g - Missing files

parent 272f39e8
Loading
Loading
Loading
Loading
+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")
	}
}
+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)
	}
}