@@ -460,6 +460,85 @@ func TestSymlinks(t *testing.T) {
460460 }))
461461}
462462
463+ func TestReadFile (t * testing.T ) {
464+ type tarfsFile struct {
465+ Header tar.Header
466+ Data []byte
467+ }
468+
469+ tmp := t .TempDir ()
470+ run := func (openErr bool , tarfsFiles []tarfsFile , chk func (* testing.T , * FS )) func (* testing.T ) {
471+ return func (t * testing.T ) {
472+ t .Helper ()
473+ // This is a perfect candidate for using test.GenerateFixture, but
474+ // creates an import cycle.
475+ f , err := os .Create (filepath .Join (tmp , path .Base (t .Name ())))
476+ if err != nil {
477+ t .Fatal (err )
478+ }
479+ defer f .Close ()
480+
481+ tw := tar .NewWriter (f )
482+ for _ , tarfsFile := range tarfsFiles {
483+ h := tarfsFile .Header
484+ h .Size = int64 (len (tarfsFile .Data ))
485+ h .Format = tar .FormatGNU
486+ if err := tw .WriteHeader (& h ); err != nil {
487+ t .Error (err )
488+ }
489+ _ , err := tw .Write (tarfsFile .Data )
490+ if err != nil {
491+ t .Error (err )
492+ }
493+ }
494+ if err := tw .Close (); err != nil {
495+ t .Error (err )
496+ }
497+
498+ sys , err := New (f )
499+ t .Log (err )
500+ if (err != nil ) != openErr {
501+ t .Fail ()
502+ }
503+
504+ if chk != nil {
505+ chk (t , sys )
506+ }
507+ }
508+ }
509+
510+ t .Run ("Hardlink" , func (t * testing.T ) {
511+ originalData := []byte (`Hello, World!` )
512+ abData := make ([]byte , len (originalData ))
513+ copy (abData , originalData )
514+
515+ run (false , []tarfsFile {
516+ {
517+ Header : tar.Header {Name : `a/` },
518+ },
519+ {
520+ Header : tar.Header {Name : `a/b` },
521+ Data : abData ,
522+ },
523+ {
524+ Header : tar.Header {
525+ Name : `a/c` ,
526+ Typeflag : tar .TypeLink ,
527+ Linkname : `a/b` ,
528+ },
529+ },
530+ }, func (t * testing.T , sys * FS ) {
531+ acFile , err := sys .ReadFile ("a/c" )
532+ if err != nil {
533+ t .Errorf ("error while opening file: %v" , err )
534+ }
535+ if ! bytes .Equal (originalData , acFile ) {
536+ t .Errorf ("unexpected \" %s\" , got \" %s\" " , originalData , acFile )
537+ }
538+ })
539+ })
540+ }
541+
463542func TestKnownLayers (t * testing.T ) {
464543 ents , err := os .ReadDir (`testdata/known` )
465544 if err != nil {
0 commit comments