diff --git a/discover/table.go b/discover/table.go index 41d5ac6..b22c48d 100644 --- a/discover/table.go +++ b/discover/table.go @@ -23,6 +23,7 @@ package discover import ( + "context" crand "crypto/rand" "encoding/binary" "fmt" @@ -190,7 +191,9 @@ func (tab *Table) setFallbackNodes(nodes []*enode.Node) error { return fmt.Errorf("bad bootstrap node %q: %v", n, err) } } + tab.mutex.Lock() tab.nursery = wrapNodes(nodes) + tab.mutex.Unlock() return nil } @@ -302,11 +305,15 @@ func (tab *Table) doRefresh(done chan struct{}) { func (tab *Table) loadSeedNodes() { seeds := wrapNodes(tab.db.QuerySeeds(seedCount, seedMaxAge)) + tab.mutex.Lock() seeds = append(seeds, tab.nursery...) + tab.mutex.Unlock() for i := range seeds { seed := seeds[i] - age := log.Lazy{Fn: func() interface{} { return time.Since(tab.db.LastPongReceived(seed.ID(), seed.IP())) }} - tab.log.Trace("Found seed node in database", "id", seed.ID(), "addr", seed.addr(), "age", age) + if tab.log.Enabled(context.Background(), log.LevelTrace) { + age := time.Since(tab.db.LastPongReceived(seed.ID(), seed.IP())) + tab.log.Trace("Found seed node in database", "id", seed.ID(), "addr", seed.addr(), "age", age) + } tab.addSeenNode(seed) } } diff --git a/discover/table_test.go b/discover/table_test.go index 1ef63fe..219144b 100644 --- a/discover/table_test.go +++ b/discover/table_test.go @@ -177,8 +177,6 @@ func TestTable_BucketIPLimit(t *testing.T) { // checkIPLimitInvariant checks that ip limit sets contain an entry for every // node in the table and no extra entries. func checkIPLimitInvariant(t *testing.T, tab *Table) { - t.Helper() - tabset := netutil.DistinctNetSet{Subnet: tableSubnet, Limit: tableIPLimit} for _, b := range tab.buckets { for _, n := range b.entries { diff --git a/discover/v4_lookup_test.go b/discover/v4_lookup_test.go index 3b51ad5..1c8d547 100644 --- a/discover/v4_lookup_test.go +++ b/discover/v4_lookup_test.go @@ -153,7 +153,6 @@ func serveTestnet(test *udpTest, testnet *preminedTestnet) { // checkLookupResults verifies that the results of a lookup are the closest nodes to // the testnet's target. func checkLookupResults(t *testing.T, tn *preminedTestnet, results []*enode.Node) { - t.Helper() t.Logf("results:") for _, e := range results { t.Logf(" ld=%d, %x", enode.LogDist(tn.target.id(), e.ID()), e.ID().Bytes()) diff --git a/discover/v4_udp_test.go b/discover/v4_udp_test.go index aeacdc2..cd105cf 100644 --- a/discover/v4_udp_test.go +++ b/discover/v4_udp_test.go @@ -86,15 +86,11 @@ func (test *udpTest) close() { // handles a packet as if it had been sent to the transport. func (test *udpTest) packetIn(wantError error, data v4wire.Packet) { - test.t.Helper() - test.packetInFrom(wantError, test.remotekey, test.remoteaddr, data) } // handles a packet as if it had been sent to the transport by the key/endpoint. func (test *udpTest) packetInFrom(wantError error, key *ecdsa.PrivateKey, addr *net.UDPAddr, data v4wire.Packet) { - test.t.Helper() - enc, _, err := v4wire.Encode(key, data) if err != nil { test.t.Errorf("%s encode error: %v", data.Name(), err) @@ -108,8 +104,6 @@ func (test *udpTest) packetInFrom(wantError error, key *ecdsa.PrivateKey, addr * // waits for a packet to be sent by the transport. // validate should have type func(X, *net.UDPAddr, []byte), where X is a packet type. func (test *udpTest) waitPacketOut(validate interface{}) (closed bool) { - test.t.Helper() - dgram, err := test.pipe.receive() if err == errClosed { return true @@ -549,20 +543,14 @@ func TestUDPv4_smallNetConvergence(t *testing.T) { } func startLocalhostV4(t *testing.T, cfg Config) *UDPv4 { - t.Helper() - cfg.PrivateKey = newkey() db, _ := enode.OpenDB("") ln := enode.NewLocalNode(db, cfg.PrivateKey) // Prefix logs with node ID. lprefix := fmt.Sprintf("(%s)", ln.ID().TerminalString()) - lfmt := log.TerminalFormat(false) - cfg.Log = testlog.Logger(t, log.LvlTrace) - cfg.Log.SetHandler(log.FuncHandler(func(r *log.Record) error { - t.Logf("%s %s", lprefix, lfmt.Format(r)) - return nil - })) + fmt.Println("### prefix", lprefix) + cfg.Log = testlog.Logger(t, log.LevelTrace, lprefix) // Listen. socket, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IP{127, 0, 0, 1}}) diff --git a/discover/v5_udp_test.go b/discover/v5_udp_test.go index 52862ac..ff1a948 100644 --- a/discover/v5_udp_test.go +++ b/discover/v5_udp_test.go @@ -80,12 +80,7 @@ func startLocalhostV5(t *testing.T, cfg Config) *UDPv5 { // Prefix logs with node ID. lprefix := fmt.Sprintf("(%s)", ln.ID().TerminalString()) - lfmt := log.TerminalFormat(false) - cfg.Log = testlog.Logger(t, log.LvlTrace) - cfg.Log.SetHandler(log.FuncHandler(func(r *log.Record) error { - t.Logf("%s %s", lprefix, lfmt.Format(r)) - return nil - })) + cfg.Log = testlog.Logger(t, log.LvlTrace, lprefix) // Listen. socket, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IP{127, 0, 0, 1}}) @@ -127,7 +122,6 @@ func TestUDPv5_unknownPacket(t *testing.T) { nonce := v5wire.Nonce{1, 2, 3} check := func(p *v5wire.Whoareyou, wantSeq uint64) { - t.Helper() if p.Nonce != nonce { t.Error("wrong nonce in WHOAREYOU:", p.Nonce, nonce) } @@ -779,14 +773,11 @@ func newUDPV5Test(t *testing.T) *udpV5Test { // handles a packet as if it had been sent to the transport. func (test *udpV5Test) packetIn(packet v5wire.Packet) { - test.t.Helper() test.packetInFrom(test.remotekey, test.remoteaddr, packet) } // handles a packet as if it had been sent to the transport by the key/endpoint. func (test *udpV5Test) packetInFrom(key *ecdsa.PrivateKey, addr *net.UDPAddr, packet v5wire.Packet) { - test.t.Helper() - ln := test.getNode(key, addr) codec := &testCodec{test: test, id: ln.ID()} enc, _, err := codec.Encode(test.udp.Self().ID(), addr.String(), packet, nil) @@ -817,8 +808,6 @@ func (test *udpV5Test) getNode(key *ecdsa.PrivateKey, addr *net.UDPAddr) *enode. // function. The function must be of type func (X, *net.UDPAddr, v5wire.Nonce) where X is // assignable to packetV5. func (test *udpV5Test) waitPacketOut(validate interface{}) (closed bool) { - test.t.Helper() - fn := reflect.ValueOf(validate) exptype := fn.Type().In(0) @@ -850,8 +839,6 @@ func (test *udpV5Test) waitPacketOut(validate interface{}) (closed bool) { } func (test *udpV5Test) close() { - test.t.Helper() - test.udp.Close() test.db.Close() for id, n := range test.nodesByID { diff --git a/discover/v5wire/crypto_test.go b/discover/v5wire/crypto_test.go index 72169b4..1f76d6d 100644 --- a/discover/v5wire/crypto_test.go +++ b/discover/v5wire/crypto_test.go @@ -98,8 +98,6 @@ func TestDeriveKeys(t *testing.T) { } func check(t *testing.T, what string, x, y []byte) { - t.Helper() - if !bytes.Equal(x, y) { t.Errorf("wrong %s: %#x != %#x", what, x, y) } else { diff --git a/discover/v5wire/encoding_test.go b/discover/v5wire/encoding_test.go index a538731..86d7e00 100644 --- a/discover/v5wire/encoding_test.go +++ b/discover/v5wire/encoding_test.go @@ -522,13 +522,10 @@ func (n *handshakeTestNode) init(key *ecdsa.PrivateKey, ip net.IP, clock mclock. } func (n *handshakeTestNode) encode(t testing.TB, to handshakeTestNode, p Packet) ([]byte, Nonce) { - t.Helper() return n.encodeWithChallenge(t, to, nil, p) } func (n *handshakeTestNode) encodeWithChallenge(t testing.TB, to handshakeTestNode, c *Whoareyou, p Packet) ([]byte, Nonce) { - t.Helper() - // Copy challenge and add destination node. This avoids sharing 'c' among the two codecs. var challenge *Whoareyou if c != nil { @@ -546,8 +543,6 @@ func (n *handshakeTestNode) encodeWithChallenge(t testing.TB, to handshakeTestNo } func (n *handshakeTestNode) expectDecode(t *testing.T, ptype byte, p []byte) Packet { - t.Helper() - dec, err := n.decode(p) if err != nil { t.Fatal(fmt.Errorf("(%s) %v", n.ln.ID().TerminalString(), err)) @@ -560,7 +555,6 @@ func (n *handshakeTestNode) expectDecode(t *testing.T, ptype byte, p []byte) Pac } func (n *handshakeTestNode) expectDecodeErr(t *testing.T, wantErr error, p []byte) { - t.Helper() if _, err := n.decode(p); !errors.Is(err, wantErr) { t.Fatal(fmt.Errorf("(%s) got err %q, want %q", n.ln.ID().TerminalString(), err, wantErr)) } diff --git a/go.mod b/go.mod index 9d3724d..55fa8aa 100644 --- a/go.mod +++ b/go.mod @@ -2,26 +2,29 @@ module github.com/waku-org/go-discover go 1.19 +replace github.com/ethereum/go-ethereum v1.11.6 => github.com/status-im/go-ethereum v1.12.1-0.20240731102018-216ea3288e4c + require ( github.com/davecgh/go-spew v1.1.1 github.com/ethereum/go-ethereum v1.11.6 - github.com/stretchr/testify v1.8.0 - golang.org/x/crypto v0.1.0 + github.com/stretchr/testify v1.8.4 + golang.org/x/crypto v0.17.0 ) require ( - github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect + github.com/StackExchange/wmi v1.2.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect - github.com/go-ole/go-ole v1.2.1 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect - github.com/tklauser/go-sysconf v0.3.5 // indirect - github.com/tklauser/numcpus v0.2.2 // indirect - golang.org/x/sys v0.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sys v0.16.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index f63209e..2c81ab6 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -17,6 +19,9 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -34,6 +39,8 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8= github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -48,21 +55,37 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/status-im/go-ethereum v1.12.1-0.20240724120051-6f474ac420bb h1:j/ifYnfv6x+TutSwWVIa6+EmaWqV4bGOTAzOLemNMpY= +github.com/status-im/go-ethereum v1.12.1-0.20240724120051-6f474ac420bb/go.mod h1:RqzRrqX5SMmOo/3kzsNDP0mzS+cIVnpkZOnn+NW2FqU= +github.com/status-im/go-ethereum v1.12.1-0.20240730103428-3ccd70edb79c h1:zZPq67YRLYyZI9PwLRC7kZwDpfRUlF/Cw+vjPhsERM0= +github.com/status-im/go-ethereum v1.12.1-0.20240730103428-3ccd70edb79c/go.mod h1:RqzRrqX5SMmOo/3kzsNDP0mzS+cIVnpkZOnn+NW2FqU= +github.com/status-im/go-ethereum v1.12.1-0.20240731102018-216ea3288e4c h1:HFhTbc7QanC799jviW5RPu1tsjpNeKGl/gq4zjQElVg= +github.com/status-im/go-ethereum v1.12.1-0.20240731102018-216ea3288e4c/go.mod h1:RqzRrqX5SMmOo/3kzsNDP0mzS+cIVnpkZOnn+NW2FqU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -73,14 +96,20 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/internal/testlog/testlog.go b/internal/testlog/testlog.go index 684339f..f8cbf01 100644 --- a/internal/testlog/testlog.go +++ b/internal/testlog/testlog.go @@ -18,125 +18,91 @@ package testlog import ( + "context" + "log/slog" + "os" "sync" "testing" "github.com/ethereum/go-ethereum/log" ) -// Handler returns a log handler which logs to the unit test log of t. -func Handler(t *testing.T, level log.Lvl) log.Handler { - return log.LvlFilterHandler(level, &handler{t, log.TerminalFormat(false)}) -} - -type handler struct { - t *testing.T - fmt log.Format -} - -func (h *handler) Log(r *log.Record) error { - h.t.Logf("%s", h.fmt.Format(r)) - return nil +type logger struct { + l log.Logger + mu *sync.Mutex + prefix string } -// logger implements log.Logger such that all output goes to the unit test log via -// t.Logf(). All methods in between logger.Trace, logger.Debug, etc. are marked as test -// helpers, so the file and line number in unit test output correspond to the call site -// which emitted the log message. -type logger struct { - t *testing.T - l log.Logger - mu *sync.Mutex - h *bufHandler +// Logger returns a logger which logs to the unit test log of t. +func Logger(t *testing.T, level slog.Level, optionalPrefix ...string) log.Logger { + h := log.NewTerminalHandlerWithSource(os.Stderr, level, false) + prefix := "" + if len(optionalPrefix) > 0 { + prefix = optionalPrefix[0] + } + return &logger{l: log.NewLoggerWithOpts(h, &log.LoggerOptions{SkipCallers: 1}), mu: new(sync.Mutex), prefix: prefix} } -type bufHandler struct { - buf []*log.Record - fmt log.Format +func (l *logger) With(ctx ...interface{}) log.Logger { + return &logger{l: l.l.With(ctx...), mu: l.mu, prefix: l.prefix} } -func (h *bufHandler) Log(r *log.Record) error { - h.buf = append(h.buf, r) - return nil +func (l *logger) New(ctx ...interface{}) log.Logger { + return l.With(ctx...) } -// Logger returns a logger which logs to the unit test log of t. -func Logger(t *testing.T, level log.Lvl) log.Logger { - l := &logger{ - t: t, - l: log.New(), - mu: new(sync.Mutex), - h: &bufHandler{fmt: log.TerminalFormat(false)}, - } - l.l.SetHandler(log.LvlFilterHandler(level, l.h)) - return l +func (l *logger) Log(level slog.Level, msg string, ctx ...interface{}) { + l.Write(level, msg, ctx...) } func (l *logger) Trace(msg string, ctx ...interface{}) { - l.t.Helper() l.mu.Lock() defer l.mu.Unlock() - l.l.Trace(msg, ctx...) - l.flush() + l.Write(log.LevelTrace, msg, ctx...) } func (l *logger) Debug(msg string, ctx ...interface{}) { - l.t.Helper() l.mu.Lock() defer l.mu.Unlock() - l.l.Debug(msg, ctx...) - l.flush() + l.Write(log.LevelDebug, msg, ctx...) } func (l *logger) Info(msg string, ctx ...interface{}) { - l.t.Helper() l.mu.Lock() defer l.mu.Unlock() - l.l.Info(msg, ctx...) - l.flush() + l.Write(log.LevelInfo, msg, ctx...) } func (l *logger) Warn(msg string, ctx ...interface{}) { - l.t.Helper() l.mu.Lock() defer l.mu.Unlock() - l.l.Warn(msg, ctx...) - l.flush() + l.Write(log.LevelWarn, msg, ctx...) } func (l *logger) Error(msg string, ctx ...interface{}) { - l.t.Helper() l.mu.Lock() defer l.mu.Unlock() - l.l.Error(msg, ctx...) - l.flush() + l.Write(log.LevelError, msg, ctx...) } func (l *logger) Crit(msg string, ctx ...interface{}) { - l.t.Helper() l.mu.Lock() defer l.mu.Unlock() - l.l.Crit(msg, ctx...) - l.flush() -} - -func (l *logger) New(ctx ...interface{}) log.Logger { - return &logger{l.t, l.l.New(ctx...), l.mu, l.h} + l.Write(log.LevelCrit, msg, ctx...) + os.Exit(1) } -func (l *logger) GetHandler() log.Handler { - return l.l.GetHandler() +func (l *logger) Write(level slog.Level, msg string, attrs ...any) { + if l.prefix != "" { + msg = l.prefix + " " + msg + } + l.l.Write(level, msg, attrs...) } -func (l *logger) SetHandler(h log.Handler) { - l.l.SetHandler(h) +func (l *logger) Enabled(ctx context.Context, level slog.Level) bool { + return true } -// flush writes all buffered messages and clears the buffer. -func (l *logger) flush() { - l.t.Helper() - for _, r := range l.h.buf { - l.t.Logf("%s", l.h.fmt.Format(r)) - } - l.h.buf = nil +func (l *logger) Handler() slog.Handler { + return l.l.Handler() }