Initial commit
This commit is contained in:
56
test/advertise_test.go
Normal file
56
test/advertise_test.go
Normal file
@ -0,0 +1,56 @@
|
||||
package test
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
peering "forge.cadoles.com/wpetit/go-http-peering"
|
||||
"forge.cadoles.com/wpetit/go-http-peering/crypto"
|
||||
)
|
||||
|
||||
func TestAdvertise(t *testing.T) {
|
||||
|
||||
if t.Skipped() {
|
||||
t.SkipNow()
|
||||
}
|
||||
|
||||
id, pk, client, store := setup(t)
|
||||
|
||||
attrs := peering.PeerAttributes{}
|
||||
if err := client.Advertise(attrs); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
peer, err := store.Get(id)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if g, e := peer.ID, id; g != e {
|
||||
t.Errorf("peer.ID: got '%v', expected '%v'", g, e)
|
||||
}
|
||||
|
||||
if g, e := peer.Attributes, attrs; !reflect.DeepEqual(g, e) {
|
||||
t.Errorf("peer.Attributes: got '%v', expected '%v'", g, e)
|
||||
}
|
||||
|
||||
var defaultTime time.Time
|
||||
if peer.LastContact == defaultTime {
|
||||
t.Error("peer.LastContact should not be time.Time zero value")
|
||||
}
|
||||
|
||||
if peer.LastAddress == "" {
|
||||
t.Error("peer.LastAddress should not be empty")
|
||||
}
|
||||
|
||||
pem, err := crypto.EncodePublicKeyToPEM(pk.Public())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if g, e := peer.PublicKey, pem; !reflect.DeepEqual(g, e) {
|
||||
t.Errorf("peer.PublicKey: got '%v', expected '%v'", g, e)
|
||||
}
|
||||
|
||||
}
|
46
test/ping_test.go
Normal file
46
test/ping_test.go
Normal file
@ -0,0 +1,46 @@
|
||||
package test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
peering "forge.cadoles.com/wpetit/go-http-peering"
|
||||
)
|
||||
|
||||
func TestPing(t *testing.T) {
|
||||
|
||||
if t.Skipped() {
|
||||
t.SkipNow()
|
||||
}
|
||||
|
||||
id, _, client, store := setup(t)
|
||||
|
||||
attrs := peering.PeerAttributes{}
|
||||
if err := client.Advertise(attrs); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
peer, err := store.Get(id)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
lastContact := peer.LastContact
|
||||
|
||||
if err := store.Accept(id); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if err := client.Ping(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
peer, err = store.Get(id)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if peer.LastContact == lastContact {
|
||||
t.Error("peer.LastContact should have been updated")
|
||||
}
|
||||
|
||||
}
|
62
test/update_test.go
Normal file
62
test/update_test.go
Normal file
@ -0,0 +1,62 @@
|
||||
package test
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
peering "forge.cadoles.com/wpetit/go-http-peering"
|
||||
"forge.cadoles.com/wpetit/go-http-peering/crypto"
|
||||
)
|
||||
|
||||
func TestUpdate(t *testing.T) {
|
||||
|
||||
if t.Skipped() {
|
||||
t.SkipNow()
|
||||
}
|
||||
|
||||
id, pk, client, store := setup(t)
|
||||
|
||||
attrs := peering.PeerAttributes{}
|
||||
|
||||
if err := client.Advertise(attrs); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err := store.Accept(id); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
attrs["Label"] = "Foo Bar"
|
||||
if err := client.UpdateAttributes(attrs); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
peer, err := store.Get(id)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if g, e := peer.ID, id; g != e {
|
||||
t.Errorf("peer.ID: got '%v', expected '%v'", g, e)
|
||||
}
|
||||
|
||||
if g, e := peer.Attributes, attrs; !reflect.DeepEqual(g, e) {
|
||||
t.Errorf("peer.Attributes: got '%v', expected '%v'", g, e)
|
||||
}
|
||||
|
||||
var defaultTime time.Time
|
||||
if peer.LastContact == defaultTime {
|
||||
t.Error("peer.LastContact should not be time.Time zero value")
|
||||
}
|
||||
|
||||
pem, err := crypto.EncodePublicKeyToPEM(pk.Public())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if g, e := peer.PublicKey, pem; !reflect.DeepEqual(g, e) {
|
||||
t.Errorf("peer.PublicKey: got '%v', expected '%v'", g, e)
|
||||
}
|
||||
|
||||
}
|
64
test/util_test.go
Normal file
64
test/util_test.go
Normal file
@ -0,0 +1,64 @@
|
||||
package test
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
peering "forge.cadoles.com/wpetit/go-http-peering"
|
||||
"forge.cadoles.com/wpetit/go-http-peering/client"
|
||||
"forge.cadoles.com/wpetit/go-http-peering/memory"
|
||||
"forge.cadoles.com/wpetit/go-http-peering/server"
|
||||
)
|
||||
|
||||
func mustGeneratePrivateKey() *rsa.PrivateKey {
|
||||
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return privateKey
|
||||
}
|
||||
|
||||
func startServer(store peering.Store) (int, error) {
|
||||
listener, err := net.Listen("tcp", ":0")
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
mux := createServerMux(store)
|
||||
go http.Serve(listener, mux)
|
||||
port := listener.Addr().(*net.TCPAddr).Port
|
||||
return port, nil
|
||||
}
|
||||
|
||||
func createServerMux(store peering.Store) *http.ServeMux {
|
||||
mux := http.NewServeMux()
|
||||
mux.HandleFunc(peering.AdvertisePath, server.AdvertiseHandler(store))
|
||||
update := server.Authenticate(store)(server.UpdateHandler(store))
|
||||
mux.Handle(peering.UpdatePath, update)
|
||||
ping := server.Authenticate(store)(server.PingHandler(store))
|
||||
mux.Handle(peering.PingPath, ping)
|
||||
return mux
|
||||
}
|
||||
|
||||
func setup(t *testing.T) (peering.PeerID, *rsa.PrivateKey, *client.Client, peering.Store) {
|
||||
store := memory.NewStore()
|
||||
|
||||
port, err := startServer(store)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
pk := mustGeneratePrivateKey()
|
||||
id := peering.NewPeerID()
|
||||
|
||||
c := client.New(
|
||||
client.WithBaseURL(fmt.Sprintf("http://127.0.0.1:%d", port)),
|
||||
client.WithPrivateKey(pk),
|
||||
client.WithPeerID(id),
|
||||
)
|
||||
|
||||
return id, pk, c, store
|
||||
}
|
Reference in New Issue
Block a user