PageRenderTime 45ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/tests/MongoDB.Driver.Tests/MongoClientSettingsTests.cs

http://github.com/mongodb/mongo-csharp-driver
C# | 1082 lines | 894 code | 171 blank | 17 comment | 16 complexity | 51b6cc77af59f9a8317b42b52870e9ce MD5 | raw file
Possible License(s): Apache-2.0
  1. /* Copyright 2010-present MongoDB Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. using System;
  16. using System.Linq;
  17. using System.Net.Sockets;
  18. using System.Security.Authentication;
  19. using System.Threading;
  20. using FluentAssertions;
  21. using MongoDB.Bson;
  22. using MongoDB.Driver.Core.Clusters;
  23. using MongoDB.Driver.Core.Compression;
  24. using MongoDB.Driver.Core.Configuration;
  25. using MongoDB.Driver.Core.TestHelpers.XunitExtensions;
  26. using Xunit;
  27. namespace MongoDB.Driver.Tests
  28. {
  29. public class MongoClientSettingsTests
  30. {
  31. private readonly MongoServerAddress _localHost = new MongoServerAddress("localhost");
  32. [Fact]
  33. public void TestAllowInsecureTls()
  34. {
  35. var settings = new MongoClientSettings();
  36. Assert.Equal(false, settings.AllowInsecureTls);
  37. var allowInsecureTls = true;
  38. settings.AllowInsecureTls = allowInsecureTls;
  39. Assert.Equal(allowInsecureTls, settings.AllowInsecureTls);
  40. settings.SslSettings.CheckCertificateRevocation.Should().BeFalse();
  41. settings.Freeze();
  42. Assert.Equal(allowInsecureTls, settings.AllowInsecureTls);
  43. Assert.Throws<InvalidOperationException>(() => { settings.AllowInsecureTls = allowInsecureTls; });
  44. }
  45. [Fact]
  46. public void TestApplicationName()
  47. {
  48. var settings = new MongoClientSettings();
  49. Assert.Equal(null, settings.ApplicationName);
  50. var applicationName = "app";
  51. settings.ApplicationName = applicationName;
  52. Assert.Equal(applicationName, settings.ApplicationName);
  53. settings.Freeze();
  54. Assert.Equal(applicationName, settings.ApplicationName);
  55. Assert.Throws<InvalidOperationException>(() => { settings.ApplicationName = applicationName; });
  56. }
  57. [Fact]
  58. public void TestApplicationName_too_long()
  59. {
  60. var subject = new MongoClientSettings();
  61. var value = new string('x', 129);
  62. var exception = Record.Exception(() => subject.ApplicationName = value);
  63. var argumentException = exception.Should().BeOfType<ArgumentException>().Subject;
  64. argumentException.ParamName.Should().Be("value");
  65. }
  66. [Fact]
  67. public void TestClone()
  68. {
  69. // set everything to non default values to test that all settings are cloned
  70. var connectionString =
  71. "mongodb://user1:password1@somehost/?appname=app;" +
  72. "connect=direct;connectTimeout=123;ipv6=true;heartbeatInterval=1m;heartbeatTimeout=2m;localThreshold=128;" +
  73. "maxIdleTime=124;maxLifeTime=125;maxPoolSize=126;minPoolSize=127;readConcernLevel=majority;" +
  74. "readPreference=secondary;readPreferenceTags=a:1,b:2;readPreferenceTags=c:3,d:4;socketTimeout=129;" +
  75. "serverSelectionTimeout=20s;ssl=true;sslVerifyCertificate=false;waitqueuesize=130;waitQueueTimeout=131;" +
  76. "w=1;fsync=true;journal=true;w=2;wtimeout=131;gssapiServiceName=other;tlsInsecure=true";
  77. #pragma warning disable 618
  78. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
  79. {
  80. connectionString += ";uuidRepresentation=pythonLegacy";
  81. }
  82. #pragma warning restore 618
  83. var builder = new MongoUrlBuilder(connectionString);
  84. var url = builder.ToMongoUrl();
  85. var settings = MongoClientSettings.FromUrl(url);
  86. // a few settings can only be made in code
  87. #pragma warning disable 618
  88. settings.Credential = MongoCredential.CreateMongoCRCredential("database", "username", "password").WithMechanismProperty("SERVICE_NAME", "other");
  89. #pragma warning restore 618
  90. settings.SslSettings = new SslSettings { CheckCertificateRevocation = false };
  91. settings.SdamLogFilename = "stdout";
  92. var clone = settings.Clone();
  93. Assert.Equal(settings, clone);
  94. }
  95. [Fact]
  96. public void TestCompressors()
  97. {
  98. var settings = new MongoClientSettings();
  99. Assert.Equal(Enumerable.Empty<CompressorConfiguration>(), settings.Compressors);
  100. var compressors = new[] { new CompressorConfiguration(CompressorType.Zlib) };
  101. settings.Compressors = compressors;
  102. Assert.Equal(compressors, settings.Compressors);
  103. settings.Freeze();
  104. Assert.Equal(compressors, settings.Compressors);
  105. Assert.Throws<InvalidOperationException>(() => { settings.Compressors = compressors; });
  106. }
  107. [Fact]
  108. public void TestConnectionMode()
  109. {
  110. var settings = new MongoClientSettings();
  111. Assert.Equal(ConnectionMode.Automatic, settings.ConnectionMode);
  112. var connectionMode = ConnectionMode.Direct;
  113. settings.ConnectionMode = connectionMode;
  114. Assert.Equal(connectionMode, settings.ConnectionMode);
  115. settings.Freeze();
  116. Assert.Equal(connectionMode, settings.ConnectionMode);
  117. Assert.Throws<InvalidOperationException>(() => { settings.ConnectionMode = connectionMode; });
  118. }
  119. [Fact]
  120. public void TestConnectTimeout()
  121. {
  122. var settings = new MongoClientSettings();
  123. Assert.Equal(MongoDefaults.ConnectTimeout, settings.ConnectTimeout);
  124. var connectTimeout = new TimeSpan(1, 2, 3);
  125. settings.ConnectTimeout = connectTimeout;
  126. Assert.Equal(connectTimeout, settings.ConnectTimeout);
  127. settings.Freeze();
  128. Assert.Equal(connectTimeout, settings.ConnectTimeout);
  129. Assert.Throws<InvalidOperationException>(() => { settings.ConnectTimeout = connectTimeout; });
  130. }
  131. [Fact]
  132. public void TestCredentials()
  133. {
  134. var settings = new MongoClientSettings();
  135. #pragma warning disable 618
  136. Assert.Equal(0, settings.Credentials.Count());
  137. #pragma warning restore
  138. }
  139. [Fact]
  140. public void TestDefaults()
  141. {
  142. var settings = new MongoClientSettings();
  143. Assert.Equal(false, settings.AllowInsecureTls);
  144. Assert.Equal(null, settings.ApplicationName);
  145. Assert.Equal(Enumerable.Empty<CompressorConfiguration>(), settings.Compressors);
  146. Assert.Equal(ConnectionMode.Automatic, settings.ConnectionMode);
  147. Assert.Equal(MongoDefaults.ConnectTimeout, settings.ConnectTimeout);
  148. #pragma warning disable 618
  149. Assert.Equal(0, settings.Credentials.Count());
  150. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
  151. {
  152. Assert.Equal(MongoDefaults.GuidRepresentation, settings.GuidRepresentation);
  153. }
  154. #pragma warning restore 618
  155. Assert.Equal(ServerSettings.DefaultHeartbeatInterval, settings.HeartbeatInterval);
  156. Assert.Equal(ServerSettings.DefaultHeartbeatTimeout, settings.HeartbeatTimeout);
  157. Assert.Equal(false, settings.IPv6);
  158. Assert.Equal(MongoDefaults.MaxConnectionIdleTime, settings.MaxConnectionIdleTime);
  159. Assert.Equal(MongoDefaults.MaxConnectionLifeTime, settings.MaxConnectionLifeTime);
  160. Assert.Equal(MongoDefaults.MaxConnectionPoolSize, settings.MaxConnectionPoolSize);
  161. Assert.Equal(MongoDefaults.MinConnectionPoolSize, settings.MinConnectionPoolSize);
  162. Assert.Equal(ReadConcern.Default, settings.ReadConcern);
  163. Assert.Equal(ReadPreference.Primary, settings.ReadPreference);
  164. Assert.Equal(null, settings.ReplicaSetName);
  165. Assert.Equal(true, settings.RetryReads);
  166. Assert.Equal(true, settings.RetryWrites);
  167. Assert.Equal(ConnectionStringScheme.MongoDB, settings.Scheme);
  168. Assert.Equal(_localHost, settings.Server);
  169. Assert.Equal(_localHost, settings.Servers.First());
  170. Assert.Equal(1, settings.Servers.Count());
  171. Assert.Equal(MongoDefaults.ServerSelectionTimeout, settings.ServerSelectionTimeout);
  172. Assert.Equal(MongoDefaults.SocketTimeout, settings.SocketTimeout);
  173. Assert.Null(settings.SslSettings);
  174. #pragma warning disable 618
  175. Assert.Equal(false, settings.UseSsl);
  176. #pragma warning restore 618
  177. Assert.Equal(false, settings.UseTls);
  178. #pragma warning disable 618
  179. Assert.Equal(true, settings.VerifySslCertificate);
  180. #pragma warning restore 618
  181. #pragma warning disable 618
  182. Assert.Equal(MongoDefaults.ComputedWaitQueueSize, settings.WaitQueueSize);
  183. #pragma warning restore 618
  184. Assert.Equal(MongoDefaults.WaitQueueTimeout, settings.WaitQueueTimeout);
  185. Assert.Equal(WriteConcern.Acknowledged, settings.WriteConcern);
  186. Assert.Equal(null, settings.SdamLogFilename);
  187. }
  188. [Fact]
  189. public void TestEquals()
  190. {
  191. var settings = new MongoClientSettings();
  192. var clone = settings.Clone();
  193. Assert.True(clone.Equals(settings));
  194. clone = settings.Clone();
  195. clone.AllowInsecureTls = !settings.AllowInsecureTls;
  196. Assert.False(clone.Equals(settings));
  197. clone = settings.Clone();
  198. clone.ApplicationName = "app2";
  199. Assert.False(clone.Equals(settings));
  200. clone = settings.Clone();
  201. clone.Compressors = new[] { new CompressorConfiguration(CompressorType.Zlib) };
  202. Assert.False(clone.Equals(settings));
  203. clone = settings.Clone();
  204. clone.ConnectionMode = ConnectionMode.Direct;
  205. Assert.False(clone.Equals(settings));
  206. clone = settings.Clone();
  207. clone.ConnectTimeout = new TimeSpan(1, 2, 3);
  208. Assert.False(clone.Equals(settings));
  209. clone = settings.Clone();
  210. #pragma warning disable 618
  211. clone.Credential = MongoCredential.CreateMongoCRCredential("db2", "user2", "password2");
  212. #pragma warning restore 618
  213. Assert.False(clone.Equals(settings));
  214. clone = settings.Clone();
  215. #pragma warning disable 618
  216. clone.Credential = MongoCredential.CreateMongoCRCredential("db", "user2", "password2");
  217. #pragma warning restore 618
  218. Assert.False(clone.Equals(settings));
  219. #pragma warning disable 618
  220. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
  221. {
  222. clone = settings.Clone();
  223. var unequalGuidRepresentation = clone.GuidRepresentation != GuidRepresentation.PythonLegacy ? GuidRepresentation.PythonLegacy : GuidRepresentation.CSharpLegacy;
  224. clone.GuidRepresentation = unequalGuidRepresentation;
  225. Assert.False(clone.Equals(settings));
  226. }
  227. #pragma warning restore 618
  228. clone = settings.Clone();
  229. clone.HeartbeatInterval = new TimeSpan(1, 2, 3);
  230. Assert.False(clone.Equals(settings));
  231. clone = settings.Clone();
  232. clone.HeartbeatTimeout = new TimeSpan(1, 2, 3);
  233. Assert.False(clone.Equals(settings));
  234. clone = settings.Clone();
  235. clone.IPv6 = !settings.IPv6;
  236. Assert.False(clone.Equals(settings));
  237. clone = settings.Clone();
  238. clone.LocalThreshold = new TimeSpan(1, 2, 3);
  239. Assert.False(clone.Equals(settings));
  240. clone = settings.Clone();
  241. clone.MaxConnectionIdleTime = new TimeSpan(1, 2, 3);
  242. Assert.False(clone.Equals(settings));
  243. clone = settings.Clone();
  244. clone.MaxConnectionLifeTime = new TimeSpan(1, 2, 3);
  245. Assert.False(clone.Equals(settings));
  246. clone = settings.Clone();
  247. clone.MaxConnectionPoolSize = settings.MaxConnectionPoolSize + 1;
  248. Assert.False(clone.Equals(settings));
  249. clone = settings.Clone();
  250. clone.ReadConcern = ReadConcern.Majority;
  251. Assert.False(clone.Equals(settings));
  252. clone = settings.Clone();
  253. clone.MinConnectionPoolSize = settings.MinConnectionPoolSize + 1;
  254. Assert.False(clone.Equals(settings));
  255. clone = settings.Clone();
  256. clone.ReadPreference = ReadPreference.Secondary;
  257. Assert.False(clone.Equals(settings));
  258. clone = settings.Clone();
  259. clone.ReplicaSetName = "abc";
  260. Assert.False(clone.Equals(settings));
  261. clone = settings.Clone();
  262. clone.RetryReads = false;
  263. Assert.False(clone.Equals(settings));
  264. clone = settings.Clone();
  265. clone.RetryWrites = false;
  266. Assert.False(clone.Equals(settings));
  267. clone = settings.Clone();
  268. clone.Scheme = ConnectionStringScheme.MongoDBPlusSrv;
  269. Assert.False(clone.Equals(settings));
  270. clone = settings.Clone();
  271. clone.Server = new MongoServerAddress("someotherhost");
  272. Assert.False(clone.Equals(settings));
  273. clone = settings.Clone();
  274. clone.ServerSelectionTimeout = new TimeSpan(1, 2, 3);
  275. Assert.False(clone.Equals(settings));
  276. clone = settings.Clone();
  277. clone.SocketTimeout = new TimeSpan(1, 2, 3);
  278. Assert.False(clone.Equals(settings));
  279. clone = settings.Clone();
  280. clone.SslSettings = new SslSettings { CheckCertificateRevocation = false };
  281. Assert.False(clone.Equals(settings));
  282. clone = settings.Clone();
  283. #pragma warning disable 618
  284. clone.UseSsl = !settings.UseSsl;
  285. #pragma warning restore 618
  286. Assert.False(clone.Equals(settings));
  287. clone = settings.Clone();
  288. clone.UseTls = !settings.UseTls;
  289. Assert.False(clone.Equals(settings));
  290. clone = settings.Clone();
  291. #pragma warning disable 618
  292. clone.VerifySslCertificate = !settings.VerifySslCertificate;
  293. #pragma warning restore 618
  294. Assert.False(clone.Equals(settings));
  295. clone = settings.Clone();
  296. #pragma warning disable 618
  297. clone.WaitQueueSize = settings.WaitQueueSize + 1;
  298. #pragma warning restore 618
  299. Assert.False(clone.Equals(settings));
  300. clone = settings.Clone();
  301. clone.WaitQueueTimeout = new TimeSpan(1, 2, 3);
  302. Assert.False(clone.Equals(settings));
  303. clone = settings.Clone();
  304. clone.WriteConcern = WriteConcern.W2;
  305. Assert.False(clone.Equals(settings));
  306. clone = settings.Clone();
  307. clone.SdamLogFilename = "garbage";
  308. Assert.False(clone.Equals(settings));
  309. }
  310. [Fact]
  311. public void TestFreeze()
  312. {
  313. var settings = new MongoClientSettings();
  314. Assert.False(settings.IsFrozen);
  315. var hashCode = settings.GetHashCode();
  316. var stringRepresentation = settings.ToString();
  317. settings.Freeze();
  318. Assert.True(settings.IsFrozen);
  319. Assert.Equal(hashCode, settings.GetHashCode());
  320. Assert.Equal(stringRepresentation, settings.ToString());
  321. }
  322. [Fact]
  323. public void TestFreezeInvalid()
  324. {
  325. var settings = new MongoClientSettings();
  326. settings.AllowInsecureTls = true;
  327. settings.SslSettings.CheckCertificateRevocation = true;
  328. var exception = Record.Exception(() => settings.Freeze());
  329. exception.Should().BeOfType<InvalidOperationException>();
  330. }
  331. [Fact]
  332. public void TestFromUrl()
  333. {
  334. // set everything to non default values to test that all settings are converted
  335. var connectionString =
  336. "mongodb://user1:password1@somehost/?appname=app1;authSource=db;authMechanismProperties=CANONICALIZE_HOST_NAME:true;" +
  337. "compressors=zlib,snappy;zlibCompressionLevel=9;connect=direct;connectTimeout=123;ipv6=true;heartbeatInterval=1m;heartbeatTimeout=2m;localThreshold=128;" +
  338. "maxIdleTime=124;maxLifeTime=125;maxPoolSize=126;minPoolSize=127;readConcernLevel=majority;" +
  339. "readPreference=secondary;readPreferenceTags=a:1,b:2;readPreferenceTags=c:3,d:4;retryReads=false;retryWrites=true;socketTimeout=129;" +
  340. "serverSelectionTimeout=20s;tls=true;tlsInsecure=true;waitqueuesize=130;waitQueueTimeout=131;" +
  341. "w=1;fsync=true;journal=true;w=2;wtimeout=131;gssapiServiceName=other";
  342. #pragma warning disable 618
  343. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
  344. {
  345. connectionString += ";uuidRepresentation=pythonLegacy";
  346. }
  347. #pragma warning restore 618
  348. var builder = new MongoUrlBuilder(connectionString);
  349. var url = builder.ToMongoUrl();
  350. var settings = MongoClientSettings.FromUrl(url);
  351. Assert.Equal(url.AllowInsecureTls, settings.AllowInsecureTls);
  352. Assert.Equal(url.ApplicationName, settings.ApplicationName);
  353. Assert.Equal(url.Compressors, settings.Compressors);
  354. Assert.Equal(url.ConnectionMode, settings.ConnectionMode);
  355. Assert.Equal(url.ConnectTimeout, settings.ConnectTimeout);
  356. #pragma warning disable 618
  357. Assert.Equal(1, settings.Credentials.Count());
  358. #pragma warning restore
  359. Assert.Equal(url.Username, settings.Credential.Username);
  360. Assert.Equal(url.AuthenticationMechanism, settings.Credential.Mechanism);
  361. Assert.Equal("other", settings.Credential.GetMechanismProperty<string>("SERVICE_NAME", "mongodb"));
  362. Assert.Equal(true, settings.Credential.GetMechanismProperty<bool>("CANONICALIZE_HOST_NAME", false));
  363. Assert.Equal(url.AuthenticationSource, settings.Credential.Source);
  364. Assert.Equal(new PasswordEvidence(url.Password), settings.Credential.Evidence);
  365. #pragma warning disable 618
  366. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
  367. {
  368. Assert.Equal(url.GuidRepresentation, settings.GuidRepresentation);
  369. }
  370. #pragma warning restore 618
  371. Assert.Equal(url.HeartbeatInterval, settings.HeartbeatInterval);
  372. Assert.Equal(url.HeartbeatTimeout, settings.HeartbeatTimeout);
  373. Assert.Equal(url.IPv6, settings.IPv6);
  374. Assert.Equal(url.LocalThreshold, settings.LocalThreshold);
  375. Assert.Equal(url.MaxConnectionIdleTime, settings.MaxConnectionIdleTime);
  376. Assert.Equal(url.MaxConnectionLifeTime, settings.MaxConnectionLifeTime);
  377. Assert.Equal(url.MaxConnectionPoolSize, settings.MaxConnectionPoolSize);
  378. Assert.Equal(url.MinConnectionPoolSize, settings.MinConnectionPoolSize);
  379. Assert.Equal(url.ReadConcernLevel, settings.ReadConcern.Level);
  380. Assert.Equal(url.ReadPreference, settings.ReadPreference);
  381. Assert.Equal(url.ReplicaSetName, settings.ReplicaSetName);
  382. Assert.Equal(url.RetryReads, settings.RetryReads);
  383. Assert.Equal(url.RetryWrites, settings.RetryWrites);
  384. Assert.Equal(url.Scheme, settings.Scheme);
  385. Assert.True(url.Servers.SequenceEqual(settings.Servers));
  386. Assert.Equal(url.ServerSelectionTimeout, settings.ServerSelectionTimeout);
  387. Assert.Equal(url.SocketTimeout, settings.SocketTimeout);
  388. #pragma warning disable 618
  389. settings.SslSettings.Should().BeNull();
  390. Assert.Equal(url.UseSsl, settings.UseSsl);
  391. #pragma warning restore 618
  392. Assert.Equal(url.UseTls, settings.UseTls);
  393. #pragma warning disable 618
  394. Assert.Equal(url.VerifySslCertificate, settings.VerifySslCertificate);
  395. #pragma warning restore 618
  396. #pragma warning disable 618
  397. Assert.Equal(url.ComputedWaitQueueSize, settings.WaitQueueSize);
  398. #pragma warning restore 618
  399. Assert.Equal(url.WaitQueueTimeout, settings.WaitQueueTimeout);
  400. Assert.Equal(url.GetWriteConcern(true), settings.WriteConcern);
  401. }
  402. [Fact]
  403. public void TestFromUrlWithMongoDBX509()
  404. {
  405. var url = new MongoUrl("mongodb://username@localhost/?authMechanism=MONGODB-X509");
  406. var settings = MongoClientSettings.FromUrl(url);
  407. var credential = settings.Credential;
  408. Assert.Equal("MONGODB-X509", credential.Mechanism);
  409. Assert.Equal("username", credential.Username);
  410. Assert.IsType<ExternalEvidence>(credential.Evidence);
  411. }
  412. [Fact]
  413. public void TestFromUrlWithMongoDBX509_without_username()
  414. {
  415. var url = new MongoUrl("mongodb://localhost/?authMechanism=MONGODB-X509");
  416. var settings = MongoClientSettings.FromUrl(url);
  417. var credential = settings.Credential;
  418. Assert.Equal("MONGODB-X509", credential.Mechanism);
  419. Assert.Equal(null, credential.Username);
  420. Assert.IsType<ExternalEvidence>(credential.Evidence);
  421. }
  422. [Theory]
  423. [InlineData("mongodb+srv://username:password@test5.test.build.10gen.cc/?connect=standalone", ConnectionStringScheme.MongoDB, "localhost.test.build.10gen.cc:27017")]
  424. [InlineData("mongodb+srv://username:password@test5.test.build.10gen.cc/?connect=automatic", ConnectionStringScheme.MongoDBPlusSrv, "test5.test.build.10gen.cc:53")]
  425. [InlineData("mongodb+srv://username:password@test5.test.build.10gen.cc/?connect=replicaset", ConnectionStringScheme.MongoDBPlusSrv, "test5.test.build.10gen.cc:53")]
  426. [InlineData("mongodb+srv://username:password@test5.test.build.10gen.cc/?connect=shardrouter", ConnectionStringScheme.MongoDBPlusSrv, "test5.test.build.10gen.cc:53")]
  427. public void TestFromUrlResolving(string connectionString, ConnectionStringScheme expectedScheme, string expectedEndPoint)
  428. {
  429. var url = new MongoUrl(connectionString);
  430. var result = MongoClientSettings.FromUrl(url);
  431. var expectedServers = new[] { MongoServerAddress.Parse(expectedEndPoint) };
  432. result.Servers.Should().Equal(expectedServers);
  433. result.Scheme.Should().Be(expectedScheme);
  434. }
  435. [Fact]
  436. public void TestFrozenCopy()
  437. {
  438. var settings = new MongoClientSettings();
  439. Assert.Equal(false, settings.IsFrozen);
  440. var frozenCopy = settings.FrozenCopy();
  441. Assert.Equal(true, frozenCopy.IsFrozen);
  442. Assert.NotSame(settings, frozenCopy);
  443. Assert.Equal(settings, frozenCopy);
  444. var secondFrozenCopy = frozenCopy.FrozenCopy();
  445. Assert.Same(frozenCopy, secondFrozenCopy);
  446. }
  447. [Fact]
  448. public void TestGuidRepresentation()
  449. {
  450. #pragma warning disable 618
  451. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
  452. {
  453. var settings = new MongoClientSettings();
  454. Assert.Equal(MongoDefaults.GuidRepresentation, settings.GuidRepresentation);
  455. var guidRepresentation = GuidRepresentation.PythonLegacy;
  456. settings.GuidRepresentation = guidRepresentation;
  457. Assert.Equal(guidRepresentation, settings.GuidRepresentation);
  458. settings.Freeze();
  459. Assert.Equal(guidRepresentation, settings.GuidRepresentation);
  460. Assert.Throws<InvalidOperationException>(() => { settings.GuidRepresentation = guidRepresentation; });
  461. }
  462. else
  463. {
  464. var settings = new MongoClientSettings();
  465. var exception = Record.Exception(() => settings.GuidRepresentation);
  466. exception.Should().BeOfType<InvalidOperationException>();
  467. exception = Record.Exception(() => { settings.GuidRepresentation = GuidRepresentation.CSharpLegacy; });
  468. exception.Should().BeOfType<InvalidOperationException>();
  469. }
  470. #pragma warning restore 618
  471. }
  472. [Fact]
  473. public void TestHeartbeatInterval()
  474. {
  475. var settings = new MongoClientSettings();
  476. Assert.Equal(ServerSettings.DefaultHeartbeatInterval, settings.HeartbeatInterval);
  477. var heartbeatInterval = new TimeSpan(1, 2, 3);
  478. settings.HeartbeatInterval = heartbeatInterval;
  479. Assert.Equal(heartbeatInterval, settings.HeartbeatInterval);
  480. settings.Freeze();
  481. Assert.Equal(heartbeatInterval, settings.HeartbeatInterval);
  482. Assert.Throws<InvalidOperationException>(() => { settings.HeartbeatInterval = heartbeatInterval; });
  483. }
  484. [Fact]
  485. public void TestHeartbeatTimeout()
  486. {
  487. var settings = new MongoClientSettings();
  488. Assert.Equal(ServerSettings.DefaultHeartbeatTimeout, settings.HeartbeatTimeout);
  489. var heartbeatTimeout = new TimeSpan(1, 2, 3);
  490. settings.HeartbeatTimeout = heartbeatTimeout;
  491. Assert.Equal(heartbeatTimeout, settings.HeartbeatTimeout);
  492. settings.Freeze();
  493. Assert.Equal(heartbeatTimeout, settings.HeartbeatTimeout);
  494. Assert.Throws<InvalidOperationException>(() => { settings.HeartbeatTimeout = heartbeatTimeout; });
  495. }
  496. [Fact]
  497. public void TestIPv6()
  498. {
  499. var settings = new MongoClientSettings();
  500. Assert.Equal(false, settings.IPv6);
  501. var ipv6 = true;
  502. settings.IPv6 = ipv6;
  503. Assert.Equal(ipv6, settings.IPv6);
  504. settings.Freeze();
  505. Assert.Equal(ipv6, settings.IPv6);
  506. Assert.Throws<InvalidOperationException>(() => { settings.IPv6 = ipv6; });
  507. }
  508. [Fact]
  509. public void TestLocalThreshold()
  510. {
  511. var settings = new MongoClientSettings();
  512. Assert.Equal(MongoDefaults.LocalThreshold, settings.LocalThreshold);
  513. var localThreshold = new TimeSpan(1, 2, 3);
  514. settings.LocalThreshold = localThreshold;
  515. Assert.Equal(localThreshold, settings.LocalThreshold);
  516. settings.Freeze();
  517. Assert.Equal(localThreshold, settings.LocalThreshold);
  518. Assert.Throws<InvalidOperationException>(() => { settings.LocalThreshold = localThreshold; });
  519. }
  520. [Fact]
  521. public void TestMaxConnectionIdleTime()
  522. {
  523. var settings = new MongoClientSettings();
  524. Assert.Equal(MongoDefaults.MaxConnectionIdleTime, settings.MaxConnectionIdleTime);
  525. var maxConnectionIdleTime = new TimeSpan(1, 2, 3);
  526. settings.MaxConnectionIdleTime = maxConnectionIdleTime;
  527. Assert.Equal(maxConnectionIdleTime, settings.MaxConnectionIdleTime);
  528. settings.Freeze();
  529. Assert.Equal(maxConnectionIdleTime, settings.MaxConnectionIdleTime);
  530. Assert.Throws<InvalidOperationException>(() => { settings.MaxConnectionIdleTime = maxConnectionIdleTime; });
  531. }
  532. [Fact]
  533. public void TestMaxConnectionLifeTime()
  534. {
  535. var settings = new MongoClientSettings();
  536. Assert.Equal(MongoDefaults.MaxConnectionLifeTime, settings.MaxConnectionLifeTime);
  537. var maxConnectionLifeTime = new TimeSpan(1, 2, 3);
  538. settings.MaxConnectionLifeTime = maxConnectionLifeTime;
  539. Assert.Equal(maxConnectionLifeTime, settings.MaxConnectionLifeTime);
  540. settings.Freeze();
  541. Assert.Equal(maxConnectionLifeTime, settings.MaxConnectionLifeTime);
  542. Assert.Throws<InvalidOperationException>(() => { settings.MaxConnectionLifeTime = maxConnectionLifeTime; });
  543. }
  544. [Fact]
  545. public void TestMaxConnectionPoolSize()
  546. {
  547. var settings = new MongoClientSettings();
  548. Assert.Equal(MongoDefaults.MaxConnectionPoolSize, settings.MaxConnectionPoolSize);
  549. var maxConnectionPoolSize = 123;
  550. settings.MaxConnectionPoolSize = maxConnectionPoolSize;
  551. Assert.Equal(maxConnectionPoolSize, settings.MaxConnectionPoolSize);
  552. settings.Freeze();
  553. Assert.Equal(maxConnectionPoolSize, settings.MaxConnectionPoolSize);
  554. Assert.Throws<InvalidOperationException>(() => { settings.MaxConnectionPoolSize = maxConnectionPoolSize; });
  555. }
  556. [Fact]
  557. public void TestMinConnectionPoolSize()
  558. {
  559. var settings = new MongoClientSettings();
  560. Assert.Equal(MongoDefaults.MinConnectionPoolSize, settings.MinConnectionPoolSize);
  561. var minConnectionPoolSize = 123;
  562. settings.MinConnectionPoolSize = minConnectionPoolSize;
  563. Assert.Equal(minConnectionPoolSize, settings.MinConnectionPoolSize);
  564. settings.Freeze();
  565. Assert.Equal(minConnectionPoolSize, settings.MinConnectionPoolSize);
  566. Assert.Throws<InvalidOperationException>(() => { settings.MinConnectionPoolSize = minConnectionPoolSize; });
  567. }
  568. [Fact]
  569. public void TestReadConcern()
  570. {
  571. var settings = new MongoClientSettings();
  572. Assert.Equal(ReadConcern.Default, settings.ReadConcern);
  573. var readConcern = ReadConcern.Majority;
  574. settings.ReadConcern = readConcern;
  575. Assert.Same(readConcern, settings.ReadConcern);
  576. settings.Freeze();
  577. Assert.Equal(readConcern, settings.ReadConcern);
  578. Assert.Throws<InvalidOperationException>(() => { settings.ReadConcern = ReadConcern.Default; });
  579. }
  580. [Fact]
  581. public void TestReadPreference()
  582. {
  583. var settings = new MongoClientSettings();
  584. Assert.Equal(ReadPreference.Primary, settings.ReadPreference);
  585. var readPreference = ReadPreference.Primary;
  586. settings.ReadPreference = readPreference;
  587. Assert.Same(readPreference, settings.ReadPreference);
  588. settings.Freeze();
  589. Assert.Equal(readPreference, settings.ReadPreference);
  590. Assert.Throws<InvalidOperationException>(() => { settings.ReadPreference = readPreference; });
  591. }
  592. [Fact]
  593. public void TestReplicaSetName()
  594. {
  595. var settings = new MongoClientSettings();
  596. Assert.Equal(null, settings.ReplicaSetName);
  597. var replicaSetName = "abc";
  598. settings.ReplicaSetName = replicaSetName;
  599. Assert.Same(replicaSetName, settings.ReplicaSetName);
  600. settings.Freeze();
  601. Assert.Same(replicaSetName, settings.ReplicaSetName);
  602. Assert.Throws<InvalidOperationException>(() => { settings.ReplicaSetName = replicaSetName; });
  603. }
  604. [Fact]
  605. public void TestRetryReads()
  606. {
  607. var settings = new MongoClientSettings();
  608. Assert.Equal(true, settings.RetryReads);
  609. var retryReads = false;
  610. settings.RetryReads = retryReads;
  611. Assert.Equal(retryReads, settings.RetryReads);
  612. settings.Freeze();
  613. Assert.Equal(retryReads, settings.RetryReads);
  614. Assert.Throws<InvalidOperationException>(() => { settings.RetryReads = false; });
  615. }
  616. [Fact]
  617. public void TestRetryWrites()
  618. {
  619. var settings = new MongoClientSettings();
  620. Assert.Equal(true, settings.RetryWrites);
  621. var retryWrites = false;
  622. settings.RetryWrites = retryWrites;
  623. Assert.Equal(retryWrites, settings.RetryWrites);
  624. settings.Freeze();
  625. Assert.Equal(retryWrites, settings.RetryWrites);
  626. Assert.Throws<InvalidOperationException>(() => { settings.RetryWrites = true; });
  627. }
  628. [Fact]
  629. public void TestScheme()
  630. {
  631. var settings = new MongoClientSettings();
  632. Assert.Equal(ConnectionStringScheme.MongoDB, settings.Scheme);
  633. var scheme = ConnectionStringScheme.MongoDBPlusSrv;
  634. settings.Scheme = scheme;
  635. Assert.Equal(scheme, settings.Scheme);
  636. settings.Freeze();
  637. Assert.Equal(scheme, settings.Scheme);
  638. Assert.Throws<InvalidOperationException>(() => { settings.Scheme = scheme; });
  639. }
  640. [Fact]
  641. public void TestSdamLogFileName()
  642. {
  643. var settings = new MongoClientSettings();
  644. Assert.Equal(null, settings.SdamLogFilename);
  645. var sdamLogFileName = "LCARS";
  646. settings.SdamLogFilename = sdamLogFileName;
  647. Assert.Same(sdamLogFileName, settings.SdamLogFilename);
  648. settings.Freeze();
  649. Assert.Same(sdamLogFileName, settings.SdamLogFilename);
  650. Assert.Throws<InvalidOperationException>(() => { settings.SdamLogFilename = sdamLogFileName; });
  651. }
  652. [Fact]
  653. public void TestServer()
  654. {
  655. var settings = new MongoClientSettings();
  656. Assert.Equal(_localHost, settings.Server);
  657. Assert.True(new[] { _localHost }.SequenceEqual(settings.Servers));
  658. var server = new MongoServerAddress("server");
  659. var servers = new[] { server };
  660. settings.Server = server;
  661. Assert.Equal(server, settings.Server);
  662. Assert.True(servers.SequenceEqual(settings.Servers));
  663. settings.Freeze();
  664. Assert.Equal(server, settings.Server);
  665. Assert.True(servers.SequenceEqual(settings.Servers));
  666. Assert.Throws<InvalidOperationException>(() => { settings.Server = server; });
  667. }
  668. [Fact]
  669. public void TestServersWithOneServer()
  670. {
  671. var settings = new MongoClientSettings();
  672. Assert.Equal(_localHost, settings.Server);
  673. Assert.True(new[] { _localHost }.SequenceEqual(settings.Servers));
  674. var server = new MongoServerAddress("server");
  675. var servers = new[] { server };
  676. settings.Servers = servers;
  677. Assert.Equal(server, settings.Server);
  678. Assert.True(servers.SequenceEqual(settings.Servers));
  679. settings.Freeze();
  680. Assert.Equal(server, settings.Server);
  681. Assert.True(servers.SequenceEqual(settings.Servers));
  682. Assert.Throws<InvalidOperationException>(() => { settings.Server = server; });
  683. }
  684. [Fact]
  685. public void TestServersWithTwoServers()
  686. {
  687. var settings = new MongoClientSettings();
  688. Assert.Equal(_localHost, settings.Server);
  689. Assert.True(new[] { _localHost }.SequenceEqual(settings.Servers));
  690. var servers = new MongoServerAddress[]
  691. {
  692. new MongoServerAddress("server1"),
  693. new MongoServerAddress("server2")
  694. };
  695. settings.Servers = servers;
  696. Assert.Throws<InvalidOperationException>(() => { var s = settings.Server; });
  697. Assert.True(servers.SequenceEqual(settings.Servers));
  698. settings.Freeze();
  699. Assert.Throws<InvalidOperationException>(() => { var s = settings.Server; });
  700. Assert.True(servers.SequenceEqual(settings.Servers));
  701. Assert.Throws<InvalidOperationException>(() => { settings.Servers = servers; });
  702. }
  703. [SkippableFact]
  704. public void TestSocketConfigurator()
  705. {
  706. RequireServer.Check();
  707. var settings = DriverTestConfiguration.Client.Settings.Clone();
  708. var socketConfiguratorWasCalled = false;
  709. Action<Socket> socketConfigurator = s => { socketConfiguratorWasCalled = true; };
  710. settings.ClusterConfigurator = cb => cb.ConfigureTcp(tcp => tcp.With(socketConfigurator: socketConfigurator));
  711. var subject = new MongoClient(settings);
  712. SpinWait.SpinUntil(() => subject.Cluster.Description.State == ClusterState.Connected, TimeSpan.FromSeconds(5)).Should().BeTrue();
  713. Assert.True(socketConfiguratorWasCalled);
  714. }
  715. [Fact]
  716. public void TestServerSelectionTimeout()
  717. {
  718. var settings = new MongoClientSettings();
  719. Assert.Equal(MongoDefaults.ServerSelectionTimeout, settings.ServerSelectionTimeout);
  720. var serverSelectionTimeout = new TimeSpan(1, 2, 3);
  721. settings.ServerSelectionTimeout = serverSelectionTimeout;
  722. Assert.Equal(serverSelectionTimeout, settings.ServerSelectionTimeout);
  723. settings.Freeze();
  724. Assert.Equal(serverSelectionTimeout, settings.ServerSelectionTimeout);
  725. Assert.Throws<InvalidOperationException>(() => { settings.ServerSelectionTimeout = serverSelectionTimeout; });
  726. }
  727. [Fact]
  728. public void TestSocketTimeout()
  729. {
  730. var settings = new MongoClientSettings();
  731. Assert.Equal(MongoDefaults.SocketTimeout, settings.SocketTimeout);
  732. var socketTimeout = new TimeSpan(1, 2, 3);
  733. settings.SocketTimeout = socketTimeout;
  734. Assert.Equal(socketTimeout, settings.SocketTimeout);
  735. settings.Freeze();
  736. Assert.Equal(socketTimeout, settings.SocketTimeout);
  737. Assert.Throws<InvalidOperationException>(() => { settings.SocketTimeout = socketTimeout; });
  738. }
  739. [Fact]
  740. public void TestSslSettings()
  741. {
  742. var settings = new MongoClientSettings();
  743. settings.SslSettings.Should().BeNull();
  744. var sslSettings = new SslSettings { CheckCertificateRevocation = false };
  745. settings.SslSettings = sslSettings;
  746. Assert.Equal(sslSettings, settings.SslSettings);
  747. settings.Freeze();
  748. Assert.Equal(sslSettings, settings.SslSettings);
  749. Assert.Throws<InvalidOperationException>(() => { settings.SslSettings = sslSettings; });
  750. }
  751. [Fact]
  752. public void TestUseSsl()
  753. {
  754. #pragma warning disable 618
  755. var settings = new MongoClientSettings();
  756. Assert.Equal(false, settings.UseSsl);
  757. var useSsl = true;
  758. settings.UseSsl = useSsl;
  759. Assert.Equal(useSsl, settings.UseSsl);
  760. settings.Freeze();
  761. Assert.Equal(useSsl, settings.UseSsl);
  762. Assert.Throws<InvalidOperationException>(() => { settings.UseSsl = useSsl; });
  763. #pragma warning restore 618
  764. }
  765. [Fact]
  766. public void TestUseTls()
  767. {
  768. var settings = new MongoClientSettings();
  769. Assert.Equal(false, settings.UseTls);
  770. var useTls = true;
  771. settings.UseTls = useTls;
  772. Assert.Equal(useTls, settings.UseTls);
  773. settings.Freeze();
  774. Assert.Equal(useTls, settings.UseTls);
  775. Assert.Throws<InvalidOperationException>(() => { settings.UseTls = useTls; });
  776. }
  777. [Fact]
  778. public void TestVerifySslCertificate()
  779. {
  780. #pragma warning disable 618
  781. var settings = new MongoClientSettings();
  782. Assert.Equal(true, settings.VerifySslCertificate);
  783. var verifySslCertificate = false;
  784. settings.VerifySslCertificate = verifySslCertificate;
  785. Assert.Equal(verifySslCertificate, settings.VerifySslCertificate);
  786. settings.SslSettings.CheckCertificateRevocation.Should().BeFalse();
  787. settings.Freeze();
  788. Assert.Equal(verifySslCertificate, settings.VerifySslCertificate);
  789. Assert.Throws<InvalidOperationException>(() => { settings.VerifySslCertificate = verifySslCertificate; });
  790. #pragma warning restore 618
  791. }
  792. [Fact]
  793. public void TestWaitQueueSize()
  794. {
  795. #pragma warning disable 618
  796. var settings = new MongoClientSettings();
  797. Assert.Equal(MongoDefaults.ComputedWaitQueueSize, settings.WaitQueueSize);
  798. var waitQueueSize = 123;
  799. settings.WaitQueueSize = waitQueueSize;
  800. Assert.Equal(waitQueueSize, settings.WaitQueueSize);
  801. settings.Freeze();
  802. Assert.Equal(waitQueueSize, settings.WaitQueueSize);
  803. Assert.Throws<InvalidOperationException>(() => { settings.WaitQueueSize = waitQueueSize; });
  804. #pragma warning restore 618
  805. }
  806. [Fact]
  807. public void TestWaitQueueTimeout()
  808. {
  809. var settings = new MongoClientSettings();
  810. Assert.Equal(MongoDefaults.WaitQueueTimeout, settings.WaitQueueTimeout);
  811. var waitQueueTimeout = new TimeSpan(1, 2, 3);
  812. settings.WaitQueueTimeout = waitQueueTimeout;
  813. Assert.Equal(waitQueueTimeout, settings.WaitQueueTimeout);
  814. settings.Freeze();
  815. Assert.Equal(waitQueueTimeout, settings.WaitQueueTimeout);
  816. Assert.Throws<InvalidOperationException>(() => { settings.WaitQueueTimeout = waitQueueTimeout; });
  817. }
  818. [Fact]
  819. public void TestWriteConcern()
  820. {
  821. var settings = new MongoClientSettings();
  822. Assert.Equal(WriteConcern.Acknowledged, settings.WriteConcern);
  823. var writeConcern = new WriteConcern();
  824. settings.WriteConcern = writeConcern;
  825. Assert.Same(writeConcern, settings.WriteConcern);
  826. settings.Freeze();
  827. Assert.Equal(writeConcern, settings.WriteConcern);
  828. Assert.Throws<InvalidOperationException>(() => { settings.WriteConcern = writeConcern; });
  829. }
  830. [Fact]
  831. public void ToClusterKey_should_copy_relevant_values()
  832. {
  833. var clusterConfigurator = new Action<ClusterBuilder>(b => { });
  834. #pragma warning disable 618
  835. var credential = MongoCredential.CreateMongoCRCredential("source", "username", "password");
  836. #pragma warning restore 618
  837. var servers = new[] { new MongoServerAddress("localhost") };
  838. var sslSettings = new SslSettings
  839. {
  840. CheckCertificateRevocation = true,
  841. EnabledSslProtocols = SslProtocols.Tls
  842. };
  843. var subject = new MongoClientSettings
  844. {
  845. AllowInsecureTls = false,
  846. ApplicationName = "app",
  847. ClusterConfigurator = clusterConfigurator,
  848. ConnectionMode = ConnectionMode.Direct,
  849. ConnectTimeout = TimeSpan.FromSeconds(1),
  850. Credential = credential,
  851. HeartbeatInterval = TimeSpan.FromSeconds(7),
  852. HeartbeatTimeout = TimeSpan.FromSeconds(8),
  853. IPv6 = true,
  854. LocalThreshold = TimeSpan.FromMilliseconds(20),
  855. MaxConnectionIdleTime = TimeSpan.FromSeconds(2),
  856. MaxConnectionLifeTime = TimeSpan.FromSeconds(3),
  857. MaxConnectionPoolSize = 10,
  858. MinConnectionPoolSize = 5,
  859. ReplicaSetName = "rs",
  860. Scheme = ConnectionStringScheme.MongoDB,
  861. SdamLogFilename = "pokédex",
  862. Servers = servers,
  863. ServerSelectionTimeout = TimeSpan.FromSeconds(6),
  864. SocketTimeout = TimeSpan.FromSeconds(4),
  865. SslSettings = sslSettings,
  866. UseTls = true,
  867. #pragma warning disable 618
  868. WaitQueueSize = 20,
  869. #pragma warning restore 618
  870. WaitQueueTimeout = TimeSpan.FromSeconds(5)
  871. };
  872. #pragma warning disable 618
  873. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
  874. {
  875. subject.GuidRepresentation = GuidRepresentation.Standard;
  876. }
  877. #pragma warning restore 618
  878. var result = subject.ToClusterKey();
  879. result.AllowInsecureTls.Should().Be(subject.AllowInsecureTls);
  880. result.ApplicationName.Should().Be(subject.ApplicationName);
  881. result.ClusterConfigurator.Should().BeSameAs(clusterConfigurator);
  882. result.ConnectionMode.Should().Be(subject.ConnectionMode);
  883. result.ConnectTimeout.Should().Be(subject.ConnectTimeout);
  884. #pragma warning disable 618
  885. result.Credentials.Should().Equal(subject.Credentials);
  886. #pragma warning restore
  887. result.HeartbeatInterval.Should().Be(subject.HeartbeatInterval);
  888. result.HeartbeatTimeout.Should().Be(subject.HeartbeatTimeout);
  889. result.IPv6.Should().Be(subject.IPv6);
  890. result.LocalThreshold.Should().Be(subject.LocalThreshold);
  891. result.MaxConnectionIdleTime.Should().Be(subject.MaxConnectionIdleTime);
  892. result.MaxConnectionLifeTime.Should().Be(subject.MaxConnectionLifeTime);
  893. result.MaxConnectionPoolSize.Should().Be(subject.MaxConnectionPoolSize);
  894. result.MinConnectionPoolSize.Should().Be(subject.MinConnectionPoolSize);
  895. result.ReceiveBufferSize.Should().Be(MongoDefaults.TcpReceiveBufferSize);
  896. result.ReplicaSetName.Should().Be(subject.ReplicaSetName);
  897. result.Scheme.Should().Be(subject.Scheme);
  898. result.SdamLogFilename.Should().Be(subject.SdamLogFilename);
  899. result.SendBufferSize.Should().Be(MongoDefaults.TcpSendBufferSize);
  900. result.Servers.Should().Equal(subject.Servers);
  901. result.ServerSelectionTimeout.Should().Be(subject.ServerSelectionTimeout);
  902. result.SocketTimeout.Should().Be(subject.SocketTimeout);
  903. result.SslSettings.Should().Be(subject.SslSettings);
  904. result.UseTls.Should().Be(subject.UseTls);
  905. #pragma warning disable 618
  906. result.WaitQueueSize.Should().Be(subject.WaitQueueSize);
  907. #pragma warning restore 618
  908. result.WaitQueueTimeout.Should().Be(subject.WaitQueueTimeout);
  909. }
  910. }
  911. }