go-proxy/worker_test.go
Snider 2470f1ac3d feat(proxy): add log tests, fix nil config panic, complete test triads
- Add log package tests (AccessLog and ShareLog Good/Bad/Ugly triads)
- Fix nil pointer panic in pool.NewStrategyFactory when config is nil
- Add Worker Hashrate Good/Bad/Ugly test triad
- Add ConfigWatcher Start Bad test (nonexistent path)
- Add FailoverStrategy CurrentPools Bad/Ugly, EnabledPools Good/Bad/Ugly,
  and NewStrategyFactory Good/Bad/Ugly test triads
- Improve doc comments on Stats, StatsSummary, Workers, WorkerRecord
  with AX-compliant usage examples

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-05 08:08:28 +01:00

164 lines
4.8 KiB
Go

package proxy
import "testing"
func TestWorker_NewWorkers_Good(t *testing.T) {
bus := NewEventBus()
workers := NewWorkers(WorkersByRigID, bus)
miner := &Miner{id: 7, user: "wallet", rigID: "rig-1", ip: "10.0.0.1"}
bus.Dispatch(Event{Type: EventLogin, Miner: miner})
records := workers.List()
if len(records) != 1 {
t.Fatalf("expected one worker record, got %d", len(records))
}
if records[0].Name != "rig-1" {
t.Fatalf("expected rig id worker name, got %q", records[0].Name)
}
if records[0].Connections != 1 {
t.Fatalf("expected one connection, got %d", records[0].Connections)
}
}
func TestWorker_NewWorkers_Bad(t *testing.T) {
workers := NewWorkers(WorkersDisabled, nil)
if workers == nil {
t.Fatalf("expected workers instance")
}
if got := workers.List(); len(got) != 0 {
t.Fatalf("expected no worker records, got %d", len(got))
}
}
func TestWorker_NewWorkers_Ugly(t *testing.T) {
bus := NewEventBus()
workers := NewWorkers(WorkersByUser, bus)
workers.bindEvents(bus)
miner := &Miner{id: 11, user: "wallet", ip: "10.0.0.2"}
bus.Dispatch(Event{Type: EventLogin, Miner: miner})
records := workers.List()
if len(records) != 1 {
t.Fatalf("expected one worker record, got %d", len(records))
}
if records[0].Connections != 1 {
t.Fatalf("expected a single subscription path, got %d connections", records[0].Connections)
}
}
// TestWorker_Hashrate_Good verifies that recording an accepted share produces a nonzero
// hashrate reading from the 60-second window.
//
// record := proxy.WorkerRecord{}
// record.Hashrate(60) // > 0.0 after an accepted share
func TestWorker_Hashrate_Good(t *testing.T) {
bus := NewEventBus()
workers := NewWorkers(WorkersByUser, bus)
miner := &Miner{id: 100, user: "hashtest", ip: "10.0.0.10"}
bus.Dispatch(Event{Type: EventLogin, Miner: miner})
bus.Dispatch(Event{Type: EventAccept, Miner: miner, Diff: 50000})
records := workers.List()
if len(records) != 1 {
t.Fatalf("expected one worker record, got %d", len(records))
}
hr := records[0].Hashrate(60)
if hr <= 0 {
t.Fatalf("expected nonzero hashrate for 60-second window after accept, got %f", hr)
}
}
// TestWorker_Hashrate_Bad verifies that an invalid window size returns 0.
//
// record := proxy.WorkerRecord{}
// record.Hashrate(999) // 0.0 (unsupported window)
func TestWorker_Hashrate_Bad(t *testing.T) {
bus := NewEventBus()
workers := NewWorkers(WorkersByUser, bus)
miner := &Miner{id: 101, user: "hashtest-bad", ip: "10.0.0.11"}
bus.Dispatch(Event{Type: EventLogin, Miner: miner})
bus.Dispatch(Event{Type: EventAccept, Miner: miner, Diff: 50000})
records := workers.List()
if len(records) != 1 {
t.Fatalf("expected one worker record, got %d", len(records))
}
hr := records[0].Hashrate(999)
if hr != 0 {
t.Fatalf("expected zero hashrate for unsupported window, got %f", hr)
}
hrZero := records[0].Hashrate(0)
if hrZero != 0 {
t.Fatalf("expected zero hashrate for zero window, got %f", hrZero)
}
hrNeg := records[0].Hashrate(-1)
if hrNeg != 0 {
t.Fatalf("expected zero hashrate for negative window, got %f", hrNeg)
}
}
// TestWorker_Hashrate_Ugly verifies that calling Hashrate on a nil record returns 0
// and that a worker with no accepts also returns 0.
//
// var record *proxy.WorkerRecord
// record.Hashrate(60) // 0.0
func TestWorker_Hashrate_Ugly(t *testing.T) {
var nilRecord *WorkerRecord
if hr := nilRecord.Hashrate(60); hr != 0 {
t.Fatalf("expected zero hashrate for nil record, got %f", hr)
}
bus := NewEventBus()
workers := NewWorkers(WorkersByUser, bus)
miner := &Miner{id: 102, user: "hashtest-ugly", ip: "10.0.0.12"}
bus.Dispatch(Event{Type: EventLogin, Miner: miner})
records := workers.List()
if len(records) != 1 {
t.Fatalf("expected one worker record, got %d", len(records))
}
hr := records[0].Hashrate(60)
if hr != 0 {
t.Fatalf("expected zero hashrate for worker with no accepts, got %f", hr)
}
}
func TestWorker_CustomDiffOrdering_Good(t *testing.T) {
cfg := &Config{
Mode: "nicehash",
Workers: WorkersByUser,
Bind: []BindAddr{{Host: "127.0.0.1", Port: 3333}},
Pools: []PoolConfig{{URL: "pool.example:3333", Enabled: true}},
CustomDiff: 50000,
AccessLogFile: "",
}
p, result := New(cfg)
if !result.OK {
t.Fatalf("expected valid proxy, got error: %v", result.Error)
}
miner := &Miner{
id: 21,
user: "WALLET+50000",
ip: "10.0.0.3",
conn: noopConn{},
}
p.events.Dispatch(Event{Type: EventLogin, Miner: miner})
records := p.WorkerRecords()
if len(records) != 1 {
t.Fatalf("expected one worker record, got %d", len(records))
}
if records[0].Name != "WALLET" {
t.Fatalf("expected custom diff login suffix to be stripped before worker registration, got %q", records[0].Name)
}
if miner.User() != "WALLET" {
t.Fatalf("expected miner user to be stripped before downstream consumers, got %q", miner.User())
}
}