package cql

import (
	"net"
	"testing"
	"time"

	"go.uber.org/zap"
)

func TestServerConnectionLimit(t *testing.T) {
	server := NewServer("127.0.0.1:0", noopHandler{}, zap.NewNop(), &ServerOptions{
		ProtocolVersion: ProtoVersion4,
		MaxConnections:  1,
	})
	if err := server.Start(); err != nil {
		t.Fatalf("server start failed: %v", err)
	}
	defer server.Stop()

	addr := server.Addr()
	if addr == nil {
		t.Fatalf("server addr is nil")
	}

	conn1, err := net.Dial("tcp", addr.String())
	if err != nil {
		t.Fatalf("first dial failed: %v", err)
	}
	defer conn1.Close()

	_ = waitForConnectionInfo(t, server, 2*time.Second)

	conn2, err := net.Dial("tcp", addr.String())
	if err != nil {
		t.Fatalf("second dial failed: %v", err)
	}
	defer conn2.Close()

	time.Sleep(50 * time.Millisecond)
	infos := server.GetActiveConnections()
	if len(infos) != 1 {
		t.Fatalf("expected 1 active connection, got %d", len(infos))
	}

	_ = conn2.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
	buf := make([]byte, 1)
	_, err = conn2.Read(buf)
	if err == nil {
		t.Fatalf("expected second connection to be closed")
	}
	if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
		t.Fatalf("expected second connection close, got timeout")
	}
}
