From 5ba21cb9bf002ba1e1b5cf4c7b3e216190499090 Mon Sep 17 00:00:00 2001 From: Virgil Date: Sat, 4 Apr 2026 22:17:31 +0000 Subject: [PATCH] fix(proxy): align miner success wire format Co-Authored-By: Virgil --- miner_login_test.go | 11 +++++++++-- miner_wire_test.go | 43 +++++++++++++++++++++++++++++++++++++++++++ state_impl.go | 2 ++ 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 miner_wire_test.go diff --git a/miner_login_test.go b/miner_login_test.go index 5e9f31a..02cad22 100644 --- a/miner_login_test.go +++ b/miner_login_test.go @@ -54,6 +54,7 @@ func TestMiner_HandleLogin_Good(t *testing.T) { <-done var payload struct { + Error json.RawMessage `json:"error"` Result struct { ID string `json:"id"` Status string `json:"status"` @@ -65,6 +66,9 @@ func TestMiner_HandleLogin_Good(t *testing.T) { t.Fatalf("unmarshal login response: %v", err) } + if string(payload.Error) != "null" { + t.Fatalf("expected login response error to be null, got %s", string(payload.Error)) + } if payload.Result.Status != "OK" { t.Fatalf("expected login success, got %q", payload.Result.Status) } @@ -293,8 +297,11 @@ func TestMiner_HandleKeepalived_Good(t *testing.T) { if err := json.Unmarshal(line, &payload); err != nil { t.Fatalf("unmarshal keepalived response: %v", err) } - if _, ok := payload["error"]; ok { - t.Fatalf("expected keepalived response to omit error field, got %s", string(line)) + if _, ok := payload["error"]; !ok { + t.Fatalf("expected keepalived response to include error field, got %s", string(line)) + } + if string(payload["error"]) != "null" { + t.Fatalf("expected keepalived response error to be null, got %s", string(payload["error"])) } var result struct { Status string `json:"status"` diff --git a/miner_wire_test.go b/miner_wire_test.go new file mode 100644 index 0000000..f8ed970 --- /dev/null +++ b/miner_wire_test.go @@ -0,0 +1,43 @@ +package proxy + +import ( + "bufio" + "encoding/json" + "net" + "testing" +) + +func TestMiner_Success_WritesNullError_Good(t *testing.T) { + minerConn, clientConn := net.Pipe() + defer minerConn.Close() + defer clientConn.Close() + + miner := NewMiner(minerConn, 3333, nil) + done := make(chan struct{}) + go func() { + miner.Success(7, "OK") + close(done) + }() + + line, err := bufio.NewReader(clientConn).ReadBytes('\n') + if err != nil { + t.Fatalf("read success response: %v", err) + } + <-done + + var payload struct { + Error json.RawMessage `json:"error"` + Result struct { + Status string `json:"status"` + } `json:"result"` + } + if err := json.Unmarshal(line, &payload); err != nil { + t.Fatalf("unmarshal success response: %v", err) + } + if string(payload.Error) != "null" { + t.Fatalf("expected success response error to be null, got %s", string(payload.Error)) + } + if payload.Result.Status != "OK" { + t.Fatalf("expected success status OK, got %q", payload.Result.Status) + } +} diff --git a/state_impl.go b/state_impl.go index 36acf64..b076c80 100644 --- a/state_impl.go +++ b/state_impl.go @@ -1086,6 +1086,7 @@ func (m *Miner) replyLoginSuccess(id int64) { payload := map[string]any{ "id": id, "jsonrpc": "2.0", + "error": nil, "result": result, } _ = m.writeJSON(payload) @@ -1133,6 +1134,7 @@ func (m *Miner) Success(id int64, status string) { payload := map[string]any{ "id": id, "jsonrpc": "2.0", + "error": nil, "result": map[string]any{ "status": status, },