// 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.Fatal("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.Fatal("json.MarshalIndent failed: %v", err)
	}
	if err := ioutil.WriteFile(fileName, mConf, 0644); err != nil {
		t.Fatal("ioutil.WriteFile(%q, %q) failed: %v", fileName, string(mConf), err)
	}
}
