package dump

import (
	"reflect"
	"testing"
)

func Test_acl_decode(t *testing.T) {
	type args struct {
		xattr []byte
	}
	tests := []struct {
		name string
		args args
		want string
	}{
		{
			name: "decode string",
			args: args{
				xattr: []byte{2, 0, 0, 0, 1, 0, 6, 0, 255, 255, 255, 255, 2, 0, 7, 0, 0, 0, 0, 0, 2, 0, 7, 0, 254, 255, 0, 0, 4, 0, 7, 0, 255, 255, 255, 255, 16, 0, 7, 0, 255, 255, 255, 255, 32, 0, 4, 0, 255, 255, 255, 255},
			},
			want: "user::rw-\nuser:0:rwx\nuser:65534:rwx\ngroup::rwx\nmask::rwx\nother::r--\n",
		},
		{
			name: "decode group",
			args: args{
				xattr: []byte{2, 0, 0, 0, 8, 0, 1, 0, 254, 255, 0, 0},
			},
			want: "group:65534:--x\n",
		},
		{
			name: "decode fail",
			args: args{
				xattr: []byte("abctest"),
			},
			want: "",
		},
		{
			name: "decode empty fail",
			args: args{
				xattr: []byte(""),
			},
			want: "",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			a := &acl{}
			a.decode(tt.args.xattr)
			if tt.want != a.String() {
				t.Errorf("acl.decode() = %v, want: %v", a.String(), tt.want)
			}
			a.decode(tt.args.xattr)
			if tt.want != a.String() {
				t.Errorf("second acl.decode() = %v, want: %v", a.String(), tt.want)
			}
		})
	}
}

func Test_acl_encode(t *testing.T) {
	tests := []struct {
		name string
		want []byte
		args []aclElement
	}{
		{
			name: "encode values",
			want: []byte{2, 0, 0, 0, 1, 0, 6, 0, 255, 255, 255, 255, 2, 0, 7, 0, 0, 0, 0, 0, 2, 0, 7, 0, 254, 255, 0, 0, 4, 0, 7, 0, 255, 255, 255, 255, 16, 0, 7, 0, 255, 255, 255, 255, 32, 0, 4, 0, 255, 255, 255, 255},
			args: []aclElement{
				{
					aclSID: 8589934591,
					Perm:   6,
				},
				{
					aclSID: 8589934592,
					Perm:   7,
				},
				{
					aclSID: 8590000126,
					Perm:   7,
				},
				{
					aclSID: 21474836479,
					Perm:   7,
				},
				{
					aclSID: 73014444031,
					Perm:   7,
				},
				{
					aclSID: 141733920767,
					Perm:   4,
				},
			},
		},
		{
			name: "encode fail",
			want: []byte{2, 0, 0, 0},
			args: []aclElement{},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			a := &acl{
				Version: 2,
				List:    tt.args,
			}
			if got := a.encode(); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("acl.encode() = %v, want %v", got, tt.want)
			}
		})
	}
}
