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

import (
	"testing"
	"time"

	"v.io/v23/services/application"
)

// TestRestartPolicy verifies that the daemon mode restart policy operates
// as intended.
func TestRestartPolicy(t *testing.T) {
	nbr := newBasicRestartPolicy()

	type tV struct {
		envelope *application.Envelope
		info     *instanceInfo
		wantInfo *instanceInfo
		decision bool
	}

	testVectors := []tV{
		// -1 means always restart.
		{
			&application.Envelope{
				Restarts: -1,
			},
			&instanceInfo{
				Restarts: 0,
			},
			&instanceInfo{
				Restarts: 0,
			},
			true,
		},
		// 0 means restart exactly 0 times.
		{
			&application.Envelope{
				Restarts: 0,
			},
			&instanceInfo{
				Restarts: 0,
			},
			&instanceInfo{
				Restarts: 0,
			},
			false,
		},
		// 1 means restart once (2 invocations total)
		{
			&application.Envelope{
				Restarts:          1,
				RestartTimeWindow: time.Hour,
			},
			&instanceInfo{
				Restarts: 0,
			},
			&instanceInfo{
				Restarts:           1,
				RestartWindowBegan: time.Now(),
			},
			true,
		},
		// but only ever once.
		{
			&application.Envelope{
				Restarts:          1,
				RestartTimeWindow: time.Hour,
			},
			&instanceInfo{
				Restarts:           1,
				RestartWindowBegan: time.Date(2015, time.December, 25, 12, 0, 0, 0, time.UTC),
			},
			&instanceInfo{
				Restarts:           1,
				RestartWindowBegan: time.Date(2015, time.December, 25, 12, 0, 0, 0, time.UTC),
			},
			false,
		},
		// after time window, restart count is reset.
		{
			&application.Envelope{
				Restarts:          1,
				RestartTimeWindow: time.Minute,
			},
			&instanceInfo{
				Restarts:           1,
				RestartWindowBegan: time.Now().Add(-time.Hour),
			},
			&instanceInfo{
				Restarts:           1,
				RestartWindowBegan: time.Now(),
			},
			true,
		},
		// Every time a restart happens, the beginning of the window
		// should be reset.
		{
			&application.Envelope{
				Restarts:          2,
				RestartTimeWindow: time.Minute,
			},
			&instanceInfo{
				Restarts:           1,
				RestartWindowBegan: time.Now().Add(-10 * time.Second),
			},
			&instanceInfo{
				Restarts:           2,
				RestartWindowBegan: time.Now(),
			},
			true,
		},
	}

	for ti, tv := range testVectors {
		if got, want := nbr.decide(tv.envelope, tv.info), tv.decision; got != want {
			t.Errorf("Test case #%d: basicDecisionPolicy decide: got %v, want %v", ti, got, want)
		}

		if got, want := tv.info.Restarts, tv.wantInfo.Restarts; got != want {
			t.Errorf("basicDecisionPolicy instanceInfo Restarts update got %v, want %v", got, want)
		}

		// Times should be "nearly" same.
		if got, want := tv.info.RestartWindowBegan, tv.wantInfo.RestartWindowBegan; !((got.Sub(want) < time.Second) && (got.Sub(want) >= 0)) {
			t.Errorf("Test case #%d: basicDecisionPolicy instanceInfo RestartTimeBegan got %v, want %v", ti, got, want)
		}
	}
}
