15
15
package main
16
16
17
17
import (
18
- "bufio"
19
18
"bytes"
20
19
"errors"
21
20
"flag"
22
21
"fmt"
23
- "math/rand"
24
22
"os"
25
23
"os/exec"
26
24
"path"
@@ -175,11 +173,17 @@ func runTestOnce(test test, mallocNumToFail int64) (passed bool, err error) {
175
173
} else {
176
174
cmd = exec .Command (prog , args ... )
177
175
}
178
- if test .Env != nil {
176
+ if test .Env != nil || test . numShards != 0 {
179
177
cmd .Env = make ([]string , len (os .Environ ()))
180
178
copy (cmd .Env , os .Environ ())
179
+ }
180
+ if test .Env != nil {
181
181
cmd .Env = append (cmd .Env , test .Env ... )
182
182
}
183
+ if test .numShards != 0 {
184
+ cmd .Env = append (cmd .Env , fmt .Sprintf ("GTEST_SHARD_INDEX=%d" , test .shard ))
185
+ cmd .Env = append (cmd .Env , fmt .Sprintf ("GTEST_TOTAL_SHARDS=%d" , test .numShards ))
186
+ }
183
187
var outBuf bytes.Buffer
184
188
cmd .Stdout = & outBuf
185
189
cmd .Stderr = & outBuf
@@ -270,7 +274,7 @@ func worker(tests <-chan test, results chan<- result, done *sync.WaitGroup) {
270
274
}
271
275
272
276
func (t test ) shortName () string {
273
- return t .Cmd [ 0 ] + t .shardMsg () + t .cpuMsg () + t .envMsg ()
277
+ return strings . Join ( t .Cmd , " " ) + t .shardMsg () + t .cpuMsg () + t .envMsg ()
274
278
}
275
279
276
280
func SpaceIf (returnSpace bool ) string {
@@ -281,7 +285,7 @@ func SpaceIf(returnSpace bool) string {
281
285
}
282
286
283
287
func (t test ) longName () string {
284
- return strings .Join (t .Env , " " ) + SpaceIf (len (t .Env ) != 0 ) + strings .Join (t .Cmd , " " ) + t .cpuMsg ()
288
+ return strings .Join (t .Env , " " ) + SpaceIf (len (t .Env ) != 0 ) + strings .Join (t .Cmd , " " ) + t .shardMsg () + t . cpuMsg ()
285
289
}
286
290
287
291
func (t test ) shardMsg () string {
@@ -318,70 +322,11 @@ func (t test) getGTestShards() ([]test, error) {
318
322
return []test {t }, nil
319
323
}
320
324
321
- prog := path .Join (* buildDir , t .Cmd [0 ])
322
- cmd := exec .Command (prog , "--gtest_list_tests" )
323
- var stdout bytes.Buffer
324
- cmd .Stdout = & stdout
325
- if err := cmd .Start (); err != nil {
326
- return nil , err
327
- }
328
- if err := cmd .Wait (); err != nil {
329
- return nil , err
330
- }
331
-
332
- var group string
333
- var tests []string
334
- scanner := bufio .NewScanner (& stdout )
335
- for scanner .Scan () {
336
- line := scanner .Text ()
337
-
338
- // Remove the parameter comment and trailing space.
339
- if idx := strings .Index (line , "#" ); idx >= 0 {
340
- line = line [:idx ]
341
- }
342
- line = strings .TrimSpace (line )
343
- if len (line ) == 0 {
344
- continue
345
- }
346
-
347
- if line [len (line )- 1 ] == '.' {
348
- group = line
349
- continue
350
- }
351
-
352
- if len (group ) == 0 {
353
- return nil , fmt .Errorf ("found test case %q without group" , line )
354
- }
355
- tests = append (tests , group + line )
356
- }
357
-
358
- const testsPerShard = 20
359
- if len (tests ) <= testsPerShard {
360
- return []test {t }, nil
361
- }
362
-
363
- // Slow tests which process large test vector files tend to be grouped
364
- // together, so shuffle the order.
365
- shuffled := make ([]string , len (tests ))
366
- perm := rand .Perm (len (tests ))
367
- for i , j := range perm {
368
- shuffled [i ] = tests [j ]
369
- }
370
-
371
- var shards []test
372
- for i := 0 ; i < len (shuffled ); i += testsPerShard {
373
- n := len (shuffled ) - i
374
- if n > testsPerShard {
375
- n = testsPerShard
376
- }
377
- shard := t
378
- shard .Cmd = []string {shard .Cmd [0 ], "--gtest_filter=" + strings .Join (shuffled [i :i + n ], ":" )}
379
- shard .shard = len (shards )
380
- shards = append (shards , shard )
381
- }
382
-
325
+ shards := make ([]test , * numWorkers )
383
326
for i := range shards {
384
- shards [i ].numShards = len (shards )
327
+ shards [i ] = t
328
+ shards [i ].shard = i
329
+ shards [i ].numShards = * numWorkers
385
330
}
386
331
387
332
return shards , nil
@@ -490,14 +435,14 @@ func main() {
490
435
if len (skipped ) > 0 {
491
436
fmt .Printf ("\n %d of %d tests were skipped:\n " , len (skipped ), len (testCases ))
492
437
for _ , test := range skipped {
493
- fmt .Printf ("\t %s%s \n " , strings . Join ( test .Cmd , " " ), test . cpuMsg ())
438
+ fmt .Printf ("\t %s\n " , test .shortName ())
494
439
}
495
440
}
496
441
497
442
if len (failed ) > 0 {
498
443
fmt .Printf ("\n %d of %d tests failed:\n " , len (failed ), len (testCases ))
499
444
for _ , test := range failed {
500
- fmt .Printf ("\t %s%s \n " , strings . Join ( test .Cmd , " " ), test . cpuMsg ())
445
+ fmt .Printf ("\t %s\n " , test .shortName ())
501
446
}
502
447
os .Exit (1 )
503
448
}
0 commit comments