private static async Task <EntityChange <TEntity> > GetNewerRevisionAsync <TKey, TEntity>( Func <TKey, CancellationToken, Task <Subscription <TEntity> > > subscribe, TKey key, long minRevision, CancellationToken ct) where TEntity : class, IEntity <TEntity> { using (Subscription <TEntity> subscription = await subscribe(key, ct)) { EntityChange <TEntity> curChange = subscription.Change; if (curChange.Type == EntityChangeType.Delete && minRevision > 0) { return(curChange); } while (true) { if (curChange.Type != EntityChangeType.Delete && minRevision <= curChange.Entity.Revision) { return(curChange); } await subscription.WaitForUpdateAsync(ct); curChange = subscription.Change; if (curChange.Type == EntityChangeType.Delete) { return(curChange); } } } }
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 Subscription(object key, T initialEntity, Action <Subscription <T> > remove) { Key = key; _remove = remove; _changeEvent = new AsyncAutoResetEvent(); Change = new EntityChange <T>(initialEntity == null ? EntityChangeType.Delete : EntityChangeType.Update, initialEntity); }
public async Task GetNewerRevisionAsync_Delete() { var buildRepo = new MemoryBuildRepository(); var build = new Build { EngineRef = "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)); }
public async Task GetNewerRevisionByEngineIdAsync_Insert() { var buildRepo = new MemoryBuildRepository(); Task task = Task.Run(async() => { await Task.Delay(10); var build = new Build { EngineRef = "engine1", PercentCompleted = 0.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.PercentCompleted, Is.EqualTo(0.1)); }
internal void HandleChange(EntityChange <T> change) { Change = change; _changeEvent.Set(); }