gecko/xputtest/network.go

79 lines
2.0 KiB
Go

// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package main
// #include "salticidae/network.h"
// void onTerm(int sig, void *);
// void decidedTx(msg_t *, msgnetwork_conn_t *, void *);
import "C"
import (
"fmt"
"unsafe"
"github.com/ava-labs/salticidae-go"
"github.com/ava-labs/gecko/ids"
"github.com/ava-labs/gecko/networking"
"github.com/ava-labs/gecko/utils/logging"
)
// network stores the persistent data needed when running the test.
type network struct {
ec salticidae.EventContext
build networking.Builder
net salticidae.MsgNetwork
conn salticidae.MsgNetworkConn
log logging.Logger
decided chan ids.ID
networkID uint32
}
var net = network{}
func (n *network) Initialize() error {
n.ec = salticidae.NewEventContext()
evInt := salticidae.NewSigEvent(n.ec, salticidae.SigEventCallback(C.onTerm), nil)
evInt.Add(salticidae.SIGINT)
evTerm := salticidae.NewSigEvent(n.ec, salticidae.SigEventCallback(C.onTerm), nil)
evTerm.Add(salticidae.SIGTERM)
serr := salticidae.NewError()
netconfig := salticidae.NewMsgNetworkConfig()
n.net = salticidae.NewMsgNetwork(n.ec, netconfig, &serr)
if serr.GetCode() != 0 {
return fmt.Errorf("sync error %s", salticidae.StrError(serr.GetCode()))
}
n.net.RegHandler(networking.DecidedTx, salticidae.MsgNetworkMsgCallback(C.decidedTx), nil)
return nil
}
//export onTerm
func onTerm(C.int, unsafe.Pointer) {
net.log.Info("Terminate signal received")
net.ec.Stop()
}
// decidedTx handles the recept of a decidedTx message
//export decidedTx
func decidedTx(_msg *C.struct_msg_t, _conn *C.struct_msgnetwork_conn_t, _ unsafe.Pointer) {
msg := salticidae.MsgFromC(salticidae.CMsg(_msg))
pMsg, err := net.build.Parse(networking.DecidedTx, msg.GetPayloadByMove())
if err != nil {
net.log.Warn("Failed to parse DecidedTx message")
return
}
txID, err := ids.ToID(pMsg.Get(networking.TxID).([]byte))
net.log.AssertNoError(err) // Length is checked in message parsing
net.log.Debug("Decided %s", txID)
net.decided <- txID
}