github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/metric/gauge_test.go (about)

     1  package metric_test
     2  
     3  import (
     4  	"runtime"
     5  	"sync"
     6  
     7  	. "github.com/pf-qiu/concourse/v6/atc/metric"
     8  
     9  	. "github.com/onsi/ginkgo"
    10  	. "github.com/onsi/gomega"
    11  )
    12  
    13  var _ = Describe("Gauge", func() {
    14  	var gauge *Gauge
    15  
    16  	BeforeEach(func() {
    17  		gauge = &Gauge{}
    18  	})
    19  
    20  	It("tracks the maximum value seen since last checked", func() {
    21  		gauge.Inc()
    22  		gauge.Inc()
    23  		gauge.Dec()
    24  
    25  		Expect(gauge.Max()).To(Equal(float64(2)))
    26  	})
    27  
    28  	It("deals with concurrent increments correctly", func() {
    29  		// buckle up
    30  		defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(runtime.NumCPU()))
    31  
    32  		totalIncs := 30
    33  		wg := new(sync.WaitGroup)
    34  		wg.Add(totalIncs)
    35  
    36  		for i := 0; i < totalIncs; i++ {
    37  			go func() {
    38  				gauge.Inc()
    39  				wg.Done()
    40  			}()
    41  		}
    42  
    43  		wg.Wait()
    44  
    45  		Expect(gauge.Max()).To(Equal(float64(totalIncs)))
    46  	})
    47  
    48  	It("resets the max to the current value when observed", func() {
    49  		gauge.Inc()
    50  		gauge.Inc()
    51  		gauge.Dec()
    52  
    53  		Expect(gauge.Max()).To(Equal(float64(2)))
    54  
    55  		Expect(gauge.Max()).To(Equal(float64(1)))
    56  	})
    57  })