@@ -63,6 +63,8 @@ func SnapshotterSuite(t *testing.T, name string, snapshotterFn func(ctx context.
6363 t .Run ("StatInWalk" , makeTest (name , snapshotterFn , checkStatInWalk ))
6464 t .Run ("CloseTwice" , makeTest (name , snapshotterFn , closeTwice ))
6565 t .Run ("RootPermission" , makeTest (name , snapshotterFn , checkRootPermission ))
66+
67+ t .Run ("128LayersMount" , makeTest (name , snapshotterFn , check128LayersMount ))
6668}
6769
6870func makeTest (name string , snapshotterFn func (ctx context.Context , root string ) (snapshots.Snapshotter , func () error , error ), fn func (ctx context.Context , t * testing.T , snapshotter snapshots.Snapshotter , work string )) func (t * testing.T ) {
@@ -858,3 +860,94 @@ func checkRootPermission(ctx context.Context, t *testing.T, snapshotter snapshot
858860 t .Fatalf ("expected 0755, got 0%o" , mode )
859861 }
860862}
863+
864+ func check128LayersMount (ctx context.Context , t * testing.T , snapshotter snapshots.Snapshotter , work string ) {
865+ lowestApply := fstest .Apply (
866+ fstest .CreateFile ("/bottom" , []byte ("way at the bottom\n " ), 0777 ),
867+ fstest .CreateFile ("/overwriteme" , []byte ("FIRST!\n " ), 0777 ),
868+ fstest .CreateDir ("/ADDHERE" , 0755 ),
869+ fstest .CreateDir ("/ONLYME" , 0755 ),
870+ fstest .CreateFile ("/ONLYME/bottom" , []byte ("bye!\n " ), 0777 ),
871+ )
872+
873+ appliers := []fstest.Applier {lowestApply }
874+ for i := 1 ; i <= 127 ; i ++ {
875+ appliers = append (appliers , fstest .Apply (
876+ fstest .CreateFile ("/overwriteme" , []byte (fmt .Sprintf ("%d WAS HERE!\n " , i )), 0777 ),
877+ fstest .CreateFile (fmt .Sprintf ("/ADDHERE/file-%d" , i ), []byte ("same\n " ), 0755 ),
878+ fstest .RemoveAll ("/ONLYME" ),
879+ fstest .CreateDir ("/ONLYME" , 0755 ),
880+ fstest .CreateFile (fmt .Sprintf ("/ONLYME/file-%d" , i ), []byte ("only me!\n " ), 0777 ),
881+ ))
882+ }
883+
884+ flat := filepath .Join (work , "flat" )
885+ if err := os .MkdirAll (flat , 0777 ); err != nil {
886+ t .Fatalf ("failed to create flat dir(%s): %+v" , flat , err )
887+ }
888+
889+ // NOTE: add gc labels to avoid snapshots get removed by gc...
890+ parent := ""
891+ for i , applier := range appliers {
892+ preparing := filepath .Join (work , fmt .Sprintf ("prepare-layer-%d" , i ))
893+ if err := os .MkdirAll (preparing , 0777 ); err != nil {
894+ t .Fatalf ("[layer %d] failed to create preparing dir(%s): %+v" , i , preparing , err )
895+ }
896+
897+ mounts , err := snapshotter .Prepare (ctx , preparing , parent , opt )
898+ if err != nil {
899+ t .Fatalf ("[layer %d] failed to get mount info: %+v" , i , err )
900+ }
901+
902+ if err := mount .All (mounts , preparing ); err != nil {
903+ t .Fatalf ("[layer %d] failed to mount on the target(%s): %+v" , i , preparing , err )
904+ }
905+
906+ if err := fstest .CheckDirectoryEqual (preparing , flat ); err != nil {
907+ testutil .Unmount (t , preparing )
908+ t .Fatalf ("[layer %d] preparing doesn't equal to flat before apply: %+v" , i , err )
909+ }
910+
911+ if err := applier .Apply (flat ); err != nil {
912+ testutil .Unmount (t , preparing )
913+ t .Fatalf ("[layer %d] failed to apply on flat dir: %+v" , i , err )
914+ }
915+
916+ if err = applier .Apply (preparing ); err != nil {
917+ testutil .Unmount (t , preparing )
918+ t .Fatalf ("[layer %d] failed to apply on preparing dir: %+v" , i , err )
919+ }
920+
921+ if err := fstest .CheckDirectoryEqual (preparing , flat ); err != nil {
922+ testutil .Unmount (t , preparing )
923+ t .Fatalf ("[layer %d] preparing doesn't equal to flat after apply: %+v" , i , err )
924+ }
925+
926+ testutil .Unmount (t , preparing )
927+
928+ parent = filepath .Join (work , fmt .Sprintf ("committed-%d" , i ))
929+ if err := snapshotter .Commit (ctx , parent , preparing , opt ); err != nil {
930+ t .Fatalf ("[layer %d] failed to commit the preparing: %+v" , i , err )
931+ }
932+
933+ }
934+
935+ view := filepath .Join (work , "fullview" )
936+ if err := os .MkdirAll (view , 0777 ); err != nil {
937+ t .Fatalf ("failed to create fullview dir(%s): %+v" , view , err )
938+ }
939+
940+ mounts , err := snapshotter .View (ctx , view , parent , opt )
941+ if err != nil {
942+ t .Fatalf ("failed to get view's mount info: %+v" , err )
943+ }
944+
945+ if err := mount .All (mounts , view ); err != nil {
946+ t .Fatalf ("failed to mount on the target(%s): %+v" , view , err )
947+ }
948+ defer testutil .Unmount (t , view )
949+
950+ if err := fstest .CheckDirectoryEqual (view , flat ); err != nil {
951+ t .Fatalf ("fullview should equal to flat: %+v" , err )
952+ }
953+ }
0 commit comments