public async Task GetNewerRevisionAsync_DoesNotExist() { var buildRepo = new MemoryBuildRepository(); EntityChange <Build> change = await buildRepo.GetNewerRevisionAsync("build1", 1); Assert.That(change.Type, Is.EqualTo(EntityChangeType.Delete)); }
public async Task GetNewerRevisionByEngineIdAsync_Insert() { var buildRepo = new MemoryBuildRepository(); Task task = Task.Run(async() => { await Task.Delay(10); var build = new Build { EngineId = "engine1", CurrentStep = 1 }; await buildRepo.InsertAsync(build); }); EntityChange <Build> change = await buildRepo.GetNewerRevisionByEngineIdAsync("engine1", 0); await task; Assert.That(change.Type, Is.EqualTo(EntityChangeType.Insert)); Assert.That(change.Entity.Revision, Is.EqualTo(0)); Assert.That(change.Entity.CurrentStep, Is.EqualTo(1)); }
public async Task GetNewerRevisionAsync_Delete() { var buildRepo = new MemoryBuildRepository(); var build = new Build { EngineId = "engine1" }; await buildRepo.InsertAsync(build); Task task = Task.Run(async() => { await Task.Delay(10); await buildRepo.DeleteAsync(build); }); EntityChange <Build> change = await buildRepo.GetNewerRevisionAsync(build.Id, 1); await task; Assert.That(change.Type, Is.EqualTo(EntityChangeType.Delete)); }
private static async Task <EntityChange <TEntity> > GetNewerRevisionAsync <TKey, TEntity>( Func <TKey, Action <EntityChange <TEntity> >, Task <IDisposable> > subscribe, Func <TKey, Task <TEntity> > getEntity, TKey key, long minRevision, CancellationToken ct) where TEntity : class, IEntity <TEntity> { var changeEvent = new AsyncAutoResetEvent(); var change = new EntityChange <TEntity>(); void HandleChange(EntityChange <TEntity> c) { change = c; changeEvent.Set(); } ct.ThrowIfCancellationRequested(); using (await subscribe(key, HandleChange)) { if (minRevision > 0 && await getEntity(key) == null) { return(new EntityChange <TEntity>(EntityChangeType.Delete, null)); } while (true) { await changeEvent.WaitAsync(ct); EntityChange <TEntity> curChange = change; if (curChange.Type == EntityChangeType.Delete) { return(curChange); } if (minRevision <= curChange.Entity.Revision) { return(curChange); } } } }