62 lines
1.4 KiB
Go
62 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"crypto/hmac"
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// makeToken creates a valid HMAC-SHA256 token: sig.timestamp
|
|
func makeToken(secret string, ts int64) string {
|
|
tsStr := fmt.Sprintf("%d", ts)
|
|
mac := hmac.New(sha256.New, []byte(secret))
|
|
mac.Write([]byte(tsStr))
|
|
sig := hex.EncodeToString(mac.Sum(nil))
|
|
return sig + "." + tsStr
|
|
}
|
|
|
|
func TestValidateToken_Valid(t *testing.T) {
|
|
secret := "test-secret"
|
|
ts := time.Now().Unix()
|
|
token := makeToken(secret, ts)
|
|
|
|
if !ValidateToken(token, secret, 30) {
|
|
t.Error("expected valid token to pass validation")
|
|
}
|
|
}
|
|
|
|
func TestValidateToken_Expired(t *testing.T) {
|
|
secret := "test-secret"
|
|
ts := time.Now().Unix() - 60 // 60 seconds ago
|
|
token := makeToken(secret, ts)
|
|
|
|
if ValidateToken(token, secret, 30) {
|
|
t.Error("expected expired token (60s ago) to be rejected")
|
|
}
|
|
}
|
|
|
|
func TestValidateToken_WrongSecret(t *testing.T) {
|
|
ts := time.Now().Unix()
|
|
token := makeToken("right-secret", ts)
|
|
|
|
if ValidateToken(token, "wrong-secret", 30) {
|
|
t.Error("expected token signed with wrong secret to be rejected")
|
|
}
|
|
}
|
|
|
|
func TestValidateToken_MalformedNoTimestamp(t *testing.T) {
|
|
// No dot separator — cannot split into sig.timestamp
|
|
if ValidateToken("nodothere", "secret", 30) {
|
|
t.Error("expected malformed token (no dot) to be rejected")
|
|
}
|
|
}
|
|
|
|
func TestValidateToken_EmptyToken(t *testing.T) {
|
|
if ValidateToken("", "secret", 30) {
|
|
t.Error("expected empty token to be rejected")
|
|
}
|
|
}
|