96 lines
2.4 KiB
Go
96 lines
2.4 KiB
Go
package peer
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.dracodev.net/Projets/clip-sync/internal/config"
|
|
"git.dracodev.net/Projets/clip-sync/internal/dedup"
|
|
)
|
|
|
|
func TestBroadcastSendsPayload(t *testing.T) {
|
|
received := make(chan dedup.Payload, 1)
|
|
|
|
// Start a fake peer server.
|
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodPost {
|
|
t.Errorf("expected POST, got %s", r.Method)
|
|
}
|
|
if r.URL.Path != "/clip" {
|
|
t.Errorf("expected /clip, got %s", r.URL.Path)
|
|
}
|
|
|
|
var p dedup.Payload
|
|
if err := json.NewDecoder(r.Body).Decode(&p); err != nil {
|
|
t.Errorf("decode: %v", err)
|
|
}
|
|
received <- p
|
|
w.WriteHeader(http.StatusNoContent)
|
|
}))
|
|
defer ts.Close()
|
|
|
|
peers := []config.PeerConfig{
|
|
{Name: "test-peer", Addr: ts.Listener.Addr().String()},
|
|
}
|
|
|
|
b := NewBroadcaster(peers, "my-machine", Options{})
|
|
b.Broadcast("hello, peer!")
|
|
|
|
select {
|
|
case p := <-received:
|
|
if p.Text != "hello, peer!" {
|
|
t.Errorf("text = %q, want \"hello, peer!\"", p.Text)
|
|
}
|
|
if p.Origin != "my-machine" {
|
|
t.Errorf("origin = %q, want \"my-machine\"", p.Origin)
|
|
}
|
|
if p.Ts == 0 {
|
|
t.Error("timestamp should be non-zero")
|
|
}
|
|
case <-time.After(5 * time.Second):
|
|
t.Fatal("timeout waiting for broadcast")
|
|
}
|
|
}
|
|
|
|
func TestBroadcastEmptyPeers(t *testing.T) {
|
|
// Should not panic or error with zero peers.
|
|
b := NewBroadcaster(nil, "my-machine", Options{})
|
|
b.Broadcast("test")
|
|
b.Broadcast("")
|
|
}
|
|
|
|
func TestBroadcastImage(t *testing.T) {
|
|
received := make(chan dedup.Payload, 1)
|
|
|
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
var p dedup.Payload
|
|
if err := json.NewDecoder(r.Body).Decode(&p); err != nil {
|
|
t.Errorf("decode: %v", err)
|
|
}
|
|
received <- p
|
|
w.WriteHeader(http.StatusNoContent)
|
|
}))
|
|
defer ts.Close()
|
|
|
|
b := NewBroadcaster([]config.PeerConfig{{Name: "p", Addr: ts.Listener.Addr().String()}}, "my-machine", Options{})
|
|
b.BroadcastImage("image/png", []byte{1, 2, 3})
|
|
|
|
select {
|
|
case p := <-received:
|
|
if p.Mime != "image/png" {
|
|
t.Errorf("mime = %q, want \"image/png\"", p.Mime)
|
|
}
|
|
if p.Data != "AQID" { // base64 of {1,2,3}
|
|
t.Errorf("data = %q, want \"AQID\"", p.Data)
|
|
}
|
|
if p.Text != "" {
|
|
t.Errorf("text = %q, want empty", p.Text)
|
|
}
|
|
case <-time.After(5 * time.Second):
|
|
t.Fatal("timeout waiting for image broadcast")
|
|
}
|
|
}
|