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  }