package pool import ( "net" "sync" "testing" "time" "dappco.re/go/core/proxy" ) type disconnectCountingListener struct { mu sync.Mutex count int } func (l *disconnectCountingListener) OnJob(job proxy.Job) {} func (l *disconnectCountingListener) OnResultAccepted(sequence int64, accepted bool, errorMessage string) { } func (l *disconnectCountingListener) OnDisconnect() { l.mu.Lock() l.count++ l.mu.Unlock() } func (l *disconnectCountingListener) Count() int { l.mu.Lock() defer l.mu.Unlock() return l.count } func TestStratumClient_ReadLoop_Ugly(t *testing.T) { serverConn, clientConn := net.Pipe() defer clientConn.Close() listener := &disconnectCountingListener{} client := &StratumClient{ listener: listener, conn: serverConn, } go client.readLoop() payload := make([]byte, 16385) for index := range payload { payload[index] = 'a' } payload = append(payload, '\n') writeErr := make(chan error, 1) go func() { _, err := clientConn.Write(payload) writeErr <- err }() time.Sleep(50 * time.Millisecond) if got := listener.Count(); got != 1 { t.Fatalf("expected oversized line to close the connection, got %d disconnect callbacks", got) } select { case err := <-writeErr: if err != nil { t.Fatal(err) } default: } } func TestStratumClient_Disconnect_Good(t *testing.T) { serverConn, clientConn := net.Pipe() defer clientConn.Close() listener := &disconnectCountingListener{} client := &StratumClient{ listener: listener, conn: serverConn, } go client.readLoop() time.Sleep(10 * time.Millisecond) client.Disconnect() time.Sleep(50 * time.Millisecond) if got := listener.Count(); got != 1 { t.Fatalf("expected one disconnect callback, got %d", got) } }