@@ -22,8 +22,10 @@ import (
2222 "io"
2323 "os"
2424 "path/filepath"
25+ "runtime"
2526 "strings"
2627 "sync"
28+ "syscall"
2729 "testing"
2830 "time"
2931
@@ -286,3 +288,82 @@ func TestPipeReader(t *testing.T) {
286288 assert .NoError (t , err )
287289 wg .Wait ()
288290}
291+
292+ func createTempFile (t * testing.T , dir , pattern , content string ) string {
293+ t .Helper ()
294+ f , err := os .CreateTemp (dir , pattern )
295+ assert .NoError (t , err )
296+ _ , err = f .WriteString (content )
297+ assert .NoError (t , err )
298+ err = f .Close ()
299+ assert .NoError (t , err )
300+ return f .Name ()
301+ }
302+
303+ func createTempDir (t * testing.T , dir , pattern string ) string {
304+ t .Helper ()
305+ name , err := os .MkdirTemp (dir , pattern )
306+ assert .NoError (t , err )
307+ return name
308+ }
309+
310+ func TestGetFileMetadata (t * testing.T ) {
311+ baseTempDir := t .TempDir ()
312+
313+ // --- Test Case 1: Regular File ---
314+ t .Run ("Regular File" , func (t * testing.T ) {
315+ content := "hello world"
316+ filePath := createTempFile (t , baseTempDir , "testfile-*.txt" , content )
317+ fileInfo , err := os .Stat (filePath ) // Get ground truth info
318+ assert .NoError (t , err )
319+
320+ metadata , err := getFileMetadata (filePath )
321+ assert .NoError (t , err )
322+
323+ assert .Equal (t , filepath .Base (filePath ), metadata .Name )
324+ assert .Equal (t , int64 (len (content )), metadata .Size )
325+ assert .Equal (t , uint32 (fileInfo .Mode ().Perm ()), metadata .Mode )
326+ assert .Equal (t , byte (0 ), metadata .Typeflag , "Typeflag should be 0 for regular file" )
327+ assert .WithinDuration (t , fileInfo .ModTime (), metadata .ModTime , time .Second )
328+
329+ // Check UID/GID only on Unix-like systems
330+ if stat , ok := fileInfo .Sys ().(* syscall.Stat_t ); ok {
331+ assert .Equal (t , stat .Uid , metadata .Uid , "UID mismatch" )
332+ assert .Equal (t , stat .Gid , metadata .Gid , "GID mismatch" )
333+ } else if runtime .GOOS != "windows" {
334+ // If not windows and not syscall.Stat_t, something is unexpected
335+ t .Logf ("Warning: Could not get syscall.Stat_t on non-Windows OS (%s)" , runtime .GOOS )
336+ } else {
337+ // On Windows, expect 0 as syscall.Stat_t assertion fails
338+ assert .Equal (t , uint32 (0 ), metadata .Uid , "UID should be 0 on Windows" )
339+ assert .Equal (t , uint32 (0 ), metadata .Gid , "GID should be 0 on Windows" )
340+ }
341+ })
342+
343+ // --- Test Case 2: Directory ---
344+ t .Run ("Directory" , func (t * testing.T ) {
345+ dirPath := createTempDir (t , baseTempDir , "testdir-*" )
346+ dirInfo , err := os .Stat (dirPath )
347+ assert .NoError (t , err )
348+
349+ metadata , err := getFileMetadata (dirPath )
350+ assert .NoError (t , err )
351+
352+ assert .Equal (t , filepath .Base (dirPath ), metadata .Name )
353+ assert .Equal (t , dirInfo .Size (), metadata .Size )
354+ assert .Equal (t , uint32 (dirInfo .Mode ().Perm ()), metadata .Mode )
355+ assert .Equal (t , byte (5 ), metadata .Typeflag , "Typeflag should be 5 for directory" )
356+ assert .WithinDuration (t , dirInfo .ModTime (), metadata .ModTime , time .Second )
357+
358+ // Check UID/GID only on Unix-like systems
359+ if stat , ok := dirInfo .Sys ().(* syscall.Stat_t ); ok {
360+ assert .Equal (t , stat .Uid , metadata .Uid , "UID mismatch" )
361+ assert .Equal (t , stat .Gid , metadata .Gid , "GID mismatch" )
362+ } else if runtime .GOOS != "windows" {
363+ t .Logf ("Warning: Could not get syscall.Stat_t on non-Windows OS (%s)" , runtime .GOOS )
364+ } else {
365+ assert .Equal (t , uint32 (0 ), metadata .Uid , "UID should be 0 on Windows" )
366+ assert .Equal (t , uint32 (0 ), metadata .Gid , "GID should be 0 on Windows" )
367+ }
368+ })
369+ }
0 commit comments