package service

import (
	crand "crypto/rand"
	"math"
	"math/big"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestJitterForHost(t *testing.T) {
	jh := newJitterHashTable(30)

	histogram := make(map[int64]int)
	hostCount := 3000
	for i := 0; i < hostCount; i++ {
		hostID, err := crand.Int(crand.Reader, big.NewInt(10000))
		require.NoError(t, err)
		jitter := jh.jitterForHost(uint(hostID.Int64() + 10000))
		jitterMinutes := int64(jitter.Minutes())
		histogram[jitterMinutes]++
	}
	min, max := math.MaxInt, 0
	for jitterMinutes, count := range histogram {
		if count < min {
			min = count
		}
		if count > max {
			max = count
		}
		t.Logf("jitterMinutes=%d \t count=%d\n", jitterMinutes, count)
	}
	variation := max - min
	t.Logf("min=%d \t max=%d \t variation=%d\n", min, max, variation)

	// check that variation is below 1% of the total amount of hosts
	require.Less(t, variation, int(float32(hostCount)/0.01))
}

func TestNoJitter(t *testing.T) {
	jh := newJitterHashTable(0)

	hostCount := 3000
	for i := 0; i < hostCount; i++ {
		hostID, err := crand.Int(crand.Reader, big.NewInt(10000))
		require.NoError(t, err)
		jitter := jh.jitterForHost(uint(hostID.Int64() + 10000))
		jitterMinutes := int64(jitter.Minutes())
		require.Equal(t, int64(0), jitterMinutes)
	}
}
