158 lines
4 KiB
Go
158 lines
4 KiB
Go
package protocol
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"hash-of-wisdom/internal/pow/challenge"
|
|
"hash-of-wisdom/internal/quotes"
|
|
)
|
|
|
|
func TestSymmetricEncoding_ChallengeRequest(t *testing.T) {
|
|
// Create a challenge request
|
|
req := &ChallengeRequest{}
|
|
|
|
// Encode it
|
|
var buf bytes.Buffer
|
|
err := req.Encode(&buf)
|
|
require.NoError(t, err)
|
|
|
|
// Decode it back
|
|
decoder := NewMessageDecoder()
|
|
msg, err := decoder.Decode(&buf)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, ChallengeRequestType, msg.Type)
|
|
assert.Equal(t, uint32(0), msg.PayloadLength)
|
|
|
|
// Decode the request payload
|
|
decodedReq := &ChallengeRequest{}
|
|
err = decodedReq.Decode(msg.PayloadStream)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestSymmetricEncoding_SolutionRequest(t *testing.T) {
|
|
// Create a solution request
|
|
req := &SolutionRequest{
|
|
Challenge: challenge.Challenge{
|
|
Timestamp: 1640995200,
|
|
Difficulty: 4,
|
|
Resource: "quotes",
|
|
Random: []byte("test"),
|
|
HMAC: []byte("test"),
|
|
},
|
|
Nonce: 12345,
|
|
}
|
|
|
|
// Encode it
|
|
var buf bytes.Buffer
|
|
err := req.Encode(&buf)
|
|
require.NoError(t, err)
|
|
|
|
// Decode it back
|
|
decoder := NewMessageDecoder()
|
|
msg, err := decoder.Decode(&buf)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, SolutionRequestType, msg.Type)
|
|
assert.Greater(t, msg.PayloadLength, uint32(0))
|
|
|
|
// Decode the request payload
|
|
decodedReq := &SolutionRequest{}
|
|
err = decodedReq.Decode(msg.PayloadStream)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, req.Nonce, decodedReq.Nonce)
|
|
assert.Equal(t, req.Challenge.Timestamp, decodedReq.Challenge.Timestamp)
|
|
}
|
|
|
|
func TestSymmetricEncoding_ChallengeResponse(t *testing.T) {
|
|
// Create a challenge response
|
|
resp := &ChallengeResponse{
|
|
Challenge: &challenge.Challenge{
|
|
Timestamp: 1640995200,
|
|
Difficulty: 4,
|
|
Resource: "quotes",
|
|
Random: []byte("test"),
|
|
HMAC: []byte("test"),
|
|
},
|
|
}
|
|
|
|
// Encode it
|
|
var buf bytes.Buffer
|
|
err := resp.Encode(&buf)
|
|
require.NoError(t, err)
|
|
|
|
// Decode it back
|
|
decoder := NewMessageDecoder()
|
|
msg, err := decoder.Decode(&buf)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, ChallengeResponseType, msg.Type)
|
|
assert.Greater(t, msg.PayloadLength, uint32(0))
|
|
|
|
// Decode the response payload
|
|
decodedResp := &ChallengeResponse{}
|
|
err = decodedResp.Decode(msg.PayloadStream)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, resp.Challenge.Timestamp, decodedResp.Challenge.Timestamp)
|
|
assert.Equal(t, resp.Challenge.Difficulty, decodedResp.Challenge.Difficulty)
|
|
}
|
|
|
|
func TestSymmetricEncoding_SolutionResponse(t *testing.T) {
|
|
// Create a solution response
|
|
resp := &SolutionResponse{
|
|
Quote: "es.Quote{
|
|
Text: "Test quote",
|
|
Author: "Test Author",
|
|
},
|
|
}
|
|
|
|
// Encode it
|
|
var buf bytes.Buffer
|
|
err := resp.Encode(&buf)
|
|
require.NoError(t, err)
|
|
|
|
// Decode it back
|
|
decoder := NewMessageDecoder()
|
|
msg, err := decoder.Decode(&buf)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, QuoteResponseType, msg.Type)
|
|
assert.Greater(t, msg.PayloadLength, uint32(0))
|
|
|
|
// Decode the response payload
|
|
decodedResp := &SolutionResponse{}
|
|
err = decodedResp.Decode(msg.PayloadStream)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, resp.Quote.Text, decodedResp.Quote.Text)
|
|
assert.Equal(t, resp.Quote.Author, decodedResp.Quote.Author)
|
|
}
|
|
|
|
func TestSymmetricEncoding_ErrorResponse(t *testing.T) {
|
|
// Create an error response
|
|
resp := &ErrorResponse{
|
|
Code: "TEST_ERROR",
|
|
Message: "Test error message",
|
|
Details: map[string]string{"key": "value"},
|
|
}
|
|
|
|
// Encode it
|
|
var buf bytes.Buffer
|
|
err := resp.Encode(&buf)
|
|
require.NoError(t, err)
|
|
|
|
// Decode it back
|
|
decoder := NewMessageDecoder()
|
|
msg, err := decoder.Decode(&buf)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, ErrorResponseType, msg.Type)
|
|
assert.Greater(t, msg.PayloadLength, uint32(0))
|
|
|
|
// Decode the response payload
|
|
decodedResp := &ErrorResponse{}
|
|
err = decodedResp.Decode(msg.PayloadStream)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, resp.Code, decodedResp.Code)
|
|
assert.Equal(t, resp.Message, decodedResp.Message)
|
|
assert.Equal(t, resp.Details, decodedResp.Details)
|
|
}
|