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

import (
	"flag"
	"reflect"
	"testing"

	"v.io/v23/verror"
)

func TestParseArguments(t *testing.T) {
	cases := []struct {
		cmdline  []string
		env      []string
		errID    verror.ID
		expected WorkParameters
	}{

		{
			[]string{"setuidhelper"},
			[]string{},
			errUserNameMissing.ID,
			WorkParameters{},
		},

		{
			[]string{"setuidhelper", "--minuid", "1", "--username", testUserName},
			[]string{"A=B"},
			"",
			WorkParameters{
				uid:       testUid,
				gid:       testGid,
				workspace: "",
				agentsock: "",
				logDir:    "",
				argv0:     "",
				argv:      []string{"unnamed_app"},
				envv:      []string{"A=B"},
				dryrun:    false,
				remove:    false,
				chown:     false,
				kill:      false,
				killPids:  nil,
			},
		},

		{
			[]string{"setuidhelper", "--minuid", "1", "--username", testUserName, "--workspace", "/hello",
				"--logdir", "/logging", "--agentsock", "/tmp/sXXXX", "--run", "/bin/v23", "--", "one", "two"},
			[]string{"A=B"},
			"",
			WorkParameters{
				uid:       testUid,
				gid:       testGid,
				workspace: "/hello",
				agentsock: "/tmp/sXXXX",
				logDir:    "/logging",
				argv0:     "/bin/v23",
				argv:      []string{"unnamed_app", "one", "two"},
				envv:      []string{"A=B"},
				dryrun:    false,
				remove:    false,
				chown:     false,
				kill:      false,
				killPids:  nil,
			},
		},

		{
			[]string{"setuidhelper", "--username", testUserName},
			[]string{"A=B"},
			errUIDTooLow.ID,
			WorkParameters{},
		},

		{
			[]string{"setuidhelper", "--rm", "hello", "vanadium"},
			[]string{"A=B"},
			"",
			WorkParameters{
				uid:       0,
				gid:       0,
				workspace: "",
				agentsock: "",
				logDir:    "",
				argv0:     "",
				argv:      []string{"hello", "vanadium"},
				envv:      nil,
				dryrun:    false,
				remove:    true,
				chown:     false,
				kill:      false,
				killPids:  nil,
			},
		},

		{
			[]string{"setuidhelper", "--chown", "--username", testUserName, "--dryrun", "--minuid", "1", "/tmp/foo", "/tmp/bar"},
			[]string{"A=B"},
			"",
			WorkParameters{
				uid:       testUid,
				gid:       testGid,
				workspace: "",
				agentsock: "",
				logDir:    "",
				argv0:     "",
				argv:      []string{"/tmp/foo", "/tmp/bar"},
				envv:      nil,
				dryrun:    true,
				remove:    false,
				chown:     true,
				kill:      false,
				killPids:  nil,
			},
		},

		{
			[]string{"setuidhelper", "--kill", "235", "451"},
			[]string{"A=B"},
			"",
			WorkParameters{
				uid:       0,
				gid:       0,
				workspace: "",
				agentsock: "",
				logDir:    "",
				argv0:     "",
				argv:      nil,
				envv:      nil,
				dryrun:    false,
				remove:    false,
				chown:     false,
				kill:      true,
				killPids:  []int{235, 451},
			},
		},

		{
			[]string{"setuidhelper", "--kill", "235", "451oops"},
			[]string{"A=B"},
			errAtoiFailed.ID,
			WorkParameters{
				uid:       0,
				gid:       0,
				workspace: "",
				agentsock: "",
				logDir:    "",
				argv0:     "",
				argv:      nil,
				envv:      nil,
				dryrun:    false,
				remove:    false,
				chown:     false,
				kill:      true,
				killPids:  nil,
			},
		},

		{
			[]string{"setuidhelper", "--minuid", "1", "--username", testUserName, "--workspace", "/hello", "--progname", "binaryd/vanadium/app/testapp",
				"--logdir", "/logging", "--agentsock", "/tmp/2981298123/s", "--run", "/bin/v23", "--dryrun", "--", "one", "two"},
			[]string{"A=B"},
			"",
			WorkParameters{
				uid:       testUid,
				gid:       testGid,
				workspace: "/hello",
				agentsock: "/tmp/2981298123/s",
				logDir:    "/logging",
				argv0:     "/bin/v23",
				argv:      []string{"binaryd/vanadium/app/testapp", "one", "two"},
				envv:      []string{"A=B"},
				dryrun:    true,
				remove:    false,
				chown:     false,
				kill:      false,
				killPids:  nil,
			},
		},
	}

	for _, c := range cases {
		var wp WorkParameters
		fs := flag.NewFlagSet(c.cmdline[0], flag.ExitOnError)
		setupFlags(fs)
		fs.Parse(c.cmdline[1:])
		if err := wp.ProcessArguments(fs, c.env); (err != nil || c.errID != "") && verror.ErrorID(err) != c.errID {
			t.Fatalf("got %s (%v), expected %q error", verror.ErrorID(err), err, c.errID)
		}
		if !reflect.DeepEqual(wp, c.expected) {
			t.Fatalf("got %#v expected %#v", wp, c.expected)
		}
	}
}
