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

import (
	"io/ioutil"
	"os"
	"testing"

	"v.io/v23/security"
	impl "v.io/x/ref/services/cluster/internal"
	"v.io/x/ref/test/testutil"
)

func TestClusterAgent(t *testing.T) {
	workdir, err := ioutil.TempDir("", "TestClusterAgent")
	if err != nil {
		t.Fatalf("ioutil.TempDir failed: %v", err)
	}
	defer os.RemoveAll(workdir)

	agentP := testutil.NewPrincipal("agent")
	serviceP := testutil.NewPrincipal("service")
	instanceP := testutil.NewPrincipal("instance")

	agent := impl.NewAgent(agentP, impl.NewFileStorage(workdir))

	blessings1, err := serviceP.Bless(agentP.PublicKey(), serviceP.BlessingStore().Default(), "foo", security.UnconstrainedUse())
	if err != nil {
		t.Fatalf("serviceP.Bless failed: %v", err)
	}

	secret, err := agent.NewSecret(blessings1)
	if err != nil {
		t.Fatalf("agent.NewSecret failed: %v", err)
	}

	blessings2, err := agent.Bless(secret, instanceP.PublicKey(), "bar")
	if err != nil {
		t.Fatalf("agent.Bless failed: %v", err)
	}
	if blessings2.PublicKey() != instanceP.PublicKey() {
		t.Errorf("unexpected PublicKey mismatch. Got %v, expected %v", blessings2.PublicKey(), instanceP.PublicKey())
	}
	if expected := "service/foo/bar"; blessings2.String() != expected {
		t.Errorf("unexpected blessings. Got %q, expected %q", blessings2, expected)
	}

	if err := agent.ForgetSecret(secret); err != nil {
		t.Errorf("agent.ForgetSecret failed: %v", err)
	}
}
