// 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 main_test

import (
	"io/ioutil"
	"os"
	"path/filepath"
	"regexp"

	_ "v.io/x/ref/runtime/factories/generic"
	"v.io/x/ref/test/v23tests"
)

//go:generate v23 test generate .

func writeRoledConfig() (path string, shutdown func(), err error) {
	dir, err := ioutil.TempDir("", "")
	if err != nil {
		return dir, nil, err
	}
	err = ioutil.WriteFile(filepath.Join(dir, "therole.conf"), []byte(`
{
  "Members": ["root/child"],
  "Extend": true
}
`), 0644)
	return dir, func() { os.RemoveAll(dir) }, err
}

func V23TestBecomeRole(t *v23tests.T) {
	vbecome := t.BuildV23Pkg("v.io/x/ref/services/agent/vbecome")
	principal := t.BuildV23Pkg("v.io/x/ref/cmd/principal")

	roled := t.BuildV23Pkg("v.io/x/ref/services/role/roled")
	roledCreds, _ := t.Shell().NewChildCredentials("master")
	roled = roled.WithStartOpts(roled.StartOpts().WithCustomCredentials(roledCreds))

	v23tests.RunRootMT(t, "--v23.tcp.address=127.0.0.1:0")

	dir, shutdown, err := writeRoledConfig()
	if err != nil {
		t.Fatalf("Couldn't write roled config: %v", err)
	}
	defer shutdown()
	roled.Start("--v23.tcp.address=127.0.0.1:0", "--config-dir", dir, "--name", "roled")

	output := vbecome.Run("--role=roled/therole", principal.Path(), "dump")
	want := regexp.MustCompile(`Default Blessings\s+root/master/therole/root/child`)
	if !want.MatchString(output) {
		t.Errorf("Principal didn't have the role blessing:\n %s", output)
	}
}

func V23TestBecomeName(t *v23tests.T) {
	vbecome := t.BuildV23Pkg("v.io/x/ref/services/agent/vbecome")
	principal := t.BuildV23Pkg("v.io/x/ref/cmd/principal")

	v23tests.RunRootMT(t, "--v23.tcp.address=127.0.0.1:0")
	output := vbecome.Run("--name=bob", principal.Path(), "dump")
	want := regexp.MustCompile(`Default Blessings\s+root/child/bob`)
	if !want.MatchString(output) {
		t.Errorf("Principal didn't have the expected blessing:\n %s", output)
	}
}
