package service // import "github.com/docker/docker/volume/service"

import (
	"context"
	"errors"
	"fmt"
	"io/ioutil"
	"net"
	"os"
	"strings"
	"testing"

	"github.com/docker/docker/volume"
	volumedrivers "github.com/docker/docker/volume/drivers"
	"github.com/docker/docker/volume/service/opts"
	volumetestutils "github.com/docker/docker/volume/testutils"
	"github.com/google/go-cmp/cmp"
	"gotest.tools/assert"
	is "gotest.tools/assert/cmp"
)

func TestCreate(t *testing.T) {
	t.Parallel()

	s, cleanup := setupTest(t)
	defer cleanup()
	s.drivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")

	ctx := context.Background()
	v, err := s.Create(ctx, "fake1", "fake")
	if err != nil {
		t.Fatal(err)
	}
	if v.Name() != "fake1" {
		t.Fatalf("Expected fake1 volume, got %v", v)
	}
	if l, _, _ := s.Find(ctx, nil); len(l) != 1 {
		t.Fatalf("Expected 1 volume in the store, got %v: %v", len(l), l)
	}

	if _, err := s.Create(ctx, "none", "none"); err == nil {
		t.Fatalf("Expected unknown driver error, got nil")
	}

	_, err = s.Create(ctx, "fakeerror", "fake", opts.WithCreateOptions(map[string]string{"error": "create error"}))
	expected := &OpErr{Op: "create", Name: "fakeerror", Err: errors.New("create error")}
	if err != nil && err.Error() != expected.Error() {
		t.Fatalf("Expected create fakeError: create error, got %v", err)
	}
}

func TestRemove(t *testing.T) {
	t.Parallel()

	s, cleanup := setupTest(t)
	defer cleanup()

	s.drivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
	s.drivers.Register(volumetestutils.NewFakeDriver("noop"), "noop")

	ctx := context.Background()

	// doing string compare here since this error comes directly from the driver
	expected := "no such volume"
	var v volume.Volume = volumetestutils.NoopVolume{}
	if err := s.Remove(ctx, v); err == nil || !strings.Contains(err.Error(), expected) {
		t.Fatalf("Expected error %q, got %v", expected, err)
	}

	v, err := s.Create(ctx, "fake1", "fake", opts.WithCreateReference("fake"))
	if err != nil {
		t.Fatal(err)
	}

	if err := s.Remove(ctx, v); !IsInUse(err) {
		t.Fatalf("Expected ErrVolumeInUse error, got %v", err)
	}
	s.Release(ctx, v.Name(), "fake")
	if err := s.Remove(ctx, v); err != nil {
		t.Fatal(err)
	}
	if l, _, _ := s.Find(ctx, nil); len(l) != 0 {
		t.Fatalf("Expected 0 volumes in the store, got %v, %v", len(l), l)
	}
}

func TestList(t *testing.T) {
	t.Parallel()

	dir, err := ioutil.TempDir("", "test-list")
	assert.NilError(t, err)
	defer os.RemoveAll(dir)

	drivers := volumedrivers.NewStore(nil)
	drivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
	drivers.Register(volumetestutils.NewFakeDriver("fake2"), "fake2")

	s, err := NewStore(dir, drivers)
	assert.NilError(t, err)

	ctx := context.Background()
	if _, err := s.Create(ctx, "test", "fake"); err != nil {
		t.Fatal(err)
	}
	if _, err := s.Create(ctx, "test2", "fake2"); err != nil {
		t.Fatal(err)
	}

	ls, _, err := s.Find(ctx, nil)
	if err != nil {
		t.Fatal(err)
	}
	if len(ls) != 2 {
		t.Fatalf("expected 2 volumes, got: %d", len(ls))
	}
	if err := s.Shutdown(); err != nil {
		t.Fatal(err)
	}

	// and again with a new store
	s, err = NewStore(dir, drivers)
	if err != nil {
		t.Fatal(err)
	}
	ls, _, err = s.Find(ctx, nil)
	if err != nil {
		t.Fatal(err)
	}
	if len(ls) != 2 {
		t.Fatalf("expected 2 volumes, got: %d", len(ls))
	}
}

func TestFindByDriver(t *testing.T) {
	t.Parallel()
	s, cleanup := setupTest(t)
	defer cleanup()

	assert.Assert(t, s.drivers.Register(volumetestutils.NewFakeDriver("fake"), "fake"))
	assert.Assert(t, s.drivers.Register(volumetestutils.NewFakeDriver("noop"), "noop"))

	ctx := context.Background()
	_, err := s.Create(ctx, "fake1", "fake")
	assert.NilError(t, err)

	_, err = s.Create(ctx, "fake2", "fake")
	assert.NilError(t, err)

	_, err = s.Create(ctx, "fake3", "noop")
	assert.NilError(t, err)

	l, _, err := s.Find(ctx, ByDriver("fake"))
	assert.NilError(t, err)
	assert.Equal(t, len(l), 2)

	l, _, err = s.Find(ctx, ByDriver("noop"))
	assert.NilError(t, err)
	assert.Equal(t, len(l), 1)

	l, _, err = s.Find(ctx, ByDriver("nosuchdriver"))
	assert.NilError(t, err)
	assert.Equal(t, len(l), 0)
}

func TestFindByReferenced(t *testing.T) {
	t.Parallel()
	s, cleanup := setupTest(t)
	defer cleanup()

	s.drivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
	s.drivers.Register(volumetestutils.NewFakeDriver("noop"), "noop")

	ctx := context.Background()
	if _, err := s.Create(ctx, "fake1", "fake", opts.WithCreateReference("volReference")); err != nil {
		t.Fatal(err)
	}
	if _, err := s.Create(ctx, "fake2", "fake"); err != nil {
		t.Fatal(err)
	}

	dangling, _, err := s.Find(ctx, ByReferenced(false))
	assert.Assert(t, err)
	assert.Assert(t, len(dangling) == 1)
	assert.Check(t, dangling[0].Name() == "fake2")

	used, _, err := s.Find(ctx, ByReferenced(true))
	assert.Assert(t, err)
	assert.Assert(t, len(used) == 1)
	assert.Check(t, used[0].Name() == "fake1")
}

func TestDerefMultipleOfSameRef(t *testing.T) {
	t.Parallel()
	s, cleanup := setupTest(t)
	defer cleanup()
	s.drivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")

	ctx := context.Background()
	v, err := s.Create(ctx, "fake1", "fake", opts.WithCreateReference("volReference"))
	if err != nil {
		t.Fatal(err)
	}

	if _, err := s.Get(ctx, "fake1", opts.WithGetDriver("fake"), opts.WithGetReference("volReference")); err != nil {
		t.Fatal(err)
	}

	s.Release(ctx, v.Name(), "volReference")
	if err := s.Remove(ctx, v); err != nil {
		t.Fatal(err)
	}
}

func TestCreateKeepOptsLabelsWhenExistsRemotely(t *testing.T) {
	t.Parallel()
	s, cleanup := setupTest(t)
	defer cleanup()

	vd := volumetestutils.NewFakeDriver("fake")
	s.drivers.Register(vd, "fake")

	// Create a volume in the driver directly
	if _, err := vd.Create("foo", nil); err != nil {
		t.Fatal(err)
	}

	ctx := context.Background()
	v, err := s.Create(ctx, "foo", "fake", opts.WithCreateLabels(map[string]string{"hello": "world"}))
	if err != nil {
		t.Fatal(err)
	}

	switch dv := v.(type) {
	case volume.DetailedVolume:
		if dv.Labels()["hello"] != "world" {
			t.Fatalf("labels don't match")
		}
	default:
		t.Fatalf("got unexpected type: %T", v)
	}
}

func TestDefererencePluginOnCreateError(t *testing.T) {
	t.Parallel()

	var (
		l   net.Listener
		err error
	)

	for i := 32768; l == nil && i < 40000; i++ {
		l, err = net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", i))
	}
	if l == nil {
		t.Fatalf("could not create listener: %v", err)
	}
	defer l.Close()

	s, cleanup := setupTest(t)
	defer cleanup()

	d := volumetestutils.NewFakeDriver("TestDefererencePluginOnCreateError")
	p, err := volumetestutils.MakeFakePlugin(d, l)
	if err != nil {
		t.Fatal(err)
	}

	pg := volumetestutils.NewFakePluginGetter(p)
	s.drivers = volumedrivers.NewStore(pg)

	ctx := context.Background()
	// create a good volume so we have a plugin reference
	_, err = s.Create(ctx, "fake1", d.Name())
	if err != nil {
		t.Fatal(err)
	}

	// Now create another one expecting an error
	_, err = s.Create(ctx, "fake2", d.Name(), opts.WithCreateOptions(map[string]string{"error": "some error"}))
	if err == nil || !strings.Contains(err.Error(), "some error") {
		t.Fatalf("expected an error on create: %v", err)
	}

	// There should be only 1 plugin reference
	if refs := volumetestutils.FakeRefs(p); refs != 1 {
		t.Fatalf("expected 1 plugin reference, got: %d", refs)
	}
}

func TestRefDerefRemove(t *testing.T) {
	t.Parallel()

	driverName := "test-ref-deref-remove"
	s, cleanup := setupTest(t)
	defer cleanup()
	s.drivers.Register(volumetestutils.NewFakeDriver(driverName), driverName)

	ctx := context.Background()
	v, err := s.Create(ctx, "test", driverName, opts.WithCreateReference("test-ref"))
	assert.NilError(t, err)

	err = s.Remove(ctx, v)
	assert.Assert(t, is.ErrorContains(err, ""))
	assert.Equal(t, errVolumeInUse, err.(*OpErr).Err)

	s.Release(ctx, v.Name(), "test-ref")
	err = s.Remove(ctx, v)
	assert.NilError(t, err)
}

func TestGet(t *testing.T) {
	t.Parallel()

	driverName := "test-get"
	s, cleanup := setupTest(t)
	defer cleanup()
	s.drivers.Register(volumetestutils.NewFakeDriver(driverName), driverName)

	ctx := context.Background()
	_, err := s.Get(ctx, "not-exist")
	assert.Assert(t, is.ErrorContains(err, ""))
	assert.Equal(t, errNoSuchVolume, err.(*OpErr).Err)

	v1, err := s.Create(ctx, "test", driverName, opts.WithCreateLabels(map[string]string{"a": "1"}))
	assert.NilError(t, err)

	v2, err := s.Get(ctx, "test")
	assert.NilError(t, err)
	assert.DeepEqual(t, v1, v2, cmpVolume)

	dv := v2.(volume.DetailedVolume)
	assert.Equal(t, "1", dv.Labels()["a"])

	err = s.Remove(ctx, v1)
	assert.NilError(t, err)
}

func TestGetWithReference(t *testing.T) {
	t.Parallel()

	driverName := "test-get-with-ref"
	s, cleanup := setupTest(t)
	defer cleanup()
	s.drivers.Register(volumetestutils.NewFakeDriver(driverName), driverName)

	ctx := context.Background()
	_, err := s.Get(ctx, "not-exist", opts.WithGetDriver(driverName), opts.WithGetReference("test-ref"))
	assert.Assert(t, is.ErrorContains(err, ""))

	v1, err := s.Create(ctx, "test", driverName, opts.WithCreateLabels(map[string]string{"a": "1"}))
	assert.NilError(t, err)

	v2, err := s.Get(ctx, "test", opts.WithGetDriver(driverName), opts.WithGetReference("test-ref"))
	assert.NilError(t, err)
	assert.DeepEqual(t, v1, v2, cmpVolume)

	err = s.Remove(ctx, v2)
	assert.Assert(t, is.ErrorContains(err, ""))
	assert.Equal(t, errVolumeInUse, err.(*OpErr).Err)

	s.Release(ctx, v2.Name(), "test-ref")
	err = s.Remove(ctx, v2)
	assert.NilError(t, err)
}

var cmpVolume = cmp.AllowUnexported(volumetestutils.FakeVolume{}, volumeWrapper{})

func setupTest(t *testing.T) (*VolumeStore, func()) {
	t.Helper()

	dirName := strings.Replace(t.Name(), string(os.PathSeparator), "_", -1)
	dir, err := ioutil.TempDir("", dirName)
	assert.NilError(t, err)

	cleanup := func() {
		t.Helper()
		err := os.RemoveAll(dir)
		assert.Check(t, err)
	}

	s, err := NewStore(dir, volumedrivers.NewStore(nil))
	assert.Check(t, err)
	return s, func() {
		s.Shutdown()
		cleanup()
	}
}

func TestFilterFunc(t *testing.T) {
	testDriver := volumetestutils.NewFakeDriver("test")
	testVolume, err := testDriver.Create("test", nil)
	assert.NilError(t, err)
	testVolume2, err := testDriver.Create("test2", nil)
	assert.NilError(t, err)
	testVolume3, err := testDriver.Create("test3", nil)
	assert.NilError(t, err)

	for _, test := range []struct {
		vols   []volume.Volume
		fn     filterFunc
		desc   string
		expect []volume.Volume
	}{
		{desc: "test nil list", vols: nil, expect: nil, fn: func(volume.Volume) bool { return true }},
		{desc: "test empty list", vols: []volume.Volume{}, expect: []volume.Volume{}, fn: func(volume.Volume) bool { return true }},
		{desc: "test filter non-empty to empty", vols: []volume.Volume{testVolume}, expect: []volume.Volume{}, fn: func(volume.Volume) bool { return false }},
		{desc: "test nothing to fitler non-empty list", vols: []volume.Volume{testVolume}, expect: []volume.Volume{testVolume}, fn: func(volume.Volume) bool { return true }},
		{desc: "test filter some", vols: []volume.Volume{testVolume, testVolume2}, expect: []volume.Volume{testVolume}, fn: func(v volume.Volume) bool { return v.Name() == testVolume.Name() }},
		{desc: "test filter middle", vols: []volume.Volume{testVolume, testVolume2, testVolume3}, expect: []volume.Volume{testVolume, testVolume3}, fn: func(v volume.Volume) bool { return v.Name() != testVolume2.Name() }},
		{desc: "test filter middle and last", vols: []volume.Volume{testVolume, testVolume2, testVolume3}, expect: []volume.Volume{testVolume}, fn: func(v volume.Volume) bool { return v.Name() != testVolume2.Name() && v.Name() != testVolume3.Name() }},
		{desc: "test filter first and last", vols: []volume.Volume{testVolume, testVolume2, testVolume3}, expect: []volume.Volume{testVolume2}, fn: func(v volume.Volume) bool { return v.Name() != testVolume.Name() && v.Name() != testVolume3.Name() }},
	} {
		t.Run(test.desc, func(t *testing.T) {
			test := test
			t.Parallel()

			filter(&test.vols, test.fn)
			assert.DeepEqual(t, test.vols, test.expect, cmpVolume)
		})
	}
}
