github.com/ByteTerrace/packer@v1.3.2/packer/progressbar_test.go (about) 1 package packer 2 3 import ( 4 "sync" 5 "testing" 6 "time" 7 8 "github.com/cheggaaa/pb" 9 ) 10 11 func speedyProgressBar(bar *pb.ProgressBar) { 12 bar.SetUnits(pb.U_BYTES) 13 bar.SetRefreshRate(1 * time.Millisecond) 14 bar.NotPrint = true 15 bar.Format("[\x00=\x00>\x00-\x00]") 16 } 17 18 func TestStackableProgressBar_race(t *testing.T) { 19 bar := &StackableProgressBar{ 20 ConfigProgressbarFN: speedyProgressBar, 21 } 22 23 start42Fn := func() { bar.Start(42) } 24 finishFn := func() { bar.Finish() } 25 add21 := func() { bar.Add(21) } 26 // prefix := func() { bar.prefix() } 27 28 type fields struct { 29 pre func() 30 calls []func() 31 post func() 32 } 33 tests := []struct { 34 name string 35 fields fields 36 iterations int 37 }{ 38 {"all public", fields{nil, []func(){start42Fn, finishFn, add21, add21}, finishFn}, 300}, 39 {"add", fields{start42Fn, []func(){add21}, finishFn}, 300}, 40 {"add start", fields{start42Fn, []func(){start42Fn, add21}, finishFn}, 300}, 41 } 42 43 for _, tt := range tests { 44 tt := tt 45 t.Run(tt.name, func(t *testing.T) { 46 for i := 0; i < tt.iterations; i++ { 47 if tt.fields.pre != nil { 48 tt.fields.pre() 49 } 50 var startWg, endWg sync.WaitGroup 51 startWg.Add(1) 52 endWg.Add(len(tt.fields.calls)) 53 for _, call := range tt.fields.calls { 54 call := call 55 go func() { 56 defer endWg.Done() 57 startWg.Wait() 58 call() 59 }() 60 } 61 startWg.Done() // everyone is initialized, let's unlock everyone at the same time. 62 // .... 63 endWg.Wait() // wait for all calls to return. 64 if tt.fields.post != nil { 65 tt.fields.post() 66 } 67 } 68 }) 69 } 70 71 }