package sync

import (
	"testing"
	"time"

	"github.com/micro/go-micro/store"
	store_mock "github.com/micro/go-micro/store/mock"
	mem_lock "github.com/micro/go-micro/sync/lock/memory"
	"github.com/stretchr/testify/mock"
)

func TestIterate(t *testing.T) {
	recA := &store.Record{
		Key:   "A",
		Value: nil,
	}
	recB := &store.Record{
		Key:   "B",
		Value: nil,
	}
	s1 := &store_mock.Store{}
	s2 := &store_mock.Store{}
	s1.On("List").Return([]*store.Record{recA, recB}, nil)
	s2.On("List").Return([]*store.Record{recB, recA}, nil)
	s1.On("Write", mock.Anything).Return(nil)
	s2.On("Write", mock.Anything).Return(nil)

	f := func(key, val interface{}) error {
		time.Sleep(1 * time.Millisecond)
		return nil
	}
	l := mem_lock.NewLock()
	m1 := NewMap(WithStore(s1), WithLock(l))
	m2 := NewMap(WithStore(s2), WithLock(l))
	go func() {
		m2.Iterate(f)
	}()
	m1.Iterate(f)
}