// 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 vclock

import (
	"testing"
	"time"

	"v.io/x/ref/services/syncbase/server/util"
)

func TestVClockBasic(t *testing.T) {
	sysTs := time.Now()
	c := NewVClockForTests(newMockSystemClock(sysTs, 0))
	if ts, err := c.Now(); err != nil {
		t.Errorf("c.Now failed: %v", err)
	} else if ts != sysTs {
		t.Errorf("got %v, want %v", ts, sysTs)
	}
}

func TestVClockWithSkew(t *testing.T) {
	// test with positive skew
	checkSkew(t, 5)
	// test with negative skew
	checkSkew(t, -5)
}

func checkSkew(t *testing.T, skew time.Duration) {
	sysTs := time.Now()
	c := NewVClockForTests(newMockSystemClock(sysTs, 0))

	ntpTs := sysTs.Add(time.Duration(-20))
	elapsedTime := 100 * time.Nanosecond
	bootTime := sysTs.Add(-elapsedTime)

	if err := util.Put(nil, c.st, vclockDataKey, newVClockData(bootTime, skew, elapsedTime, ntpTs, 1, 1)); err != nil {
		t.Errorf("Writing VClockData failed: %v", err)
	}

	if ts, err := c.Now(); err != nil {
		t.Errorf("c.Now failed: %v", err)
	} else if ts != sysTs.Add(skew) {
		t.Errorf("expected ts == sysTs + skew: %v, %v, %v", ts, sysTs, skew)
	}
}

func TestApplySkew(t *testing.T) {
	c := NewVClockForTests(nil)
	data := newVClockData(time.Time{}, time.Minute, 0, time.Time{}, 0, 0)
	sysTs := time.Now()
	adjTs := c.ApplySkew(sysTs, data)
	if adjTs.Sub(sysTs) != time.Minute {
		t.Errorf("Unexpected diff: sysTs %v, adjTs %v", sysTs, adjTs)
	}
}
