public void BypassSpawningMongocryptdViaBypassAutoEncryptionTest( [Values(false, true)] bool async) { RequireServer.Check().Supports(Feature.ClientSideEncryption); var extraOptions = new Dictionary <string, object> { { "mongocryptdSpawnArgs", new [] { "--pidfilepath=bypass-spawning-mongocryptd.pid", "--port=27021" } }, }; using (var mongocryptdClient = new DisposableMongoClient(new MongoClient("mongodb://localhost:27021/?serverSelectionTimeoutMS=1000"))) using (var clientEncrypted = ConfigureClientEncrypted( kmsProviderFilter: "local", bypassAutoEncryption: true, extraOptions: extraOptions)) { var coll = GetCollection(clientEncrypted, __collCollectionNamespace); Insert(coll, async, new BsonDocument("unencrypted", "test")); var adminDatabase = mongocryptdClient.GetDatabase(DatabaseNamespace.Admin.DatabaseName); var isMasterCommand = new BsonDocument("ismaster", 1); var exception = Record.Exception(() => adminDatabase.RunCommand <BsonDocument>(isMasterCommand)); exception.Should().BeOfType <TimeoutException>(); exception.Message.Should().Contain("A timeout occured after 1000ms selecting a server"); } }
public static MongoServer GetServer(this DisposableMongoClient disposableClient) { var client = (MongoClient)disposableClient.Wrapped; #pragma warning disable 618 return(client.GetServer()); #pragma warning restore }
public void Topology_secondary_discovery_with_directConnection_false_should_work_as_expected([Values(false, true, null)] bool?directConnection) { RequireServer .Check() .Supports(Feature.DirectConnectionSetting) .ClusterTypes(ClusterType.ReplicaSet) .Authentication(false); // we don't use auth connection string in this test var setupClient = DriverTestConfiguration.Client; setupClient.GetDatabase(DriverTestConfiguration.DatabaseNamespace.DatabaseName).RunCommand <BsonDocument>("{ ping : 1 }"); var setupCluster = setupClient.Cluster; SpinWait.SpinUntil(() => setupCluster.Description.State == ClusterState.Connected, TimeSpan.FromSeconds(3)); var clusterDescription = setupCluster.Description; var secondary = clusterDescription.Servers.FirstOrDefault(s => s.State == ServerState.Connected && s.Type == ServerType.ReplicaSetSecondary); if (secondary == null) { throw new Exception("No secondary was found."); } var dnsEndpoint = (DnsEndPoint)secondary.EndPoint; var replicaSetName = secondary.ReplicaSetConfig.Name; using (var client = new DisposableMongoClient(new MongoClient(CreateConnectionString(dnsEndpoint, directConnection, replicaSetName)), CreateLogger <DisposableMongoClient>())) { var database = client.GetDatabase(DriverTestConfiguration.DatabaseNamespace.DatabaseName); var collection = database.GetCollection <BsonDocument>(DriverTestConfiguration.CollectionNamespace.CollectionName); var exception = Record.Exception(() => collection.InsertOne(new BsonDocument())); if (directConnection.GetValueOrDefault()) { exception.Should().BeOfType <MongoNotPrimaryException>(); exception.Message.Should().Contain("Server returned not primary error"); } else { exception.Should().BeNull(); } } }
private void CreateClient(BsonDocument entity, out DisposableMongoClient client, out EventCapturer eventCapturer) { var eventTypesToCapture = new List <string>(); var commandNamesToSkip = new List <string> { "authenticate", "buildInfo", "configureFailPoint", "getLastError", "getnonce", "isMaster", "saslContinue", "saslStart" }; var readConcern = ReadConcern.Default; var retryReads = true; var retryWrites = true; var useMultipleShardRouters = false; var writeConcern = WriteConcern.Acknowledged; ServerApi serverApi = null; foreach (var element in entity) { switch (element.Name) { case "id": // handled on higher level break; case "uriOptions": foreach (var option in element.Value.AsBsonDocument) { switch (option.Name) { case "retryWrites": retryWrites = option.Value.AsBoolean; break; case "retryReads": retryReads = option.Value.AsBoolean; break; case "readConcernLevel": var levelValue = option.Value.AsString; var level = (ReadConcernLevel)Enum.Parse(typeof(ReadConcernLevel), levelValue, true); readConcern = new ReadConcern(level); break; case "w": writeConcern = new WriteConcern(option.Value.AsInt32); break; default: throw new FormatException($"Unrecognized client uriOption name: '{option.Name}'."); } } break; case "useMultipleMongoses": useMultipleShardRouters = element.Value.AsBoolean; break; case "observeEvents": eventTypesToCapture.AddRange(element.Value.AsBsonArray.Select(x => x.AsString)); break; case "ignoreCommandMonitoringEvents": commandNamesToSkip.AddRange(element.Value.AsBsonArray.Select(x => x.AsString)); break; case "serverApi": ServerApiVersion serverApiVersion = null; bool? serverApiStrict = null; bool? serverApiDeprecationErrors = null; foreach (var option in element.Value.AsBsonDocument) { switch (option.Name) { case "version": var serverApiVersionString = option.Value.AsString; switch (serverApiVersionString) { case "1": serverApiVersion = ServerApiVersion.V1; break; default: throw new FormatException($"Unrecognized serverApi version: '{serverApiVersionString}'."); } break; case "strict": serverApiStrict = option.Value.AsBoolean; break; case "deprecationErrors": serverApiDeprecationErrors = option.Value.AsBoolean; break; default: throw new FormatException($"Unrecognized client serverApi option name: '{option.Name}'."); } } if (serverApiVersion != null) { serverApi = new ServerApi(serverApiVersion, serverApiStrict, serverApiDeprecationErrors); } break; default: throw new FormatException($"Unrecognized client entity field: '{element.Name}'."); } } eventCapturer = null; if (eventTypesToCapture.Count > 0) { eventCapturer = new EventCapturer(); foreach (var eventTypeToCapture in eventTypesToCapture) { switch (eventTypeToCapture) { case "commandStartedEvent": eventCapturer = eventCapturer.Capture <CommandStartedEvent>(x => !commandNamesToSkip.Contains(x.CommandName)); break; case "commandSucceededEvent": eventCapturer = eventCapturer.Capture <CommandSucceededEvent>(x => !commandNamesToSkip.Contains(x.CommandName)); break; case "commandFailedEvent": eventCapturer = eventCapturer.Capture <CommandFailedEvent>(x => !commandNamesToSkip.Contains(x.CommandName)); break; default: throw new FormatException($"Invalid event name: {eventTypeToCapture}."); } } } var localEventCapturer = eventCapturer; // copy value of eventCapturer ref variable to a local variable (to avoid error CS1628) client = DriverTestConfiguration.CreateDisposableClient( settings => { settings.RetryReads = retryReads; settings.RetryWrites = retryWrites; settings.ReadConcern = readConcern; settings.WriteConcern = writeConcern; settings.HeartbeatInterval = TimeSpan.FromMilliseconds(5); // the default value for spec tests if (localEventCapturer != null) { settings.ClusterConfigurator = c => c.Subscribe(localEventCapturer); } settings.ServerApi = serverApi; }, useMultipleShardRouters); }