| // 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) |
| } |
| } |