package testkit import ( "context" "crypto/rand" "fmt" "github.com/libp2p/go-libp2p" "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-pubsub-tracer/traced" ma "github.com/multiformats/go-multiaddr" ) type PubsubTracer struct { t *TestEnvironment host host.Host traced *traced.TraceCollector } func PreparePubsubTracer(t *TestEnvironment) (*PubsubTracer, error) { ctx := context.Background() privk, _, err := crypto.GenerateEd25519Key(rand.Reader) if err != nil { return nil, err } tracedIP := t.NetClient.MustGetDataNetworkIP().String() tracedAddr := fmt.Sprintf("/ip4/%s/tcp/4001", tracedIP) host, err := libp2p.New(ctx, libp2p.Identity(privk), libp2p.ListenAddrStrings(tracedAddr), ) if err != nil { return nil, err } tracedDir := t.TestOutputsPath + "/traced.logs" traced, err := traced.NewTraceCollector(host, tracedDir) if err != nil { host.Close() return nil, err } tracedMultiaddrStr := fmt.Sprintf("%s/p2p/%s", tracedAddr, host.ID()) t.RecordMessage("I am %s", tracedMultiaddrStr) _ = ma.StringCast(tracedMultiaddrStr) tracedMsg := &PubsubTracerMsg{Multiaddr: tracedMultiaddrStr} t.SyncClient.MustPublish(ctx, PubsubTracerTopic, tracedMsg) t.RecordMessage("waiting for all nodes to be ready") t.SyncClient.MustSignalAndWait(ctx, StateReady, t.TestInstanceCount) tracer := &PubsubTracer{t: t, host: host, traced: traced} return tracer, nil } func (tr *PubsubTracer) RunDefault() error { tr.t.RecordMessage("running pubsub tracer") defer func() { err := tr.Stop() if err != nil { tr.t.RecordMessage("error stoping tracer: %s", err) } }() tr.t.WaitUntilAllDone() return nil } func (tr *PubsubTracer) Stop() error { tr.traced.Stop() return tr.host.Close() }