private async Task <bool> ReportLoadOnChangeRole(ReplicaRole role)
        {
            MetricReliableStateManager target = new MetricReliableStateManager(
                this.GetContext(),
                new JsonReliableStateSerializerResolver(),
                this.GetConfig(),
                new MockReliableStateManager());

            ManualResetEvent reset = new ManualResetEvent(false);

            bool actual = false;

            MockStatefulServicePartition partition = new MockStatefulServicePartition()
            {
                OnReportLoad = (metrics) =>
                {
                    actual = true;
                    reset.Set();
                }
            };

            await((IStateProviderReplica)target).OpenAsync(ReplicaOpenMode.New, partition, CancellationToken.None);
            await((IStateProviderReplica)target).ChangeRoleAsync(role, CancellationToken.None);

            // this may yield false negatives because we're at the mercy of the task scheduler
            // to actually execute the reporting task in a timely manner, which depends on external factors.
            reset.WaitOne(TimeSpan.FromSeconds(10));

            return(actual);
        }
        public void TestStatefulServiceWithMockPartition()
        {
            var partition     = new MockStatefulServicePartition();
            var partitionInfo = MockQueryPartitionFactory.CreateIntPartitonInfo();

            partition.PartitionInfo = partitionInfo;
            var statefulServiceContext = MockStatefulServiceContextFactory.Default;

            var sut = new NestedStatefulService(statefulServiceContext);

            sut.SetPartition(partition);

            Assert.AreEqual(partitionInfo, sut.GetPartition().PartitionInfo);
        }
        public void TestDeadLock9()
        {
            Func <StatefulServiceContext, IReliableStateManagerReplica2, StatefulServiceWithReplicaListener> serviceFactory = (context, stateManagerReplica) =>
            {
                var partition = new MockStatefulServicePartition()
                {
                    PartitionInfo = MockQueryPartitionFactory.CreateSingletonPartitonInfo(Guid.NewGuid())
                };
                context = MockStatefulServiceContextFactory.Create(
                    context.CodePackageActivationContext,
                    context.ServiceTypeName,
                    context.ServiceName,
                    partition.PartitionInfo.Id,
                    context.ReplicaId);

                var service = new StatefulServiceWithReplicaListener(context);
                service.SetPartition(partition);
                return(service);
            };

            //shared instance, called from multiple threads
            MockStatefulServiceReplicaSet <StatefulServiceWithReplicaListener> replicaSet;

            Parallel.For(1, 100, async(i) =>
            {
                replicaSet = new MockStatefulServiceReplicaSet <StatefulServiceWithReplicaListener>(serviceFactory);
                await replicaSet.AddReplicaAsync(ReplicaRole.Primary, 1);
                await replicaSet.AddReplicaAsync(ReplicaRole.ActiveSecondary, 2);
                await replicaSet.AddReplicaAsync(ReplicaRole.ActiveSecondary, 3);
                await replicaSet.AddReplicaAsync(ReplicaRole.ActiveSecondary, 4);
                await replicaSet.AddReplicaAsync(ReplicaRole.ActiveSecondary, 5);
                await replicaSet.AddReplicaAsync(ReplicaRole.ActiveSecondary, 6);
                await replicaSet.AddReplicaAsync(ReplicaRole.ActiveSecondary, 7);
                await replicaSet.AddReplicaAsync(ReplicaRole.ActiveSecondary, 8);
                await replicaSet.AddReplicaAsync(ReplicaRole.ActiveSecondary, 9);
                await replicaSet.AddReplicaAsync(ReplicaRole.ActiveSecondary, 10);
            });
        }