// Copyright 2016 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 vsync

import "container/heap"
import "math/rand"
import "testing"
import "time"

import "v.io/v23/context"
import wire "v.io/v23/services/syncbase"
import "v.io/v23/verror"
import "v.io/x/lib/nsync"
import blob "v.io/x/ref/services/syncbase/localblobstore"

// TestBlobFetchStateHeap() tests that blobFetchStateHeap() does indeed act as a heap,
// ordered by blobFetchState.nextAttempt
func TestBlobFetchStateHeap(t *testing.T) {
	var queue blobFetchStateHeap
	var list []*blobFetchState
	now := time.Now()
	heap.Init(&queue) // "container/heap"'s spec requires this---apparently even on an empty heap.
	for loop := 0; loop != 1000000; loop++ {
		op := rand.Int31n(4)
		switch op {
		case 0, 1: // add an entry
			bfs := &blobFetchState{nextAttempt: now.Add(time.Duration(rand.Int63()))}
			heap.Push(&queue, bfs)
			i := len(list)
			list = append(list, bfs)
			for i != 0 && bfs.nextAttempt.Before(list[i-1].nextAttempt) {
				list[i] = list[i-1]
				i--
			}
			list[i] = bfs
		case 2: // remove an entry from the root, if there is one
			if len(queue) != 0 {
				bfs := heap.Pop(&queue).(*blobFetchState)
				if bfs != list[0] {
					t.Fatalf("loop %d: Pop: lowest in heap is not lowest in list", loop)
				}
				copy(list[:], list[1:])
				list = list[0 : len(list)-1]
			}
		case 3: // remove an arbitrary entry, if there is one.
			if len(queue) != 0 {
				i := rand.Int31n(int32(len(list)))
				heapIndex := list[i].heapIndex
				bfs := heap.Remove(&queue, heapIndex).(*blobFetchState)
				if bfs != list[i] {
					t.Fatalf("loop %d: Remove() blobFetchState index %d differs from list index %d",
						loop, heapIndex, i)
				}
				copy(list[i:], list[i+1:])
				list = list[0 : len(list)-1]
			}
		}

		// check heap consistency
		if len(queue) != len(list) {
			t.Fatalf("loop %d: len(queue)==%d != %d==len(list)", loop)
		}
		if len(queue) != 0 && queue[0] != list[0] {
			t.Fatalf("loop %d: lowest in heap is not lowest in list", loop)
		}
		for i := 0; i != len(queue); i++ {
			if i != queue[i].heapIndex {
				t.Fatalf("loop %d: heapIndex incorrect: %d != %d", loop, i, queue[i].heapIndex)
			}
		}
	}
}

// A fakeFetchData is passed to fakeBlobFetchFunc() via StartFetchingBlob()'s
// clientData argument.  It holds the data used to fake a fetch, and to
// notify of its completion.
type fakeFetchData struct {
	t     *testing.T
	delay time.Duration // how long each fake fetch waits

	mu                 nsync.Mu             // protects fields below
	fetchesRemaining   int                  // number of outstanding fetches remaining; under mu
	noFetchesRemaining nsync.CV             // signalled when fetchesRemaining==0
	errorsOn           map[wire.BlobRef]int // report an error fetching blob b errorsOn[b] times
}

const pkgPath = "v.io/x/ref/services/syncbase/vsync"

var errFakeBlobFetchError = verror.Register(pkgPath+".fakeBlobFetchError", verror.NoRetry, "{1:}{2:} fakeBlobFetch error")

// fakeBlobFetchFunc() is a fake blob fetching routine.  It's used in this unit test
// to verify that the basic queueing of the server blob fetching mechanism works.
// The real blob fetching path is tested by TestV23ServerBlobFetch in v.io/v23/syncbase/featuretests.
func fakeBlobFetchFunc(ctx *context.T, blobRef wire.BlobRef, ffdi interface{}) error {
	ffd := ffdi.(*fakeFetchData)
	var err error

	time.Sleep(ffd.delay) // simulate a delay in fetching the blob.

	ffd.mu.Lock()
	var errorCount int = ffd.errorsOn[blobRef]
	if errorCount != 0 {
		// If we were instructed to fake an error in fetching this blob, do it.
		ffd.errorsOn[blobRef] = errorCount - 1
		err = verror.New(errFakeBlobFetchError, ctx, blobRef)
	} else {
		// Otherwise, claim success, and report that the fetch of this blob is complete.
		ffd.fetchesRemaining--
		if ffd.fetchesRemaining < 0 {
			panic("finished more fetches than were started")
		}
		if ffd.fetchesRemaining == 0 {
			ffd.noFetchesRemaining.Broadcast()
		}
	}
	ffd.mu.Unlock()

	return err
}

// makeNewBlobRef() creates a blob ref by writing a new empty blob.
func makeNewBlobRef(t *testing.T, ctx *context.T, bst blob.BlobStore) wire.BlobRef {
	var writer blob.BlobWriter
	var err error
	writer, err = bst.NewBlobWriter(ctx, "")
	if err != nil {
		t.Fatalf("can't make a blob writer: %v\n", err)
	}
	var blobRef wire.BlobRef = wire.BlobRef(writer.Name())
	writer.CloseWithoutFinalize()
	return blobRef
}

// TestBlobFetch() is a unit test for the blob fetcher, using fake code to actually fetch blobs.
func TestBlobFetchSimple(t *testing.T) {
	svc := createService(t)

	ctx, bfShutdown := context.RootContext()
	defer bfShutdown()

	var ss *syncService = svc.sync
	var bst blob.BlobStore = ss.bst

	const threadCount = 10 // number of threads in BlobFetcher
	bf := NewBlobFetcher(ctx, threadCount)
	ffd := fakeFetchData{
		t:        t,
		delay:    500 * time.Millisecond, // a short delay so test doesn't run too long.
		errorsOn: make(map[wire.BlobRef]int),
	}

	start := time.Now()

	// Create fetchCount BlobRefs and fake a fetch on each.
	// In this initial run, no errors are generated.
	const fetchCount = 100
	for i := 0; i != fetchCount; i++ {
		var blobRef wire.BlobRef = makeNewBlobRef(t, ctx, bst)

		ffd.mu.Lock()
		ffd.fetchesRemaining++
		ffd.mu.Unlock()
		bf.StartFetchingBlob(svc.sync.bst, blobRef, &ffd, time.Now().Add(10*time.Minute), fakeBlobFetchFunc)
	}

	// Wait until all fetching is done.  The test would deadlock here if
	// our fetch function was not called the right number of times.
	ffd.mu.Lock()
	for ffd.fetchesRemaining != 0 {
		ffd.noFetchesRemaining.Wait(&ffd.mu)
	}
	ffd.mu.Unlock()
	end := time.Now()

	// Check that the fetching took about the correct amount of time,
	// given the fetch delays and the amount of concurrency requested.
	var elapsed time.Duration = end.Sub(start)
	var expectedElapsed time.Duration = (ffd.delay * fetchCount) / threadCount
	var expectedMinElapsed time.Duration = expectedElapsed / 2
	var expectedMaxElapsed time.Duration = expectedElapsed * 4
	if elapsed < expectedMinElapsed {
		t.Errorf("BlobFetcher completed in %v, expected at least %v", elapsed, expectedMinElapsed)
	}
	if elapsed > expectedMaxElapsed {
		t.Errorf("BlobFetcher completed in %v, expected at most %v", elapsed, expectedMaxElapsed)
	}

	// Now run the test again, but introduce errors on the first fetch of
	// each blob, and issue duplicate requests to fetch each blob.
	// Use a different set of blob ids than the last test, so that there
	// will be no duplicates left in the blob fetcher's queue, which would
	// cause duplicate suppression to kick in unexpectedly.
	start = time.Now()
	for i := 0; i != fetchCount; i++ {
		var blobRef wire.BlobRef = makeNewBlobRef(t, ctx, bst)

		ffd.mu.Lock()
		ffd.fetchesRemaining++
		ffd.errorsOn[blobRef] = 1
		ffd.mu.Unlock()
		for j := 0; j != 3; j++ {
			// Issue duplicate requests; the duplicates will be ignored.
			bf.StartFetchingBlob(svc.sync.bst, blobRef, &ffd, time.Now().Add(10*time.Minute), fakeBlobFetchFunc)
		}
	}
	// Wait for fetches to complete.  We would deadlock here if our fetch
	// function didn't ultimately return true for each blob.  The fake test
	// function would panic() if it was called too many times, due to the
	// duplicate requests.
	ffd.mu.Lock()
	for ffd.fetchesRemaining != 0 {
		ffd.noFetchesRemaining.Wait(&ffd.mu)
	}
	ffd.mu.Unlock()

	// Check that the fetching took about the correct amount of time,
	// given the fetch delays and the amount of concurrency requested.
	end = time.Now()
	elapsed = end.Sub(start)
	const retryDelay = 1000 * time.Millisecond // min time for first retry, with current parameters.
	expectedElapsed = ((2 * ffd.delay * fetchCount) / threadCount) + retryDelay
	expectedMinElapsed = expectedElapsed / 2
	expectedMaxElapsed = expectedElapsed * 4
	if elapsed < expectedMinElapsed {
		t.Errorf("BlobFetcher completed in %v, expected at least %v", elapsed, expectedMinElapsed)
	}
	if elapsed > expectedMaxElapsed {
		t.Errorf("BlobFetcher completed in %v, expected at most %v", elapsed, expectedMaxElapsed)
	}

	// Shut everything down.
	bfShutdown()
	bf.WaitForExit()
	destroyService(t, svc)
}
