package main

import (
	"sync"
	"testing"
)

func TestSnapshots(t *testing.T) {
	r := &Registry{}
	s := Snapshot{1, []Endpoint{{"A", 1, 0, true, false}}}
	if err := r.Publish(s); err != nil {
		t.Fatal(err)
	}
	s.Endpoints[0].Name = "caller changed"
	if r.Read().Endpoints[0].Name != "A" {
		t.Fatal("input alias")
	}
	if r.Publish(Snapshot{1, nil}) == nil || r.Publish(Snapshot{2, []Endpoint{{Name: "B"}}}) == nil {
		t.Fatal("accepted invalid update")
	}
	var wg sync.WaitGroup
	for range 8 {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for range 50 {
				s := r.Read()
				s.Endpoints[0].Name = "local"
			}
		}()
	}
	wg.Wait()
}
func TestPicker(t *testing.T) {
	a := Endpoint{"A", 1, 8, true, false}
	b := Endpoint{"B", 2, 6, true, false}
	n, e := p2c(a, b)
	if e != nil || n != "B" {
		t.Fatal(n, e)
	}
	a.Draining = true
	b.Ready = false
	if _, e = p2c(a, b); e == nil {
		t.Fatal("routed to unhealthy")
	}
}
