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

// TODO(caprita): Merge this with init.go now that v.io/c/20864 got rid of
// init_mojo.go.

package test

import (
	"flag"
	"os"
	"sync"

	"v.io/v23"
	"v.io/v23/context"
	"v.io/v23/naming"
	"v.io/v23/options"
	"v.io/v23/rpc"
	"v.io/x/ref"
	"v.io/x/ref/internal/logger"
	"v.io/x/ref/services/mounttable/mounttablelib"
	"v.io/x/ref/test/testutil"
)

const (
	TestBlessing = "test-blessing"
)

var once sync.Once
var IntegrationTestsEnabled bool
var IntegrationTestsDebugShellOnError bool

const IntegrationTestsFlag = "v23.tests"
const IntegrationTestsDebugShellOnErrorFlag = "v23.tests.shell-on-fail"

func init() {
	flag.BoolVar(&IntegrationTestsEnabled, IntegrationTestsFlag, false, "Run integration tests.")
	flag.BoolVar(&IntegrationTestsDebugShellOnError, IntegrationTestsDebugShellOnErrorFlag, false, "Drop into a debug shell if an integration test fails.")
}

func editListenSpec(ctx *context.T) *context.T {
	return v23.WithListenSpec(ctx, rpc.ListenSpec{Addrs: rpc.ListenAddrs{{Protocol: "tcp", Address: "127.0.0.1:0"}}})
}

func editPrincipal(ctx *context.T, v23testProcess bool) *context.T {
	if v23testProcess {
		return ctx
	}
	var err error
	if ctx, err = v23.WithPrincipal(ctx, testutil.NewPrincipal(TestBlessing)); err != nil {
		panic(err)
	}
	return ctx
}

func editNamespace(ctx *context.T, v23testProcess, createMounttable bool) {
	ns := v23.GetNamespace(ctx)
	ns.CacheCtl(naming.DisableCache(true))

	// TODO(caprita): Whether this is a Shell child process is but an
	// approximation as to whether we should or should not edit the
	// namespace in the context.  See also TODO on V23Init.
	if v23testProcess {
		return
	}

	if !createMounttable {
		ns.SetRoots()
		return
	}

	// Create a mounttable server and set the namespace root to that.
	disp, err := mounttablelib.NewMountTableDispatcher(ctx, "", "", "mounttable")
	if err != nil {
		panic(err)
	}
	_, s, err := v23.WithNewDispatchingServer(ctx, "", disp, options.ServesMountTable(true))
	if err != nil {
		panic(err)
	}
	ns.SetRoots(s.Status().Endpoints[0].Name())
}

func editEnvironment(v23testProcess bool) func() {
	// We don't want to launch on-demand agents when loading
	// credentials from disk in tests.  The exception is where we
	// explicitly test the agent loading behavior, in which case the
	// test will unset this environment variable following context
	// creation.  For Shell child processes, just respect what the
	// parent configured for them.
	if v23testProcess {
		return nil
	}
	oldEnv := os.Getenv(ref.EnvCredentialsNoAgent)
	os.Setenv(ref.EnvCredentialsNoAgent, "1")
	return func() { os.Setenv(ref.EnvCredentialsNoAgent, oldEnv) }
}

// internalInit initializes the runtime and returns a new context.
func internalInit(createMounttable bool) (*context.T, func()) {
	ctx, shutdown := v23.Init()
	if *debugOnShutdown != "" {
		orig := shutdown
		shutdown = func() { debug(ctx, orig) }
	}

	v23testProcess := os.Getenv("V23_SHELL_TEST_PROCESS") != ""

	ctx = editListenSpec(ctx)

	ctx = editPrincipal(ctx, v23testProcess)

	editNamespace(ctx, v23testProcess, createMounttable)

	if undo := editEnvironment(v23testProcess); undo != nil {
		orig := shutdown
		shutdown = func() {
			undo()
			orig()
		}
	}
	return ctx, shutdown
}

// TestContext returns a *context.T suitable for use in tests. It sets the
// context's logger to logger.Global(), and that's it. In particular, it does
// not call v23.Init().
func TestContext() (*context.T, context.CancelFunc) {
	ctx, cancel := context.RootContext()
	return context.WithLogger(ctx, logger.Global()), cancel
}
