Example #1
0
        public void CanGetNumberOfKeysFromTouchReferenceTask()
        {
            var task1 = new TouchReferenceDocumentIfChangedTask(101);

            Assert.Equal(0, task1.NumberOfKeys);

            for (var i = 0; i < 100; i++)
            {
                task1.UpdateReferenceToCheck(new KeyValuePair <string, Etag>("key/" + i, Etag.Empty));
            }
            Assert.Equal(100, task1.NumberOfKeys);

            var task2 = new TouchReferenceDocumentIfChangedTask(102);

            task2.UpdateReferenceToCheck(new KeyValuePair <string, Etag>("test1", Etag.Empty));
            task2.UpdateReferenceToCheck(new KeyValuePair <string, Etag>("test2", Etag.Empty));
            task1.Merge(task2);
            Assert.Equal(102, task1.NumberOfKeys);

            var task3 = new TouchReferenceDocumentIfChangedTask(103);

            task3.UpdateReferenceToCheck(new KeyValuePair <string, Etag>("test1", Etag.Empty.IncrementBy(2)));
            task3.UpdateReferenceToCheck(new KeyValuePair <string, Etag>("test2", Etag.Empty.IncrementBy(1)));
            task1.Merge(task3);
            Assert.Equal(102, task1.NumberOfKeys);
        }
        public void returns_only_tasks_for_existing_indexes(string requestedStorage)
        {
            using (var storage = NewTransactionalStorage(requestedStorage))
            {
                storage.Batch(actions =>
                {
                    int id = 99;
                    for (int i = 0; i < 3; i++)
                    {
                        var task = new RemoveFromIndexTask(id);
                        id++;
                        task.AddKey("tasks/" + i);
                        actions.Tasks.AddTask(task, SystemTime.UtcNow);
                    }

                    id = 99;
                    for (int i = 0; i < 3; i++)
                    {
                        var task = new TouchReferenceDocumentIfChangedTask(id);
                        id++;
                        actions.Tasks.AddTask(task, SystemTime.UtcNow);
                    }
                });

                storage.Batch(actions =>
                {
                    var idsToSkip   = new List <int>();
                    var allIndexes  = new[] { 100 };
                    var alreadySeen = new HashSet <IComparable>();

                    var task1 = actions.Tasks.GetMergedTask <RemoveFromIndexTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.Equal(1, task1.NumberOfKeys);
                    Assert.NotNull(task1);
                    Assert.Equal(100, task1.Index);
                    actions.Tasks.DeleteTasks(alreadySeen);

                    task1 = actions.Tasks.GetMergedTask <RemoveFromIndexTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.Null(task1);

                    var task2 = actions.Tasks.GetMergedTask <TouchReferenceDocumentIfChangedTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.NotNull(task2);
                    Assert.Equal(false, task2.SeparateTasksByIndex);
                    Assert.Equal(100, task2.Index);
                    actions.Tasks.DeleteTasks(alreadySeen);

                    task2 = actions.Tasks.GetMergedTask <TouchReferenceDocumentIfChangedTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.Null(task2);
                });

                storage.Batch(actions =>
                {
                    var isIndexStale = actions.Staleness.IsIndexStale(100, null, null);
                    Assert.False(isIndexStale);
                });
            }
        }
        public void CanAddAndRemoveMultipleTasks_DifferentTypes(string requestedStorage)
        {
            using (var storage = NewTransactionalStorage(requestedStorage))
            {
                storage.Batch(actions =>
                {
                    for (int i = 0; i < 3; i++)
                    {
                        var task = new RemoveFromIndexTask(100);
                        task.AddKey("tasks/" + i);
                        actions.Tasks.AddTask(task, SystemTime.UtcNow);
                    }

                    for (int i = 0; i < 3; i++)
                    {
                        var task = new TouchReferenceDocumentIfChangedTask(100);
                        actions.Tasks.AddTask(task, SystemTime.UtcNow);
                    }
                });

                storage.Batch(actions =>
                {
                    var idsToSkip   = new List <int>();
                    var allIndexes  = new[] { 100 };
                    var alreadySeen = new HashSet <IComparable>();

                    var task1 = actions.Tasks.GetMergedTask <RemoveFromIndexTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.NotNull(task1);

                    task1 = actions.Tasks.GetMergedTask <RemoveFromIndexTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.Null(task1);

                    var task2 = actions.Tasks.GetMergedTask <TouchReferenceDocumentIfChangedTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.NotNull(task2);

                    task2 = actions.Tasks.GetMergedTask <TouchReferenceDocumentIfChangedTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.Null(task2);

                    actions.Tasks.DeleteTasks(alreadySeen);
                });

                storage.Batch(accessor =>
                {
                    Assert.False(accessor.Tasks.HasTasks);
                    Assert.Equal(0, accessor.Tasks.ApproximateTaskCount);
                });

                storage.Batch(actions =>
                {
                    var isIndexStale = actions.Staleness.IsIndexStale(100, null, null);
                    Assert.False(isIndexStale);
                });
            }
        }
        public void CanAddAndRemoveMultipleTasks_DifferentTypes(string requestedStorage)
        {
            using (var storage = NewTransactionalStorage(requestedStorage))
            {
                storage.Batch(actions =>
                {
                    for (int i = 0; i < 3; i++)
                    {
                        var task = new RemoveFromIndexTask(100);
                        task.AddKey("tasks/" + i);
                        actions.Tasks.AddTask(task, SystemTime.UtcNow);
                    }

                    for (int i = 0; i < 3; i++)
                    {
                        var task = new TouchReferenceDocumentIfChangedTask(100);
                        actions.Tasks.AddTask(task, SystemTime.UtcNow);
                    }
                });

                storage.Batch(actions =>
                {
                    var idsToSkip = new List<int>();
                    var allIndexes = new[] { 100 };
                    var alreadySeen = new HashSet<IComparable>();

                    var task1 = actions.Tasks.GetMergedTask<RemoveFromIndexTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.NotNull(task1);

                    task1 = actions.Tasks.GetMergedTask<RemoveFromIndexTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.Null(task1);

                    var task2 = actions.Tasks.GetMergedTask<TouchReferenceDocumentIfChangedTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.NotNull(task2);

                    task2 = actions.Tasks.GetMergedTask<TouchReferenceDocumentIfChangedTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.Null(task2);

                    actions.Tasks.DeleteTasks(alreadySeen);
                });

                storage.Batch(accessor =>
                {
                    Assert.False(accessor.Tasks.HasTasks);
                    Assert.Equal(0, accessor.Tasks.ApproximateTaskCount);
                });

                storage.Batch(actions =>
                {
                    var isIndexStale = actions.Staleness.IsIndexStale(100, null, null);
                    Assert.False(isIndexStale);
                });
            }
        }
        public void can_remove_different_type_tasks_for_one_index(string requestedStorage)
        {
            using (var storage = NewTransactionalStorage(requestedStorage))
            {
                storage.Batch(actions =>
                {
                    for (int i = 0; i < 3; i++)
                    {
                        var task1 = new RemoveFromIndexTask(100);
                        task1.AddKey("tasks/" + i);
                        actions.Tasks.AddTask(task1, SystemTime.UtcNow);

                        var task2 = new TouchReferenceDocumentIfChangedTask(100);
                        actions.Tasks.AddTask(task2, SystemTime.UtcNow);
                    }
                });

                storage.Batch(actions =>
                {
                    Assert.Equal(6, actions.Tasks.ApproximateTaskCount);
                    actions.Tasks.DeleteTasksForIndex(101);
                });

                storage.Batch(accessor =>
                {
                    Assert.True(accessor.Tasks.HasTasks);
                    Assert.Equal(6, accessor.Tasks.ApproximateTaskCount);
                });

                storage.Batch(actions =>
                {
                    var isIndexStale = actions.Staleness.IsIndexStale(100, null, null);
                    Assert.False(isIndexStale);
                });

                storage.Batch(actions => actions.Tasks.DeleteTasksForIndex(100));

                storage.Batch(accessor =>
                {
                    Assert.False(accessor.Tasks.HasTasks);
                    Assert.Equal(0, accessor.Tasks.ApproximateTaskCount);

                    var isIndexStale = accessor.Staleness.IsIndexStale(101, null, null);
                    Assert.False(isIndexStale);
                });
            }
        }
        public void returns_only_working_indexes(string requestedStorage)
        {
            using (var storage = NewTransactionalStorage(requestedStorage))
            {
                storage.Batch(actions =>
                {
                    var id = 100;
                    for (int i = 0; i < 3; i++)
                    {
                        var task = new TouchReferenceDocumentIfChangedTask(id);
                        task.UpdateReferenceToCheck(new KeyValuePair <string, Etag>(i.ToString(), Etag.Empty));
                        id++;
                        actions.Tasks.AddTask(task, SystemTime.UtcNow);
                    }
                });

                storage.Batch(actions =>
                {
                    var idsToSkip = new List <int>()
                    {
                        101
                    };
                    var allIndexes  = new[] { 100 };
                    var alreadySeen = new HashSet <IComparable>();

                    var task1 = actions.Tasks.GetMergedTask <TouchReferenceDocumentIfChangedTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.Equal(1, task1.NumberOfKeys);
                    Assert.NotNull(task1);
                    Assert.Equal(100, task1.Index);
                });

                storage.Batch(actions =>
                {
                    var isIndexStale = actions.Staleness.IsIndexStale(100, null, null);
                    Assert.False(isIndexStale);
                });
            }
        }
        public void CanGetNumberOfKeysFromTouchReferenceTask()
        {
            var task1 = new TouchReferenceDocumentIfChangedTask(101);
            Assert.Equal(0, task1.NumberOfKeys);

            for (var i = 0; i < 100; i++)
            {
                task1.UpdateReferenceToCheck(new KeyValuePair<string, Etag>("key/" + i, Etag.Empty));
            }
            Assert.Equal(100, task1.NumberOfKeys);

            var task2 = new TouchReferenceDocumentIfChangedTask(102);
            task2.UpdateReferenceToCheck(new KeyValuePair<string, Etag>("test1", Etag.Empty));
            task2.UpdateReferenceToCheck(new KeyValuePair<string, Etag>("test2", Etag.Empty));
            task1.Merge(task2);
            Assert.Equal(102, task1.NumberOfKeys);

            var task3 = new TouchReferenceDocumentIfChangedTask(103);
            task3.UpdateReferenceToCheck(new KeyValuePair<string, Etag>("test1", Etag.Empty.IncrementBy(2)));
            task3.UpdateReferenceToCheck(new KeyValuePair<string, Etag>("test2", Etag.Empty.IncrementBy(1)));
            task1.Merge(task3);
            Assert.Equal(102, task1.NumberOfKeys);
        }
        public void returns_only_working_indexes(string requestedStorage)
        {
            using (var storage = NewTransactionalStorage(requestedStorage))
            {
                storage.Batch(actions =>
                {
                    var id = 100;
                    for (int i = 0; i < 3; i++)
                    {
                        var task = new TouchReferenceDocumentIfChangedTask(id);
                        task.UpdateReferenceToCheck(new KeyValuePair<string, Etag>(i.ToString(), Etag.Empty));
                        id++;
                        actions.Tasks.AddTask(task, SystemTime.UtcNow);
                    }
                });

                storage.Batch(actions =>
                {
                    var idsToSkip = new List<int>() { 101 };
                    var allIndexes = new[] { 100 };
                    var alreadySeen = new HashSet<IComparable>();

                    var task1 = actions.Tasks.GetMergedTask<TouchReferenceDocumentIfChangedTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.Equal(1, task1.NumberOfKeys);
                    Assert.NotNull(task1);
                    Assert.Equal(100, task1.Index);
                });

                storage.Batch(actions =>
                {
                    var isIndexStale = actions.Staleness.IsIndexStale(100, null, null);
                    Assert.False(isIndexStale);
                });
            }
        }
        public void returns_only_tasks_for_existing_indexes_with_merging(string requestedStorage)
        {
            using (var storage = NewTransactionalStorage(requestedStorage))
            {
                storage.Batch(actions =>
                {
                    int id = 100;
                    for (int i = 0; i < 3; i++)
                    {
                        var task = new RemoveFromIndexTask(id);
                        id++;
                        task.AddKey("tasks/" + i);
                        actions.Tasks.AddTask(task, SystemTime.UtcNow);

                        task = new RemoveFromIndexTask(id);
                        id++;
                        task.AddKey("tasks/" + i + 1);
                        actions.Tasks.AddTask(task, SystemTime.UtcNow);
                    }

                    id = 100;
                    for (int i = 0; i < 3; i++)
                    {
                        var task = new TouchReferenceDocumentIfChangedTask(id);
                        id++;
                        actions.Tasks.AddTask(task, SystemTime.UtcNow);

                        task = new TouchReferenceDocumentIfChangedTask(id);
                        id++;
                        actions.Tasks.AddTask(task, SystemTime.UtcNow);
                    }
                });

                storage.Batch(actions =>
                {
                    var idsToSkip = new List<int>();
                    var allIndexes = new[] { 100 };
                    var alreadySeen = new HashSet<IComparable>();

                    var task1 = actions.Tasks.GetMergedTask<RemoveFromIndexTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.Equal(1, task1.NumberOfKeys);
                    Assert.NotNull(task1);
                    Assert.Equal(100, task1.Index);
                    actions.Tasks.DeleteTasks(alreadySeen);

                    task1 = actions.Tasks.GetMergedTask<RemoveFromIndexTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.Null(task1);

                    var task2 = actions.Tasks.GetMergedTask<TouchReferenceDocumentIfChangedTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.NotNull(task2);
                    Assert.Equal(false, task2.SeparateTasksByIndex);
                    Assert.Equal(100, task2.Index);
                    actions.Tasks.DeleteTasks(alreadySeen);

                    task2 = actions.Tasks.GetMergedTask<TouchReferenceDocumentIfChangedTask>(idsToSkip, allIndexes, alreadySeen);
                    Assert.Null(task2);
                });

                storage.Batch(actions =>
                {
                    var isIndexStale = actions.Staleness.IsIndexStale(100, null, null);
                    Assert.False(isIndexStale);
                });
            }
        }
        public void can_remove_two_different_type_tasks_for_one_index(string requestedStorage)
        {
            using (var storage = NewTransactionalStorage(requestedStorage))
            {
                storage.Batch(actions =>
                {
                    for (int i = 0; i < 3; i++)
                    {
                        var task1 = new RemoveFromIndexTask(100);
                        task1.AddKey("tasks/" + i);
                        actions.Tasks.AddTask(task1, SystemTime.UtcNow);

                        var task2 = new TouchReferenceDocumentIfChangedTask(101);
                        actions.Tasks.AddTask(task2, SystemTime.UtcNow);
                    }
                });

                storage.Batch(actions =>
                {
                    Assert.Equal(6, actions.Tasks.ApproximateTaskCount);
                    actions.Tasks.DeleteTasksForIndex(100);
                });

                storage.Batch(accessor => Assert.True(accessor.Tasks.HasTasks));

                storage.Batch(actions =>
                {
                    var isIndexStale = actions.Staleness.IsIndexStaleByTask(100, null);
                    Assert.False(isIndexStale);

                    isIndexStale = actions.Staleness.IsIndexStaleByTask(101, null);
                    Assert.True(isIndexStale);
                });

                storage.Batch(actions => actions.Tasks.DeleteTasksForIndex(101));

                storage.Batch(accessor =>
                {
                    Assert.False(accessor.Tasks.HasTasks);
                    Assert.Equal(0, accessor.Tasks.ApproximateTaskCount);

                    var isIndexStale = accessor.Staleness.IsIndexStaleByTask(101, null);
                    Assert.False(isIndexStale);
                });
            }
        }