public async Task TryLoadOngoingMigration_Should_return_tool_state_when_migration_failed_while_preparing()
        {
            // Arrange
            var endpointName   = nameof(TryLoadOngoingMigration_Should_return_tool_state_when_migration_failed_while_preparing);
            var timeoutsSource = new AspTimeoutsSource(connectionString, 10, containerName, fakeEndpointName, fakeEndpointTimeoutTableName, tablePrefix: tableNamePrefix);
            var runParameters  = new Dictionary <string, string> {
                { "Test", "TestValue" }
            };

            var toolStateTable = tableClient.GetTableReference($"{tableNamePrefix}{AspConstants.ToolStateTableName}");
            await toolStateTable.CreateIfNotExistsAsync();

            var toolStateEntity = new ToolStateEntity {
                Status = MigrationStatus.Preparing, RunParameters = runParameters, EndpointName = endpointName, PartitionKey = ToolStateEntity.FixedPartitionKey, RowKey = "bar"
            };

            await toolStateTable.ExecuteAsync(TableOperation.Insert(toolStateEntity));

            // Act
            var currentMigration = await timeoutsSource.TryLoadOngoingMigration();

            // Assert
            Assert.IsNotNull(currentMigration);

            Assert.AreEqual(endpointName, currentMigration.EndpointName);
            Assert.AreEqual(runParameters, currentMigration.RunParameters);
            Assert.AreEqual(0, currentMigration.NumberOfBatches);
            Assert.AreEqual(MigrationStatus.Preparing, currentMigration.Status);
        }
        public async Task Aborting_Unhides_The_TimeoutEntities_even_when_preparing_failed()
        {
            // Arrange
            var endpointName   = nameof(Aborting_Unhides_The_TimeoutEntities);
            var timeoutsSource = new AspTimeoutsSource(connectionString, 1, containerName, fakeEndpointName, fakeEndpointTimeoutTableName, tablePrefix: tableNamePrefix);
            var cutOffDate     = DateTime.UtcNow;

            var endpointTimeoutTableName = tableClient.GetTableReference($"{tableNamePrefix}{fakeEndpointTimeoutTableName}");
            await endpointTimeoutTableName.CreateIfNotExistsAsync();

            var toolStateTable = tableClient.GetTableReference($"{tableNamePrefix}{AspConstants.ToolStateTableName}");
            await toolStateTable.CreateIfNotExistsAsync();

            var uniqueHiddenEndpointName = string.Format(AspConstants.MigrationHiddenEndpointNameFormat, "gurlugurlu", endpointName);
            var toolStateEntity          = new ToolStateEntity()
            {
                Status = MigrationStatus.Preparing, EndpointName = endpointName, PartitionKey = ToolStateEntity.FixedPartitionKey, RowKey = "bar", UniqueHiddenEndpointName = uniqueHiddenEndpointName
            };

            await toolStateTable.ExecuteAsync(TableOperation.Insert(toolStateEntity));

            for (var x = 0; x < 3; x++)
            {
                var dateTime = cutOffDate.AddDays(random.Next(1, 5));

                var entity = new TimeoutDataEntity(dateTime.ToString(AspConstants.PartitionKeyScope), Guid.NewGuid().ToString())
                {
                    OwningTimeoutManager = uniqueHiddenEndpointName,
                    Destination          = endpointName,
                    SagaId       = Guid.NewGuid(),
                    StateAddress = x.ToString(),
                    Time         = dateTime,
                    Headers      = "Headers",
                };

                await endpointTimeoutTableName.ExecuteAsync(TableOperation.Insert(entity));
            }

            // Act
            await timeoutsSource.Abort();

            // Assert
            var query = new TableQuery <TimeoutDataEntity>()
                        .Where(TableQuery.GenerateFilterCondition("OwningTimeoutManager", QueryComparisons.Equal, endpointName));
            var timeouts = await endpointTimeoutTableName.ExecuteQuerySegmentedAsync(query, null);

            Assert.AreEqual(3, timeouts.Results.Count);

            var currentAfterAborting = await timeoutsSource.TryLoadOngoingMigration();

            Assert.IsNull(currentAfterAborting);

            Assert.IsFalse(await timeoutsSource.CheckIfAMigrationIsInProgress());
        }
        public async Task CheckMigrationInProgress_Should_be_true_when_migration_running()
        {
            // Arrange
            var endpointName   = nameof(CheckMigrationInProgress_Should_be_true_when_migration_running);
            var timeoutsSource = new AspTimeoutsSource(connectionString, 10, containerName, fakeEndpointName, fakeEndpointTimeoutTableName, tablePrefix: tableNamePrefix);
            var toolStateTable = tableClient.GetTableReference($"{tableNamePrefix}{AspConstants.ToolStateTableName}");
            await toolStateTable.CreateIfNotExistsAsync();

            var toolStateEntity = new ToolStateEntity {
                Status = MigrationStatus.StoragePrepared, EndpointName = endpointName, PartitionKey = ToolStateEntity.FixedPartitionKey, RowKey = "bar"
            };

            await toolStateTable.ExecuteAsync(TableOperation.Insert(toolStateEntity));

            // Act
            var currentMigration = await timeoutsSource.CheckIfAMigrationIsInProgress();

            // Assert
            Assert.IsTrue(currentMigration);
        }