public void WhenStaleLocksAreExpired_TheLocksAreRemoved() { var thePackage = CreatePackageIdentity("Package", "1.0"); var packageLocks = new PackageLocks { new UsageDetails(new ServerTaskId("Deployment-1"), new CacheAge(1), new DateTime(2021, 1, 1)) }; var journalEntry = new JournalEntry(thePackage, 1, packageLocks); var journalEntries = new Dictionary <PackageIdentity, JournalEntry>() { { thePackage, journalEntry } }; var testJournal = new PackageJournal(new InMemoryJournalRepository(journalEntries), Substitute.For <ILog>(), Substitute.For <ICalamariFileSystem>(), Substitute.For <IRetentionAlgorithm>(), Substitute.For <ISemaphoreFactory>()); testJournal.ExpireStaleLocks(TimeSpan.FromDays(14)); Assert.IsFalse(journalRepository.HasLock(thePackage)); }
public void WhenRetentionIsAppliedAndCacheSpaceIsSufficientButDiskSpaceIsNot_ThenPackageFileAndUsageAreRemoved() { var existingPackage = CreatePackageIdentity("PackageOne", "1.0"); var retentionAlgorithm = Substitute.For <IRetentionAlgorithm>(); retentionAlgorithm.GetPackagesToRemove(Arg.Any <IEnumerable <JournalEntry> >()).Returns(new List <PackageIdentity>() { existingPackage }); var fileSystem = Substitute.For <ICalamariFileSystem>(); fileSystem.FileExists(existingPackage.Path.Value).Returns(true); fileSystem.GetDiskFreeSpace(Arg.Any <string>(), out _) .Returns(x => { x[1] = 0.5M; // 0.5MB free return(true); }); var thisRepository = new InMemoryJournalRepository(); var thisJournal = new PackageJournal(thisRepository, Substitute.For <ILog>(), fileSystem, retentionAlgorithm, Substitute.For <ISemaphoreFactory>()); thisJournal.RegisterPackageUse(existingPackage, new ServerTaskId("Deployment-1"), 1 * 1024 * 1024); //Package is 1 MB thisJournal.ApplyRetention(); thisRepository.GetUsage(existingPackage).Should().BeEmpty(); fileSystem.Received().DeleteFile(existingPackage.Path.Value, FailureOptions.IgnoreFailure); }
public void WhenRetentionIsApplied_ThenPackageFileAndUsageAreRemoved() { var packageOne = CreatePackageIdentity("PackageOne", "1.0"); var retentionAlgorithm = Substitute.For <IRetentionAlgorithm>(); retentionAlgorithm.GetPackagesToRemove(Arg.Any <IEnumerable <JournalEntry> >()).Returns(new List <PackageIdentity>() { packageOne }); var fileSystem = Substitute.For <ICalamariFileSystem>(); fileSystem.FileExists(packageOne.Path.Value).Returns(true); var thisRepository = new InMemoryJournalRepository(); var thisJournal = new PackageJournal(thisRepository, Substitute.For <ILog>(), fileSystem, retentionAlgorithm, Substitute.For <ISemaphoreFactory>()); thisJournal.RegisterPackageUse(packageOne, new ServerTaskId("Deployment-1"), 1000); thisJournal.ApplyRetention(); thisRepository.GetUsage(packageOne).Should().BeEmpty(); fileSystem.Received().DeleteFile(packageOne.Path.Value, FailureOptions.IgnoreFailure); }
public void Setup() { variables = new CalamariVariables(); variables.Set(KnownVariables.Calamari.EnablePackageRetention, bool.TrueString); variables.Set(TentacleVariables.Agent.TentacleHome, "SomeDirectory"); journalRepository = new InMemoryJournalRepository(); packageJournal = new PackageJournal( journalRepository, Substitute.For <ILog>(), Substitute.For <ICalamariFileSystem>(), Substitute.For <IRetentionAlgorithm>(), Substitute.For <ISemaphoreFactory>() ); }
static InMemoryJournalRepository SeedJournal() { var journalRepo = new InMemoryJournalRepository(); var journal = new PackageJournal(journalRepo, Substitute.For <ILog>(), new TestCalamariPhysicalFileSystem(), Substitute.For <IRetentionAlgorithm>(), new SystemSemaphoreManager()); var serverTask = new ServerTaskId("ServerTasks-1"); for (var i = 0; i < 50000; i++) { var package = new PackageIdentity(new PackageId($"Package-{i % 100}"), new SemanticVersion(1, 0, i), new PackagePath($"C:\\{i}")); journal.RegisterPackageUse(package, serverTask, 100); } journal.RemoveAllLocks(serverTask); return(journalRepo); }
public void OnlyStaleLocksAreExpired() { var packageOne = CreatePackageIdentity("PackageOne", "1.0"); var packageTwo = CreatePackageIdentity("PackageTwo", "1.0"); var packageOneLocks = new PackageLocks { new UsageDetails(new ServerTaskId("Deployment-1"), new CacheAge(1), new DateTime(2021, 1, 1)), }; var packageTwoLocks = new PackageLocks { new UsageDetails(new ServerTaskId("Deployment-2"), new CacheAge(1), DateTime.Now), }; var packageOneJournalEntry = new JournalEntry(packageOne, 1, packageOneLocks); var packageTwoJournalEntry = new JournalEntry(packageTwo, 1, packageTwoLocks); var journalEntries = new Dictionary <PackageIdentity, JournalEntry>() { { packageOne, packageOneJournalEntry }, { packageTwo, packageTwoJournalEntry } }; var testJournalRepository = new InMemoryJournalRepository(journalEntries); var testJournal = new PackageJournal(testJournalRepository, Substitute.For <ILog>(), Substitute.For <ICalamariFileSystem>(), Substitute.For <IRetentionAlgorithm>(), Substitute.For <ISemaphoreFactory>()); testJournal.ExpireStaleLocks(TimeSpan.FromDays(14)); Assert.IsFalse(testJournalRepository.HasLock(packageOne)); Assert.IsTrue(testJournalRepository.HasLock(packageTwo)); }