blob: b575f69de81b729eb45a8a9f8aeab1b1f1929b8d [file] [log] [blame]
// 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 internal
import (
"encoding/json"
"io/ioutil"
"os"
"path/filepath"
"reflect"
"sort"
"testing"
"v.io/v23/security"
)
func TestImportMembers(t *testing.T) {
workdir, err := ioutil.TempDir("", "test-role-server-")
if err != nil {
t.Fatalf("ioutil.TempDir failed: %v", err)
}
defer os.RemoveAll(workdir)
os.Mkdir(filepath.Join(workdir, "sub"), 0700)
configs := map[string]Config{
"role1": Config{Members: []security.BlessingPattern{"A", "B", "C"}},
"role2": Config{Members: []security.BlessingPattern{"C", "D", "E"}},
"sub/role3": Config{ImportMembers: []string{"../role2"}},
"sub/role4": Config{ImportMembers: []string{"../role1", "../role2"}},
"sub/role5": Config{ImportMembers: []string{"../role1", "../role6"}},
"role6": Config{ImportMembers: []string{"sub/role5"}, Members: []security.BlessingPattern{"F"}},
}
for role, config := range configs {
WriteConfig(t, config, filepath.Join(workdir, role+".conf"))
}
testcases := []struct {
role string
members []security.BlessingPattern
}{
{"role1", []security.BlessingPattern{"A/_role", "B/_role", "C/_role"}},
{"role2", []security.BlessingPattern{"C/_role", "D/_role", "E/_role"}},
{"sub/role3", []security.BlessingPattern{"C/_role", "D/_role", "E/_role"}},
{"sub/role4", []security.BlessingPattern{"A/_role", "B/_role", "C/_role", "D/_role", "E/_role"}},
{"sub/role5", []security.BlessingPattern{"A/_role", "B/_role", "C/_role", "F/_role"}},
{"role6", []security.BlessingPattern{"A/_role", "B/_role", "C/_role", "F/_role"}},
}
for _, tc := range testcases {
c, err := loadExpandedConfig(filepath.Join(workdir, tc.role+".conf"), nil)
if err != nil {
t.Errorf("unexpected error for %q: %v", tc.role, err)
continue
}
sort.Sort(BlessingPatternSlice(c.Members))
if !reflect.DeepEqual(tc.members, c.Members) {
t.Errorf("unexpected results. Got %#v, expected %#v", c.Members, tc.members)
}
}
}
type BlessingPatternSlice []security.BlessingPattern
func (p BlessingPatternSlice) Len() int { return len(p) }
func (p BlessingPatternSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p BlessingPatternSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func WriteConfig(t *testing.T, config Config, fileName string) {
mConf, err := json.Marshal(config)
if err != nil {
t.Fatalf("json.MarshalIndent failed: %v", err)
}
if err := ioutil.WriteFile(fileName, mConf, 0644); err != nil {
t.Fatalf("ioutil.WriteFile(%q, %q) failed: %v", fileName, string(mConf), err)
}
}