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

import (
	"errors"
	"testing"

	"v.io/v23/context"
	"v.io/v23/discovery"

	"v.io/x/ref/lib/discovery/factory"
)

type mock struct {
	newErr                error
	numNews, numShutdowns int
}

func (m *mock) New(*context.T) (discovery.T, error) {
	m.numNews++
	return nil, m.newErr
}

func (m *mock) Shutdown() {
	m.numShutdowns++
}

func TestFactoryBasic(t *testing.T) {
	m := &mock{}
	factory.InjectFactory(m)

	f, _ := factory.New(nil)

	for i := 0; i < 3; i++ {
		_, err := f.New(nil)
		if err != nil {
			t.Error(err)
		}

		if want := i + 1; m.numNews != want {
			t.Errorf("expected %d New calls, but got %d times", want, m.numNews)
		}
	}

	m.newErr = errors.New("new error")
	if _, err := f.New(nil); err != m.newErr {
		t.Error("expected an error %v, but got %v", m.newErr, err)
	}

	f.Shutdown()
	if m.numShutdowns != 1 {
		t.Errorf("expected one Shutdown call, but got %d times", m.numShutdowns)
	}
}

func TestFactoryShutdownBeforeNew(t *testing.T) {
	m := &mock{}
	factory.InjectFactory(m)

	f, _ := factory.New(nil)

	f.Shutdown()
	if _, err := f.New(nil); err == nil {
		t.Error("expected an error, but got none")
	}
	if m.numNews != 0 {
		t.Errorf("expected no New call, but got %d times", m.numNews)
	}
	if m.numShutdowns != 0 {
		t.Errorf("expected no Shutdown call, but got %d times", m.numShutdowns)
	}
}
