package worker

import (
	blocks "github.com/ipfs/go-ipfs/blocks"
	"testing"
)

func TestStartClose(t *testing.T) {
	numRuns := 50
	if testing.Short() {
		numRuns = 5
	}
	for i := 0; i < numRuns; i++ {
		w := NewWorker(nil, DefaultConfig)
		w.Close()
	}
}

func TestQueueDeduplication(t *testing.T) {
	numUniqBlocks := 5 // arbitrary

	var firstBatch []*blocks.Block
	for i := 0; i < numUniqBlocks; i++ {
		firstBatch = append(firstBatch, blockFromInt(i))
	}

	// to get different pointer values and prevent the implementation from
	// cheating. The impl must check equality using Key.
	var secondBatch []*blocks.Block
	for i := 0; i < numUniqBlocks; i++ {
		secondBatch = append(secondBatch, blockFromInt(i))
	}
	var workQueue BlockList

	for _, b := range append(firstBatch, secondBatch...) {
		workQueue.Push(b)
	}
	for i := 0; i < numUniqBlocks; i++ {
		b := workQueue.Pop()
		if b.Key() != firstBatch[i].Key() {
			t.Fatal("list is not FIFO")
		}
	}
	if b := workQueue.Pop(); b != nil {
		t.Fatal("the workQueue did not de-duplicate the blocks")
	}
}

func TestPushPopPushPop(t *testing.T) {
	var workQueue BlockList
	orig := blockFromInt(1)
	dup := blockFromInt(1)
	workQueue.PushFront(orig)
	workQueue.Pop()
	workQueue.Push(dup)
	if workQueue.Len() != 1 {
		t.Fatal("the block list's internal state is corrupt")
	}
}

func blockFromInt(i int) *blocks.Block {
	return blocks.NewBlock([]byte(string(i)))
}
