// Copyright 2020 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package faketime_test

import (
	"testing"
	"time"

	"gvisor.dev/gvisor/pkg/tcpip/faketime"
)

func TestManualClockAdvance(t *testing.T) {
	const timeout = time.Millisecond
	clock := faketime.NewManualClock()
	start := clock.NowMonotonic()
	clock.Advance(timeout)
	if got, want := time.Duration(clock.NowMonotonic()-start)*time.Nanosecond, timeout; got != want {
		t.Errorf("got = %d, want = %d", got, want)
	}
}

func TestManualClockAfterFunc(t *testing.T) {
	const (
		timeout1 = time.Millisecond     // timeout for counter1
		timeout2 = 2 * time.Millisecond // timeout for counter2
	)
	tests := []struct {
		name         string
		advance      time.Duration
		wantCounter1 int
		wantCounter2 int
	}{
		{
			name:         "before timeout1",
			advance:      timeout1 - 1,
			wantCounter1: 0,
			wantCounter2: 0,
		},
		{
			name:         "timeout1",
			advance:      timeout1,
			wantCounter1: 1,
			wantCounter2: 0,
		},
		{
			name:         "timeout2",
			advance:      timeout2,
			wantCounter1: 1,
			wantCounter2: 1,
		},
		{
			name:         "after timeout2",
			advance:      timeout2 + 1,
			wantCounter1: 1,
			wantCounter2: 1,
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			clock := faketime.NewManualClock()
			counter1 := 0
			counter2 := 0
			clock.AfterFunc(timeout1, func() {
				counter1++
			})
			clock.AfterFunc(timeout2, func() {
				counter2++
			})
			start := clock.NowMonotonic()
			clock.Advance(test.advance)
			if got, want := counter1, test.wantCounter1; got != want {
				t.Errorf("got counter1 = %d, want = %d", got, want)
			}
			if got, want := counter2, test.wantCounter2; got != want {
				t.Errorf("got counter2 = %d, want = %d", got, want)
			}
			if got, want := time.Duration(clock.NowMonotonic()-start)*time.Nanosecond, test.advance; got != want {
				t.Errorf("got elapsed = %d, want = %d", got, want)
			}
		})
	}
}
