mirror of
https://github.com/soypat/lneto.git
synced 2026-09-08 15:59:10 +00:00
claude: add tests for tcp and ntp to consolidate functionality
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
package xnet
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/soypat/lneto/tcp"
|
||||
)
|
||||
|
||||
func TestTCPConn_SetDeadline_Established(t *testing.T) {
|
||||
const seed = 9999
|
||||
const MTU = 1500
|
||||
const svPort = 8080
|
||||
client, sv, clconn, svconn := newTCPStacks(t, seed, MTU)
|
||||
tst := testerFrom(t, MTU)
|
||||
|
||||
tst.TestTCPSetupAndEstablish(sv, client, svconn, clconn, svPort, 1337)
|
||||
|
||||
if clconn.State() != tcp.StateEstablished {
|
||||
t.Fatalf("expected StateEstablished, got %s", clconn.State())
|
||||
}
|
||||
|
||||
// SetDeadline should succeed on established connection.
|
||||
err := clconn.SetDeadline(time.Now().Add(time.Hour))
|
||||
if err != nil {
|
||||
t.Fatalf("SetDeadline on established conn failed: %v", err)
|
||||
}
|
||||
|
||||
// Clear deadlines.
|
||||
err = clconn.SetDeadline(time.Time{})
|
||||
if err != nil {
|
||||
t.Fatalf("SetDeadline(zero) failed: %v", err)
|
||||
}
|
||||
_ = sv
|
||||
}
|
||||
|
||||
func TestTCPConn_ReadDeadlineExceeded(t *testing.T) {
|
||||
const seed = 10001
|
||||
const MTU = 1500
|
||||
const svPort = 8080
|
||||
client, sv, clconn, svconn := newTCPStacks(t, seed, MTU)
|
||||
tst := testerFrom(t, MTU)
|
||||
|
||||
tst.TestTCPSetupAndEstablish(sv, client, svconn, clconn, svPort, 1337)
|
||||
|
||||
// Set read deadline in the past.
|
||||
err := svconn.SetReadDeadline(time.Now().Add(-time.Second))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Read should fail immediately with deadline exceeded.
|
||||
buf := make([]byte, 64)
|
||||
_, rerr := svconn.Read(buf)
|
||||
if rerr == nil {
|
||||
t.Fatal("Read with past deadline should fail")
|
||||
}
|
||||
if rerr != os.ErrDeadlineExceeded {
|
||||
t.Fatalf("expected os.ErrDeadlineExceeded, got %v", rerr)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTCPConn_WriteDeadlineExceeded(t *testing.T) {
|
||||
const seed = 10002
|
||||
const MTU = 1500
|
||||
const svPort = 8080
|
||||
client, sv, clconn, svconn := newTCPStacks(t, seed, MTU)
|
||||
tst := testerFrom(t, MTU)
|
||||
|
||||
tst.TestTCPSetupAndEstablish(sv, client, svconn, clconn, svPort, 1337)
|
||||
|
||||
// Set write deadline in the past.
|
||||
err := clconn.SetWriteDeadline(time.Now().Add(-time.Second))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Write should fail immediately with deadline exceeded.
|
||||
_, werr := clconn.Write([]byte("hello"))
|
||||
if werr == nil {
|
||||
t.Fatal("Write with past deadline should fail")
|
||||
}
|
||||
if werr != os.ErrDeadlineExceeded {
|
||||
t.Fatalf("expected os.ErrDeadlineExceeded, got %v", werr)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTCPConn_FlushEmptyNoop(t *testing.T) {
|
||||
const seed = 10003
|
||||
const MTU = 1500
|
||||
const svPort = 8080
|
||||
client, sv, clconn, svconn := newTCPStacks(t, seed, MTU)
|
||||
tst := testerFrom(t, MTU)
|
||||
|
||||
tst.TestTCPSetupAndEstablish(sv, client, svconn, clconn, svPort, 1337)
|
||||
|
||||
// Flush with no unsent data should return nil immediately.
|
||||
err := clconn.Flush()
|
||||
if err != nil {
|
||||
t.Fatalf("Flush with no unsent data should succeed: %v", err)
|
||||
}
|
||||
}
|
||||
@@ -228,3 +228,78 @@ func TestStackAsyncListener_MultiSequentialConn(t *testing.T) {
|
||||
doRequest(netip.AddrPortFrom(caddr, uint16(sv.Prand32())), 0, []byte("HTTP 1.0\r\n"))
|
||||
}
|
||||
}
|
||||
|
||||
func TestListener_Close(t *testing.T) {
|
||||
const svPort uint16 = 80
|
||||
|
||||
pool, err := NewTCPPool(TCPPoolConfig{
|
||||
PoolSize: 1,
|
||||
QueueSize: 4,
|
||||
TxBufSize: 512,
|
||||
RxBufSize: 512,
|
||||
EstablishedTimeout: 10e9,
|
||||
ClosingTimeout: 10e9,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var listener tcp.Listener
|
||||
err = listener.Reset(svPort, pool)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if listener.LocalPort() != svPort {
|
||||
t.Fatalf("expected port %d, got %d", svPort, listener.LocalPort())
|
||||
}
|
||||
|
||||
err = listener.Close()
|
||||
if err != nil {
|
||||
t.Fatalf("Close failed: %v", err)
|
||||
}
|
||||
if listener.LocalPort() != 0 {
|
||||
t.Fatalf("port should be 0 after Close, got %d", listener.LocalPort())
|
||||
}
|
||||
|
||||
// Double close should return net.ErrClosed.
|
||||
err = listener.Close()
|
||||
if err == nil {
|
||||
t.Fatal("double Close should return error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestListener_ResetAfterClose(t *testing.T) {
|
||||
const svPort uint16 = 80
|
||||
|
||||
pool, err := NewTCPPool(TCPPoolConfig{
|
||||
PoolSize: 1,
|
||||
QueueSize: 4,
|
||||
TxBufSize: 512,
|
||||
RxBufSize: 512,
|
||||
EstablishedTimeout: 10e9,
|
||||
ClosingTimeout: 10e9,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var listener tcp.Listener
|
||||
err = listener.Reset(svPort, pool)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = listener.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Should be able to Reset after Close.
|
||||
err = listener.Reset(svPort, pool)
|
||||
if err != nil {
|
||||
t.Fatalf("Reset after Close failed: %v", err)
|
||||
}
|
||||
if listener.LocalPort() != svPort {
|
||||
t.Fatalf("expected port %d after re-Reset, got %d", svPort, listener.LocalPort())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user