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

// concurrency_test is a simple test of the framework for systematic
// testing of concurrency.
package concurrency_test

import (
	"fmt"
	"io/ioutil"
	"os"
	"testing"
	"time"

	"v.io/x/lib/vlog"
	"v.io/x/ref/profiles/internal/testing/concurrency"
	"v.io/x/ref/profiles/internal/testing/concurrency/sync"
)

var m sync.Mutex

// createMutexSets returns sets of thread identifiers that match the
// logic of mutexThreadClosure.
func createMutexSet(n int) map[int]bool {
	locks := make(map[int]bool)
	for i := 1; i <= n; i++ {
		locks[i] = true
	}
	return locks
}

// generateMutexOutputs generates all legal outputs of sequencing
// calls to rw.Lock(), rw.Unlock(). The input identifies the threads
// that wish to invoke these functions.
func generateMutexOutputs(locks map[int]bool) []string {
	if length(locks) == 0 {
		return []string{""}
	}
	result := make([]string, 0)
	for lock, ok := range locks {
		if ok {
			locks[lock] = false
			for _, s := range generateMutexOutputs(locks) {
				result = append(result, fmt.Sprintf("%d:Lock()%d:Unlock()%s", lock, lock, s))
			}
			locks[lock] = true
		}
	}
	return result
}

// mutexThreadClosure folds the input arguments inside of the function body
// as the testing framework only supports functions with no arguments.
func mutexThreadClosure(t *testing.T, n, max int, out *os.File) func() {
	return func() {
		defer concurrency.Exit()
		if n < max {
			child := mutexThreadClosure(t, n+1, max, out)
			concurrency.Start(child)
		}
		m.Lock()
		fmt.Fprintf(out, "%d:Lock()", n)
		m.Unlock()
		fmt.Fprintf(out, "%d:Unlock()", n)
	}
}

// TestMutex runs mutexThreadCLosure() without systematically testing
// concurrency.
func TestMutex(t *testing.T) {
	for n := 2; n < 6; n++ {
		thread := mutexThreadClosure(t, 1, n, nil)
		thread()
	}
}

// TestMutexExplore runs mutexThreadClosure() using the framework for systematic
// testing of concurrency, checking that the exploration explores the
// correct number of interleavings.
func TestMutexExplore(t *testing.T) {
	for n := 2; n < 6; n++ {
		out, err := ioutil.TempFile("", "")
		if err != nil {
			t.Fatalf("TempFile() failed: %v", err)
		}
		defer os.Remove(out.Name())
		defer out.Close()
		body := mutexThreadClosure(t, 1, n, out)
		tester := concurrency.Init(setup, body, cleanupClosure(out))
		defer concurrency.Finish()
		niterations, err := tester.Explore()
		if err != nil {
			t.Fatalf("Unexpected error encountered: %v", err)
		}
		outputs := processOutput(t, out)
		expectedOutputs := generateMutexOutputs(createMutexSet(n))
		checkExpectedOutputs(t, outputs, expectedOutputs)
		checkUnexpectedOutputs(t, outputs, expectedOutputs)
		vlog.VI(1).Infof("Explored %v iterations.", niterations)
	}
}

// TestMutexExploreN runs mutexThreadClosure() using the framework for
// systematic testing of concurrency, checking that the exploration
// explores at most the given number of interleavings.
func TestMutexExploreN(t *testing.T) {
	for n := 2; n < 6; n++ {
		out, err := ioutil.TempFile("", "")
		if err != nil {
			t.Fatalf("TempFile() failed: %v", err)
		}
		defer os.Remove(out.Name())
		defer out.Close()
		body := mutexThreadClosure(t, 1, n, out)
		tester := concurrency.Init(setup, body, cleanupClosure(out))
		defer concurrency.Finish()
		stopAfter := 100
		niterations, err := tester.ExploreN(stopAfter)
		if err != nil {
			t.Fatalf("Unexpected error encountered: %v", err)
		}
		outputs := processOutput(t, out)
		expectedOutputs := generateMutexOutputs(createMutexSet(n))
		checkUnexpectedOutputs(t, outputs, expectedOutputs)
		if niterations < stopAfter {
			checkExpectedOutputs(t, outputs, expectedOutputs)
		}
		if niterations > stopAfter {
			t.Fatalf("Unexpected number of iterations: expected at most %v, got %v", stopAfter, niterations)
		}
		vlog.VI(1).Infof("Explored %v iterations.", niterations)
	}
}

// TestMutexExploreFor runs mutexThreadClosure() using the framework
// for systematic testing of concurrency, checking that the
// exploration respects the given "soft" deadline.
func TestMutexExploreFor(t *testing.T) {
	for n := 2; n < 6; n++ {
		out, err := ioutil.TempFile("", "")
		if err != nil {
			t.Fatalf("TempFile() failed: %v", err)
		}
		defer os.Remove(out.Name())
		defer out.Close()
		body := mutexThreadClosure(t, 1, n, out)
		tester := concurrency.Init(setup, body, cleanupClosure(out))
		defer concurrency.Finish()
		start := time.Now()
		deadline := 10 * time.Millisecond
		niterations, err := tester.ExploreFor(deadline)
		end := time.Now()
		if err != nil {
			t.Fatalf("Unexpected error encountered: %v", err)
		}
		outputs := processOutput(t, out)
		expectedOutputs := generateMutexOutputs(createMutexSet(n))
		checkUnexpectedOutputs(t, outputs, expectedOutputs)
		if start.Add(deadline).After(end) {
			checkExpectedOutputs(t, outputs, expectedOutputs)
		}
		vlog.VI(1).Infof("Explored %v iterations.", niterations)
	}
}
