private static CosmosContainerCore GetMockedContainer(string containerName = null)
        {
            Mock <CosmosContainerCore> mockedContainer = MockCosmosUtil.CreateMockContainer(containerName: containerName);

            mockedContainer.Setup(c => c.ClientContext).Returns(ChangeFeedEstimatorCoreTests.GetMockedClientContext());
            return(mockedContainer.Object);
        }
        public void ApplyBuildConfiguration_ValidatesNullMonitoredContainer()
        {
            Func <long, CancellationToken, Task> estimationDelegate = (long estimation, CancellationToken token) =>
            {
                return(Task.CompletedTask);
            };

            ChangeFeedEstimatorCore estimator = ChangeFeedEstimatorCoreTests.CreateEstimator(estimationDelegate, out Mock <RemainingWorkEstimator> remainingWorkEstimator);

            estimator.ApplyBuildConfiguration(
                null,
                ChangeFeedEstimatorCoreTests.GetMockedContainer("leases"),
                "something",
                "instanceName",
                new ChangeFeedLeaseOptions(),
                new ChangeFeedProcessorOptions(),
                null);
        }
        public void ApplyBuildConfiguration_ValidCustomStore()
        {
            Func <long, CancellationToken, Task> estimationDelegate = (long estimation, CancellationToken token) =>
            {
                return(Task.CompletedTask);
            };

            ChangeFeedEstimatorCore estimator = ChangeFeedEstimatorCoreTests.CreateEstimator(estimationDelegate, out Mock <RemainingWorkEstimator> remainingWorkEstimator);

            estimator.ApplyBuildConfiguration(
                Mock.Of <DocumentServiceLeaseStoreManager>(),
                null,
                "something",
                "instanceName",
                new ChangeFeedLeaseOptions(),
                new ChangeFeedProcessorOptions(),
                ChangeFeedEstimatorCoreTests.GetMockedContainer("monitored"));
        }
        public async Task StartAsync_TriggersDelegate()
        {
            const long remainingWork           = 15;
            long       estimationDelegateValue = 0;
            bool       receivedEstimation      = false;
            Func <long, CancellationToken, Task> estimationDelegate = (long estimation, CancellationToken token) =>
            {
                estimationDelegateValue = estimation;
                receivedEstimation      = true;
                return(Task.CompletedTask);
            };

            Mock <DocumentServiceLeaseStoreManager> leaseStoreManager = new Mock <DocumentServiceLeaseStoreManager>();

            leaseStoreManager.Setup(l => l.LeaseContainer).Returns(Mock.Of <DocumentServiceLeaseContainer>);
            leaseStoreManager.Setup(l => l.LeaseManager).Returns(Mock.Of <DocumentServiceLeaseManager>);
            leaseStoreManager.Setup(l => l.LeaseStore).Returns(Mock.Of <DocumentServiceLeaseStore>);
            leaseStoreManager.Setup(l => l.LeaseCheckpointer).Returns(Mock.Of <DocumentServiceLeaseCheckpointer>);

            ChangeFeedEstimatorCore estimator = ChangeFeedEstimatorCoreTests.CreateEstimator(estimationDelegate, out Mock <RemainingWorkEstimator> remainingWorkEstimator);

            estimator.ApplyBuildConfiguration(
                leaseStoreManager.Object,
                null,
                "something",
                "instanceName",
                new ChangeFeedLeaseOptions(),
                new ChangeFeedProcessorOptions(),
                ChangeFeedEstimatorCoreTests.GetMockedContainer("monitored"));

            remainingWorkEstimator.Setup(r => r.GetEstimatedRemainingWorkAsync(It.IsAny <CancellationToken>())).ReturnsAsync(remainingWork);

            await estimator.StartAsync();

            int waitIterations = 0; // Failsafe in case someone breaks the estimator so this does not run forever

            while (!receivedEstimation && waitIterations++ < 3)
            {
                Thread.Sleep(TimeSpan.FromSeconds(10));
            }

            Assert.AreEqual(remainingWork, estimationDelegateValue);
        }
 public void NullDelegateThrows()
 {
     ChangeFeedEstimatorCoreTests.CreateEstimator(null, out Mock <RemainingWorkEstimator> remainingWorkEstimator);
 }