Esempio n. 1
0
        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);
                    }
                }
            }
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
 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);
 }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
        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));
        }
Esempio n. 6
0
 internal void HandleChange(EntityChange <T> change)
 {
     Change = change;
     _changeEvent.Set();
 }