811d855a35
This eliminates an edge case that can cause a deadlock and is a prerequisite to cheaply testing connection liveness and to recoving a connection after a timeout. https://github.com/jackc/pgconn/issues/27 Squashed commit of the following: commit 0d7b0dddea1575e9fd72592665badb8cbdd581cc Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 25 13:15:05 2022 -0500 Add test for non-blocking IO preventing deadlock commit 79d68d23d38bb03ddb8bf13cb45792430eaf959a Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 18 18:23:24 2022 -0500 Release CopyFrom buf when done commit 95a43139c7b0b7557898c4480e5b3e42417ee3c0 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 18 18:22:32 2022 -0500 Avoid allocations with non-blocking write commit 6b63ceee076794bc4380495a55dd414dbbd08a43 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 18 17:46:49 2022 -0500 Simplify iobufpool usage commit 60ecdda02e5a24c894df4f58d31c485b90de5d5b Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 18 11:51:59 2022 -0500 Add true non-blocking IO commit 7dd26a34a182d4aacaed3bf8c09f9cc48a7b6156 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 4 20:28:23 2022 -0500 Fix block when reading more than buffered commit afa702213f1b6d24c976406448301b2be53b7f70 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 4 20:10:23 2022 -0500 More TLS support commit 51655bf8f40321d5f89bc3c02dd55fba0ac6aa49 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 4 17:46:00 2022 -0500 Steps toward TLS commit 2b80beb1ed75f0f58db8188b87753dbc26b62098 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 4 13:06:29 2022 -0500 Litle more TLS support commit 765b2c6e7b034ff6ffab3974579fd6ee7add593b Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 4 12:29:30 2022 -0500 Add testing of TLS commit 5b64432afbed9224f9512cc46624c88e7ebec625 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 4 09:48:19 2022 -0500 Introduce testVariants in prep for TLS commit ecebd7b103d4a9125c61e83f3651b950658b0b84 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 4 09:32:14 2022 -0500 Handle and test read of previously buffered data commit 09c64d8cf3ca5be1a31bef46bf78fa5cb9fae831 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 4 09:04:48 2022 -0500 Rename nbbconn to nbconn commit 73398bc67a7b7bd1aa044fb9b0546f4198ef92d2 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 4 08:59:53 2022 -0500 Remove backup files commit f1df39a29d23ae4e5175b92c69697f2bf9b4e112 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 4 08:58:05 2022 -0500 Initial passing tests commit ea3cdab234343fc9761d9b7966c5346179cd1b01 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Jun 4 08:38:57 2022 -0500 Fix connect timeout commit ca22396789d120ff556f9704f4470268fbc8c0d8 Author: Jack Christensen <jack@jackchristensen.com> Date: Thu Jun 2 19:32:55 2022 -0500 wip commit 2e7b46d5d7454daf0859dd48f8a8e190995164c5 Author: Jack Christensen <jack@jackchristensen.com> Date: Mon May 30 08:32:43 2022 -0500 Update comments commit 7d04dc5caa80cb147929b6f65bab60a27baaff89 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat May 28 19:43:23 2022 -0500 Fix broken test commit bf1edc77d70465b4097a59c08c581033d2033ac6 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat May 28 19:40:33 2022 -0500 fixed putting wrong size bufs commit 1f7a855b2e4d1e14f85ac5f5683e2b93db0a4bd9 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat May 28 18:13:47 2022 -0500 initial not quite working non-blocking conn
79 lines
2.5 KiB
Go
79 lines
2.5 KiB
Go
package iobufpool_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/jackc/pgx/v5/internal/iobufpool"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestGetCap(t *testing.T) {
|
|
tests := []struct {
|
|
requestedLen int
|
|
expectedCap int
|
|
}{
|
|
{requestedLen: 0, expectedCap: 256},
|
|
{requestedLen: 128, expectedCap: 256},
|
|
{requestedLen: 255, expectedCap: 256},
|
|
{requestedLen: 256, expectedCap: 256},
|
|
{requestedLen: 257, expectedCap: 512},
|
|
{requestedLen: 511, expectedCap: 512},
|
|
{requestedLen: 512, expectedCap: 512},
|
|
{requestedLen: 513, expectedCap: 1024},
|
|
{requestedLen: 1023, expectedCap: 1024},
|
|
{requestedLen: 1024, expectedCap: 1024},
|
|
{requestedLen: 33554431, expectedCap: 33554432},
|
|
{requestedLen: 33554432, expectedCap: 33554432},
|
|
|
|
// Above 32 MiB skip the pool and allocate exactly the requested size.
|
|
{requestedLen: 33554433, expectedCap: 33554433},
|
|
}
|
|
for _, tt := range tests {
|
|
buf := iobufpool.Get(tt.requestedLen)
|
|
assert.Equalf(t, tt.requestedLen, len(buf), "bad len for requestedLen: %d", len(buf), tt.requestedLen)
|
|
assert.Equalf(t, tt.expectedCap, cap(buf), "bad cap for requestedLen: %d", tt.requestedLen)
|
|
}
|
|
}
|
|
|
|
func TestPutHandlesWrongSizedBuffers(t *testing.T) {
|
|
for putBufSize := range []int{0, 1, 128, 250, 256, 257, 1023, 1024, 1025, 1 << 28} {
|
|
putBuf := make([]byte, putBufSize)
|
|
iobufpool.Put(putBuf)
|
|
|
|
tests := []struct {
|
|
requestedLen int
|
|
expectedCap int
|
|
}{
|
|
{requestedLen: 0, expectedCap: 256},
|
|
{requestedLen: 128, expectedCap: 256},
|
|
{requestedLen: 255, expectedCap: 256},
|
|
{requestedLen: 256, expectedCap: 256},
|
|
{requestedLen: 257, expectedCap: 512},
|
|
{requestedLen: 511, expectedCap: 512},
|
|
{requestedLen: 512, expectedCap: 512},
|
|
{requestedLen: 513, expectedCap: 1024},
|
|
{requestedLen: 1023, expectedCap: 1024},
|
|
{requestedLen: 1024, expectedCap: 1024},
|
|
{requestedLen: 33554431, expectedCap: 33554432},
|
|
{requestedLen: 33554432, expectedCap: 33554432},
|
|
|
|
// Above 32 MiB skip the pool and allocate exactly the requested size.
|
|
{requestedLen: 33554433, expectedCap: 33554433},
|
|
}
|
|
for _, tt := range tests {
|
|
getBuf := iobufpool.Get(tt.requestedLen)
|
|
assert.Equalf(t, tt.requestedLen, len(getBuf), "len(putBuf): %d, requestedLen: %d", len(putBuf), tt.requestedLen)
|
|
assert.Equalf(t, tt.expectedCap, cap(getBuf), "cap(putBuf): %d, requestedLen: %d", cap(putBuf), tt.requestedLen)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestPutGetBufferReuse(t *testing.T) {
|
|
buf := iobufpool.Get(4)
|
|
buf[0] = 1
|
|
iobufpool.Put(buf)
|
|
buf = iobufpool.Get(4)
|
|
require.Equal(t, byte(1), buf[0])
|
|
}
|