package sharedcertprovider

/*
$ go test -bench=. .
goos: darwin
goarch: amd64
pkg: sharedcertprovider
cpu: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
BenchmarkChannelProvider-16        49003             25901 ns/op
BenchmarkMutexProvider-16         106971             10535 ns/op
BenchmarkRWMutexProvider-16      5733031               194.7 ns/op
*/

import (
	"context"
	"testing"
	"time"
)

func BenchmarkChannelProvider(b *testing.B) {
	bench(b, ChannelProvider)
}

func BenchmarkMutexProvider(b *testing.B) {
	bench(b, MutexProvider)
}

func BenchmarkRWMutexProvider(b *testing.B) {
	bench(b, RWMutexProvider)
}

func bench(b *testing.B, newProvider func(context.Context, time.Duration) Provider) {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	provider := newProvider(ctx, time.Second/1000)

	for i := 0; i < 50; i++ {
		go contend(ctx, provider)
	}

	for i := 0; i < b.N; i++ {
		cert := provider.GetCert()
		if !cert.Valid() {
			b.Logf("bad cert! %v xxx %v", time.Now(), provider.GetCert().validUntil)
			b.FailNow()
		}
	}
}

func contend(ctx context.Context, provider Provider) {
	for ctx.Err() == nil {
		provider.GetCert()
	}
}