// 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"
	"testing"

	"v.io/x/ref/lib/v23test"
	_ "v.io/x/ref/runtime/factories/generic"
)

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 TestV23BecomeRole(t *testing.T) {
	v23test.SkipUnlessRunningIntegrationTests(t)
	sh := v23test.NewShell(t, v23test.Opts{})
	defer sh.Cleanup()

	vbecome := sh.BuildGoPkg("v.io/x/ref/services/agent/vbecome")
	principal := sh.BuildGoPkg("v.io/x/ref/cmd/principal")
	roled := sh.BuildGoPkg("v.io/x/ref/services/role/roled")

	sh.StartRootMountTable()

	dir, shutdown, err := writeRoledConfig()
	if err != nil {
		t.Fatalf("Couldn't write roled config: %v", err)
	}
	defer shutdown()

	sh.Cmd(roled, "--v23.tcp.address=127.0.0.1:0", "--config-dir", dir, "--name", "roled").WithCredentials(sh.ForkCredentials("master")).Start()

	output := sh.Cmd(vbecome, "--role=roled/therole", principal, "dump").Stdout()
	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 TestV23BecomeName(t *testing.T) {
	v23test.SkipUnlessRunningIntegrationTests(t)
	sh := v23test.NewShell(t, v23test.Opts{})
	defer sh.Cleanup()

	vbecome := sh.BuildGoPkg("v.io/x/ref/services/agent/vbecome")
	principal := sh.BuildGoPkg("v.io/x/ref/cmd/principal")

	sh.StartRootMountTable()

	output := sh.Cmd(vbecome, "--name=bob", principal, "dump").Stdout()
	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)
	}
}

func TestMain(m *testing.M) {
	os.Exit(v23test.Run(m.Run))
}
