// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package mounttablelib

import (
	"fmt"
	"io/ioutil"
	"os"
	"reflect"
	"testing"

	"v.io/v23/security"
	"v.io/v23/security/access"
)

func TestPersistence(t *testing.T) {
	rootCtx, _, _, shutdown := initTest()
	defer shutdown()

	td, err := ioutil.TempDir("", "upyournose")
	if err != nil {
		t.Fatalf("Failed to make temporary dir: %s", err)
	}
	defer os.RemoveAll(td)
	fmt.Printf("temp persist dir %s\n", td)
	mt, mtAddr := newMT(t, "", td, "testPersistence", rootCtx)

	perms1 := access.Permissions{
		"Read":    access.AccessList{In: []security.BlessingPattern{security.AllPrincipals}},
		"Resolve": access.AccessList{In: []security.BlessingPattern{security.AllPrincipals}},
		"Create":  access.AccessList{In: []security.BlessingPattern{security.AllPrincipals}},
	}
	perms2 := access.Permissions{
		"Read":    access.AccessList{In: []security.BlessingPattern{security.AllPrincipals}},
		"Resolve": access.AccessList{In: []security.BlessingPattern{security.AllPrincipals}},
		"Create":  access.AccessList{In: []security.BlessingPattern{"root"}},
	}
	perms3 := access.Permissions{
		"Read":    access.AccessList{In: []security.BlessingPattern{security.AllPrincipals}},
		"Resolve": access.AccessList{In: []security.BlessingPattern{security.AllPrincipals}},
		"Create":  access.AccessList{In: []security.BlessingPattern{"bob"}},
	}

	// Set some permissions.  It should be persisted.
	doSetPermissions(t, rootCtx, mtAddr, "a", perms1, "", true)
	doSetPermissions(t, rootCtx, mtAddr, "a/b", perms2, "", true)
	doSetPermissions(t, rootCtx, mtAddr, "a/b/c/d", perms2, "", true)
	doSetPermissions(t, rootCtx, mtAddr, "a/b/c/d/e", perms2, "", true)
	doDeleteSubtree(t, rootCtx, mtAddr, "a/b/c", true)
	doSetPermissions(t, rootCtx, mtAddr, "a/c/d", perms3, "", true)
	mt.Stop()

	// Restart with the persisted data.
	mt, mtAddr = newMT(t, "", td, "testPersistence", rootCtx)

	// Add root as Admin to each of the perms since the mounttable itself will.
	perms1["Admin"] = access.AccessList{In: []security.BlessingPattern{"root"}}
	perms2["Admin"] = access.AccessList{In: []security.BlessingPattern{"root"}}
	perms3["Admin"] = access.AccessList{In: []security.BlessingPattern{"root"}}

	// Check deletion.
	checkExists(t, rootCtx, mtAddr, "a/b", true)
	checkExists(t, rootCtx, mtAddr, "a/b/c", false)

	// Check Persistance.
	if perm, _ := doGetPermissions(t, rootCtx, mtAddr, "a", true); !reflect.DeepEqual(perm, perms1) {
		t.Fatalf("a: got %v, want %v", perm, perms1)
	}
	if perm, _ := doGetPermissions(t, rootCtx, mtAddr, "a/b", true); !reflect.DeepEqual(perm, perms2) {
		t.Fatalf("a/b: got %v, want %v", perm, perms2)
	}
	if perm, _ := doGetPermissions(t, rootCtx, mtAddr, "a/c/d", true); !reflect.DeepEqual(perm, perms3) {
		t.Fatalf("a/c/d: got %v, want %v", perm, perms3)
	}
	mt.Stop()
}
