From 33d4eb5b21342dfacd99f12f2a6da2b8b36d362f Mon Sep 17 00:00:00 2001 From: Winni Neessen Date: Mon, 23 Sep 2024 10:33:06 +0200 Subject: [PATCH] Add unit tests for connection pool and rename Len to Size Introduced unit tests for the connection pool to ensure robust functionality. Also, renamed the Len method to Size in the Pool interface and its implementation for better clarity and consistency. --- connpool.go | 8 +++---- connpool_test.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 connpool_test.go diff --git a/connpool.go b/connpool.go index b22019c..f774806 100644 --- a/connpool.go +++ b/connpool.go @@ -38,8 +38,8 @@ type Pool interface { // no longer usable. Close() - // Len returns the current number of connections of the pool. - Len() int + // Size returns the current number of connections of the pool. + Size() int } // connPool implements the Pool interface @@ -174,8 +174,8 @@ func (p *connPool) Close() { } } -// Len returns the current number of connections in the connection pool. -func (p *connPool) Len() int { +// Size returns the current number of connections in the connection pool. +func (p *connPool) Size() int { _, conns, _ := p.getConnsAndDialContext() return len(conns) } diff --git a/connpool_test.go b/connpool_test.go new file mode 100644 index 0000000..589ad68 --- /dev/null +++ b/connpool_test.go @@ -0,0 +1,57 @@ +// SPDX-FileCopyrightText: 2022-2024 The go-mail Authors +// +// SPDX-License-Identifier: MIT + +package mail + +import ( + "context" + "fmt" + "net" + "testing" + "time" +) + +func TestNewConnPool(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + serverPort := TestServerPortBase + 10 + featureSet := "250-AUTH PLAIN\r\n250-8BITMIME\r\n250-DSN\r\n250 SMTPUTF8" + go func() { + if err := simpleSMTPServer(ctx, featureSet, true, serverPort); err != nil { + t.Errorf("failed to start test server: %s", err) + return + } + }() + time.Sleep(time.Millisecond * 300) + + pool, err := newConnPool(serverPort) + if err != nil { + t.Errorf("failed to create connection pool: %s", err) + } + if pool == nil { + t.Errorf("connection pool is nil") + return + } + if pool.Size() != 5 { + t.Errorf("expected 5 connections, got %d", pool.Size()) + } + for i := 0; i < 5; i++ { + go func() { + conn, err := pool.Get() + if err != nil { + t.Errorf("failed to get connection: %s", err) + } + if _, err := conn.Write([]byte("EHLO test.localhost.localdomain\r\nQUIT\r\n")); err != nil { + t.Errorf("failed to write quit command to first connection: %s", err) + } + }() + } +} + +func newConnPool(port int) (Pool, error) { + netDialer := net.Dialer{} + return NewConnPool(context.Background(), 5, 30, netDialer.DialContext, "tcp", + fmt.Sprintf("127.0.0.1:%d", port)) +}