109 lines
2.5 KiB
Go
109 lines
2.5 KiB
Go
package tests
|
|
|
|
import (
|
|
"bytes"
|
|
"lux/crypto"
|
|
"lux/host"
|
|
"lux/net"
|
|
"lux/proto"
|
|
"testing"
|
|
)
|
|
|
|
type DummyWANProvider struct{}
|
|
|
|
func (*DummyWANProvider) Provide() (host.LuxOption, error) {
|
|
wan := host.NewLuxOptionWAN()
|
|
wan.Addr4 = proto.LuxProtoIPToAddr([]byte{1, 2, 3, 4})
|
|
|
|
return &wan, nil
|
|
}
|
|
|
|
func TestHeartbeatMulticast(t *testing.T) {
|
|
ks := crypto.NewLuxKeyStore("/tmp/keystore.dat")
|
|
|
|
keyNodeA, _ := crypto.NewLuxKey(proto.LuxTypeNode)
|
|
ks.Put(keyNodeA)
|
|
keyNodeB, _ := crypto.NewLuxKey(proto.LuxTypeNode)
|
|
ks.Put(keyNodeB)
|
|
keyHost, _ := crypto.NewLuxKey(proto.LuxTypeHost)
|
|
ks.Put(keyHost)
|
|
|
|
nodeA := net.NewLuxRouter(keyNodeA, ks)
|
|
nodeA.CreateInboundChannel(net.LuxChannelExterior, "127.0.0.1:9979")
|
|
nodeA.Start()
|
|
defer nodeA.Stop()
|
|
|
|
nodeB := net.NewLuxRouter(keyNodeB, ks)
|
|
nodeB.CreateInboundChannel(net.LuxChannelExterior, "127.0.0.2:9979")
|
|
nodeB.Start()
|
|
defer nodeB.Stop()
|
|
|
|
hostA := host.NewLuxHost("testhost", keyHost, ks)
|
|
hostA.AddNode(keyNodeA.Id, "127.0.0.1:9979")
|
|
hostA.AddNode(keyNodeB.Id, "127.0.0.2:9979")
|
|
|
|
hostA.AddOptionProvider(&DummyWANProvider{})
|
|
|
|
t.Logf("nodeA %s", keyNodeA.Id.String())
|
|
t.Logf("nodeB %s", keyNodeB.Id.String())
|
|
t.Logf("host %s", keyHost.Id.String())
|
|
|
|
for i := 0; i < 2; i++ {
|
|
t.Logf("heartbeat %d", i)
|
|
if err := hostA.Heartbeat(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
packetA, err := nodeA.Recv()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
packetB, err := nodeB.Recv()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
stateA := host.NewLuxState("testhost")
|
|
if err := stateA.Read(&packetA.Buffer); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
stateB := host.NewLuxState("testhost")
|
|
if err := stateB.Read(&packetB.Buffer); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if stateA.Hostname != stateB.Hostname {
|
|
t.Fatal("stateA.Hostname != stateB.Hostname")
|
|
}
|
|
|
|
if !bytes.Equal(stateA.Options[host.LuxOptionTypeWAN].(*host.LuxOptionWAN).Addr4.AsSlice(),
|
|
stateB.Options[host.LuxOptionTypeWAN].(*host.LuxOptionWAN).Addr4.AsSlice()) {
|
|
t.Fatal("WAN IPs aren't equal")
|
|
}
|
|
}
|
|
|
|
// node to host reply
|
|
reply := net.LuxPacket{
|
|
Target: keyHost.Id,
|
|
Type: 0x0203,
|
|
Buffer: proto.FromSlice([]byte{1, 2, 3, 4}),
|
|
}
|
|
if err := nodeA.Send(reply); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
hostA.GetRouter().Start()
|
|
defer hostA.GetRouter().Stop()
|
|
|
|
reply2, err := hostA.GetRouter().Recv()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if reply2.Type != reply.Type {
|
|
t.Fatal(".Type != reply.Type")
|
|
}
|
|
if !bytes.Equal(reply2.Buffer.AllBytes()[:4], reply.Buffer.AllBytes()) {
|
|
t.Fatal("reply payloads not equal!")
|
|
}
|
|
}
|