@@ -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
@@ -126,7 +128,9 @@ func (s *BuilderTestSuite) TestBuildLayer() {
126128
127129 desc , err := s .builder .BuildLayer (context .Background (), "test/media-type.tar" , s .tempDir , s .tempFile , hooks .NewHooks ())
128130 s .NoError (err )
129- s .Equal (expectedDesc , desc )
131+ s .Equal (expectedDesc .MediaType , desc .MediaType )
132+ s .Equal (expectedDesc .Digest , desc .Digest )
133+ s .Equal (expectedDesc .Size , desc .Size )
130134 })
131135
132136 s .Run ("file not found" , func () {
@@ -286,3 +290,82 @@ func TestPipeReader(t *testing.T) {
286290 assert .NoError (t , err )
287291 wg .Wait ()
288292}
293+
294+ func createTempFile (t * testing.T , dir , pattern , content string ) string {
295+ t .Helper ()
296+ f , err := os .CreateTemp (dir , pattern )
297+ assert .NoError (t , err )
298+ _ , err = f .WriteString (content )
299+ assert .NoError (t , err )
300+ err = f .Close ()
301+ assert .NoError (t , err )
302+ return f .Name ()
303+ }
304+
305+ func createTempDir (t * testing.T , dir , pattern string ) string {
306+ t .Helper ()
307+ name , err := os .MkdirTemp (dir , pattern )
308+ assert .NoError (t , err )
309+ return name
310+ }
311+
312+ func TestGetFileMetadata (t * testing.T ) {
313+ baseTempDir := t .TempDir ()
314+
315+ // --- Test Case 1: Regular File ---
316+ t .Run ("Regular File" , func (t * testing.T ) {
317+ content := "hello world"
318+ filePath := createTempFile (t , baseTempDir , "testfile-*.txt" , content )
319+ fileInfo , err := os .Stat (filePath ) // Get ground truth info
320+ assert .NoError (t , err )
321+
322+ metadata , err := getFileMetadata (filePath )
323+ assert .NoError (t , err )
324+
325+ assert .Equal (t , filepath .Base (filePath ), metadata .Name )
326+ assert .Equal (t , int64 (len (content )), metadata .Size )
327+ assert .Equal (t , uint32 (fileInfo .Mode ().Perm ()), metadata .Mode )
328+ assert .Equal (t , byte (0 ), metadata .Typeflag , "Typeflag should be 0 for regular file" )
329+ assert .WithinDuration (t , fileInfo .ModTime (), metadata .ModTime , time .Second )
330+
331+ // Check UID/GID only on Unix-like systems
332+ if stat , ok := fileInfo .Sys ().(* syscall.Stat_t ); ok {
333+ assert .Equal (t , stat .Uid , metadata .Uid , "UID mismatch" )
334+ assert .Equal (t , stat .Gid , metadata .Gid , "GID mismatch" )
335+ } else if runtime .GOOS != "windows" {
336+ // If not windows and not syscall.Stat_t, something is unexpected
337+ t .Logf ("Warning: Could not get syscall.Stat_t on non-Windows OS (%s)" , runtime .GOOS )
338+ } else {
339+ // On Windows, expect 0 as syscall.Stat_t assertion fails
340+ assert .Equal (t , uint32 (0 ), metadata .Uid , "UID should be 0 on Windows" )
341+ assert .Equal (t , uint32 (0 ), metadata .Gid , "GID should be 0 on Windows" )
342+ }
343+ })
344+
345+ // --- Test Case 2: Directory ---
346+ t .Run ("Directory" , func (t * testing.T ) {
347+ dirPath := createTempDir (t , baseTempDir , "testdir-*" )
348+ dirInfo , err := os .Stat (dirPath )
349+ assert .NoError (t , err )
350+
351+ metadata , err := getFileMetadata (dirPath )
352+ assert .NoError (t , err )
353+
354+ assert .Equal (t , filepath .Base (dirPath ), metadata .Name )
355+ assert .Equal (t , dirInfo .Size (), metadata .Size )
356+ assert .Equal (t , uint32 (dirInfo .Mode ().Perm ()), metadata .Mode )
357+ assert .Equal (t , byte (5 ), metadata .Typeflag , "Typeflag should be 5 for directory" )
358+ assert .WithinDuration (t , dirInfo .ModTime (), metadata .ModTime , time .Second )
359+
360+ // Check UID/GID only on Unix-like systems
361+ if stat , ok := dirInfo .Sys ().(* syscall.Stat_t ); ok {
362+ assert .Equal (t , stat .Uid , metadata .Uid , "UID mismatch" )
363+ assert .Equal (t , stat .Gid , metadata .Gid , "GID mismatch" )
364+ } else if runtime .GOOS != "windows" {
365+ t .Logf ("Warning: Could not get syscall.Stat_t on non-Windows OS (%s)" , runtime .GOOS )
366+ } else {
367+ assert .Equal (t , uint32 (0 ), metadata .Uid , "UID should be 0 on Windows" )
368+ assert .Equal (t , uint32 (0 ), metadata .Gid , "GID should be 0 on Windows" )
369+ }
370+ })
371+ }
0 commit comments