//Handler for /nodemanager/addtransport //mode: POST //url: /nodemanager/addtransport func nodeAddTransportHandler(nm *nodemanager.NodeManager) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { logger.Info("Add transport to Node") var c ConfigWithID err := json.NewDecoder(r.Body).Decode(&c) if err != nil { wh.Error400(w, "Error decoding config for transport") } if len(nm.PubKeyList) < c.NodeID { wh.Error400(w, "Invalid Node id") return } node := nm.GetNodeByIndex(c.NodeID) nodemanager.AddPeersToNode(node, c.Config) } }
// Initialize the Nodes for communication and sending messages func sendMessage(configID int, config nodemanager.TestConfig, wg *sync.WaitGroup, statusChannel chan bool) { fmt.Fprintf(os.Stderr, "Starting Config: %v\n", configID) defer wg.Done() node := nodemanager.CreateNode(config) nodemanager.AddPeersToNode(node, config) defer node.Close() nodemanager.AddRoutesToEstablish(node, config.RoutesConfigsToEstablish) // Send messages for _, messageToSend := range config.MessagesToSend { sendMsgErr := node.SendMessageThruRoute((domain.RouteID)(messageToSend.ThruRoute), messageToSend.Contents) if sendMsgErr != nil { panic(sendMsgErr) } fmt.Fprintf(os.Stdout, "Send message %v from Node: %v to Node: %v\n", messageToSend.Contents, configID, node.GetConnectedPeers()[0].Hex()) } // Receive messages received := make(chan domain.MeshMessage, 2*len(config.MessagesToReceive)) node.SetReceiveChannel(received) // Wait for messages to pass thru recvMap := make(map[string]domain.ReplyTo) for timeEnd := time.Now().Add(1 * time.Second); time.Now().Before(timeEnd); { if len(received) > 0 { fmt.Fprintf(os.Stdout, "Len Receive Channel %v in Node: %v \n", len(received), configID) msgRecvd := <-received recvMap[fmt.Sprintf("%v", msgRecvd.Contents)] = msgRecvd.ReplyTo for _, messageToReceive := range config.MessagesToReceive { if fmt.Sprintf("%v", messageToReceive.Contents) == fmt.Sprintf("%v", msgRecvd.Contents) { if len(messageToReceive.Reply) > 0 { sendBackErr := node.SendMessageBackThruRoute(msgRecvd.ReplyTo, messageToReceive.Reply) if sendBackErr != nil { panic(sendBackErr) } fmt.Fprintf(os.Stdout, "=== Send back %v\n", time.Now()) } } } } runtime.Gosched() } success := true for _, messageToReceive := range config.MessagesToReceive { _, received := recvMap[fmt.Sprintf("%v", messageToReceive.Contents)] if !received { success = false fmt.Fprintf(os.Stdout, "Didn't receive message contents: %v - Node: %v\n", messageToReceive.Contents, configID) } } // Wait for messages to pass back time.Sleep(1 * time.Second) fmt.Fprintf(os.Stdout, "-- Finished test -- %v\n", time.Now()) if success { fmt.Fprint(os.Stdout, "\t Success!\n") } else { fmt.Fprint(os.Stderr, "\t Failure. \n") } statusChannel <- success }