// Test instantiation of Node func TestNewNode(t *testing.T) { defer log.AfterTest(t) h1, h2 := SetupTwoHosts(t, false) // Add tree + entitylist el := sda.NewRoster([]*network.ServerIdentity{h1.ServerIdentity, h2.ServerIdentity}) h1.AddRoster(el) tree := el.GenerateBinaryTree() h1.AddTree(tree) // Try directly StartNewNode proto, err := h1.StartProtocol(testProto, tree) if err != nil { t.Fatal("Could not start new protocol", err) } p := proto.(*ProtocolTest) m := <-p.DispMsg if m != "Dispatch" { t.Fatal("Dispatch() not called - msg is:", m) } m = <-p.StartMsg if m != "Start" { t.Fatal("Start() not called - msg is:", m) } h1.Close() h2.Close() }
func TestServiceProtocolProcessMessage(t *testing.T) { ds := &DummyService{ link: make(chan bool), } var count int sda.RegisterNewService("DummyService", func(c *sda.Context, path string) sda.Service { if count == 0 { count++ // the client does not need a Service return &DummyService{link: make(chan bool)} } ds.c = c ds.path = path ds.Config = DummyConfig{ Send: true, } return ds }) // fake a client h2 := sda.NewLocalHost(2010) defer h2.Close() host := sda.NewLocalHost(2000) host.ListenAndBind() host.StartProcessMessages() log.Lvl1("Host created and listening") defer host.Close() // create the entityList and tree el := sda.NewRoster([]*network.ServerIdentity{host.ServerIdentity}) tree := el.GenerateBinaryTree() // give it to the service ds.fakeTree = tree // Send a request to the service b, err := network.MarshalRegisteredType(&DummyMsg{10}) log.ErrFatal(err) re := &sda.ClientRequest{ Service: sda.ServiceFactory.ServiceID("DummyService"), Data: b, } log.Lvl1("Client connecting to host") if _, err := h2.Connect(host.ServerIdentity); err != nil { t.Fatal(err) } log.Lvl1("Sending request to service...") if err := h2.SendRaw(host.ServerIdentity, re); err != nil { t.Fatal(err) } // wait for the link from the protocol waitOrFatalValue(ds.link, true, t) // now wait for the same link as the protocol should have sent a message to // himself ! waitOrFatalValue(ds.link, true, t) }
// This makes h2 the leader, so it creates a tree and entity list // and start a protocol. H1 should receive that message and request the entitity // list and the treelist and then instantiate the protocol. func TestProtocolAutomaticInstantiation(t *testing.T) { defer log.AfterTest(t) log.TestOutput(testing.Verbose(), 4) // setup chanH1 := make(chan bool) chanH2 := make(chan bool) chans := []chan bool{chanH1, chanH2} id := 0 // custom creation function so we know the step due to the channels fn := func(n *sda.TreeNodeInstance) (sda.ProtocolInstance, error) { ps := SimpleProtocol{ TreeNodeInstance: n, Chan: chans[id], } ps.RegisterHandler(ps.ReceiveMessage) id++ return &ps, nil } network.RegisterMessageType(SimpleMessage{}) sda.ProtocolRegisterName(simpleProto, fn) h1, h2 := SetupTwoHosts(t, true) defer h1.Close() defer h2.Close() h1.StartProcessMessages() // create small Tree el := sda.NewRoster([]*network.ServerIdentity{h1.ServerIdentity, h2.ServerIdentity}) h1.AddRoster(el) tree := el.GenerateBinaryTree() h1.AddTree(tree) // start the protocol go func() { _, err := h1.StartProtocol(simpleProto, tree) if err != nil { t.Fatal(fmt.Sprintf("Could not start protocol %v", err)) } }() // we are supposed to receive something from host1 from Start() select { case _ = <-chanH1: break case <-time.After(200 * time.Millisecond): t.Fatal("Could not receive from channel of host 1") } // Then we are supposed to receive from h2 after he got the tree and the // entity list from h1 select { case _ = <-chanH2: break case <-time.After(2 * time.Second): t.Fatal("Could not receive from channel of host 1") } }
// Test if a request that makes the service create a new protocol works func TestServiceRequestNewProtocol(t *testing.T) { ds := &DummyService{ link: make(chan bool), } sda.RegisterNewService("DummyService", func(c *sda.Context, path string) sda.Service { ds.c = c ds.path = path return ds }) host := sda.NewLocalHost(2000) host.Listen() host.StartProcessMessages() log.Lvl1("Host created and listening") defer host.Close() // create the entityList and tree el := sda.NewRoster([]*network.ServerIdentity{host.ServerIdentity}) tree := el.GenerateBinaryTree() // give it to the service ds.fakeTree = tree // Send a request to the service b, err := network.MarshalRegisteredType(&DummyMsg{10}) log.ErrFatal(err) re := &sda.ClientRequest{ Service: sda.ServiceFactory.ServiceID("DummyService"), Data: b, } // fake a client h2 := sda.NewLocalHost(2010) defer h2.Close() log.Lvl1("Client connecting to host") if _, err := h2.Connect(host.ServerIdentity); err != nil { t.Fatal(err) } log.Lvl1("Sending request to service...") if err := h2.SendRaw(host.ServerIdentity, re); err != nil { t.Fatal(err) } // wait for the link from the waitOrFatalValue(ds.link, true, t) // Now RESEND the value so we instantiate using the SAME TREENODE log.Lvl1("Sending request AGAIN to service...") if err := h2.SendRaw(host.ServerIdentity, re); err != nil { t.Fatal(err) } // wait for the link from the // NOW expect false waitOrFatalValue(ds.link, false, t) }
func TestOverlayDone(t *testing.T) { defer log.AfterTest(t) log.TestOutput(testing.Verbose(), 4) // setup h1 := sda.NewLocalHost(2000) defer h1.Close() fn := func(n *sda.TreeNodeInstance) (sda.ProtocolInstance, error) { ps := ProtocolOverlay{ TreeNodeInstance: n, } return &ps, nil } el := sda.NewRoster([]*network.ServerIdentity{h1.ServerIdentity}) h1.AddRoster(el) tree := el.GenerateBinaryTree() h1.AddTree(tree) sda.ProtocolRegisterName("ProtocolOverlay", fn) p, err := h1.CreateProtocol("ProtocolOverlay", tree) if err != nil { t.Fatal("error starting new node", err) } po := p.(*ProtocolOverlay) // release the resources var count int po.OnDoneCallback(func() bool { count++ if count >= 2 { return true } return false }) po.Release() overlay := h1.Overlay() if _, ok := overlay.TokenToNode(po.Token()); !ok { t.Fatal("Node should exists after first call Done()") } po.Release() if _, ok := overlay.TokenToNode(po.Token()); ok { t.Fatal("Node should NOT exists after call Done()") } }
func TestServiceChannels(t *testing.T) { defer log.AfterTest(t) sc1 := &ServiceChannels{} sc2 := &ServiceChannels{} var count int sda.RegisterNewService("ChannelsService", func(c *sda.Context, path string) sda.Service { var sc *ServiceChannels if count == 0 { sc = sc1 } else { sc = sc2 } count++ sc.ctx = c sc.path = path return sc }) h1, h2 := SetupTwoHosts(t, true) defer h1.Close() defer h2.Close() // Add tree + entitylist el := sda.NewRoster([]*network.ServerIdentity{h1.ServerIdentity, h2.ServerIdentity}) tree := el.GenerateBinaryTree() sc1.tree = *tree h1.AddRoster(el) h1.AddTree(tree) h1.StartProcessMessages() sc1.ProcessClientRequest(nil, nil) select { case msg := <-Incoming: if msg.I != 12 { t.Fatal("Child should receive 12") } case <-time.After(time.Second * 3): t.Fatal("Timeout") } }
// test for calling the NewProtocol method on a remote Service func TestServiceNewProtocol(t *testing.T) { ds1 := &DummyService{ link: make(chan bool), Config: DummyConfig{ Send: true, }, } ds2 := &DummyService{ link: make(chan bool), } var count int sda.RegisterNewService("DummyService", func(c *sda.Context, path string) sda.Service { var localDs *DummyService switch count { case 2: // the client does not need a Service return &DummyService{link: make(chan bool)} case 1: // children localDs = ds2 case 0: // root localDs = ds1 } localDs.c = c localDs.path = path count++ return localDs }) host := sda.NewLocalHost(2000) host.ListenAndBind() host.StartProcessMessages() log.Lvl1("Host created and listening") defer host.Close() host2 := sda.NewLocalHost(2002) host2.ListenAndBind() host2.StartProcessMessages() defer host2.Close() // create the entityList and tree el := sda.NewRoster([]*network.ServerIdentity{host.ServerIdentity, host2.ServerIdentity}) tree := el.GenerateBinaryTree() // give it to the service ds1.fakeTree = tree // Send a request to the service b, err := network.MarshalRegisteredType(&DummyMsg{10}) log.ErrFatal(err) re := &sda.ClientRequest{ Service: sda.ServiceFactory.ServiceID("DummyService"), Data: b, } // fake a client client := sda.NewLocalHost(2010) defer client.Close() log.Lvl1("Client connecting to host") if _, err := client.Connect(host.ServerIdentity); err != nil { t.Fatal(err) } log.Lvl1("Sending request to service...") if err := client.SendRaw(host.ServerIdentity, re); err != nil { t.Fatal(err) } // wait for the link from the protocol that Starts waitOrFatalValue(ds1.link, true, t) // now wait for the same link as the protocol should have sent a message to // himself ! waitOrFatalValue(ds1.link, true, t) // now wait for the SECOND LINK on the SECOND HOST that the SECOND SERVICE // should have started (ds2) in ProcessRequest waitOrFatalValue(ds2.link, true, t) }