@@ -39,7 +39,10 @@ var concurrentDemos = flag.Int("concurrentdemos", 2, "The `number` of current de
3939
4040var update = flag .Bool ("update" , false , "update .golden files" )
4141
42+ //nolint:cyclop
4243func TestDemoInfoCs (t * testing.T ) {
44+ t .Parallel ()
45+
4346 if testing .Short () {
4447 t .Skip ("skipping test due to -short flag" )
4548 }
@@ -62,21 +65,21 @@ func TestDemoInfoCs(t *testing.T) {
6265 actual .WriteString (fmt .Sprintf ("%#v\n " , e ))
6366 })
6467
65- fmt . Println ("Parsing header" )
68+ t . Log ("Parsing header" )
6669 h , err := p .ParseHeader ()
6770 assertions .NoError (err , "error returned by Parser.ParseHeader()" )
6871 assertions .Equal (h , p .Header (), "values returned by ParseHeader() and Header() don't match" )
69- fmt . Printf ("Header: %v - FrameRate()=%.2f frames/s ; FrameTime()=%s ; TickRate()=%.2f frames/s ; TickTime()=%s\n " , h , h .FrameRate (), h .FrameTime (), p .TickRate (), p .TickTime ())
72+ t . Logf ("Header: %v - FrameRate()=%.2f frames/s ; FrameTime()=%s ; TickRate()=%.2f frames/s ; TickTime()=%s\n " , h , h .FrameRate (), h .FrameTime (), p .TickRate (), p .TickTime ())
7073
71- fmt . Println ("Registering handlers" )
74+ t . Log ("Registering handlers" )
7275 gs := p .GameState ()
7376 p .RegisterEventHandler (func (e events.RoundEnd ) {
7477 var (
7578 winner , loser * common.TeamState
7679 winnerSide string
7780 )
7881
79- switch e .Winner {
82+ switch e .Winner { //nolint:exhaustive
8083 case common .TeamTerrorists :
8184 winner = gs .TeamTerrorists ()
8285 loser = gs .TeamCounterTerrorists ()
@@ -87,7 +90,8 @@ func TestDemoInfoCs(t *testing.T) {
8790 winnerSide = "CT"
8891 default :
8992 // Probably match medic or something similar
90- fmt .Println ("Round finished: No winner (tie)" )
93+ t .Log ("Round finished: No winner (tie)" )
94+
9195 return
9296 }
9397
@@ -100,7 +104,7 @@ func TestDemoInfoCs(t *testing.T) {
100104 currentFrame := p .CurrentFrame ()
101105
102106 // Score + 1 for winner because it hasn't actually been updated yet
103- fmt . Printf ("Round finished: score=%d:%d ; winnerSide=%s ; clanName=%q ; teamId=%d ; teamFlag=%s ; ingameTime=%s ; progress=%.1f%% ; tick=%d ; frame=%d\n " , winner .Score ()+ 1 , loser .Score (), winnerSide , winnerClan , winnerID , winnerFlag , ingameTime , progressPercent , ingameTick , currentFrame )
107+ t . Logf ("Round finished: score=%d:%d ; winnerSide=%s ; clanName=%q ; teamId=%d ; teamFlag=%s ; ingameTime=%s ; progress=%.1f%% ; tick=%d ; frame=%d\n " , winner .Score ()+ 1 , loser .Score (), winnerSide , winnerClan , winnerID , winnerFlag , ingameTime , progressPercent , ingameTick , currentFrame )
104108 if len (winnerClan ) == 0 || winnerID == 0 || len (winnerFlag ) == 0 || ingameTime == 0 || progressPercent == 0 || ingameTick == 0 || currentFrame == 0 {
105109 t .Error ("Unexprected default value, check output of last round" )
106110 }
@@ -165,31 +169,33 @@ func TestDemoInfoCs(t *testing.T) {
165169 // Net-message stuff
166170 var netTickHandlerID dispatch.HandlerIdentifier
167171 netTickHandlerID = p .RegisterNetMessageHandler (func (tick * msg.CNETMsg_Tick ) {
168- fmt . Println ("Net-message tick handled, unregistering - tick:" , tick .Tick )
172+ t . Log ("Net-message tick handled, unregistering - tick:" , tick .Tick )
169173 p .UnregisterNetMessageHandler (netTickHandlerID )
170174 })
171175
172176 ts := time .Now ()
173177
174178 frameByFrameCount := 1000
175- fmt . Printf ("Parsing frame by frame (%d frames)\n " , frameByFrameCount )
179+ t . Logf ("Parsing frame by frame (%d frames)\n " , frameByFrameCount )
176180
177181 for i := 0 ; i < frameByFrameCount ; i ++ {
178182 ok , err := p .ParseNextFrame ()
179183 assertions .NoError (err , "error occurred in ParseNextFrame()" )
180184 assertions .True (ok , "parser reported end of demo after less than %d frames" , frameByFrameCount )
181185 }
182186
183- fmt . Println ("Parsing to end" )
187+ t . Log ("Parsing to end" )
184188 err = p .ParseToEnd ()
185189 assertions .NoError (err , "error occurred in ParseToEnd()" )
186190
187- fmt . Printf ("Took %s\n " , time .Since (ts ))
191+ t . Logf ("Took %s\n " , time .Since (ts ))
188192
189193 assertGolden (t , assertions , "default" , actual .Bytes ())
190194}
191195
192196func TestUnexpectedEndOfDemo (t * testing.T ) {
197+ t .Parallel ()
198+
193199 if testing .Short () {
194200 t .Skip ("skipping test due to -short flag" )
195201 }
@@ -203,7 +209,9 @@ func TestUnexpectedEndOfDemo(t *testing.T) {
203209 assert .Equal (t , demoinfocs .ErrUnexpectedEndOfDemo , err , "parsing cancelled but error was not ErrUnexpectedEndOfDemo" )
204210}
205211
206- func TestCancelParseToEnd (t * testing.T ) {
212+ func TestParseToEnd_Cancel (t * testing.T ) {
213+ t .Parallel ()
214+
207215 if testing .Short () {
208216 t .Skip ("skipping test" )
209217 }
@@ -232,7 +240,36 @@ func TestCancelParseToEnd(t *testing.T) {
232240 assert .True (t , tix == maxTicks , "FrameDone handler was not triggered the correct amount of times" )
233241}
234242
243+ // See https://github.com/markus-wa/demoinfocs-golang/issues/276
244+ func TestParseToEnd_MultiCancel (t * testing.T ) {
245+ t .Parallel ()
246+
247+ if testing .Short () {
248+ t .Skip ("skipping test" )
249+ }
250+
251+ f := openFile (t , defaultDemPath )
252+ defer mustClose (t , f )
253+
254+ p := demoinfocs .NewParser (f )
255+
256+ var handlerID dispatch.HandlerIdentifier
257+ handlerID = p .RegisterEventHandler (func (events.FrameDone ) {
258+ p .Cancel ()
259+ p .Cancel ()
260+ p .Cancel ()
261+ p .Cancel ()
262+ p .Cancel ()
263+ p .UnregisterEventHandler (handlerID )
264+ })
265+
266+ err := p .ParseToEnd ()
267+ assert .Equal (t , demoinfocs .ErrCancelled , err , "parsing cancelled but error was not ErrCancelled" )
268+ }
269+
235270func TestInvalidFileType (t * testing.T ) {
271+ t .Parallel ()
272+
236273 invalidDemoData := make ([]byte , 2048 )
237274 _ , err := rand .Read (invalidDemoData )
238275 assert .NoError (t , err , "failed to create/read random data" )
@@ -253,6 +290,8 @@ func TestInvalidFileType(t *testing.T) {
253290}
254291
255292func TestConcurrent (t * testing.T ) {
293+ t .Parallel ()
294+
256295 if testing .Short () {
257296 t .Skip ("skipping test" )
258297 }
@@ -262,19 +301,21 @@ func TestConcurrent(t *testing.T) {
262301 var i int64
263302 runner := func () {
264303 n := atomic .AddInt64 (& i , 1 )
265- fmt . Printf ("Starting concurrent runner %d\n " , n )
304+ t . Logf ("Starting concurrent runner %d\n " , n )
266305
267306 ts := time .Now ()
268307
269308 parseDefaultDemo (t )
270309
271- fmt . Printf ("Runner %d took %s\n " , n , time .Since (ts ))
310+ t . Logf ("Runner %d took %s\n " , n , time .Since (ts ))
272311 }
273312
274313 runConcurrently (runner )
275314}
276315
277316func parseDefaultDemo (tb testing.TB ) {
317+ tb .Helper ()
318+
278319 f := openFile (tb , defaultDemPath )
279320 defer mustClose (tb , f )
280321
@@ -297,6 +338,8 @@ func runConcurrently(runner func()) {
297338}
298339
299340func TestDemoSet (t * testing.T ) {
341+ t .Parallel ()
342+
300343 if testing .Short () {
301344 t .Skip ("skipping test due to -short flag" )
302345 }
@@ -307,7 +350,7 @@ func TestDemoSet(t *testing.T) {
307350 for _ , d := range dems {
308351 name := d .Name ()
309352 if strings .HasSuffix (name , ".dem" ) {
310- fmt . Printf ("Parsing '%s/%s'\n " , demSetPath , name )
353+ t . Logf ("Parsing '%s/%s'\n " , demSetPath , name )
311354 func () {
312355 f := openFile (t , fmt .Sprintf ("%s/%s" , demSetPath , name ))
313356 defer mustClose (t , f )
@@ -318,6 +361,12 @@ func TestDemoSet(t *testing.T) {
318361
319362 p := demoinfocs .NewParser (f )
320363
364+ p .RegisterEventHandler (func (event events.GenericGameEvent ) {
365+ if event .Name == "bot_takeover" {
366+ t .Log (event .Data )
367+ }
368+ })
369+
321370 err = p .ParseToEnd ()
322371 assert .Nil (t , err , "parsing of '%s/%s' failed" , demSetPath , name )
323372 }()
@@ -362,13 +411,17 @@ func BenchmarkConcurrent(b *testing.B) {
362411}
363412
364413func openFile (tb testing.TB , file string ) * os.File {
414+ tb .Helper ()
415+
365416 f , err := os .Open (file )
366417 assert .NoError (tb , err , "failed to open file %q" , file )
367418
368419 return f
369420}
370421
371422func assertGolden (tb testing.TB , assertions * assert.Assertions , testCase string , actual []byte ) {
423+ tb .Helper ()
424+
372425 const goldenVerificationGoVersionMin = "go1.12"
373426 if ver := runtime .Version (); strings .Compare (ver , goldenVerificationGoVersionMin ) < 0 {
374427 tb .Logf ("old go version %q detected, skipping golden file verification" , ver )
@@ -417,15 +470,18 @@ func assertGolden(tb testing.TB, assertions *assert.Assertions, testCase string,
417470
418471func removePointers (s []byte ) []byte {
419472 r := regexp .MustCompile (`\(0x[\da-f]{10}\)` )
473+
420474 return r .ReplaceAll (s , []byte ("(non-nil)" ))
421475}
422476
423477func writeFile (assertions * assert.Assertions , file string , data []byte ) {
424- err := ioutil .WriteFile (file , data , 0755 )
478+ err := ioutil .WriteFile (file , data , 0600 )
425479 assertions .NoError (err , "failed to write to file %q" , file )
426480}
427481
428482func mustClose (tb testing.TB , closables ... io.Closer ) {
483+ tb .Helper ()
484+
429485 mustCloseAssert (assert .New (tb ), closables ... )
430486}
431487
0 commit comments