From 1a6f1c805c5137c3085c01d20609360f0260fc5a Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Fri, 21 Oct 2022 12:15:59 +0300 Subject: [PATCH] rpc: fix race in TestWSClientEvents ``` 2022-10-21T08:59:45.2219797Z === RUN TestWSClientEvents/default_ntf_channel 2022-10-21T08:59:45.2219901Z ================== 2022-10-21T08:59:45.2220017Z WARNING: DATA RACE 2022-10-21T08:59:45.2220177Z Write at 0x00c000c82778 by goroutine 371: 2022-10-21T08:59:45.2220580Z github.com/nspcc-dev/neo-go/pkg/rpcclient.TestWSClientEvents.func2() 2022-10-21T08:59:45.2221112Z /home/runner/work/neo-go/neo-go/pkg/rpcclient/wsclient_test.go:171 +0x1c4 2022-10-21T08:59:45.2221244Z testing.tRunner() 2022-10-21T08:59:45.2221617Z /opt/hostedtoolcache/go/1.18.7/x64/src/testing/testing.go:1439 +0x213 2022-10-21T08:59:45.2221759Z testing.(*T).Run.func1() 2022-10-21T08:59:45.2222124Z /opt/hostedtoolcache/go/1.18.7/x64/src/testing/testing.go:1486 +0x47 2022-10-21T08:59:45.2222138Z 2022-10-21T08:59:45.2222308Z Previous read at 0x00c000c82778 by goroutine 37: 2022-10-21T08:59:45.2222694Z github.com/nspcc-dev/neo-go/pkg/rpcclient.(*Client).StateRootInHeader() 2022-10-21T08:59:45.2223151Z /home/runner/work/neo-go/neo-go/pkg/rpcclient/rpc.go:1104 +0xb0 2022-10-21T08:59:45.2223482Z github.com/nspcc-dev/neo-go/pkg/rpcclient.(*WSClient).wsReader() 2022-10-21T08:59:45.2224077Z /home/runner/work/neo-go/neo-go/pkg/rpcclient/wsclient.go:210 +0x651 2022-10-21T08:59:45.2224416Z github.com/nspcc-dev/neo-go/pkg/rpcclient.NewWS.func2() 2022-10-21T08:59:45.2224892Z /home/runner/work/neo-go/neo-go/pkg/rpcclient/wsclient.go:149 +0x39 2022-10-21T08:59:45.2224901Z 2022-10-21T08:59:45.2225049Z Goroutine 371 (running) created at: 2022-10-21T08:59:45.2225182Z testing.(*T).Run() 2022-10-21T08:59:45.2225548Z /opt/hostedtoolcache/go/1.18.7/x64/src/testing/testing.go:1486 +0x724 2022-10-21T08:59:45.2225911Z github.com/nspcc-dev/neo-go/pkg/rpcclient.TestWSClientEvents() 2022-10-21T08:59:45.2226408Z /home/runner/work/neo-go/neo-go/pkg/rpcclient/wsclient_test.go:167 +0x404 2022-10-21T08:59:45.2226539Z testing.tRunner() 2022-10-21T08:59:45.2226900Z /opt/hostedtoolcache/go/1.18.7/x64/src/testing/testing.go:1439 +0x213 2022-10-21T08:59:45.2227042Z testing.(*T).Run.func1() 2022-10-21T08:59:45.2227398Z /opt/hostedtoolcache/go/1.18.7/x64/src/testing/testing.go:1486 +0x47 2022-10-21T08:59:45.2227406Z 2022-10-21T08:59:45.2227552Z Goroutine 37 (finished) created at: 2022-10-21T08:59:45.2227851Z github.com/nspcc-dev/neo-go/pkg/rpcclient.NewWS() 2022-10-21T08:59:45.2228327Z /home/runner/work/neo-go/neo-go/pkg/rpcclient/wsclient.go:149 +0x6fb 2022-10-21T08:59:45.2228843Z github.com/nspcc-dev/neo-go/pkg/rpcclient.TestWSClientEvents.func2() 2022-10-21T08:59:45.2229434Z /home/runner/work/neo-go/neo-go/pkg/rpcclient/wsclient_test.go:168 +0x131 2022-10-21T08:59:45.2229569Z testing.tRunner() 2022-10-21T08:59:45.2229930Z /opt/hostedtoolcache/go/1.18.7/x64/src/testing/testing.go:1439 +0x213 2022-10-21T08:59:45.2230069Z testing.(*T).Run.func1() 2022-10-21T08:59:45.2230424Z /opt/hostedtoolcache/go/1.18.7/x64/src/testing/testing.go:1486 +0x47 2022-10-21T08:59:45.2230526Z ================== 2022-10-21T08:59:45.2230703Z wsclient_test.go:186: 2022-10-21T08:59:45.2230988Z Error Trace: wsclient_test.go:186 2022-10-21T08:59:45.2231209Z Error: Should be true 2022-10-21T08:59:45.2231536Z Test: TestWSClientEvents/default_ntf_channel 2022-10-21T08:59:45.2231812Z testing.go:1312: race detected during execution of test ``` --- pkg/rpcclient/wsclient_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/rpcclient/wsclient_test.go b/pkg/rpcclient/wsclient_test.go index 501700b84..e0ea0fa8f 100644 --- a/pkg/rpcclient/wsclient_test.go +++ b/pkg/rpcclient/wsclient_test.go @@ -168,7 +168,10 @@ func TestWSClientEvents(t *testing.T) { wsc, err := NewWS(context.TODO(), httpURLtoWS(srv.URL), Options{}) require.NoError(t, err) wsc.getNextRequestID = getTestRequestID + wsc.cacheLock.Lock() wsc.cache.initDone = true // Our server mock is restricted, so perform initialisation manually. + wsc.cache.network = netmode.UnitTestNet + wsc.cacheLock.Unlock() // Our server mock is restricted, so perform subscriptions manually with default notifications channel. wsc.subscriptionsLock.Lock() wsc.subscriptions["0"] = notificationReceiver{typ: neorpc.BlockEventID, ch: wsc.Notifications} @@ -176,7 +179,6 @@ func TestWSClientEvents(t *testing.T) { wsc.subscriptions["2"] = notificationReceiver{typ: neorpc.NotificationEventID, ch: wsc.Notifications} // MissedEvent must be delivered without subscription. wsc.subscriptionsLock.Unlock() - wsc.cache.network = netmode.UnitTestNet for range events { select { case _, ok = <-wsc.Notifications: