go-proxy/pool/keepalive_test.go
Virgil 4a281e6e25 feat(pool): wire keepalive ticks through splitters
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-04 19:00:18 +00:00

112 lines
2.5 KiB
Go

package pool
import (
"bufio"
"encoding/json"
"net"
"testing"
"time"
)
func TestStratumClient_Keepalive_Good(t *testing.T) {
serverConn, clientConn := net.Pipe()
defer serverConn.Close()
defer clientConn.Close()
client := &StratumClient{
conn: clientConn,
active: true,
sessionID: "session-1",
}
done := make(chan struct{})
go func() {
client.Keepalive()
close(done)
}()
line, err := bufio.NewReader(serverConn).ReadBytes('\n')
if err != nil {
t.Fatalf("read keepalive request: %v", err)
}
<-done
var payload map[string]any
if err := json.Unmarshal(line, &payload); err != nil {
t.Fatalf("unmarshal keepalive request: %v", err)
}
if got := payload["method"]; got != "keepalived" {
t.Fatalf("expected keepalived method, got %#v", got)
}
params, ok := payload["params"].(map[string]any)
if !ok {
t.Fatalf("expected params object, got %#v", payload["params"])
}
if got := params["id"]; got != "session-1" {
t.Fatalf("expected session id in keepalive payload, got %#v", got)
}
}
func TestStratumClient_Keepalive_Bad(t *testing.T) {
serverConn, clientConn := net.Pipe()
defer serverConn.Close()
defer clientConn.Close()
client := &StratumClient{
conn: clientConn,
active: false,
}
client.Keepalive()
if err := serverConn.SetReadDeadline(time.Now().Add(50 * time.Millisecond)); err != nil {
t.Fatalf("set deadline: %v", err)
}
buf := make([]byte, 1)
if _, err := serverConn.Read(buf); err == nil {
t.Fatalf("expected no keepalive data while inactive")
}
}
func TestStratumClient_Keepalive_Ugly(t *testing.T) {
serverConn, clientConn := net.Pipe()
defer serverConn.Close()
defer clientConn.Close()
client := &StratumClient{
conn: clientConn,
active: true,
sessionID: "session-2",
}
reader := bufio.NewReader(serverConn)
done := make(chan struct{})
go func() {
client.Keepalive()
client.Keepalive()
close(done)
}()
first, err := reader.ReadBytes('\n')
if err != nil {
t.Fatalf("read first keepalive request: %v", err)
}
second, err := reader.ReadBytes('\n')
if err != nil {
t.Fatalf("read second keepalive request: %v", err)
}
<-done
var firstPayload map[string]any
if err := json.Unmarshal(first, &firstPayload); err != nil {
t.Fatalf("unmarshal first keepalive request: %v", err)
}
var secondPayload map[string]any
if err := json.Unmarshal(second, &secondPayload); err != nil {
t.Fatalf("unmarshal second keepalive request: %v", err)
}
if firstPayload["id"] == secondPayload["id"] {
t.Fatalf("expected keepalive request ids to be unique")
}
}