155 lines
3.5 KiB
Go
155 lines
3.5 KiB
Go
package parser
|
|
|
|
import (
|
|
"bufio"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestScanDirectory_FindsAccessAndErrorLogs(t *testing.T) {
|
|
dir := t.TempDir()
|
|
|
|
// Create test log files
|
|
files := []string{
|
|
"access.log",
|
|
"access.log.1",
|
|
"error.log",
|
|
"error.log.1",
|
|
"other.txt", // should be ignored
|
|
}
|
|
for _, f := range files {
|
|
if err := os.WriteFile(filepath.Join(dir, f), []byte(""), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
accessFiles, errorFiles, err := ScanDirectory(dir, false)
|
|
if err != nil {
|
|
t.Fatalf("ScanDirectory error: %v", err)
|
|
}
|
|
if len(accessFiles) != 2 {
|
|
t.Errorf("expected 2 access files, got %d: %v", len(accessFiles), accessFiles)
|
|
}
|
|
if len(errorFiles) != 2 {
|
|
t.Errorf("expected 2 error files, got %d: %v", len(errorFiles), errorFiles)
|
|
}
|
|
}
|
|
|
|
func TestScanDirectory_GzipIncluded(t *testing.T) {
|
|
dir := t.TempDir()
|
|
files := []string{
|
|
"access.log",
|
|
"access.log.1.gz",
|
|
"error.log",
|
|
}
|
|
for _, f := range files {
|
|
if err := os.WriteFile(filepath.Join(dir, f), []byte(""), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
accessFiles, _, err := ScanDirectory(dir, true)
|
|
if err != nil {
|
|
t.Fatalf("ScanDirectory error: %v", err)
|
|
}
|
|
if len(accessFiles) != 2 {
|
|
t.Errorf("expected 2 access files (including gz), got %d", len(accessFiles))
|
|
}
|
|
}
|
|
|
|
func TestScanDirectory_GzipExcluded(t *testing.T) {
|
|
dir := t.TempDir()
|
|
files := []string{
|
|
"access.log",
|
|
"access.log.1.gz",
|
|
}
|
|
for _, f := range files {
|
|
if err := os.WriteFile(filepath.Join(dir, f), []byte(""), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
accessFiles, _, err := ScanDirectory(dir, false)
|
|
if err != nil {
|
|
t.Fatalf("ScanDirectory error: %v", err)
|
|
}
|
|
if len(accessFiles) != 1 {
|
|
t.Errorf("expected 1 access file (gz excluded), got %d", len(accessFiles))
|
|
}
|
|
}
|
|
|
|
func TestScanDirectory_NonexistentDir(t *testing.T) {
|
|
_, _, err := ScanDirectory("/nonexistent/path/xyz", true)
|
|
if err == nil {
|
|
t.Error("expected error for nonexistent directory, got nil")
|
|
}
|
|
}
|
|
|
|
func TestOpenLogFile_PlainText(t *testing.T) {
|
|
dir := t.TempDir()
|
|
content := "test line\n"
|
|
path := filepath.Join(dir, "test.log")
|
|
if err := os.WriteFile(path, []byte(content), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
rc, err := openLogFile(path)
|
|
if err != nil {
|
|
t.Fatalf("openLogFile error: %v", err)
|
|
}
|
|
defer rc.Close()
|
|
|
|
scanner := bufio.NewScanner(rc)
|
|
if !scanner.Scan() {
|
|
t.Fatal("expected to read a line")
|
|
}
|
|
if scanner.Text() != "test line" {
|
|
t.Errorf("got %q, want %q", scanner.Text(), "test line")
|
|
}
|
|
}
|
|
|
|
func TestOpenLogFile_Gzip(t *testing.T) {
|
|
// Use the pre-made fixture
|
|
rc, err := openLogFile("testdata/access.log.1.gz")
|
|
if err != nil {
|
|
t.Fatalf("openLogFile gz error: %v", err)
|
|
}
|
|
defer rc.Close()
|
|
|
|
scanner := bufio.NewScanner(rc)
|
|
if !scanner.Scan() {
|
|
t.Fatal("expected to read a line from gz file")
|
|
}
|
|
line := scanner.Text()
|
|
if line == "" {
|
|
t.Error("expected non-empty line from gz file")
|
|
}
|
|
}
|
|
|
|
func TestScanDirectory_SortOrder(t *testing.T) {
|
|
dir := t.TempDir()
|
|
files := []string{
|
|
"access.log.2.gz",
|
|
"access.log",
|
|
"access.log.1",
|
|
"access.log.1.gz",
|
|
}
|
|
for _, f := range files {
|
|
if err := os.WriteFile(filepath.Join(dir, f), []byte(""), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
accessFiles, _, err := ScanDirectory(dir, true)
|
|
if err != nil {
|
|
t.Fatalf("ScanDirectory error: %v", err)
|
|
}
|
|
if len(accessFiles) != 4 {
|
|
t.Fatalf("expected 4 files, got %d", len(accessFiles))
|
|
}
|
|
// access.log should come first (most recent)
|
|
if filepath.Base(accessFiles[0]) != "access.log" {
|
|
t.Errorf("expected access.log first, got %q", filepath.Base(accessFiles[0]))
|
|
}
|
|
}
|