1- package logs
1+ package logs
2+
3+ import (
4+ "compress/gzip"
5+ "os"
6+ "path/filepath"
7+ "slices"
8+ "testing"
9+ )
10+
11+ func TestGetDirectoryLogs_RotatedFiles (t * testing.T ) {
12+ // Setup test directory
13+ dirPath , err := os .MkdirTemp ("" , "test_logs" )
14+ if err != nil {
15+ t .Fatalf ("Failed to create temp dir: %v" , err )
16+ }
17+ defer os .RemoveAll (dirPath )
18+
19+ // Create test log files
20+ files := map [string ]string {
21+ "access.log" : "today logs\n " ,
22+ "access.log.1" : "yesterday logs\n " ,
23+ "access.log.2.gz" : "older logs\n " ,
24+ "error.log" : "error logs\n " ,
25+ "notes.1" : "not a log\n " ,
26+ }
27+
28+ for name , content := range files {
29+ fullPath := filepath .Join (dirPath , name )
30+ if filepath .Ext (name ) == ".gz" {
31+ f , err := os .Create (fullPath )
32+ if err != nil {
33+ t .Fatalf ("Failed to create gzip file %s: %v" , name , err )
34+ }
35+ gw := gzip .NewWriter (f )
36+ if _ , err := gw .Write ([]byte (content )); err != nil {
37+ t .Fatalf ("Failed to write gzip file %s: %v" , name , err )
38+ }
39+ if err := gw .Close (); err != nil {
40+ t .Fatalf ("Failed to close gzip writer for %s: %v" , name , err )
41+ }
42+ if err := f .Close (); err != nil {
43+ t .Fatalf ("Failed to close gzip file %s: %v" , name , err )
44+ }
45+ } else {
46+ err := os .WriteFile (fullPath , []byte (content ), 0644 )
47+ if err != nil {
48+ t .Fatalf ("Failed to create test file %s: %v" , name , err )
49+ }
50+ }
51+ }
52+
53+ tests := []struct {
54+ name string
55+ isErrorLog bool
56+ includeCompressed bool
57+ wantLogs []string
58+ wantPositions []string
59+ }{
60+ {
61+ name : "Access logs - no compressed" ,
62+ isErrorLog : false ,
63+ includeCompressed : false ,
64+ wantLogs : []string {"today logs" , "yesterday logs" },
65+ wantPositions : []string {"access.log" , "access.log.1" },
66+ },
67+ {
68+ name : "Access logs - with compressed" ,
69+ isErrorLog : false ,
70+ includeCompressed : true ,
71+ wantLogs : []string {"today logs" , "yesterday logs" , "older logs" },
72+ wantPositions : []string {"access.log" , "access.log.1" },
73+ },
74+ {
75+ name : "Error logs" ,
76+ isErrorLog : true ,
77+ includeCompressed : false ,
78+ wantLogs : []string {"error logs" },
79+ wantPositions : []string {"error.log" },
80+ },
81+ }
82+
83+ for _ , tt := range tests {
84+ t .Run (tt .name , func (t * testing.T ) {
85+ result , err := GetDirectoryLogs (dirPath , nil , tt .isErrorLog , tt .includeCompressed )
86+ if err != nil {
87+ t .Fatalf ("GetDirectoryLogs failed: %v" , err )
88+ }
89+
90+ if ! slices .Equal (result .Logs , tt .wantLogs ) {
91+ t .Fatalf ("unexpected logs: got %v want %v" , result .Logs , tt .wantLogs )
92+ }
93+
94+ var gotPositions []string
95+ for _ , pos := range result .Positions {
96+ gotPositions = append (gotPositions , pos .Filename )
97+ }
98+ if ! slices .Equal (gotPositions , tt .wantPositions ) {
99+ t .Fatalf ("unexpected positions: got %v want %v" , gotPositions , tt .wantPositions )
100+ }
101+
102+ for _ , unexpected := range []string {"not a log" , "error logs" , "older logs" } {
103+ if tt .isErrorLog || tt .includeCompressed {
104+ if unexpected == "error logs" || unexpected == "older logs" {
105+ continue
106+ }
107+ }
108+ if slices .Contains (result .Logs , unexpected ) {
109+ t .Errorf ("unexpected log line %q was returned" , unexpected )
110+ }
111+ }
112+ })
113+ }
114+ }
115+
116+ func TestIsNumericExtension (t * testing.T ) {
117+ tests := []struct {
118+ ext string
119+ expected bool
120+ }{
121+ {".1" , true },
122+ {".10" , true },
123+ {".log" , false },
124+ {".gz" , false },
125+ {"." , false },
126+ {"" , false },
127+ {".1a" , false },
128+ }
129+
130+ for _ , tt := range tests {
131+ if result := isNumericExtension (tt .ext ); result != tt .expected {
132+ t .Errorf ("isNumericExtension(%s) = %v; want %v" , tt .ext , result , tt .expected )
133+ }
134+ }
135+ }
0 commit comments