Commit 0ffce05e authored by Yann Garcia's avatar Yann Garcia
Browse files

Another bug fixed in DATA_UL/DATA_DL protocol mgmt

parent b13e6d70
Loading
Loading
Loading
Loading
+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)
	}
}
+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
@@ -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"
    }
  ],