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));
        }
Esempio n. 4
0
        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);
                    }
                }
            }
        }