68 lines
2.2 KiB
Go
68 lines
2.2 KiB
Go
package pairing
|
|
|
|
import (
|
|
"crypto/ed25519"
|
|
"crypto/rand"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestPairWithCodeSendsNormalizedPayload(t *testing.T) {
|
|
pub, _, err := ed25519.GenerateKey(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.URL.Path != "/api/v1/agent/pair" || r.Method != http.MethodPost {
|
|
t.Fatalf("unexpected request: %s %s", r.Method, r.URL.Path)
|
|
}
|
|
var body struct {
|
|
Code string `json:"code"`
|
|
DeviceName string `json:"deviceName"`
|
|
PublicKey string `json:"publicKey"`
|
|
}
|
|
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if body.Code != "AB23CD" || body.DeviceName != "macOS Agent" {
|
|
t.Fatalf("payload was not normalized: %+v", body)
|
|
}
|
|
decoded, err := base64.StdEncoding.DecodeString(body.PublicKey)
|
|
if err != nil || len(decoded) != ed25519.PublicKeySize {
|
|
t.Fatalf("invalid public key: %q", body.PublicKey)
|
|
}
|
|
w.Header().Set("Content-Type", "application/json")
|
|
_, _ = w.Write([]byte(`{"code":0,"message":"ok","data":{"deviceId":42}}`))
|
|
}))
|
|
defer server.Close()
|
|
|
|
id, err := PairWithCode(server.URL, " ab23cd ", "", "core", "0.3.0", base64.StdEncoding.EncodeToString(pub))
|
|
if err != nil || id != 42 {
|
|
t.Fatalf("PairWithCode() = %d, %v", id, err)
|
|
}
|
|
}
|
|
|
|
func TestPairWithCodeRejectsMissingPublicKey(t *testing.T) {
|
|
_, err := PairWithCode("http://127.0.0.1:1", "AB23CD", "Mac", "core", "0.3.0", "")
|
|
if err == nil || !strings.Contains(err.Error(), "公钥") {
|
|
t.Fatalf("expected actionable public key error, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestPairWithCodePreservesServerMessage(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
_, _ = w.Write([]byte(`{"code":1001,"data":null,"message":"设备公钥格式不合法"}`))
|
|
}))
|
|
defer server.Close()
|
|
pub, _, _ := ed25519.GenerateKey(rand.Reader)
|
|
_, err := PairWithCode(server.URL, "AB23CD", "Mac", "core", "0.3.0", base64.StdEncoding.EncodeToString(pub))
|
|
if err == nil || !strings.Contains(err.Error(), "设备公钥格式不合法") {
|
|
t.Fatalf("expected server message, got %v", err)
|
|
}
|
|
}
|