private static async Task <bool> EditSemaphoreDelayedBy(int delayTime, string seamaphoreId, string currentOwner) { using (var db = new MarvinEntities()) { var semaphore = await db.semaphore.FirstOrDefaultAsync(a => a.semaphoreId == seamaphoreId); semaphore.currentOwnerId = currentOwner; Thread.Sleep(delayTime); try { await db.SaveChangesAsync(); } catch (Exception) { return(false); } return(true); } }
public void StoreWinsSemaphoreRaceCondition() { using (var db = new MarvinEntities()) { var entry = db.semaphore.Add(new semaphore { currentOwnerId = "owner1", heartBeat = TimeProvider.GetUtcNow(), semaphoreId = "testSemaphore" }); db.SaveChanges(); //If this f***s up, be sure that the semaphore rowversion property concurrencymode, is set to fixed! var edit1 = EditSemaphoreDelayedBy(1000, entry.semaphoreId, "MrSlow"); var edit2 = EditSemaphoreDelayedBy(1, entry.semaphoreId, "MrFast"); Assert.That(edit1.Result, Is.False); Assert.That(edit2.Result, Is.True); db.Entry(entry).Reload(); db.semaphore.Remove(entry); db.SaveChanges(); } }
public void EssenceGetsCleanedOnUpdate() { var originJob = ActiveJob(); int essenceAmount; JobRepository.Add(originJob); Assert.That(JobRepository.ActiveJobs().Count(), Is.EqualTo(1)); Assert.That(JobRepository.DoneJobs(), Is.Empty); Assert.That(JobRepository.WaitingJobs(), Is.Empty); var jobFromRepo = JobRepository.Get(originJob.Urn); jobFromRepo.Plan.GetCurrentTask().State = ExecutionState.Done; jobFromRepo.Plan.MoveToNextTask(); JobRepository.Update(jobFromRepo); using (var db = new MarvinEntities()) { essenceAmount = db.essence.Count(); } //There should only be four essencefiles (two job essence and two task essence) Assert.That(essenceAmount, Is.EqualTo(4)); }