blob: a6b936ba966058d3783913768ab440127bb0ef18 [file] [log] [blame] [edit]
// 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, 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, 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()
}