@@ -39,7 +39,10 @@ var concurrentDemos = flag.Int("concurrentdemos", 2, "The `number` of current de
39
39
40
40
var update = flag .Bool ("update" , false , "update .golden files" )
41
41
42
+ //nolint:cyclop
42
43
func TestDemoInfoCs (t * testing.T ) {
44
+ t .Parallel ()
45
+
43
46
if testing .Short () {
44
47
t .Skip ("skipping test due to -short flag" )
45
48
}
@@ -62,21 +65,21 @@ func TestDemoInfoCs(t *testing.T) {
62
65
actual .WriteString (fmt .Sprintf ("%#v\n " , e ))
63
66
})
64
67
65
- fmt . Println ("Parsing header" )
68
+ t . Log ("Parsing header" )
66
69
h , err := p .ParseHeader ()
67
70
assertions .NoError (err , "error returned by Parser.ParseHeader()" )
68
71
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 ())
70
73
71
- fmt . Println ("Registering handlers" )
74
+ t . Log ("Registering handlers" )
72
75
gs := p .GameState ()
73
76
p .RegisterEventHandler (func (e events.RoundEnd ) {
74
77
var (
75
78
winner , loser * common.TeamState
76
79
winnerSide string
77
80
)
78
81
79
- switch e .Winner {
82
+ switch e .Winner { //nolint:exhaustive
80
83
case common .TeamTerrorists :
81
84
winner = gs .TeamTerrorists ()
82
85
loser = gs .TeamCounterTerrorists ()
@@ -87,7 +90,8 @@ func TestDemoInfoCs(t *testing.T) {
87
90
winnerSide = "CT"
88
91
default :
89
92
// Probably match medic or something similar
90
- fmt .Println ("Round finished: No winner (tie)" )
93
+ t .Log ("Round finished: No winner (tie)" )
94
+
91
95
return
92
96
}
93
97
@@ -100,7 +104,7 @@ func TestDemoInfoCs(t *testing.T) {
100
104
currentFrame := p .CurrentFrame ()
101
105
102
106
// 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 )
104
108
if len (winnerClan ) == 0 || winnerID == 0 || len (winnerFlag ) == 0 || ingameTime == 0 || progressPercent == 0 || ingameTick == 0 || currentFrame == 0 {
105
109
t .Error ("Unexprected default value, check output of last round" )
106
110
}
@@ -165,31 +169,33 @@ func TestDemoInfoCs(t *testing.T) {
165
169
// Net-message stuff
166
170
var netTickHandlerID dispatch.HandlerIdentifier
167
171
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 )
169
173
p .UnregisterNetMessageHandler (netTickHandlerID )
170
174
})
171
175
172
176
ts := time .Now ()
173
177
174
178
frameByFrameCount := 1000
175
- fmt . Printf ("Parsing frame by frame (%d frames)\n " , frameByFrameCount )
179
+ t . Logf ("Parsing frame by frame (%d frames)\n " , frameByFrameCount )
176
180
177
181
for i := 0 ; i < frameByFrameCount ; i ++ {
178
182
ok , err := p .ParseNextFrame ()
179
183
assertions .NoError (err , "error occurred in ParseNextFrame()" )
180
184
assertions .True (ok , "parser reported end of demo after less than %d frames" , frameByFrameCount )
181
185
}
182
186
183
- fmt . Println ("Parsing to end" )
187
+ t . Log ("Parsing to end" )
184
188
err = p .ParseToEnd ()
185
189
assertions .NoError (err , "error occurred in ParseToEnd()" )
186
190
187
- fmt . Printf ("Took %s\n " , time .Since (ts ))
191
+ t . Logf ("Took %s\n " , time .Since (ts ))
188
192
189
193
assertGolden (t , assertions , "default" , actual .Bytes ())
190
194
}
191
195
192
196
func TestUnexpectedEndOfDemo (t * testing.T ) {
197
+ t .Parallel ()
198
+
193
199
if testing .Short () {
194
200
t .Skip ("skipping test due to -short flag" )
195
201
}
@@ -203,7 +209,9 @@ func TestUnexpectedEndOfDemo(t *testing.T) {
203
209
assert .Equal (t , demoinfocs .ErrUnexpectedEndOfDemo , err , "parsing cancelled but error was not ErrUnexpectedEndOfDemo" )
204
210
}
205
211
206
- func TestCancelParseToEnd (t * testing.T ) {
212
+ func TestParseToEnd_Cancel (t * testing.T ) {
213
+ t .Parallel ()
214
+
207
215
if testing .Short () {
208
216
t .Skip ("skipping test" )
209
217
}
@@ -232,7 +240,36 @@ func TestCancelParseToEnd(t *testing.T) {
232
240
assert .True (t , tix == maxTicks , "FrameDone handler was not triggered the correct amount of times" )
233
241
}
234
242
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
+
235
270
func TestInvalidFileType (t * testing.T ) {
271
+ t .Parallel ()
272
+
236
273
invalidDemoData := make ([]byte , 2048 )
237
274
_ , err := rand .Read (invalidDemoData )
238
275
assert .NoError (t , err , "failed to create/read random data" )
@@ -253,6 +290,8 @@ func TestInvalidFileType(t *testing.T) {
253
290
}
254
291
255
292
func TestConcurrent (t * testing.T ) {
293
+ t .Parallel ()
294
+
256
295
if testing .Short () {
257
296
t .Skip ("skipping test" )
258
297
}
@@ -262,19 +301,21 @@ func TestConcurrent(t *testing.T) {
262
301
var i int64
263
302
runner := func () {
264
303
n := atomic .AddInt64 (& i , 1 )
265
- fmt . Printf ("Starting concurrent runner %d\n " , n )
304
+ t . Logf ("Starting concurrent runner %d\n " , n )
266
305
267
306
ts := time .Now ()
268
307
269
308
parseDefaultDemo (t )
270
309
271
- fmt . Printf ("Runner %d took %s\n " , n , time .Since (ts ))
310
+ t . Logf ("Runner %d took %s\n " , n , time .Since (ts ))
272
311
}
273
312
274
313
runConcurrently (runner )
275
314
}
276
315
277
316
func parseDefaultDemo (tb testing.TB ) {
317
+ tb .Helper ()
318
+
278
319
f := openFile (tb , defaultDemPath )
279
320
defer mustClose (tb , f )
280
321
@@ -297,6 +338,8 @@ func runConcurrently(runner func()) {
297
338
}
298
339
299
340
func TestDemoSet (t * testing.T ) {
341
+ t .Parallel ()
342
+
300
343
if testing .Short () {
301
344
t .Skip ("skipping test due to -short flag" )
302
345
}
@@ -307,7 +350,7 @@ func TestDemoSet(t *testing.T) {
307
350
for _ , d := range dems {
308
351
name := d .Name ()
309
352
if strings .HasSuffix (name , ".dem" ) {
310
- fmt . Printf ("Parsing '%s/%s'\n " , demSetPath , name )
353
+ t . Logf ("Parsing '%s/%s'\n " , demSetPath , name )
311
354
func () {
312
355
f := openFile (t , fmt .Sprintf ("%s/%s" , demSetPath , name ))
313
356
defer mustClose (t , f )
@@ -318,6 +361,12 @@ func TestDemoSet(t *testing.T) {
318
361
319
362
p := demoinfocs .NewParser (f )
320
363
364
+ p .RegisterEventHandler (func (event events.GenericGameEvent ) {
365
+ if event .Name == "bot_takeover" {
366
+ t .Log (event .Data )
367
+ }
368
+ })
369
+
321
370
err = p .ParseToEnd ()
322
371
assert .Nil (t , err , "parsing of '%s/%s' failed" , demSetPath , name )
323
372
}()
@@ -362,13 +411,17 @@ func BenchmarkConcurrent(b *testing.B) {
362
411
}
363
412
364
413
func openFile (tb testing.TB , file string ) * os.File {
414
+ tb .Helper ()
415
+
365
416
f , err := os .Open (file )
366
417
assert .NoError (tb , err , "failed to open file %q" , file )
367
418
368
419
return f
369
420
}
370
421
371
422
func assertGolden (tb testing.TB , assertions * assert.Assertions , testCase string , actual []byte ) {
423
+ tb .Helper ()
424
+
372
425
const goldenVerificationGoVersionMin = "go1.12"
373
426
if ver := runtime .Version (); strings .Compare (ver , goldenVerificationGoVersionMin ) < 0 {
374
427
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,
417
470
418
471
func removePointers (s []byte ) []byte {
419
472
r := regexp .MustCompile (`\(0x[\da-f]{10}\)` )
473
+
420
474
return r .ReplaceAll (s , []byte ("(non-nil)" ))
421
475
}
422
476
423
477
func writeFile (assertions * assert.Assertions , file string , data []byte ) {
424
- err := ioutil .WriteFile (file , data , 0755 )
478
+ err := ioutil .WriteFile (file , data , 0600 )
425
479
assertions .NoError (err , "failed to write to file %q" , file )
426
480
}
427
481
428
482
func mustClose (tb testing.TB , closables ... io.Closer ) {
483
+ tb .Helper ()
484
+
429
485
mustCloseAssert (assert .New (tb ), closables ... )
430
486
}
431
487
0 commit comments