// Copyright 2022 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

package fileutils_test

import (
	"path/filepath"
	"strings"
	"testing"

	"dawn.googlesource.com/dawn/tools/src/fileutils"
	"dawn.googlesource.com/dawn/tools/src/oswrapper"
	"github.com/google/go-cmp/cmp"
	"github.com/stretchr/testify/require"
)

func TestThisLine(t *testing.T) {
	td := fileutils.ThisLine()
	if !strings.HasSuffix(td, "paths_test.go:42") {
		t.Errorf("TestThisLine() returned %v", td)
	}
}

func TestThisDir(t *testing.T) {
	td := fileutils.ThisDir()
	if !strings.HasSuffix(td, "utils") {
		t.Errorf("ThisDir() returned %v", td)
	}
}

func TestDawnRoot(t *testing.T) {
	// We use a real wrapper here since ThisDir() is going to be based on the
	// actual filesystem anyways.
	wrapper := oswrapper.GetRealOSWrapper()
	dr := fileutils.DawnRoot(wrapper)
	rel, err := filepath.Rel(dr, fileutils.ThisDir())
	if err != nil {
		t.Fatalf("%v", err)
	}
	got := filepath.ToSlash(rel)
	expect := `tools/src/fileutils`
	if diff := cmp.Diff(got, expect); diff != "" {
		t.Errorf("DawnRoot() returned %v.\n%v", dr, diff)
	}
}

func TestExpandHome(t *testing.T) {
	tests := []struct {
		name  string
		input string
		want  string
	}{
		{
			name:  "No substitution",
			input: "/foo/bar",
			want:  "/foo/bar",
		},
		{
			name:  "Single substitution",
			input: "~/foo",
			want:  "/home/foo",
		},
		{
			name:  "Multi substitution",
			input: "~/foo/~",
			want:  "/home/foo//home",
		},
		{
			name:  "Trailing slash",
			input: "~/foo/",
			want:  "/home/foo/",
		},
		{
			name:  "Only home",
			input: "~",
			want:  "/home",
		},
	}

	for _, testCase := range tests {
		t.Run(testCase.name, func(t *testing.T) {
			wrapper := oswrapper.CreateFSTestOSWrapper()
			wrapper.Setenv("HOME", "/home")

			expandedPath := fileutils.ExpandHome(testCase.input, wrapper)
			require.Equal(t, testCase.want, expandedPath)
		})
	}
}

func TestBuildPath(t *testing.T) {
	tests := []struct {
		name    string
		setupFS func(fs oswrapper.FSTestOSWrapper) (expectedPath string) // Sets up FS and returns expected path
		want    string
	}{
		{
			name: "out/active exists",
			setupFS: func(fs oswrapper.FSTestOSWrapper) string {
				require.NoError(t, fileutils.SetUpFakeDawnRoot(fs))
				fakeDawnRoot := fileutils.DawnRoot(fs)
				require.NotEmpty(t, fakeDawnRoot, "Failed to find fake Dawn root")

				expected := filepath.Join(fakeDawnRoot, "out", "active")
				require.NoError(t, fs.MkdirAll(expected, 0777))
				return expected
			},
		},
		{
			name: "out/active does not exist",
			setupFS: func(fs oswrapper.FSTestOSWrapper) string {
				require.NoError(t, fileutils.SetUpFakeDawnRoot(fs))
				return "" // Expect empty string as out/active won't be found.
			},
		},
		{
			name: "dawn root does not exist",
			setupFS: func(fs oswrapper.FSTestOSWrapper) string {
				return "" // Expect empty string as dawn root won't be found.
			},
		},
	}

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			wrapper := oswrapper.CreateFSTestOSWrapper()
			expectedPath := tc.setupFS(wrapper)

			got := fileutils.BuildPath(wrapper)
			require.Equal(t, expectedPath, got)
		})
	}
}

func TestCommonRootDir(t *testing.T) {
	for _, test := range []struct {
		a, b   string
		expect string
	}{
		{"", "", "/"},
		{"a/b/c", "d/e/f", ""},
		{"a/", "b", ""},
		{"a/b/c", "a/b", "a/b/"},
		{"a/b/c/", "a/b", "a/b/"},
		{"a/b/c/", "a/b/", "a/b/"},
		{"a/b/c", "a/b/d", "a/b/"},
		{"a/b/c", "a/bc", "a/"},
	} {
		if got := fileutils.CommonRootDir(test.a, test.b); got != test.expect {
			t.Errorf("CommonRootDir('%v', '%v') returned '%v'.\nExpected: '%v'", test.a, test.b, got, test.expect)
		}
		if got := fileutils.CommonRootDir(test.b, test.a); got != test.expect {
			t.Errorf("CommonRootDir('%v', '%v') returned '%v'.\nExpected: '%v'", test.b, test.a, got, test.expect)
		}
	}
}

func TestIsDir(t *testing.T) {
	tests := []struct {
		name    string
		path    string
		setupFS func(fs oswrapper.FSTestOSWrapper) // Sets up the filesystem
		want    bool
	}{
		{
			name: "Is a directory",
			path: "/a/b/c",
			setupFS: func(fs oswrapper.FSTestOSWrapper) {
				require.NoError(t, fs.MkdirAll("/a/b/c", 0777))
			},
			want: true,
		},
		{
			name: "Is a file",
			path: "/a/b/file.txt",
			setupFS: func(fs oswrapper.FSTestOSWrapper) {
				require.NoError(t, fs.MkdirAll("/a/b", 0777))
				require.NoError(t, fs.WriteFile("/a/b/file.txt", []byte("hello"), 0666))
			},
			want: false,
		},
		{
			name:    "Does not exist",
			path:    "/a/b/c",
			setupFS: nil,
			want:    false,
		},
		{
			// Empty path is treated as the CWD.
			name:    "Empty path",
			path:    "",
			setupFS: nil,
			want:    true,
		},
	}

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			wrapper := oswrapper.CreateFSTestOSWrapper()
			if tc.setupFS != nil {
				tc.setupFS(wrapper)
			}

			got := fileutils.IsDir(tc.path, wrapper)
			require.Equal(t, tc.want, got)
		})
	}
}

func TestIsFile(t *testing.T) {
	tests := []struct {
		name    string
		path    string
		setupFS func(fs oswrapper.FSTestOSWrapper) // Sets up the filesystem
		want    bool
	}{
		{
			name: "Is a file",
			path: "/a/b/file.txt",
			setupFS: func(fs oswrapper.FSTestOSWrapper) {
				require.NoError(t, fs.MkdirAll("/a/b", 0777))
				require.NoError(t, fs.WriteFile("/a/b/file.txt", []byte("hello"), 0666))
			},
			want: true,
		},
		{
			name: "Is a directory",
			path: "/a/b/c",
			setupFS: func(fs oswrapper.FSTestOSWrapper) {
				require.NoError(t, fs.MkdirAll("/a/b/c", 0777))
			},
			want: false,
		},
		{
			name:    "Does not exist",
			path:    "/a/b/c",
			setupFS: nil,
			want:    false,
		},
		{
			name:    "Empty path",
			path:    "",
			setupFS: nil,
			want:    false,
		},
	}

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			wrapper := oswrapper.CreateFSTestOSWrapper()
			if tc.setupFS != nil {
				tc.setupFS(wrapper)
			}

			got := fileutils.IsFile(tc.path, wrapper)
			require.Equal(t, tc.want, got)
		})
	}
}

func TestIsEmptyDir(t *testing.T) {
	tests := []struct {
		name    string
		path    string
		setupFS func(fs oswrapper.FSTestOSWrapper)
		want    bool
		wantErr bool
	}{
		{
			name:    "Path does not exist",
			path:    "/nonexistent",
			setupFS: nil,
			wantErr: true,
		},
		{
			name: "Path is a file",
			path: "/myfile.txt",
			setupFS: func(fs oswrapper.FSTestOSWrapper) {
				require.NoError(t, fs.WriteFile("/myfile.txt", []byte("content"), 0666))
			},
			wantErr: true,
		},
		{
			name: "Directory is empty",
			path: "/mydir",
			setupFS: func(fs oswrapper.FSTestOSWrapper) {
				require.NoError(t, fs.MkdirAll("/mydir", 0777))
			},
			want:    true,
			wantErr: false,
		},
		{
			name: "Directory with a file",
			path: "/mydir",
			setupFS: func(fs oswrapper.FSTestOSWrapper) {
				require.NoError(t, fs.MkdirAll("/mydir", 0777))
				require.NoError(t, fs.WriteFile(filepath.Join("/mydir", "file.txt"), []byte("content"), 0666))
			},
			want:    false,
			wantErr: false,
		},
		{
			name: "Directory with a subdirectory",
			path: "/mydir",
			setupFS: func(fs oswrapper.FSTestOSWrapper) {
				require.NoError(t, fs.MkdirAll(filepath.Join("/mydir", "subdir"), 0777))
			},
			want:    false,
			wantErr: false,
		},
	}

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			wrapper := oswrapper.CreateFSTestOSWrapper()
			if tc.setupFS != nil {
				tc.setupFS(wrapper)
			}

			got, err := fileutils.IsEmptyDir(tc.path, wrapper)

			if tc.wantErr {
				require.Error(t, err)
			} else {
				require.NoError(t, err)
				require.Equal(t, tc.want, got)
			}
		})
	}
}
