// Copyright 2019 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 (
	"syscall/zx/net"
	"syscall/zx/posix/socket"
	"testing"
)

func TestIPToSockaddr(t *testing.T) {
	type inArgs struct {
		domain socket.Domain
		ip     IP
		port   int
		zone   string
	}

	type want struct {
		addr net.SocketAddress
		err  bool
	}

	makeIpv4 := func(addr [4]byte, port uint16) net.SocketAddress {
		return net.SocketAddressWithIpv4(net.Ipv4SocketAddress{
			Address: net.Ipv4Address{
				Addr: addr,
			},
			Port: port,
		})
	}
	makeIpv6 := func(addr [16]byte, port uint16, zone uint64) net.SocketAddress {
		return net.SocketAddressWithIpv6(net.Ipv6SocketAddress{
			Address: net.Ipv6Address{
				Addr: addr,
			},
			Port:      port,
			ZoneIndex: zone,
		})
	}

	tests := []struct {
		name string
		in   inArgs
		want want
	}{
		{
			"v4 non-numeric string zone ignored",
			inArgs{socket.DomainIpv4, ParseIP("1.2.3.4"), 6667, "zone"},
			want{makeIpv4([4]byte{1, 2, 3, 4}, 6667), false},
		},
		{
			"v4 numeric string zone ignored",
			inArgs{socket.DomainIpv4, ParseIP("1.2.3.4"), 6697, "17"},
			want{makeIpv4([4]byte{1, 2, 3, 4}, 6697), false},
		},
		{
			"v4 invalid IP returns error",
			inArgs{socket.DomainIpv4, IP([]byte{1}), 6697, ""},
			want{net.SocketAddress{}, true},
		},
		{
			"v6 with known non-numeric zone converted",
			// This test runs in a sandbox with interface 'lo' on index 1.
			inArgs{socket.DomainIpv6, ParseIP("fe80::1"), 443, "lo"},
			want{makeIpv6([16]byte{0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 443, 1), false},
		},
		{
			"v6 with unknown non-numeric zone ignored",
			inArgs{socket.DomainIpv6, ParseIP("fe80::1"), 443, "unknownif"},
			want{makeIpv6([16]byte{0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 443, 0), false},
		},
		{
			"v6 with numeric zone handled properly",
			inArgs{socket.DomainIpv6, ParseIP("fe80::1"), 80, "42"},
			want{makeIpv6([16]byte{0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 80, 42), false},
		},
		{
			"v6 invalid IP returns error",
			inArgs{socket.DomainIpv6, IP([]byte{1}), 1, ""},
			want{net.SocketAddress{}, true},
		},
	}

	for _, test := range tests {
		addr, err := ipToSockaddr(test.in.domain, test.in.ip, test.in.port, test.in.zone)
		if test.want.err && err == nil {
			t.Errorf("test %q returned no error, but an error was expected", test.name)
			continue
		} else if !test.want.err && err != nil {
			t.Errorf("test %q got error %v; no error was expected", test.name, err)
			continue
		}

		if addr != test.want.addr {
			t.Errorf("test %q got addr %v, wanted %v", test.name, addr, test.want.addr)
		}
	}
}
