@@ -737,17 +737,22 @@ final class VMStorageOCITests: XCTestCase {
737737 // Use syntactically valid digests here; the test only exercises record
738738 // and tag-symlink cleanup, not content installation.
739739 let deletedManifest = try stackedManifest (
740- baseContentDigest: " sha256: " + String( repeating: " a " , count: 64 )
740+ baseContentDigest: " sha256: " + String( repeating: " a " , count: 64 ) ,
741+ overlayContentDigest: " sha256: " + String( repeating: " e " , count: 64 )
741742 )
742743 let retainedManifest = try stackedManifest (
743- baseContentDigest: " sha256: " + String( repeating: " b " , count: 64 )
744+ baseContentDigest: " sha256: " + String( repeating: " b " , count: 64 ) ,
745+ overlayContentDigest: " sha256: " + String( repeating: " f " , count: 64 )
744746 )
745747 let deletedName = try digestName ( for: deletedManifest)
746748 let deletedRecord = try createRecord ( for: deletedManifest, in: storage)
747749 let tagName = RemoteName ( host: " example.com " , namespace: " org/image " , reference: Reference ( tag: " deleted " ) )
748750 let tagURL = storage. baseURL. appendingRemoteName ( tagName)
749751 try storage. link ( from: tagName, to: deletedName)
750752 let retainedRecord = try createRecord ( for: retainedManifest, in: storage)
753+ let retainedTagName = RemoteName ( host: " example.com " , namespace: " org/image " , reference: Reference ( tag: " retained " ) )
754+ let retainedTagURL = storage. baseURL. appendingRemoteName ( retainedTagName)
755+ try storage. link ( from: retainedTagName, to: try digestName ( for: retainedManifest) )
751756 try deletedRecord. url. updateAccessDate ( Date ( timeIntervalSince1970: 1 ) )
752757
753758 try Prune . pruneOlderThan (
@@ -758,6 +763,40 @@ final class VMStorageOCITests: XCTestCase {
758763 XCTAssertFalse ( FileManager . default. fileExists ( atPath: deletedRecord. url. path) )
759764 XCTAssertThrowsError ( try FileManager . default. destinationOfSymbolicLink ( atPath: tagURL. path) )
760765 XCTAssertTrue ( FileManager . default. fileExists ( atPath: retainedRecord. url. path) )
766+ XCTAssertTrue ( FileManager . default. fileExists ( atPath: retainedTagURL. path) )
767+ }
768+ }
769+
770+ func testSpaceBudgetPruningCachedImageRemovesOnlyItsTagSymlink( ) throws {
771+ try withTemporaryTartHome {
772+ let storage = try VMStorageOCI ( )
773+ let deletedManifest = try stackedManifest (
774+ baseContentDigest: " sha256: " + String( repeating: " c " , count: 64 ) ,
775+ overlayContentDigest: " sha256: " + String( repeating: " 0 " , count: 64 )
776+ )
777+ let retainedManifest = try stackedManifest (
778+ baseContentDigest: " sha256: " + String( repeating: " d " , count: 64 ) ,
779+ overlayContentDigest: " sha256: " + String( repeating: " 1 " , count: 64 )
780+ )
781+ let deletedName = try digestName ( for: deletedManifest)
782+ let deletedRecord = try createRecord ( for: deletedManifest, in: storage)
783+ let tagName = RemoteName ( host: " example.com " , namespace: " org/image " , reference: Reference ( tag: " deleted " ) )
784+ let tagURL = storage. baseURL. appendingRemoteName ( tagName)
785+ try storage. link ( from: tagName, to: deletedName)
786+ let retainedRecord = try createRecord ( for: retainedManifest, in: storage)
787+ let retainedTagName = RemoteName ( host: " example.com " , namespace: " org/image " , reference: Reference ( tag: " retained " ) )
788+ let retainedTagURL = storage. baseURL. appendingRemoteName ( retainedTagName)
789+ try storage. link ( from: retainedTagName, to: try digestName ( for: retainedManifest) )
790+ try deletedRecord. url. updateAccessDate ( Date ( timeIntervalSince1970: 1 ) )
791+ try retainedRecord. url. updateAccessDate ( Date ( timeIntervalSince1970: 2 ) )
792+ let retainedSize = UInt64 ( try retainedRecord. url. allocatedSizeBytes ( ) )
793+
794+ try Prune . pruneSpaceBudget ( prunableStorages: [ storage] , spaceBudgetBytes: retainedSize)
795+
796+ XCTAssertFalse ( FileManager . default. fileExists ( atPath: deletedRecord. url. path) )
797+ XCTAssertThrowsError ( try FileManager . default. destinationOfSymbolicLink ( atPath: tagURL. path) )
798+ XCTAssertTrue ( FileManager . default. fileExists ( atPath: retainedRecord. url. path) )
799+ XCTAssertTrue ( FileManager . default. fileExists ( atPath: retainedTagURL. path) )
761800 }
762801 }
763802
0 commit comments