// Copyright 2019 The Fuchsia 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 osmisc

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

func TestCopyFile(t *testing.T) {
	tmpdir := t.TempDir()
	src := filepath.Join(tmpdir, "src")
	in := []byte("written to src")
	if err := os.WriteFile(src, in, 0o400); err != nil {
		t.Fatalf("failed to write contents to src: %v", err)
	}

	for _, path := range []string{"dest", "subdir/dest"} {

		dest := filepath.Join(tmpdir, path)
		if err := CopyFile(src, dest); err != nil {
			t.Fatalf("failed to copy file: %v", err)
		}

		out, err := os.ReadFile(dest)
		if err != nil {
			t.Fatal(err)
		}
		if bytes.Compare(in, out) != 0 {
			t.Fatalf("bytes read from dest not as expected: %q != %q", in, out)
		}
	}
}

func TestFileIsOpen(t *testing.T) {
	f, err := os.Create(filepath.Join(t.TempDir(), "osmic-test"))
	if err != nil {
		t.Fatal(err)
	}
	if !FileIsOpen(f) {
		t.Errorf("file is closed when it should be open; fd: %v", f.Fd())
	}
	if err := f.Close(); err != nil {
		t.Fatalf("failed to close file: %v", err)
	}
	if FileIsOpen(f) {
		t.Errorf("file is open when it should be closed; fd: %v", f.Fd())
	}
}

func TestCreateFile(t *testing.T) {
	tmpdir := t.TempDir()
	path := filepath.Join(tmpdir, "subdir", "subdir2", "file")
	f, err := CreateFile(path)
	if err != nil {
		t.Fatalf("failed to create file: %v", err)
	}
	contents := []byte("contents")
	if _, err := f.Write(contents); err != nil {
		t.Fatalf("failed to write to file: %v", err)
	}
	if err := f.Close(); err != nil {
		t.Fatalf("failed to close file: %v", err)
	}
	if b, err := os.ReadFile(path); err != nil {
		t.Fatalf("failed to read file: %v", err)
	} else if bytes.Compare(b, contents) != 0 {
		t.Fatalf("unexpected contents: got %s, expected %s", b, contents)
	}
}

func TestFileExists(t *testing.T) {
	tmpdir := t.TempDir()
	fA := filepath.Join(tmpdir, "fileA.txt")
	fB := filepath.Join(tmpdir, "fileB.txt")
	if err := os.WriteFile(fB, []byte("content"), 0o600); err != nil {
		t.Fatalf("failed to write to %s", fB)
	}

	existsA, err := FileExists(fA)
	if err != nil {
		t.Fatalf("unexpected error: %v", err)
	} else if existsA {
		t.Fatalf("%s exist when it should not", fA)
	}

	existsB, err := FileExists(fB)
	if err != nil {
		t.Fatalf("unexpected error: %v", err)
	} else if !existsB {
		t.Fatalf("%s does not exist", fB)
	}
}
