// 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"
	"io/ioutil"
	"os"
	"path/filepath"
	"testing"
)

func TestCopyFile(t *testing.T) {
	tmpdir := t.TempDir()
	src := filepath.Join(tmpdir, "src")
	in := []byte("written to src")
	if err := ioutil.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 := ioutil.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 := ioutil.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 := ioutil.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)
	}
}
