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))); } } }