81 lines
2.9 KiB
Go
81 lines
2.9 KiB
Go
package canon_test
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// requestFixture captures one stable canonical-bytes test vector for a v1
|
|
// authenticated request. Fixture files live under testdata/ and are
|
|
// generated by hand using the canon package itself; they are committed as
|
|
// golden data so every change to the canonical-bytes contract surfaces as
|
|
// a hex diff in code review.
|
|
type requestFixture struct {
|
|
MessageType string `json:"message_type"`
|
|
ProtocolVersion string `json:"protocol_version"`
|
|
DeviceSessionID string `json:"device_session_id"`
|
|
TimestampMS int64 `json:"timestamp_ms"`
|
|
RequestID string `json:"request_id"`
|
|
Payload string `json:"payload"`
|
|
PayloadHashHex string `json:"payload_hash_hex"`
|
|
ExpectedCanonicalBytesHex string `json:"expected_canonical_bytes_hex"`
|
|
PrivateKeySeedHex string `json:"private_key_seed_hex"`
|
|
PublicKeyBase64 string `json:"public_key_base64"`
|
|
ExpectedSignatureHex string `json:"expected_signature_hex"`
|
|
}
|
|
|
|
type responseFixture struct {
|
|
ProtocolVersion string `json:"protocol_version"`
|
|
RequestID string `json:"request_id"`
|
|
TimestampMS int64 `json:"timestamp_ms"`
|
|
ResultCode string `json:"result_code"`
|
|
Payload string `json:"payload"`
|
|
PayloadHashHex string `json:"payload_hash_hex"`
|
|
ExpectedCanonicalBytesHex string `json:"expected_canonical_bytes_hex"`
|
|
PrivateKeySeedHex string `json:"private_key_seed_hex"`
|
|
PublicKeyBase64 string `json:"public_key_base64"`
|
|
ExpectedSignatureHex string `json:"expected_signature_hex"`
|
|
}
|
|
|
|
type eventFixture struct {
|
|
EventType string `json:"event_type"`
|
|
EventID string `json:"event_id"`
|
|
TimestampMS int64 `json:"timestamp_ms"`
|
|
RequestID string `json:"request_id"`
|
|
TraceID string `json:"trace_id"`
|
|
Payload string `json:"payload"`
|
|
PayloadHashHex string `json:"payload_hash_hex"`
|
|
ExpectedCanonicalBytesHex string `json:"expected_canonical_bytes_hex"`
|
|
PrivateKeySeedHex string `json:"private_key_seed_hex"`
|
|
PublicKeyBase64 string `json:"public_key_base64"`
|
|
ExpectedSignatureHex string `json:"expected_signature_hex"`
|
|
}
|
|
|
|
func loadJSONFixture(t *testing.T, name string, into any) {
|
|
t.Helper()
|
|
|
|
body, err := os.ReadFile(filepath.Join("testdata", name))
|
|
require.NoError(t, err, "read %s", name)
|
|
require.NoError(t, json.Unmarshal(body, into), "decode %s", name)
|
|
}
|
|
|
|
func mustHex(t *testing.T, value string) []byte {
|
|
t.Helper()
|
|
|
|
decoded, err := hex.DecodeString(value)
|
|
require.NoError(t, err)
|
|
|
|
return decoded
|
|
}
|
|
|
|
func sha256Sum(payload []byte) []byte {
|
|
sum := sha256.Sum256(payload)
|
|
return sum[:]
|
|
}
|