@@ -36,43 +36,60 @@ func TestCoverageApis(t *testing.T) {
36
36
mkdir (t , dir )
37
37
}
38
38
39
- // Build harness.
40
- bdir := mkdir (t , filepath .Join (dir , "build" ))
41
- hargs := []string {"-cover" , "-coverpkg=all" }
42
- if testing .CoverMode () != "" {
43
- hargs = append (hargs , "-covermode=" + testing .CoverMode ())
39
+ // Build harness. We need two copies of the harness, one built
40
+ // with -covermode=atomic and one built non-atomic.
41
+ bdir1 := mkdir (t , filepath .Join (dir , "build1" ))
42
+ hargs1 := []string {"-covermode=atomic" , "-coverpkg=all" }
43
+ atomicHarnessPath := buildHarness (t , bdir1 , hargs1 )
44
+ nonAtomicMode := testing .CoverMode ()
45
+ if testing .CoverMode () == "atomic" {
46
+ nonAtomicMode = "set"
44
47
}
45
- harnessPath := buildHarness (t , bdir , hargs )
48
+ bdir2 := mkdir (t , filepath .Join (dir , "build2" ))
49
+ hargs2 := []string {"-coverpkg=all" , "-covermode=" + nonAtomicMode }
50
+ nonAtomicHarnessPath := buildHarness (t , bdir2 , hargs2 )
46
51
47
- t .Logf ("harness path is %s" , harnessPath )
52
+ t .Logf ("atomic harness path is %s" , atomicHarnessPath )
53
+ t .Logf ("non-atomic harness path is %s" , nonAtomicHarnessPath )
48
54
49
55
// Sub-tests for each API we want to inspect, plus
50
56
// extras for error testing.
51
57
t .Run ("emitToDir" , func (t * testing.T ) {
52
58
t .Parallel ()
53
- testEmitToDir (t , harnessPath , dir )
59
+ testEmitToDir (t , atomicHarnessPath , dir )
54
60
})
55
61
t .Run ("emitToWriter" , func (t * testing.T ) {
56
62
t .Parallel ()
57
- testEmitToWriter (t , harnessPath , dir )
63
+ testEmitToWriter (t , atomicHarnessPath , dir )
58
64
})
59
65
t .Run ("emitToNonexistentDir" , func (t * testing.T ) {
60
66
t .Parallel ()
61
- testEmitToNonexistentDir (t , harnessPath , dir )
67
+ testEmitToNonexistentDir (t , atomicHarnessPath , dir )
62
68
})
63
69
t .Run ("emitToNilWriter" , func (t * testing.T ) {
64
70
t .Parallel ()
65
- testEmitToNilWriter (t , harnessPath , dir )
71
+ testEmitToNilWriter (t , atomicHarnessPath , dir )
66
72
})
67
73
t .Run ("emitToFailingWriter" , func (t * testing.T ) {
68
74
t .Parallel ()
69
- testEmitToFailingWriter (t , harnessPath , dir )
75
+ testEmitToFailingWriter (t , atomicHarnessPath , dir )
70
76
})
71
77
t .Run ("emitWithCounterClear" , func (t * testing.T ) {
72
78
t .Parallel ()
73
- testEmitWithCounterClear (t , harnessPath , dir )
79
+ testEmitWithCounterClear (t , atomicHarnessPath , dir )
80
+ })
81
+ t .Run ("emitToDirNonAtomic" , func (t * testing.T ) {
82
+ t .Parallel ()
83
+ testEmitToDirNonAtomic (t , nonAtomicHarnessPath , nonAtomicMode , dir )
84
+ })
85
+ t .Run ("emitToWriterNonAtomic" , func (t * testing.T ) {
86
+ t .Parallel ()
87
+ testEmitToWriterNonAtomic (t , nonAtomicHarnessPath , nonAtomicMode , dir )
88
+ })
89
+ t .Run ("emitWithCounterClearNonAtomic" , func (t * testing.T ) {
90
+ t .Parallel ()
91
+ testEmitWithCounterClearNonAtomic (t , nonAtomicHarnessPath , nonAtomicMode , dir )
74
92
})
75
-
76
93
}
77
94
78
95
// upmergeCoverData helps improve coverage data for this package
@@ -82,8 +99,8 @@ func TestCoverageApis(t *testing.T) {
82
99
// run from the "harness.exe" runs we've just done. We can accomplish
83
100
// this by doing a merge from the harness gocoverdir's to the test
84
101
// gocoverdir.
85
- func upmergeCoverData (t * testing.T , gocoverdir string ) {
86
- if testing .CoverMode () == "" {
102
+ func upmergeCoverData (t * testing.T , gocoverdir string , mode string ) {
103
+ if testing .CoverMode () != mode {
87
104
return
88
105
}
89
106
testGoCoverDir := os .Getenv ("GOCOVERDIR" )
@@ -243,8 +260,8 @@ func testEmitToDir(t *testing.T, harnessPath string, dir string) {
243
260
if cdc != wantcf {
244
261
t .Errorf ("EmitToDir: want %d counter-data files, got %d\n " , wantcf , cdc )
245
262
}
246
- upmergeCoverData (t , edir )
247
- upmergeCoverData (t , rdir )
263
+ upmergeCoverData (t , edir , "atomic" )
264
+ upmergeCoverData (t , rdir , "atomic" )
248
265
})
249
266
}
250
267
@@ -262,8 +279,8 @@ func testEmitToWriter(t *testing.T, harnessPath string, dir string) {
262
279
if msg := testForSpecificFunctions (t , edir , want , avoid ); msg != "" {
263
280
t .Errorf ("coverage data from %q output match failed: %s" , tp , msg )
264
281
}
265
- upmergeCoverData (t , edir )
266
- upmergeCoverData (t , rdir )
282
+ upmergeCoverData (t , edir , "atomic" )
283
+ upmergeCoverData (t , rdir , "atomic" )
267
284
})
268
285
}
269
286
@@ -276,8 +293,8 @@ func testEmitToNonexistentDir(t *testing.T, harnessPath string, dir string) {
276
293
t .Logf ("%s" , output )
277
294
t .Fatalf ("running 'harness -tp %s': %v" , tp , err )
278
295
}
279
- upmergeCoverData (t , edir )
280
- upmergeCoverData (t , rdir )
296
+ upmergeCoverData (t , edir , "atomic" )
297
+ upmergeCoverData (t , rdir , "atomic" )
281
298
})
282
299
}
283
300
@@ -298,8 +315,8 @@ func testEmitToUnwritableDir(t *testing.T, harnessPath string, dir string) {
298
315
t .Logf ("%s" , output )
299
316
t .Fatalf ("running 'harness -tp %s': %v" , tp , err )
300
317
}
301
- upmergeCoverData (t , edir )
302
- upmergeCoverData (t , rdir )
318
+ upmergeCoverData (t , edir , "atomic" )
319
+ upmergeCoverData (t , rdir , "atomic" )
303
320
})
304
321
}
305
322
@@ -312,8 +329,8 @@ func testEmitToNilWriter(t *testing.T, harnessPath string, dir string) {
312
329
t .Logf ("%s" , output )
313
330
t .Fatalf ("running 'harness -tp %s': %v" , tp , err )
314
331
}
315
- upmergeCoverData (t , edir )
316
- upmergeCoverData (t , rdir )
332
+ upmergeCoverData (t , edir , "atomic" )
333
+ upmergeCoverData (t , rdir , "atomic" )
317
334
})
318
335
}
319
336
@@ -326,73 +343,103 @@ func testEmitToFailingWriter(t *testing.T, harnessPath string, dir string) {
326
343
t .Logf ("%s" , output )
327
344
t .Fatalf ("running 'harness -tp %s': %v" , tp , err )
328
345
}
329
- upmergeCoverData (t , edir )
330
- upmergeCoverData (t , rdir )
346
+ upmergeCoverData (t , edir , "atomic" )
347
+ upmergeCoverData (t , rdir , "atomic" )
331
348
})
332
349
}
333
350
334
351
func testEmitWithCounterClear (t * testing.T , harnessPath string , dir string ) {
335
- // Ensure that we have two versions of the harness: one built with
336
- // -covermode=atomic and one built with -covermode=set (we need
337
- // both modes to test all of the functionality).
338
- var nonatomicHarnessPath , atomicHarnessPath string
339
- if testing .CoverMode () != "atomic" {
340
- nonatomicHarnessPath = harnessPath
341
- bdir2 := mkdir (t , filepath .Join (dir , "build2" ))
342
- hargs := []string {"-covermode=atomic" , "-coverpkg=all" }
343
- atomicHarnessPath = buildHarness (t , bdir2 , hargs )
344
- } else {
345
- atomicHarnessPath = harnessPath
346
- mode := "set"
347
- if testing .CoverMode () != "" && testing .CoverMode () != "atomic" {
348
- mode = testing .CoverMode ()
349
- }
350
- // Build a special nonatomic covermode version of the harness
351
- // (we need both modes to test all of the functionality).
352
- bdir2 := mkdir (t , filepath .Join (dir , "build2" ))
353
- hargs := []string {"-covermode=" + mode , "-coverpkg=all" }
354
- nonatomicHarnessPath = buildHarness (t , bdir2 , hargs )
355
- }
356
-
357
352
withAndWithoutRunner (func (setGoCoverDir bool , tag string ) {
358
- // First a run with the nonatomic harness path, which we
359
- // expect to fail.
360
353
tp := "emitWithCounterClear"
361
- rdir1 , edir1 := mktestdirs (t , tag , tp + "1" , dir )
362
- output , err := runHarness (t , nonatomicHarnessPath , tp ,
363
- setGoCoverDir , rdir1 , edir1 )
364
- if err == nil {
365
- t .Logf ("%s" , output )
366
- t .Fatalf ("running '%s -tp %s': unexpected success" ,
367
- nonatomicHarnessPath , tp )
368
- }
369
-
370
- // Next a run with the atomic harness path, which we
371
- // expect to succeed.
372
- rdir2 , edir2 := mktestdirs (t , tag , tp + "2" , dir )
373
- output , err = runHarness (t , atomicHarnessPath , tp ,
374
- setGoCoverDir , rdir2 , edir2 )
354
+ rdir , edir := mktestdirs (t , tag , tp , dir )
355
+ output , err := runHarness (t , harnessPath , tp ,
356
+ setGoCoverDir , rdir , edir )
375
357
if err != nil {
376
358
t .Logf ("%s" , output )
377
359
t .Fatalf ("running 'harness -tp %s': %v" , tp , err )
378
360
}
379
361
want := []string {tp , "postClear" }
380
362
avoid := []string {"preClear" , "main" , "final" }
381
- if msg := testForSpecificFunctions (t , edir2 , want , avoid ); msg != "" {
363
+ if msg := testForSpecificFunctions (t , edir , want , avoid ); msg != "" {
382
364
t .Logf ("%s" , output )
383
365
t .Errorf ("coverage data from %q output match failed: %s" , tp , msg )
384
366
}
385
-
386
- if testing .CoverMode () == "atomic" {
387
- upmergeCoverData (t , edir2 )
388
- upmergeCoverData (t , rdir2 )
389
- } else {
390
- upmergeCoverData (t , edir1 )
391
- upmergeCoverData (t , rdir1 )
392
- }
367
+ upmergeCoverData (t , edir , "atomic" )
368
+ upmergeCoverData (t , rdir , "atomic" )
393
369
})
394
370
}
395
371
372
+ func testEmitToDirNonAtomic (t * testing.T , harnessPath string , naMode string , dir string ) {
373
+ tp := "emitToDir"
374
+ tag := "nonatomdir"
375
+ rdir , edir := mktestdirs (t , tag , tp , dir )
376
+ output , err := runHarness (t , harnessPath , tp ,
377
+ true , rdir , edir )
378
+
379
+ // We expect an error here.
380
+ if err == nil {
381
+ t .Logf ("%s" , output )
382
+ t .Fatalf ("running 'harness -tp %s': did not get expected error" , tp )
383
+ }
384
+
385
+ got := strings .TrimSpace (string (output ))
386
+ want := "WriteCountersDir invoked for program built"
387
+ if ! strings .Contains (got , want ) {
388
+ t .Errorf ("running 'harness -tp %s': got:\n %s\n want: %s" ,
389
+ tp , got , want )
390
+ }
391
+ upmergeCoverData (t , edir , naMode )
392
+ upmergeCoverData (t , rdir , naMode )
393
+ }
394
+
395
+ func testEmitToWriterNonAtomic (t * testing.T , harnessPath string , naMode string , dir string ) {
396
+ tp := "emitToWriter"
397
+ tag := "nonatomw"
398
+ rdir , edir := mktestdirs (t , tag , tp , dir )
399
+ output , err := runHarness (t , harnessPath , tp ,
400
+ true , rdir , edir )
401
+
402
+ // We expect an error here.
403
+ if err == nil {
404
+ t .Logf ("%s" , output )
405
+ t .Fatalf ("running 'harness -tp %s': did not get expected error" , tp )
406
+ }
407
+
408
+ got := strings .TrimSpace (string (output ))
409
+ want := "WriteCounters invoked for program built"
410
+ if ! strings .Contains (got , want ) {
411
+ t .Errorf ("running 'harness -tp %s': got:\n %s\n want: %s" ,
412
+ tp , got , want )
413
+ }
414
+
415
+ upmergeCoverData (t , edir , naMode )
416
+ upmergeCoverData (t , rdir , naMode )
417
+ }
418
+
419
+ func testEmitWithCounterClearNonAtomic (t * testing.T , harnessPath string , naMode string , dir string ) {
420
+ tp := "emitWithCounterClear"
421
+ tag := "cclear"
422
+ rdir , edir := mktestdirs (t , tag , tp , dir )
423
+ output , err := runHarness (t , harnessPath , tp ,
424
+ true , rdir , edir )
425
+
426
+ // We expect an error here.
427
+ if err == nil {
428
+ t .Logf ("%s" , output )
429
+ t .Fatalf ("running 'harness -tp %s' nonatomic: did not get expected error" , tp )
430
+ }
431
+
432
+ got := strings .TrimSpace (string (output ))
433
+ want := "ClearCounters invoked for program built"
434
+ if ! strings .Contains (got , want ) {
435
+ t .Errorf ("running 'harness -tp %s': got:\n %s\n want: %s" ,
436
+ tp , got , want )
437
+ }
438
+
439
+ upmergeCoverData (t , edir , naMode )
440
+ upmergeCoverData (t , rdir , naMode )
441
+ }
442
+
396
443
func TestApisOnNocoverBinary (t * testing.T ) {
397
444
if testing .Short () {
398
445
t .Skipf ("skipping test: too long for short mode" )
0 commit comments