go-p2p/node/protocol_test.go
Claude 8f94639ec9
feat: extract P2P networking and UEPS protocol from Mining repo
P2P node layer (peer discovery, WebSocket transport, message protocol,
worker pool, identity management) and Unified Ethical Protocol Stack
(TLV packet builder with HMAC-signed frames).

Ported from github.com/Snider/Mining/pkg/{node,ueps,logging}

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 15:47:10 +00:00

161 lines
4.2 KiB
Go

package node
import (
"fmt"
"testing"
)
func TestResponseHandler_ValidateResponse(t *testing.T) {
handler := &ResponseHandler{}
t.Run("NilResponse", func(t *testing.T) {
err := handler.ValidateResponse(nil, MsgStats)
if err == nil {
t.Error("Expected error for nil response")
}
})
t.Run("ErrorResponse", func(t *testing.T) {
errMsg, _ := NewErrorMessage("sender", "receiver", ErrCodeOperationFailed, "operation failed", "")
err := handler.ValidateResponse(errMsg, MsgStats)
if err == nil {
t.Fatal("Expected error for error response")
}
if !IsProtocolError(err) {
t.Errorf("Expected ProtocolError, got %T", err)
}
if GetProtocolErrorCode(err) != ErrCodeOperationFailed {
t.Errorf("Expected code %d, got %d", ErrCodeOperationFailed, GetProtocolErrorCode(err))
}
})
t.Run("WrongType", func(t *testing.T) {
msg, _ := NewMessage(MsgPong, "sender", "receiver", nil)
err := handler.ValidateResponse(msg, MsgStats)
if err == nil {
t.Error("Expected error for wrong type")
}
if IsProtocolError(err) {
t.Error("Should not be a ProtocolError for type mismatch")
}
})
t.Run("ValidResponse", func(t *testing.T) {
msg, _ := NewMessage(MsgStats, "sender", "receiver", StatsPayload{NodeID: "test"})
err := handler.ValidateResponse(msg, MsgStats)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
})
}
func TestResponseHandler_ParseResponse(t *testing.T) {
handler := &ResponseHandler{}
t.Run("ParseStats", func(t *testing.T) {
payload := StatsPayload{
NodeID: "node-123",
NodeName: "Test Node",
Uptime: 3600,
}
msg, _ := NewMessage(MsgStats, "sender", "receiver", payload)
var parsed StatsPayload
err := handler.ParseResponse(msg, MsgStats, &parsed)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if parsed.NodeID != "node-123" {
t.Errorf("Expected NodeID 'node-123', got '%s'", parsed.NodeID)
}
if parsed.Uptime != 3600 {
t.Errorf("Expected Uptime 3600, got %d", parsed.Uptime)
}
})
t.Run("ParseMinerAck", func(t *testing.T) {
payload := MinerAckPayload{
Success: true,
MinerName: "xmrig-1",
}
msg, _ := NewMessage(MsgMinerAck, "sender", "receiver", payload)
var parsed MinerAckPayload
err := handler.ParseResponse(msg, MsgMinerAck, &parsed)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if !parsed.Success {
t.Error("Expected Success to be true")
}
if parsed.MinerName != "xmrig-1" {
t.Errorf("Expected MinerName 'xmrig-1', got '%s'", parsed.MinerName)
}
})
t.Run("ErrorResponse", func(t *testing.T) {
errMsg, _ := NewErrorMessage("sender", "receiver", ErrCodeNotFound, "not found", "")
var parsed StatsPayload
err := handler.ParseResponse(errMsg, MsgStats, &parsed)
if err == nil {
t.Error("Expected error for error response")
}
if !IsProtocolError(err) {
t.Errorf("Expected ProtocolError, got %T", err)
}
})
t.Run("NilTarget", func(t *testing.T) {
msg, _ := NewMessage(MsgPong, "sender", "receiver", nil)
err := handler.ParseResponse(msg, MsgPong, nil)
if err != nil {
t.Errorf("Unexpected error with nil target: %v", err)
}
})
}
func TestProtocolError(t *testing.T) {
err := &ProtocolError{Code: 1001, Message: "test error"}
if err.Error() != "remote error (1001): test error" {
t.Errorf("Unexpected error message: %s", err.Error())
}
if !IsProtocolError(err) {
t.Error("IsProtocolError should return true")
}
if GetProtocolErrorCode(err) != 1001 {
t.Errorf("Expected code 1001, got %d", GetProtocolErrorCode(err))
}
}
func TestConvenienceFunctions(t *testing.T) {
msg, _ := NewMessage(MsgStats, "sender", "receiver", StatsPayload{NodeID: "test"})
// Test ValidateResponse
if err := ValidateResponse(msg, MsgStats); err != nil {
t.Errorf("ValidateResponse failed: %v", err)
}
// Test ParseResponse
var parsed StatsPayload
if err := ParseResponse(msg, MsgStats, &parsed); err != nil {
t.Errorf("ParseResponse failed: %v", err)
}
if parsed.NodeID != "test" {
t.Errorf("Expected NodeID 'test', got '%s'", parsed.NodeID)
}
}
func TestGetProtocolErrorCode_NonProtocolError(t *testing.T) {
err := fmt.Errorf("regular error")
if GetProtocolErrorCode(err) != 0 {
t.Error("Expected 0 for non-ProtocolError")
}
}