// Copyright 2015 The Vanadium 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 netstate_test

import (
	"fmt"
	"net"
	"testing"

	"v.io/x/lib/netstate"
)

func TestChooser(t *testing.T) {
	_, ifcs, rt := mockInterfacesAndRouteTable()
	cleanup := netstate.CreateAndUseMockCache(ifcs, rt)
	defer cleanup()

	chooser := func(protocol string, addrs []net.Addr) ([]net.Addr, error) {
		r := []net.Addr{}
		for _, a := range netstate.ConvertToAddresses(addrs) {
			if netstate.IsIPProtocol(a.Network()) {
				r = append(r, a)
			}
		}
		return r, nil
	}

	addrs, unspecified, err := netstate.PossibleAddresses("tcp", "0.0.0.0", chooser)
	if err != nil {
		t.Fatal(err)
	}
	if got, want := unspecified, true; got != want {
		t.Errorf("got %v, want %v", got, want)
	}

	if got, want := len(addrs), 7; got != want {
		t.Errorf("got %v, want %v", got, want)
	}
	if got, want := addrs[0], netstate.MkAddr("ip", "192.168.1.10"); !cmpAddr(got, want) {
		t.Errorf("got %#v, want %#v", got, want)
	}
	for _, a := range addrs {
		ip := net.ParseIP(a.String())
		if ip == nil {
			t.Fatalf("failed to parse %q", addrs[0].String())
		}
	}

	addrs, unspecified, err = netstate.PossibleAddresses("tcp", "172.16.2.12", chooser)
	if err != nil {
		t.Fatal(err)
	}
	if got, want := unspecified, false; got != want {
		t.Errorf("got %v, want %v", got, want)
	}
	if got, want := len(addrs), 1; got != want {
		t.Errorf("got %v, want %v", got, want)
	}

	ip := net.ParseIP(addrs[0].String())
	if ip == nil {
		t.Fatalf("failed to parse %q", addrs[0].String())
	}

	naddr, err := netstate.AddressFromIP(ip)
	if err != nil {
		t.Fatal(err)
	}
	if got, want := naddr.Interface().Index(), 3; got != want {
		t.Errorf("got %v, want %v", got, want)
	}
}

func TestChooserNoMatches(t *testing.T) {
	_, ifcs, rt := mockInterfacesAndRouteTable()
	cleanup := netstate.CreateAndUseMockCache(ifcs, rt)
	defer cleanup()

	chooser := func(protocol string, addrs []net.Addr) ([]net.Addr, error) {
		return nil, nil
	}

	addrs, unspecified, err := netstate.PossibleAddresses("tcp", "0.0.0.0", chooser)
	if err != nil {
		t.Fatal(err)
	}

	if got, want := len(addrs), 1; got != want {
		t.Fatalf("got %v, want %v", got, want)
	}

	if got, want := addrs[0].String(), "0.0.0.0"; got != want {
		t.Fatalf("got %v, want %v", got, want)
	}

	if got, want := unspecified, true; got != want {
		t.Errorf("got %v, want %v", got, want)
	}
	addrs, unspecified, err = netstate.PossibleAddresses("tcp", "172.16.1.11", chooser)
	if err != nil {
		t.Fatal(err)
	}

	if got, want := len(addrs), 1; got != want {
		t.Fatalf("got %v, want %v", got, want)
	}

	address := addrs[0]
	if _, ok := address.(netstate.Address); !ok {
		t.Fatalf("%v has wront type %T", address, address)
	}
	if got, want := unspecified, false; got != want {
		t.Errorf("got %v, want %v", got, want)
	}
}

func TestChooserIsNilAndErrors(t *testing.T) {
	_, ifcs, rt := mockInterfacesAndRouteTable()
	cleanup := netstate.CreateAndUseMockCache(ifcs, rt)
	defer cleanup()

	addrs, unspecified, err := netstate.PossibleAddresses("tcp", "0.0.0.0", nil)
	if err != nil {
		t.Fatal(err)
	}

	if got, want := len(addrs), 1; got != want {
		t.Fatalf("got %v, want %v", got, want)
	}
	if got, want := unspecified, true; got != want {
		t.Errorf("got %v, want %v", got, want)
	}

	errorChooser := func(protocol string, addrs []net.Addr) ([]net.Addr, error) {
		return nil, fmt.Errorf("a test error")
	}
	_, _, err = netstate.PossibleAddresses("tcp", "0.0.0.0", errorChooser)
	if err == nil || err.Error() != "a test error" {
		t.Fatal(err)
	}

	_, _, err = netstate.PossibleAddresses("xxx", "0.0.0.0", nil)
	if got, want := err, netstate.ErrNotAnIPProtocol; got != want {
		t.Errorf("got %v, want %v", got, want)
	}

	_, _, err = netstate.PossibleAddresses("tcp", "0.x.0.0", nil)
	if got, want := err, netstate.ErrFailedToParseIPAddr; got != want {
		t.Errorf("got %v, want %v", got, want)
	}

}
