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

import (
	"os"
	"path/filepath"
	"testing"

	"fuchsia.googlesource.com/jiri/tool"
)

// TestFindRootEnvSymlink checks that FindRoot interprets the value of the
// -root flag as a path, evaluates any symlinks the path might contain, and
// returns the result.
func TestFindRootEnvSymlink(t *testing.T) {
	ctx := tool.NewDefaultContext()

	// Create a temporary directory.
	tmpDir, err := ctx.NewSeq().TempDir("", "")
	if err != nil {
		t.Fatalf("TempDir() failed: %v", err)
	}
	defer func() { ctx.NewSeq().RemoveAll(tmpDir).Done() }()

	// Make sure tmpDir is not a symlink itself.
	tmpDir, err = filepath.EvalSymlinks(tmpDir)
	if err != nil {
		t.Fatalf("EvalSymlinks(%v) failed: %v", tmpDir, err)
	}

	// Create a directory and a symlink to it.
	root, perm := filepath.Join(tmpDir, "root"), os.FileMode(0700)
	symRoot := filepath.Join(tmpDir, "sym_root")
	seq := ctx.NewSeq().MkdirAll(root, perm).Symlink(root, symRoot)
	if err := seq.Done(); err != nil {
		t.Fatalf("%v", err)
	}

	// Set the -root flag to the symlink created above and check that
	// FindRoot() evaluates the symlink.
	rootFlag = symRoot
	if got, want := FindRoot(), root; got != want {
		t.Fatalf("unexpected output: got %v, want %v", got, want)
	}
}
