// Copyright 2015 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 tarutil

import (
	"archive/tar"
	"compress/gzip"
	"io"
	"os"
	"path"
	"strings"
	"testing"
	"time"
)

// fileInfo is an os.FileInfo implementation for tarHeader.
type fileInfo struct {
	name   string
	mode   os.FileMode
	size   int64
	target string // if symlink
}

func (fi fileInfo) IsDir() bool        { return fi.mode.IsDir() }
func (fi fileInfo) ModTime() time.Time { return time.Time{} }
func (fi fileInfo) Mode() os.FileMode  { return fi.mode }
func (fi fileInfo) Name() string       { return path.Base(fi.name) }
func (fi fileInfo) Size() int64        { return fi.size }
func (fi fileInfo) Sys() interface{}   { return nil }

func tarHeader(t *testing.T, fi fileInfo) *tar.Header {
	h, err := tar.FileInfoHeader(fi, fi.target)
	if err != nil {
		t.Fatalf("tarHeader: %v", err)
	}
	h.Name = fi.name // see docs on tar.FileInfoHeader
	return h
}

func TestFileList(t *testing.T) {
	fl := new(FileList)

	fl.AddHeader(tarHeader(t, fileInfo{name: "symlink-file", target: "link-target", mode: 0644 | os.ModeSymlink}))
	fl.AddRegular(tarHeader(t, fileInfo{name: "regular.txt", mode: 0644, size: 7}), 7, strings.NewReader("foo bar"))

	tgz := fl.TarGz()
	defer tgz.Close()
	zr, err := gzip.NewReader(tgz)
	if err != nil {
		t.Fatalf("gzip.NewReader: %v", err)
	}
	tr := tar.NewReader(zr)
	saw := 0
	for {
		h, err := tr.Next()
		if err == io.EOF {
			break
		}
		if err != nil {
			t.Fatalf("tar.Reader.Next: %v", err)
		}
		saw++
		switch h.Name {
		case "symlink-file":
		case "regular.txt":
			all, err := io.ReadAll(tr)
			if err != nil {
				t.Fatalf("Reading regular.txt: %v", err)
			}
			if string(all) != "foo bar" {
				t.Errorf("regular.txt = %q; want \"foo bar\"", all)
			}
		default:
			t.Fatalf("unknown name %q", h.Name)
		}
	}
	if saw != 2 {
		t.Errorf("number of entries = %d; want 2", saw)
	}
}
