github.com/aavshr/aws-sdk-go@v1.41.3/aws/credentials/credentials_bench_test.go (about)

     1  //go:build go1.9
     2  // +build go1.9
     3  
     4  package credentials
     5  
     6  import (
     7  	"fmt"
     8  	"strconv"
     9  	"sync"
    10  	"testing"
    11  	"time"
    12  )
    13  
    14  func BenchmarkCredentials_Get(b *testing.B) {
    15  	stub := &stubProvider{}
    16  
    17  	cases := []int{1, 10, 100, 500, 1000, 10000}
    18  
    19  	for _, c := range cases {
    20  		b.Run(strconv.Itoa(c), func(b *testing.B) {
    21  			creds := NewCredentials(stub)
    22  			var wg sync.WaitGroup
    23  			wg.Add(c)
    24  			for i := 0; i < c; i++ {
    25  				go func() {
    26  					for j := 0; j < b.N; j++ {
    27  						v, err := creds.Get()
    28  						if err != nil {
    29  							b.Errorf("expect no error %v, %v", v, err)
    30  						}
    31  					}
    32  					wg.Done()
    33  				}()
    34  			}
    35  			b.ResetTimer()
    36  
    37  			wg.Wait()
    38  		})
    39  	}
    40  }
    41  
    42  func BenchmarkCredentials_Get_Expire(b *testing.B) {
    43  	p := &blockProvider{}
    44  
    45  	expRates := []int{10000, 1000, 100}
    46  	cases := []int{1, 10, 100, 500, 1000, 10000}
    47  
    48  	for _, expRate := range expRates {
    49  		for _, c := range cases {
    50  			b.Run(fmt.Sprintf("%d-%d", expRate, c), func(b *testing.B) {
    51  				creds := NewCredentials(p)
    52  				var wg sync.WaitGroup
    53  				wg.Add(c)
    54  				for i := 0; i < c; i++ {
    55  					go func(id int) {
    56  						for j := 0; j < b.N; j++ {
    57  							v, err := creds.Get()
    58  							if err != nil {
    59  								b.Errorf("expect no error %v, %v", v, err)
    60  							}
    61  							// periodically expire creds to cause rwlock
    62  							if id == 0 && j%expRate == 0 {
    63  								creds.Expire()
    64  							}
    65  						}
    66  						wg.Done()
    67  					}(i)
    68  				}
    69  				b.ResetTimer()
    70  
    71  				wg.Wait()
    72  			})
    73  		}
    74  	}
    75  }
    76  
    77  type blockProvider struct {
    78  	creds   Value
    79  	expired bool
    80  	err     error
    81  }
    82  
    83  func (s *blockProvider) Retrieve() (Value, error) {
    84  	s.expired = false
    85  	s.creds.ProviderName = "blockProvider"
    86  	time.Sleep(time.Millisecond)
    87  	return s.creds, s.err
    88  }
    89  func (s *blockProvider) IsExpired() bool {
    90  	return s.expired
    91  }