package worker

import (
	"fmt"
	"testing"

	. "github.com/pingcap/check"
)

type testWorkerPool struct{}

func (s *testWorkerPool) SetUpSuite(c *C)    {}
func (s *testWorkerPool) TearDownSuite(c *C) {}

var _ = Suite(&testWorkerPool{})

func TestNewRestoreWorkerPool(t *testing.T) {
	TestingT(t)
}

func (s *testWorkerPool) TestApplyRecycle(c *C) {
	pool := NewPool(3, "worker")

	w1, w2, w3 := pool.Apply(), pool.Apply(), pool.Apply()
	c.Assert(w1.ID, Equals, fmt.Sprintf("worker-%d", 1))
	c.Assert(w2.ID, Equals, fmt.Sprintf("worker-%d", 2))
	c.Assert(w3.ID, Equals, fmt.Sprintf("worker-%d", 3))
	c.Assert(pool.HasWorker(), Equals, false)

	pool.Recycle(w3)
	c.Assert(pool.HasWorker(), Equals, true)
	c.Assert(pool.Apply(), Equals, w3)
	pool.Recycle(w2)
	c.Assert(pool.Apply(), Equals, w2)
	pool.Recycle(w1)
	c.Assert(pool.Apply(), Equals, w1)

	c.Assert(pool.HasWorker(), Equals, false)

	c.Assert(func() { pool.Recycle(nil) }, PanicMatches, "invalid restore worker")
}
