// Copyright 2012 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.

// +build darwin freebsd linux netbsd openbsd windows

package ipv4_test

import (
	"code.google.com/p/go.net/ipv4"
	"net"
	"os"
	"runtime"
	"testing"
)

type testMulticastConn interface {
	testUnicastConn
	MulticastTTL() (int, error)
	SetMulticastTTL(ttl int) error
	MulticastLoopback() (bool, error)
	SetMulticastLoopback(bool) error
	JoinGroup(*net.Interface, net.Addr) error
	LeaveGroup(*net.Interface, net.Addr) error
}

type multicastSockoptTest struct {
	tos    int
	ttl    int
	mcttl  int
	mcloop bool
	gaddr  net.IP
}

var multicastSockoptTests = []multicastSockoptTest{
	{ipv4.DSCP_CS0 | ipv4.ECN_NOTECT, 127, 128, false, net.IPv4(224, 0, 0, 249)}, // see RFC 4727
	{ipv4.DSCP_AF11 | ipv4.ECN_NOTECT, 255, 254, true, net.IPv4(224, 0, 0, 250)}, // see RFC 4727
}

func TestUDPMulticastSockopt(t *testing.T) {
	if testing.Short() || !*testExternal {
		t.Logf("skipping test to avoid external network")
		return
	}

	for _, tt := range multicastSockoptTests {
		c, err := net.ListenPacket("udp4", "0.0.0.0:0")
		if err != nil {
			t.Fatalf("net.ListenPacket failed: %v", err)
		}
		defer c.Close()

		p := ipv4.NewPacketConn(c)
		testMulticastSockopt(t, tt, p, &net.UDPAddr{IP: tt.gaddr})
	}
}

func TestIPMulticastSockopt(t *testing.T) {
	if testing.Short() || !*testExternal {
		t.Logf("skipping test to avoid external network")
		return
	}
	if os.Getuid() != 0 {
		t.Logf("skipping test; must be root")
		return
	}

	for _, tt := range multicastSockoptTests {
		c, err := net.ListenPacket("ip4:icmp", "0.0.0.0")
		if err != nil {
			t.Fatalf("net.ListenPacket failed: %v", err)
		}
		defer c.Close()

		r, _ := ipv4.NewRawConn(c)
		testMulticastSockopt(t, tt, r, &net.IPAddr{IP: tt.gaddr})
	}
}

func testMulticastSockopt(t *testing.T, tt multicastSockoptTest, c testMulticastConn, gaddr net.Addr) {
	switch runtime.GOOS {
	case "windows":
		// IP_TOS option is supported on Windows 8 and beyond.
		t.Logf("skipping IP_TOS test on %q", runtime.GOOS)
	default:
		if err := c.SetTOS(tt.tos); err != nil {
			t.Fatalf("ipv4.PacketConn.SetTOS failed: %v", err)
		}
		if v, err := c.TOS(); err != nil {
			t.Fatalf("ipv4.PacketConn.TOS failed: %v", err)
		} else if v != tt.tos {
			t.Fatalf("Got unexpected TOS value %v; expected %v", v, tt.tos)
		}
	}

	if err := c.SetTTL(tt.ttl); err != nil {
		t.Fatalf("ipv4.PacketConn.SetTTL failed: %v", err)
	}
	if v, err := c.TTL(); err != nil {
		t.Fatalf("ipv4.PacketConn.TTL failed: %v", err)
	} else if v != tt.ttl {
		t.Fatalf("Got unexpected TTL value %v; expected %v", v, tt.ttl)
	}

	if err := c.SetMulticastTTL(tt.mcttl); err != nil {
		t.Fatalf("ipv4.PacketConn.SetMulticastTTL failed: %v", err)
	}
	if v, err := c.MulticastTTL(); err != nil {
		t.Fatalf("ipv4.PacketConn.MulticastTTL failed: %v", err)
	} else if v != tt.mcttl {
		t.Fatalf("Got unexpected MulticastTTL value %v; expected %v", v, tt.mcttl)
	}

	if err := c.SetMulticastLoopback(tt.mcloop); err != nil {
		t.Fatalf("ipv4.PacketConn.SetMulticastLoopback failed: %v", err)
	}
	if v, err := c.MulticastLoopback(); err != nil {
		t.Fatalf("ipv4.PacketConn.MulticastLoopback failed: %v", err)
	} else if v != tt.mcloop {
		t.Fatalf("Got unexpected MulticastLoopback value %v; expected %v", v, tt.mcloop)
	}

	if err := c.JoinGroup(nil, gaddr); err != nil {
		t.Fatalf("ipv4.PacketConn.JoinGroup(%v) failed: %v", gaddr, err)
	}
	if err := c.LeaveGroup(nil, gaddr); err != nil {
		t.Fatalf("ipv4.PacketConn.LeaveGroup(%v) failed: %v", gaddr, err)
	}
}
