// Copyright 2021 Molecula Corp. All rights reserved.
package pilosa

import (
	"testing"
	"time"

	"github.com/molecula/featurebase/v3/storage"
	"github.com/molecula/featurebase/v3/testhook"
)

func TestMonitorAntiEntropyZero(t *testing.T) {

	td, err := testhook.TempDirInDir(t, *TempDir, "")
	if err != nil {
		t.Fatalf("getting temp dir: %v", err)
	}
	cfg := &storage.Config{FsyncEnabled: false, Backend: storage.DefaultBackend}
	s, err := NewServer(OptServerDataDir(td),
		OptServerAntiEntropyInterval(0), OptServerStorageConfig(cfg))
	if err != nil {
		t.Fatalf("making new server: %v", err)
	}
	defer s.Close()

	ch := make(chan struct{})
	go func() {
		s.monitorAntiEntropy()
		close(ch)
	}()

	select {
	case <-ch:
	case <-time.After(time.Second):
		t.Fatalf("monitorAntiEntropy should have returned immediately with duration 0")
	}
}

func TestAddToWaitGroup(t *testing.T) {
	// if this test times out / panics we have a problem, otherwise we're fine
	td := t.TempDir()
	cfg := &storage.Config{FsyncEnabled: false, Backend: storage.DefaultBackend}
	s, err := NewServer(OptServerDataDir(td), OptServerStorageConfig(cfg))
	if err != nil {
		t.Fatalf("making new server: %v", err)
	}

	oks := make(chan bool, 10)
	for i := 0; i < 10; i++ {
		go func() {
			oks <- s.addToWaitGroup(1)
			time.Sleep(10 * time.Millisecond)
			defer s.wg.Done()
		}()
	}

	for i := 0; i < 10; i++ {
		ok := <-oks
		if !ok {
			t.Fatalf("unexpected close during WaitGroup add")
		}
	}

	s.Close()
	if ok := s.addToWaitGroup(1); ok {
		t.Fatalf("shouldn't be able to add while server is closing")
	}
}
