package netxlite

import (
	"context"
	"errors"
	"net"
	"testing"

	"github.com/ooni/probe-cli/v3/internal/netxlite/mocks"
)

func TestResolverLegacyAdapter(t *testing.T) {
	t.Run("with compatible type", func(t *testing.T) {
		var called bool
		r := NewResolverLegacyAdapter(&mocks.Resolver{
			MockNetwork: func() string {
				return "network"
			},
			MockAddress: func() string {
				return "address"
			},
			MockCloseIdleConnections: func() {
				called = true
			},
		})
		if r.Network() != "network" {
			t.Fatal("invalid Network")
		}
		if r.Address() != "address" {
			t.Fatal("invalid Address")
		}
		r.CloseIdleConnections()
		if !called {
			t.Fatal("not called")
		}
	})

	t.Run("with incompatible type", func(t *testing.T) {
		r := NewResolverLegacyAdapter(&net.Resolver{})
		if r.Network() != "adapter" {
			t.Fatal("invalid Network")
		}
		if r.Address() != "" {
			t.Fatal("invalid Address")
		}
		r.CloseIdleConnections() // does not crash
	})

	t.Run("for LookupHTTPS", func(t *testing.T) {
		r := NewResolverLegacyAdapter(&net.Resolver{})
		https, err := r.LookupHTTPS(context.Background(), "x.org")
		if !errors.Is(err, ErrNoDNSTransport) {
			t.Fatal("not the error we expected")
		}
		if https != nil {
			t.Fatal("expected nil result")
		}
	})
}

func TestDialerLegacyAdapter(t *testing.T) {
	t.Run("with compatible type", func(t *testing.T) {
		var called bool
		r := NewDialerLegacyAdapter(&mocks.Dialer{
			MockCloseIdleConnections: func() {
				called = true
			},
		})
		r.CloseIdleConnections()
		if !called {
			t.Fatal("not called")
		}
	})

	t.Run("with incompatible type", func(t *testing.T) {
		r := NewDialerLegacyAdapter(&net.Dialer{})
		r.CloseIdleConnections() // does not crash
	})
}

func TestQUICContextDialerAdapter(t *testing.T) {
	t.Run("with compatible type", func(t *testing.T) {
		var called bool
		d := NewQUICDialerFromContextDialerAdapter(&mocks.QUICDialer{
			MockCloseIdleConnections: func() {
				called = true
			},
		})
		d.CloseIdleConnections()
		if !called {
			t.Fatal("not called")
		}
	})

	t.Run("with incompatible type", func(t *testing.T) {
		d := NewQUICDialerFromContextDialerAdapter(&mocks.QUICContextDialer{})
		d.CloseIdleConnections() // does not crash
	})
}
