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

import (
	"errors"
	"testing"
	"time"

	"v.io/v23/context"
	"v.io/v23/verror"
	"v.io/x/sensorlog_lite/internal/util"
)

var (
	errFoo = errors.New("errFoo")
	errBar = errors.New("errBar")
)

func TestAsyncRun(t *testing.T) {
	wait1 := util.AsyncRun(func() error {
		time.Sleep(200 * time.Microsecond)
		return nil
	}, func(err error) {
		t.Errorf("unexpected callback with error: %v", err)
	})

	var ecb2 error
	wait2 := util.AsyncRun(func() error {
		time.Sleep(100 * time.Microsecond)
		return errFoo
	}, func(err error) {
		ecb2 = err
	})

	if wgot, want := wait1(), error(nil); wgot != want {
		t.Errorf("wait1 unexpected error: got %v, want %v", wgot, want)
	}
	if wgot, cbgot, want := wait2(), ecb2, errFoo; wgot != want || cbgot != want {
		t.Errorf("wait2 unexpected error: wait got %v, cb got %v, want %v", wgot, cbgot, want)
	}
}

func TestAsyncRunNoCallback(t *testing.T) {
	wait1 := util.AsyncRun(func() error {
		time.Sleep(200 * time.Microsecond)
		return nil
	}, nil)

	wait2 := util.AsyncRun(func() error {
		time.Sleep(100 * time.Microsecond)
		return errBar
	}, nil)

	if wgot, want := wait1(), error(nil); wgot != want {
		t.Errorf("wait1 unexpected error: got %v, want %v", wgot, want)
	}
	if wgot, want := wait2(), errBar; wgot != want {
		t.Errorf("wait2 unexpected error: got %v, want %v", wgot, want)
	}
}

func TestAsyncRunIgnoreErrCancelled(t *testing.T) {
	ctx, cancel := context.RootContext()

	wait1 := util.AsyncRun(func() error {
		<-ctx.Done()
		return verror.New(verror.ErrCanceled, ctx)
	}, func(err error) {
		t.Errorf("unexpected callback with error: %v", err)
	})

	cancel()

	if wgot, want := wait1(), error(nil); wgot != want {
		t.Errorf("wait1 unexpected error: got %v, want %v", wgot, want)
	}
}
