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