package hdfs

import (
	"os"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

var mode = 0777 | os.ModeDir

func TestMkdir(t *testing.T) {
	client := getClient(t)

	baleet(t, "/_test/dir2")

	err := client.Mkdir("/_test/dir2", mode)
	require.NoError(t, err)

	fi, err := client.Stat("/_test/dir2")
	require.NoError(t, err)
	assert.True(t, fi.IsDir())
}

func TestMkdirExists(t *testing.T) {
	client := getClient(t)

	mkdirp(t, "/_test/existingdir")

	err := client.Mkdir("/_test/existingdir", mode)
	assertPathError(t, err, "mkdir", "/_test/existingdir", os.ErrExist)
}

func TestMkdirWithoutParent(t *testing.T) {
	client := getClient(t)

	baleet(t, "/_test/nonexistent")

	err := client.Mkdir("/_test/nonexistent/foo", mode)
	assertPathError(t, err, "mkdir", "/_test/nonexistent/foo", os.ErrNotExist)

	_, err = client.Stat("/_test/nonexistent/foo")
	assertPathError(t, err, "stat", "/_test/nonexistent/foo", os.ErrNotExist)

	_, err = client.Stat("/_test/nonexistent")
	assertPathError(t, err, "stat", "/_test/nonexistent", os.ErrNotExist)
}

func TestMkdirAll(t *testing.T) {
	client := getClient(t)

	baleet(t, "/_test/dir3")

	err := client.MkdirAll("/_test/dir3/foo", mode)
	require.NoError(t, err)

	fi, err := client.Stat("/_test/dir3/foo")
	require.NoError(t, err)
	assert.True(t, fi.IsDir())

	fi, err = client.Stat("/_test/dir3")
	require.NoError(t, err)
	assert.True(t, fi.IsDir())
	assert.EqualValues(t, 0, fi.Size())
}

func TestMkdirAllExists(t *testing.T) {
	client := getClient(t)

	baleet(t, "/_test/dir4")

	err := client.MkdirAll("/_test/dir4/foo", mode)
	require.NoError(t, err)

	err = client.MkdirAll("/_test/dir4/foo", mode)
	require.NoError(t, err)
}

func TestMkdirWIthoutPermission(t *testing.T) {
	client := getClient(t)
	otherClient := getClientForUser(t, "other")

	mkdirp(t, "/_test/accessdenied")

	err := otherClient.Mkdir("/_test/accessdenied/dir", mode)
	assertPathError(t, err, "mkdir", "/_test/accessdenied/dir", os.ErrPermission)

	_, err = client.Stat("/_test/accessdenied/dir")
	assertPathError(t, err, "stat", "/_test/accessdenied/dir", os.ErrNotExist)
}

func TestMkdirAllWIthoutPermission(t *testing.T) {
	client := getClient(t)
	otherClient := getClientForUser(t, "other")

	mkdirp(t, "/_test/accessdenied")

	err := otherClient.Mkdir("/_test/accessdenied/dir2/foo", mode)
	assertPathError(t, err, "mkdir", "/_test/accessdenied/dir2/foo", os.ErrPermission)

	_, err = client.Stat("/_test/accessdenied/dir2/foo")
	assertPathError(t, err, "stat", "/_test/accessdenied/dir2/foo", os.ErrNotExist)

	_, err = client.Stat("/_test/accessdenied/dir2")
	assertPathError(t, err, "stat", "/_test/accessdenied/dir2", os.ErrNotExist)
}