// Copyright 2011 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 proxy

import (
	"context"
	"errors"
	"net"
	"reflect"
	"testing"
)

type recordingProxy struct {
	addrs []string
}

func (r *recordingProxy) Dial(network, addr string) (net.Conn, error) {
	r.addrs = append(r.addrs, addr)
	return nil, errors.New("recordingProxy")
}

func TestPerHost(t *testing.T) {
	expectedDef := []string{
		"example.com:123",
		"1.2.3.4:123",
		"[1001::]:123",
	}
	expectedBypass := []string{
		"localhost:123",
		"zone:123",
		"foo.zone:123",
		"127.0.0.1:123",
		"10.1.2.3:123",
		"[1000::]:123",
	}

	t.Run("Dial", func(t *testing.T) {
		var def, bypass recordingProxy
		perHost := NewPerHost(&def, &bypass)
		perHost.AddFromString("localhost,*.zone,127.0.0.1,10.0.0.1/8,1000::/16")
		for _, addr := range expectedDef {
			perHost.Dial("tcp", addr)
		}
		for _, addr := range expectedBypass {
			perHost.Dial("tcp", addr)
		}

		if !reflect.DeepEqual(expectedDef, def.addrs) {
			t.Errorf("Hosts which went to the default proxy didn't match. Got %v, want %v", def.addrs, expectedDef)
		}
		if !reflect.DeepEqual(expectedBypass, bypass.addrs) {
			t.Errorf("Hosts which went to the bypass proxy didn't match. Got %v, want %v", bypass.addrs, expectedBypass)
		}
	})

	t.Run("DialContext", func(t *testing.T) {
		var def, bypass recordingProxy
		perHost := NewPerHost(&def, &bypass)
		perHost.AddFromString("localhost,*.zone,127.0.0.1,10.0.0.1/8,1000::/16")
		for _, addr := range expectedDef {
			perHost.DialContext(context.Background(), "tcp", addr)
		}
		for _, addr := range expectedBypass {
			perHost.DialContext(context.Background(), "tcp", addr)
		}

		if !reflect.DeepEqual(expectedDef, def.addrs) {
			t.Errorf("Hosts which went to the default proxy didn't match. Got %v, want %v", def.addrs, expectedDef)
		}
		if !reflect.DeepEqual(expectedBypass, bypass.addrs) {
			t.Errorf("Hosts which went to the bypass proxy didn't match. Got %v, want %v", bypass.addrs, expectedBypass)
		}
	})
}
