162 lines
4.2 KiB
Go
162 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")
|
||
|
|
}
|
||
|
|
}
|