private void VerifyServerDescription(ServerDescription actualDescription, BsonDocument expectedDescription, string phaseDescription)
        {
            JsonDrivenHelper.EnsureAllFieldsAreValid(expectedDescription, "electionId", "pool", "setName", "setVersion", "topologyVersion", "type", "logicalSessionTimeoutMinutes", "minWireVersion", "maxWireVersion");

            var expectedType = (string)expectedDescription["type"];

            switch (expectedType)
            {
            case "RSPrimary":
                actualDescription.Type.Should().Be(ServerType.ReplicaSetPrimary);
                break;

            case "RSSecondary":
                actualDescription.Type.Should().Be(ServerType.ReplicaSetSecondary);
                break;

            case "RSArbiter":
                actualDescription.Type.Should().Be(ServerType.ReplicaSetArbiter);
                break;

            case "RSGhost":
                actualDescription.Type.Should().Be(ServerType.ReplicaSetGhost);
                break;

            case "RSOther":
                actualDescription.Type.Should().Be(ServerType.ReplicaSetOther);
                break;

            case "Mongos":
                actualDescription.Type.Should().Be(ServerType.ShardRouter);
                break;

            case "Standalone":
                actualDescription.Type.Should().Be(ServerType.Standalone);
                break;

            case "LoadBalancer":
                actualDescription.Type.Should().Be(ServerType.LoadBalanced);
                break;

            default:
                actualDescription.Type.Should().Be(ServerType.Unknown);
                break;
            }

            if (expectedDescription.Contains("setName"))
            {
                string expectedSetName;
                switch (expectedDescription["setName"].BsonType)
                {
                case BsonType.Null: expectedSetName = null; break;

                case BsonType.String: expectedSetName = expectedDescription["setName"].AsString;; break;

                default: throw new FormatException($"Invalid setName BSON type: {expectedDescription["setName"].BsonType}.");
                }
                actualDescription.ReplicaSetConfig?.Name.Should().Be(expectedSetName);
            }

            if (expectedDescription.Contains("setVersion"))
            {
                int?expectedSetVersion;
                switch (expectedDescription["setVersion"].BsonType)
                {
                case BsonType.Null:
                    expectedSetVersion = null;
                    break;

                case BsonType.Int32:
                case BsonType.Int64:
                    expectedSetVersion = expectedDescription["setVersion"].ToInt32();
                    break;

                default:
                    throw new FormatException($"Invalid setVersion BSON type: {expectedDescription["setVersion"].BsonType}.");
                }
                actualDescription.ReplicaSetConfig?.Version.Should().Be(expectedSetVersion);
            }

            if (expectedDescription.Contains("electionId"))
            {
                ElectionId expectedElectionId;
                switch (expectedDescription["electionId"].BsonType)
                {
                case BsonType.Null: expectedElectionId = null; break;

                case BsonType.ObjectId: expectedElectionId = new ElectionId(expectedDescription["electionId"].AsObjectId); break;

                default: throw new FormatException($"Invalid electionId BSON type: {expectedDescription["electionId"].BsonType}.");
                }
                actualDescription.ElectionId.Should().Be(expectedElectionId);
            }

            if (expectedDescription.TryGetValue("topologyVersion", out var topologyVersionValue))
            {
                switch (topologyVersionValue)
                {
                case BsonDocument topologyVersion:
                    TopologyVersion expectedTopologyType = TopologyVersion.FromBsonDocument(topologyVersion);
                    expectedTopologyType.Should().NotBeNull();
                    actualDescription.TopologyVersion.Should().Be(expectedTopologyType, phaseDescription);
                    break;

                case BsonNull _:
                    actualDescription.TopologyVersion.Should().BeNull();
                    break;

                default: throw new FormatException($"Invalid topologyVersion BSON type: {topologyVersionValue.BsonType}.");
                }
            }

            if (expectedDescription.TryGetValue("logicalSessionTimeoutMinutes", out var logicalSessionTimeoutMinutes))
            {
                if (logicalSessionTimeoutMinutes is BsonNull)
                {
                    actualDescription.LogicalSessionTimeout.Should().NotHaveValue();
                }
                else
                {
                    actualDescription.LogicalSessionTimeout.Should().Be(TimeSpan.FromMinutes(logicalSessionTimeoutMinutes.ToInt32()));
                }
            }

            if (expectedDescription.TryGetValue("minWireVersion", out var minWireVersion))
            {
                if (minWireVersion is BsonNull)
                {
                    actualDescription.WireVersionRange.Should().BeNull();
                }
                else
                {
                    actualDescription.WireVersionRange.Min.Should().Be(minWireVersion.ToInt32());
                }
            }

            if (expectedDescription.TryGetValue("maxWireVersion", out var maxWireVersion))
            {
                if (maxWireVersion is BsonNull)
                {
                    actualDescription.WireVersionRange.Should().BeNull();
                }
                else
                {
                    actualDescription.WireVersionRange.Max.Should().Be(maxWireVersion.ToInt32());
                }
            }
        }
        private void PerformTopologyServiceTest(ref TopologyServiceOutcome result, TopologyServiceOperationTypeEnum operationType)
        {
            bool flag = true;

            using (TopologyServiceClient topologyServiceClient = TopologyServiceClient.CreateClient(this.Server.ToString()))
            {
                string               error                = string.Empty;
                StringBuilder        stringBuilder        = new StringBuilder();
                TopologyServiceError topologyServiceError = TopologyServiceError.None;
                Stopwatch            stopwatch            = Stopwatch.StartNew();
                try
                {
                    base.WriteVerbose(Strings.TopologyServiceOperation(operationType.ToString()));
                    IList <TopologyVersion> list;
                    IList <ServerInfo>      serversForRole;
                    switch (operationType)
                    {
                    case TopologyServiceOperationTypeEnum.GetAllTopologyVersions:
                        list = topologyServiceClient.GetAllTopologyVersions();
                        using (IEnumerator <TopologyVersion> enumerator = list.GetEnumerator())
                        {
                            while (enumerator.MoveNext())
                            {
                                TopologyVersion topologyVersion = enumerator.Current;
                                stringBuilder.Append(Strings.ToplogyserviceTopologyVersion(topologyVersion.PartitionFqdn, topologyVersion.Version) + Environment.NewLine);
                            }
                            goto IL_264;
                        }
                        break;

                    case TopologyServiceOperationTypeEnum.GetTopologyVersion:
                        break;

                    case TopologyServiceOperationTypeEnum.SetConfigDC:
                        topologyServiceClient.SetConfigDC(this.PartitionFqdn, this.TargetDomainController);
                        goto IL_264;

                    case TopologyServiceOperationTypeEnum.ReportServerDown:
                        goto IL_13A;

                    case TopologyServiceOperationTypeEnum.GetServersForRole:
                        serversForRole = topologyServiceClient.GetServersForRole(this.PartitionFqdn, new List <string>(), (ADServerRole)this.ADServerRole, 20, false);
                        using (IEnumerator <ServerInfo> enumerator2 = serversForRole.GetEnumerator())
                        {
                            while (enumerator2.MoveNext())
                            {
                                ServerInfo serverInfo = enumerator2.Current;
                                stringBuilder.Append(Strings.TopologyServiceADServerInfo(serverInfo.Fqdn) + Environment.NewLine);
                            }
                            goto IL_264;
                        }
                        goto IL_1DA;

                    case TopologyServiceOperationTypeEnum.Test:
                        goto IL_1DA;

                    default:
                        goto IL_264;
                    }
                    list = topologyServiceClient.GetTopologyVersions(new List <string>
                    {
                        this.PartitionFqdn
                    });
                    using (IEnumerator <TopologyVersion> enumerator3 = list.GetEnumerator())
                    {
                        while (enumerator3.MoveNext())
                        {
                            TopologyVersion topologyVersion2 = enumerator3.Current;
                            stringBuilder.Append(Strings.ToplogyserviceTopologyVersion(topologyVersion2.PartitionFqdn, topologyVersion2.Version) + Environment.NewLine);
                        }
                        goto IL_264;
                    }
IL_13A:
                    topologyServiceClient.ReportServerDown(this.PartitionFqdn, this.TargetDomainController, (ADServerRole)this.ADServerRole);
                    goto IL_264;
IL_1DA:
                    serversForRole = topologyServiceClient.GetServersForRole(this.PartitionFqdn, new List <string>(), (ADServerRole)this.ADServerRole, 20, false);
                    foreach (ServerInfo serverInfo2 in serversForRole)
                    {
                        stringBuilder.Append(Strings.TopologyServiceADServerInfo(serverInfo2.Fqdn) + Environment.NewLine);
                    }
                    if (serversForRole.Count > 0)
                    {
                        flag = true;
                    }
                    else
                    {
                        flag  = false;
                        error = Strings.TopologyServiceNoServersReturned(this.PartitionFqdn);
                    }
                    IL_264 :;
                }
                catch (CommunicationException ex)
                {
                    flag  = false;
                    error = ex.Message;
                    topologyServiceError = TopologyServiceError.CommunicationException;
                }
                catch (Exception ex2)
                {
                    flag  = false;
                    error = ex2.Message;
                    topologyServiceError = TopologyServiceError.OtherException;
                }
                stopwatch.Stop();
                result.Update(flag ? TopologyServiceResultEnum.Success : TopologyServiceResultEnum.Failure, stopwatch.Elapsed, error, stringBuilder.ToString());
                if (this.MonitoringContext)
                {
                    this.monitoringData.Events.Add(new MonitoringEvent(TestTopologyServiceTask.CmdletMonitoringEventSource, (int)((flag ? 1000 : 2000) + this.OperationType), flag ? EventTypeEnumeration.Success : EventTypeEnumeration.Error, flag ? Strings.TopologyServiceSuccess(this.OperationType.ToString()) : (Strings.TopologyServiceFailed(this.OperationType.ToString(), error) + " " + topologyServiceError)));
                }
            }
        }