// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package mounttablelib

import (
	"reflect"
	"testing"
	"time"

	"v.io/v23/naming"
	vdltime "v.io/v23/vdlroot/time"
)

var now = time.Now()

type fakeTime struct {
	theTime time.Time
}

func (ft *fakeTime) now() time.Time {
	return ft.theTime
}
func (ft *fakeTime) advance(d time.Duration) {
	ft.theTime = ft.theTime.Add(d)
}
func NewFakeTimeClock() *fakeTime {
	return &fakeTime{theTime: now}
}

func TestServerList(t *testing.T) {
	eps := []string{
		"endpoint:adfasdf@@who",
		"endpoint:sdfgsdfg@@x/",
		"endpoint:sdfgsdfg@@y",
		"endpoint:dfgsfdg@@",
	}

	// Test adding entries.
	ft := NewFakeTimeClock()
	setServerListClock(ft)
	sl := newServerList()
	for i, ep := range eps {
		sl.add(ep, time.Duration(5*i)*time.Second)
	}
	if sl.len() != len(eps) {
		t.Fatalf("got %d, want %d", sl.len(), len(eps))
	}

	// Test timing out entries.
	ft.advance(6 * time.Second)
	if numLeft, _ := sl.removeExpired(); numLeft != len(eps)-2 {
		t.Fatalf("got %d, want %d", sl.len(), len(eps)-2)
	}

	// Test removing entries.
	sl.remove(eps[2])
	if sl.len() != len(eps)-3 {
		t.Fatalf("got %d, want %d", sl.len(), len(eps)-3)
	}

	// Test copyToSlice.
	if got, want := sl.copyToSlice(), []naming.MountedServer{
		{
			Server:   "endpoint:dfgsfdg@@",
			Deadline: vdltime.Deadline{now.Add(15 * time.Second)},
		},
	}; !reflect.DeepEqual(got, want) {
		t.Errorf("Got %v, want %v", got, want)
	}
}
