@@ -3,6 +3,7 @@ package demoinfocs_test
33import (
44 "bytes"
55 "crypto/rand"
6+ "flag"
67 "fmt"
78 "io/ioutil"
89 "os"
@@ -28,7 +29,12 @@ const defaultDemPath = csDemosPath + "/default.dem"
2829const unexpectedEndOfDemoPath = csDemosPath + "/unexpected_end_of_demo.dem"
2930const valveMatchmakingDemoPath = csDemosPath + "/valve_matchmaking.dem"
3031
32+ var concurrentDemos int
33+
3134func init () {
35+ flag .IntVar (& concurrentDemos , "concurrentdemos" , 2 , "The `number` of current demos" )
36+ flag .Parse ()
37+
3238 if _ , err := os .Stat (defaultDemPath ); err != nil {
3339 panic (fmt .Sprintf ("Failed to read test demo %q" , defaultDemPath ))
3440 }
@@ -287,36 +293,46 @@ func TestHeaderNotParsed(t *testing.T) {
287293}
288294
289295func TestConcurrent (t * testing.T ) {
296+ t .Logf ("Running concurrency test with %d demos\n " , concurrentDemos )
297+
290298 var i int64
291299 runner := func () {
292- f , err := os .Open (defaultDemPath )
293- if err != nil {
294- t .Fatal (err )
295- }
296- defer f .Close ()
297-
298- p := dem .NewParser (f )
299-
300- _ , err = p .ParseHeader ()
301- if err != nil {
302- t .Fatal (err )
303- }
304-
305300 n := atomic .AddInt64 (& i , 1 )
306- fmt .Printf ("Starting runner %d\n " , n )
301+ fmt .Printf ("Starting concurrent runner %d\n " , n )
307302
308303 ts := time .Now ()
309304
310- err = p .ParseToEnd ()
311- if err != nil {
312- t .Fatal (err )
313- }
305+ parseDefaultDemo (t )
314306
315307 fmt .Printf ("Runner %d took %s\n " , n , time .Since (ts ))
316308 }
317309
310+ runConcurrently (runner )
311+ }
312+
313+ func parseDefaultDemo (tb testing.TB ) {
314+ f , err := os .Open (defaultDemPath )
315+ if err != nil {
316+ tb .Fatal (err )
317+ }
318+ defer f .Close ()
319+
320+ p := dem .NewParser (f )
321+
322+ _ , err = p .ParseHeader ()
323+ if err != nil {
324+ tb .Fatal (err )
325+ }
326+
327+ err = p .ParseToEnd ()
328+ if err != nil {
329+ tb .Fatal (err )
330+ }
331+ }
332+
333+ func runConcurrently (runner func ()) {
318334 var wg sync.WaitGroup
319- for j := 0 ; j < 2 ; j ++ {
335+ for i := 0 ; i < concurrentDemos ; i ++ {
320336 wg .Add (1 )
321337 go func () { runner (); wg .Done () }()
322338 }
@@ -344,7 +360,7 @@ func TestDemoSet(t *testing.T) {
344360 defer func () {
345361 pErr := recover ()
346362 if pErr != nil {
347- t .Errorf ("Failed to parse '%s/%s': %s\n " , demSetPath , name , pErr )
363+ t .Errorf ("Parsing of '%s/%s' paniced : %s\n " , demSetPath , name , pErr )
348364 }
349365 }()
350366
@@ -367,29 +383,7 @@ func TestDemoSet(t *testing.T) {
367383
368384func BenchmarkDemoInfoCs (b * testing.B ) {
369385 for i := 0 ; i < b .N ; i ++ {
370- func () {
371- f , err := os .Open (defaultDemPath )
372- if err != nil {
373- b .Fatal (err )
374- }
375- defer f .Close ()
376-
377- p := dem .NewParser (f )
378-
379- _ , err = p .ParseHeader ()
380- if err != nil {
381- b .Fatal (err )
382- }
383-
384- ts := time .Now ()
385-
386- err = p .ParseToEnd ()
387- if err != nil {
388- b .Fatal (err )
389- }
390-
391- b .Logf ("Took %s\n " , time .Since (ts ))
392- }()
386+ parseDefaultDemo (b )
393387 }
394388}
395389
@@ -420,13 +414,17 @@ func BenchmarkInMemory(b *testing.B) {
420414 b .Fatal (err )
421415 }
422416
423- ts := time .Now ()
424-
425417 err = p .ParseToEnd ()
426418 if err != nil {
427419 b .Fatal (err )
428420 }
421+ }
422+ }
429423
430- b .Logf ("Took %s\n " , time .Since (ts ))
424+ func BenchmarkConcurrent (b * testing.B ) {
425+ b .Logf ("Running concurrency benchmark with %d demos\n " , concurrentDemos )
426+
427+ for i := 0 ; i < b .N ; i ++ {
428+ runConcurrently (func () { parseDefaultDemo (b ) })
431429 }
432430}
0 commit comments