// Copyright 2022 The Go 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 robustio_test

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

	"golang.org/x/tools/internal/robustio"
)

func TestFileID(t *testing.T) {
	// A nonexistent file has no ID.
	nonexistent := filepath.Join(t.TempDir(), "nonexistent")
	if _, err := robustio.GetFileID(nonexistent); err == nil {
		t.Fatalf("GetFileID(nonexistent) succeeded unexpectedly")
	}

	// A regular file has an ID.
	real := filepath.Join(t.TempDir(), "real")
	if err := os.WriteFile(real, nil, 0644); err != nil {
		t.Fatalf("can't create regular file: %v", err)
	}
	realID, err := robustio.GetFileID(real)
	if err != nil {
		t.Fatalf("can't get ID of regular file: %v", err)
	}

	// A second regular file has a different ID.
	real2 := filepath.Join(t.TempDir(), "real2")
	if err := os.WriteFile(real2, nil, 0644); err != nil {
		t.Fatalf("can't create second regular file: %v", err)
	}
	real2ID, err := robustio.GetFileID(real2)
	if err != nil {
		t.Fatalf("can't get ID of second regular file: %v", err)
	}
	if realID == real2ID {
		t.Errorf("realID %+v != real2ID %+v", realID, real2ID)
	}

	// A symbolic link has the same ID as its target.
	if runtime.GOOS != "plan9" {
		symlink := filepath.Join(t.TempDir(), "symlink")
		if err := os.Symlink(real, symlink); err != nil {
			t.Fatalf("can't create symbolic link: %v", err)
		}
		symlinkID, err := robustio.GetFileID(symlink)
		if err != nil {
			t.Fatalf("can't get ID of symbolic link: %v", err)
		}
		if realID != symlinkID {
			t.Errorf("realID %+v != symlinkID %+v", realID, symlinkID)
		}
	}

	// Two hard-linked files have the same ID.
	if runtime.GOOS != "plan9" && runtime.GOOS != "android" {
		hardlink := filepath.Join(t.TempDir(), "hardlink")
		if err := os.Link(real, hardlink); err != nil {
			t.Fatal(err)
		}
		hardlinkID, err := robustio.GetFileID(hardlink)
		if err != nil {
			t.Fatalf("can't get ID of hard link: %v", err)
		}
		if hardlinkID != realID {
			t.Errorf("realID %+v != hardlinkID %+v", realID, hardlinkID)
		}
	}
}
