// Copyright 2013 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 !nacl,!plan9,!windows

package net

import (
	"bytes"
	"os"
	"reflect"
	"runtime"
	"syscall"
	"testing"
	"time"
)

func TestReadUnixgramWithUnnamedSocket(t *testing.T) {
	if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
		t.Skipf("skipping unixgram test on %s/%s", runtime.GOOS, runtime.GOARCH)
	}
	addr := testUnixAddr()
	la, err := ResolveUnixAddr("unixgram", addr)
	if err != nil {
		t.Fatalf("ResolveUnixAddr failed: %v", err)
	}
	c, err := ListenUnixgram("unixgram", la)
	if err != nil {
		t.Fatalf("ListenUnixgram failed: %v", err)
	}
	defer func() {
		c.Close()
		os.Remove(addr)
	}()

	off := make(chan bool)
	data := [5]byte{1, 2, 3, 4, 5}
	go func() {
		defer func() { off <- true }()
		s, err := syscall.Socket(syscall.AF_UNIX, syscall.SOCK_DGRAM, 0)
		if err != nil {
			t.Errorf("syscall.Socket failed: %v", err)
			return
		}
		defer syscall.Close(s)
		rsa := &syscall.SockaddrUnix{Name: addr}
		if err := syscall.Sendto(s, data[:], 0, rsa); err != nil {
			t.Errorf("syscall.Sendto failed: %v", err)
			return
		}
	}()

	<-off
	b := make([]byte, 64)
	c.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
	n, from, err := c.ReadFrom(b)
	if err != nil {
		t.Fatalf("UnixConn.ReadFrom failed: %v", err)
	}
	if from != nil {
		t.Fatalf("neighbor address is %v", from)
	}
	if !bytes.Equal(b[:n], data[:]) {
		t.Fatalf("got %v, want %v", b[:n], data[:])
	}
}

func TestReadUnixgramWithZeroBytesBuffer(t *testing.T) {
	if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
		t.Skipf("skipping unixgram test on %s/%s", runtime.GOOS, runtime.GOARCH)
	}
	// issue 4352: Recvfrom failed with "address family not
	// supported by protocol family" if zero-length buffer provided

	addr := testUnixAddr()
	la, err := ResolveUnixAddr("unixgram", addr)
	if err != nil {
		t.Fatalf("ResolveUnixAddr failed: %v", err)
	}
	c, err := ListenUnixgram("unixgram", la)
	if err != nil {
		t.Fatalf("ListenUnixgram failed: %v", err)
	}
	defer func() {
		c.Close()
		os.Remove(addr)
	}()

	off := make(chan bool)
	go func() {
		defer func() { off <- true }()
		c, err := DialUnix("unixgram", nil, la)
		if err != nil {
			t.Errorf("DialUnix failed: %v", err)
			return
		}
		defer c.Close()
		if _, err := c.Write([]byte{1, 2, 3, 4, 5}); err != nil {
			t.Errorf("UnixConn.Write failed: %v", err)
			return
		}
	}()

	<-off
	c.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
	_, from, err := c.ReadFrom(nil)
	if err != nil {
		t.Fatalf("UnixConn.ReadFrom failed: %v", err)
	}
	if from != nil {
		t.Fatalf("neighbor address is %v", from)
	}
}

func TestUnixgramAutobind(t *testing.T) {
	if runtime.GOOS != "linux" {
		t.Skip("skipping: autobind is linux only")
	}

	laddr := &UnixAddr{Name: "", Net: "unixgram"}
	c1, err := ListenUnixgram("unixgram", laddr)
	if err != nil {
		t.Fatalf("ListenUnixgram failed: %v", err)
	}
	defer c1.Close()

	// retrieve the autobind address
	autoAddr := c1.LocalAddr().(*UnixAddr)
	if len(autoAddr.Name) <= 1 {
		t.Fatalf("invalid autobind address: %v", autoAddr)
	}
	if autoAddr.Name[0] != '@' {
		t.Fatalf("invalid autobind address: %v", autoAddr)
	}

	c2, err := DialUnix("unixgram", nil, autoAddr)
	if err != nil {
		t.Fatalf("DialUnix failed: %v", err)
	}
	defer c2.Close()

	if !reflect.DeepEqual(c1.LocalAddr(), c2.RemoteAddr()) {
		t.Fatalf("expected autobind address %v, got %v", c1.LocalAddr(), c2.RemoteAddr())
	}
}

func TestUnixAutobindClose(t *testing.T) {
	if runtime.GOOS != "linux" {
		t.Skip("skipping: autobind is linux only")
	}
	laddr := &UnixAddr{Name: "", Net: "unix"}
	ln, err := ListenUnix("unix", laddr)
	if err != nil {
		t.Fatalf("ListenUnix failed: %v", err)
	}
	ln.Close()
}

func TestUnixgramWrite(t *testing.T) {
	if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
		t.Skipf("skipping unixgram test on %s/%s", runtime.GOOS, runtime.GOARCH)
	}
	addr := testUnixAddr()
	laddr, err := ResolveUnixAddr("unixgram", addr)
	if err != nil {
		t.Fatalf("ResolveUnixAddr failed: %v", err)
	}
	c, err := ListenPacket("unixgram", addr)
	if err != nil {
		t.Fatalf("ListenPacket failed: %v", err)
	}
	defer os.Remove(addr)
	defer c.Close()

	testUnixgramWriteConn(t, laddr)
	testUnixgramWritePacketConn(t, laddr)
}

func testUnixgramWriteConn(t *testing.T, raddr *UnixAddr) {
	c, err := Dial("unixgram", raddr.String())
	if err != nil {
		t.Fatalf("Dial failed: %v", err)
	}
	defer c.Close()

	if _, err := c.(*UnixConn).WriteToUnix([]byte("Connection-oriented mode socket"), raddr); err == nil {
		t.Fatal("WriteToUnix should fail")
	} else if err.(*OpError).Err != ErrWriteToConnected {
		t.Fatalf("WriteToUnix should fail as ErrWriteToConnected: %v", err)
	}
	if _, err = c.(*UnixConn).WriteTo([]byte("Connection-oriented mode socket"), raddr); err == nil {
		t.Fatal("WriteTo should fail")
	} else if err.(*OpError).Err != ErrWriteToConnected {
		t.Fatalf("WriteTo should fail as ErrWriteToConnected: %v", err)
	}
	if _, _, err = c.(*UnixConn).WriteMsgUnix([]byte("Connection-oriented mode socket"), nil, raddr); err == nil {
		t.Fatal("WriteTo should fail")
	} else if err.(*OpError).Err != ErrWriteToConnected {
		t.Fatalf("WriteMsgUnix should fail as ErrWriteToConnected: %v", err)
	}
	if _, err := c.Write([]byte("Connection-oriented mode socket")); err != nil {
		t.Fatalf("Write failed: %v", err)
	}
}

func testUnixgramWritePacketConn(t *testing.T, raddr *UnixAddr) {
	addr := testUnixAddr()
	c, err := ListenPacket("unixgram", addr)
	if err != nil {
		t.Fatalf("ListenPacket failed: %v", err)
	}
	defer os.Remove(addr)
	defer c.Close()

	if _, err := c.(*UnixConn).WriteToUnix([]byte("Connectionless mode socket"), raddr); err != nil {
		t.Fatalf("WriteToUnix failed: %v", err)
	}
	if _, err := c.WriteTo([]byte("Connectionless mode socket"), raddr); err != nil {
		t.Fatalf("WriteTo failed: %v", err)
	}
	if _, _, err := c.(*UnixConn).WriteMsgUnix([]byte("Connectionless mode socket"), nil, raddr); err != nil {
		t.Fatalf("WriteMsgUnix failed: %v", err)
	}
	if _, err := c.(*UnixConn).Write([]byte("Connectionless mode socket")); err == nil {
		t.Fatal("Write should fail")
	}
}

func TestUnixConnLocalAndRemoteNames(t *testing.T) {
	if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
		t.Skipf("skipping unixgram test on %s/%s", runtime.GOOS, runtime.GOARCH)
	}
	for _, laddr := range []string{"", testUnixAddr()} {
		laddr := laddr
		taddr := testUnixAddr()
		ta, err := ResolveUnixAddr("unix", taddr)
		if err != nil {
			t.Fatalf("ResolveUnixAddr failed: %v", err)
		}
		ln, err := ListenUnix("unix", ta)
		if err != nil {
			t.Fatalf("ListenUnix failed: %v", err)
		}
		defer func() {
			ln.Close()
			os.Remove(taddr)
		}()

		done := make(chan int)
		go transponder(t, ln, done)

		la, err := ResolveUnixAddr("unix", laddr)
		if err != nil {
			t.Fatalf("ResolveUnixAddr failed: %v", err)
		}
		c, err := DialUnix("unix", la, ta)
		if err != nil {
			t.Fatalf("DialUnix failed: %v", err)
		}
		defer func() {
			c.Close()
			if la != nil {
				defer os.Remove(laddr)
			}
		}()
		if _, err := c.Write([]byte("UNIXCONN LOCAL AND REMOTE NAME TEST")); err != nil {
			t.Fatalf("UnixConn.Write failed: %v", err)
		}

		switch runtime.GOOS {
		case "android", "linux":
			if laddr == "" {
				laddr = "@" // autobind feature
			}
		}
		var connAddrs = [3]struct{ got, want Addr }{
			{ln.Addr(), ta},
			{c.LocalAddr(), &UnixAddr{Name: laddr, Net: "unix"}},
			{c.RemoteAddr(), ta},
		}
		for _, ca := range connAddrs {
			if !reflect.DeepEqual(ca.got, ca.want) {
				t.Fatalf("got %#v, expected %#v", ca.got, ca.want)
			}
		}

		<-done
	}
}

func TestUnixgramConnLocalAndRemoteNames(t *testing.T) {
	if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
		t.Skipf("skipping unixgram test on %s/%s", runtime.GOOS, runtime.GOARCH)
	}
	for _, laddr := range []string{"", testUnixAddr()} {
		laddr := laddr
		taddr := testUnixAddr()
		ta, err := ResolveUnixAddr("unixgram", taddr)
		if err != nil {
			t.Fatalf("ResolveUnixAddr failed: %v", err)
		}
		c1, err := ListenUnixgram("unixgram", ta)
		if err != nil {
			t.Fatalf("ListenUnixgram failed: %v", err)
		}
		defer func() {
			c1.Close()
			os.Remove(taddr)
		}()

		var la *UnixAddr
		if laddr != "" {
			if la, err = ResolveUnixAddr("unixgram", laddr); err != nil {
				t.Fatalf("ResolveUnixAddr failed: %v", err)
			}
		}
		c2, err := DialUnix("unixgram", la, ta)
		if err != nil {
			t.Fatalf("DialUnix failed: %v", err)
		}
		defer func() {
			c2.Close()
			if la != nil {
				defer os.Remove(laddr)
			}
		}()

		switch runtime.GOOS {
		case "android", "linux":
			if laddr == "" {
				laddr = "@" // autobind feature
			}
		}

		var connAddrs = [4]struct{ got, want Addr }{
			{c1.LocalAddr(), ta},
			{c1.RemoteAddr(), nil},
			{c2.LocalAddr(), &UnixAddr{Name: laddr, Net: "unixgram"}},
			{c2.RemoteAddr(), ta},
		}
		for _, ca := range connAddrs {
			if !reflect.DeepEqual(ca.got, ca.want) {
				t.Fatalf("got %#v, expected %#v", ca.got, ca.want)
			}
		}
	}
}
