package cephfs

import (
	"testing"

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

func TestChmodDir(t *testing.T) {
	dirname := "two"
	var statsBefore uint32 = 0755
	var statsAfter uint32 = 0700
	mount := fsConnect(t)
	defer fsDisconnect(t, mount)

	err := mount.MakeDir(dirname, statsBefore)
	assert.NoError(t, err)
	defer mount.RemoveDir(dirname)

	err = mount.SyncFs()
	assert.NoError(t, err)

	sx, err := mount.Statx(dirname, StatxBasicStats, 0)
	require.NoError(t, err)

	assert.Equal(t, uint32(sx.Mode&0777), statsBefore)

	err = mount.Chmod(dirname, statsAfter)
	assert.NoError(t, err)

	sx, err = mount.Statx(dirname, StatxBasicStats, 0)
	require.NoError(t, err)
	assert.Equal(t, uint32(sx.Mode&0777), statsAfter)
}

func TestChown(t *testing.T) {
	dirname := "three"
	// dockerfile creates bob user account
	var bob uint32 = 1010
	var root uint32

	mount := fsConnect(t)
	defer fsDisconnect(t, mount)

	err := mount.MakeDir(dirname, 0755)
	assert.NoError(t, err)
	defer mount.RemoveDir(dirname)

	err = mount.SyncFs()
	assert.NoError(t, err)

	sx, err := mount.Statx(dirname, StatxBasicStats, 0)
	require.NoError(t, err)

	assert.Equal(t, uint32(sx.Uid), root)
	assert.Equal(t, uint32(sx.Gid), root)

	err = mount.Chown(dirname, bob, bob)
	assert.NoError(t, err)

	sx, err = mount.Statx(dirname, StatxBasicStats, 0)
	assert.NoError(t, err)
	assert.Equal(t, uint32(sx.Uid), bob)
	assert.Equal(t, uint32(sx.Gid), bob)
}

func TestLchown(t *testing.T) {
	dirname := "four"
	var bob uint32 = 1010
	var root uint32

	mount := fsConnect(t)
	defer fsDisconnect(t, mount)

	err := mount.MakeDir(dirname, 0755)
	assert.NoError(t, err)
	defer mount.RemoveDir(dirname)

	err = mount.SyncFs()
	assert.NoError(t, err)

	err = mount.Symlink(dirname, "symlnk")
	assert.NoError(t, err)
	defer mount.Unlink("symlnk")

	err = mount.Lchown("symlnk", bob, bob)
	sx, err := mount.Statx("symlnk", StatxBasicStats, AtSymlinkNofollow)
	assert.NoError(t, err)
	assert.Equal(t, uint32(sx.Uid), bob)
	assert.Equal(t, uint32(sx.Gid), bob)
	sx, err = mount.Statx(dirname, StatxBasicStats, AtSymlinkNofollow)
	assert.Equal(t, uint32(sx.Uid), root)
	assert.Equal(t, uint32(sx.Gid), root)
}
