// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package net

import (
	"internal/testenv"
	"runtime"
	"testing"
)

func TestListenMulticastUDP(t *testing.T) {
	testenv.MustHaveExternalNetwork(t)

	ifcs, err := Interfaces()
	if err != nil {
		t.Skip(err.Error())
	}
	if len(ifcs) == 0 {
		t.Skip("no network interfaces found")
	}

	var mifc *Interface
	for _, ifc := range ifcs {
		if ifc.Flags&FlagUp|FlagMulticast != FlagUp|FlagMulticast {
			continue
		}
		mifc = &ifc
		break
	}

	if mifc == nil {
		t.Skipf("no multicast interfaces found")
	}

	c1, err := ListenMulticastUDP("udp4", mifc, &UDPAddr{IP: ParseIP("224.0.0.254")})
	if err != nil {
		t.Fatalf("multicast not working on %s: %v", runtime.GOOS, err)
	}
	c1addr := c1.LocalAddr().(*UDPAddr)
	if err != nil {
		t.Fatal(err)
	}
	defer c1.Close()

	c2, err := ListenUDP("udp4", &UDPAddr{IP: IPv4zero, Port: 0})
	c2addr := c2.LocalAddr().(*UDPAddr)
	if err != nil {
		t.Fatal(err)
	}
	defer c2.Close()

	n, err := c2.WriteToUDP([]byte("data"), c1addr)
	if err != nil {
		t.Fatal(err)
	}
	if n != 4 {
		t.Fatalf("got %d; want 4", n)
	}

	n, err = c1.WriteToUDP([]byte("data"), c2addr)
	if err != nil {
		t.Fatal(err)
	}
	if n != 4 {
		t.Fatalf("got %d; want 4", n)
	}
}
