package allowed

import (
	"io/ioutil"
	"os"
	"path/filepath"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	"go.skia.org/infra/go/testutils"
)

func TestAllowed(t *testing.T) {
	testutils.SmallTest(t)
	testCases := []struct {
		allowed  []string
		value    string
		expected bool
		message  string
	}{
		{
			allowed:  []string{},
			value:    "test@example.org",
			expected: false,
			message:  "empty",
		},
		{
			allowed:  []string{""},
			value:    "test@",
			expected: false,
			message:  "empty domain",
		},
		{
			allowed:  []string{"test@example.org"},
			value:    "test@example.org",
			expected: true,
			message:  "single email",
		},
		{
			allowed:  []string{"example.org"},
			value:    "test@example.org",
			expected: true,
			message:  "single domain",
		},
		{
			allowed:  []string{"example.org"},
			value:    "test@google.com",
			expected: false,
			message:  "single domain fail",
		},
		{
			allowed:  []string{"google.com", "chromium.org", "special@example.com"},
			value:    "test@google.com",
			expected: true,
			message:  "multi domain",
		},
		{
			allowed:  []string{"google.com", "chromium.org", "special@example.com"},
			value:    "foo@chromium.org",
			expected: true,
			message:  "multi domain 2",
		},
		{
			allowed:  []string{"google.com", "chromium.org", "special@example.com"},
			value:    "special@example.com",
			expected: true,
			message:  "multi domain 3",
		},
		{
			allowed:  []string{"google.com", "chromium.org", "special@example.com"},
			value:    "missing@example.com",
			expected: false,
			message:  "multi domain 4",
		},
	}

	for _, tc := range testCases {
		w := NewAllowedFromList(tc.allowed)
		if got, want := w.Member(tc.value), tc.expected; got != want {
			t.Errorf("Failed case Got %v Want %v: %s", got, want, tc.message)
		}
	}
}

func TestAllowedFromFile(t *testing.T) {
	testutils.SmallTest(t)
	dirname, err := ioutil.TempDir("", "allowed_file")
	assert.NoError(t, err)
	defer testutils.RemoveAll(t, dirname)
	emails := `fred@example.com
barney@example.com`
	filename := filepath.Join(dirname, "allowed")
	err = ioutil.WriteFile(filename, []byte(emails), 0644)
	assert.NoError(t, err)
	w, err := NewAllowedFromFile(filename)
	assert.NoError(t, err)
	assert.True(t, w.Member("fred@example.com"))
	assert.True(t, w.Member("barney@example.com"))

	emails = `fred@example.com`
	err = ioutil.WriteFile(filename, []byte(emails), 0644)
	assert.NoError(t, err)

	end := time.Now().Add(10 * time.Second)
	for {
		if false == w.Member("barney@example.com") {
			break
		}
		if time.Now().After(end) {
			break
		}
		time.Sleep(time.Millisecond)
	}
	assert.True(t, w.Member("fred@example.com"))
	assert.False(t, w.Member("barney@example.com"))

	// Removing the file doesn't clear the list, instead the old one is kept.
	err = os.Remove(filename)
	assert.NoError(t, err)
	time.Sleep(100 * time.Millisecond)
	assert.True(t, w.Member("fred@example.com"))
	assert.False(t, w.Member("barney@example.com"))
}
