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!") } }