package flag

import (
	"bytes"
	"flag"
	"fmt"
	"io"
	"os"
	"reflect"
	"testing"

	"v.io/core/veyron2/security"
	"v.io/core/veyron2/services/security/access"

	"v.io/core/veyron/lib/modules"
	"v.io/core/veyron/lib/testutil"
	tsecurity "v.io/core/veyron/lib/testutil/security"
)

func TestHelperProcess(t *testing.T) {
	modules.DispatchInTest()
}

var (
	acl1 = access.TaggedACLMap{}
	acl2 = access.TaggedACLMap{
		string(access.Read): access.ACL{
			In: []security.BlessingPattern{"veyron/alice/$", "veyron/bob"},
		},
		string(access.Write): access.ACL{
			In: []security.BlessingPattern{"veyron/alice/$"},
		},
	}

	expectedAuthorizer = map[string]security.Authorizer{
		"empty": auth(access.TaggedACLAuthorizer(acl1, access.TypicalTagType())),
		"acl2":  auth(access.TaggedACLAuthorizer(acl2, access.TypicalTagType())),
	}
)

func init() {
	testutil.Init()
	modules.RegisterChild("tamFromFlag", "", tamFromFlag)
}

func auth(a security.Authorizer, err error) security.Authorizer {
	if err != nil {
		panic(err)
	}
	return a
}

func tamFromFlag(stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error {
	nfargs := flag.CommandLine.Args()
	tam, err := TaggedACLMapFromFlag()
	if err != nil {
		fmt.Fprintf(stdout, "TaggedACLMapFromFlag() failed: %v", err)
		return nil
	}
	got := auth(access.TaggedACLAuthorizer(tam, access.TypicalTagType()))
	want := expectedAuthorizer[nfargs[0]]
	if !reflect.DeepEqual(got, want) {
		fmt.Fprintf(stdout, "args %#v\n", args)
		fmt.Fprintf(stdout, "AuthorizerFromFlags() got Authorizer: %v, want: %v", got, want)
	}
	return nil
}

func TestNewAuthorizerOrDie(t *testing.T) {
	sh, err := modules.NewShell(nil, nil)
	if err != nil {
		t.Fatalf("unexpected error: %s", err)
	}
	defer sh.Cleanup(os.Stderr, os.Stderr)

	// Create a file.
	acl2FileName := tsecurity.SaveACLToFile(acl2)
	defer os.Remove(acl2FileName)

	testdata := []struct {
		cmd   string
		flags []string
		auth  string
	}{
		{
			cmd:   "tamFromFlag",
			flags: []string{"--veyron.acl.file", "runtime:" + acl2FileName},
			auth:  "acl2",
		},
		{
			cmd:   "tamFromFlag",
			flags: []string{"--veyron.acl.literal", "{}"},
			auth:  "empty",
		},
		{
			cmd:   "tamFromFlag",
			flags: []string{"--veyron.acl.literal", `{"Read": {"In":["veyron/alice/$", "veyron/bob"]}, "Write": {"In":["veyron/alice/$"]}}`},
			auth:  "acl2",
		},
	}

	for _, td := range testdata {
		fp := append(td.flags, td.auth)
		h, err := sh.Start(td.cmd, nil, fp...)
		if err != nil {
			t.Errorf("unexpected error: %s", err)
		}
		b := new(bytes.Buffer)
		h.Shutdown(b, os.Stderr)
		if got := b.String(); got != "" {
			t.Errorf(got)
		}
	}
}
