mongo 2.0.6 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +5 -2
  3. data/lib/mongo/address/ipv4.rb +6 -1
  4. data/lib/mongo/address/unix.rb +2 -2
  5. data/lib/mongo/address.rb +18 -10
  6. data/lib/mongo/auth/cr/conversation.rb +1 -1
  7. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  8. data/lib/mongo/auth/scram/conversation.rb +9 -3
  9. data/lib/mongo/auth/user/view.rb +23 -2
  10. data/lib/mongo/auth/x509/conversation.rb +1 -1
  11. data/lib/mongo/bulk_write/combineable.rb +51 -0
  12. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  13. data/lib/mongo/bulk_write/result.rb +191 -0
  14. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  15. data/lib/mongo/bulk_write/transformable.rb +132 -0
  16. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  17. data/lib/mongo/bulk_write/validatable.rb +62 -0
  18. data/lib/mongo/bulk_write.rb +159 -23
  19. data/lib/mongo/client.rb +52 -16
  20. data/lib/mongo/cluster/topology/replica_set.rb +27 -9
  21. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/cluster.rb +42 -7
  24. data/lib/mongo/collection/view/aggregation.rb +48 -9
  25. data/lib/mongo/collection/view/immutable.rb +6 -6
  26. data/lib/mongo/collection/view/iterable.rb +18 -4
  27. data/lib/mongo/collection/view/map_reduce.rb +58 -17
  28. data/lib/mongo/collection/view/readable.rb +173 -42
  29. data/lib/mongo/collection/view/writable.rb +37 -23
  30. data/lib/mongo/collection/view.rb +2 -2
  31. data/lib/mongo/collection.rb +370 -33
  32. data/lib/mongo/cursor.rb +15 -3
  33. data/lib/mongo/database/view.rb +5 -4
  34. data/lib/mongo/database.rb +14 -4
  35. data/lib/mongo/dbref.rb +113 -0
  36. data/lib/mongo/error/closed_stream.rb +34 -0
  37. data/lib/mongo/error/extra_file_chunk.rb +34 -0
  38. data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
  39. data/lib/mongo/error/invalid_file.rb +2 -2
  40. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  41. data/lib/mongo/error/invalid_uri.rb +5 -4
  42. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  43. data/lib/mongo/error/operation_failure.rb +1 -1
  44. data/lib/mongo/error/parser.rb +1 -1
  45. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  46. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  47. data/lib/mongo/error.rb +13 -2
  48. data/lib/mongo/event/description_changed.rb +1 -1
  49. data/lib/mongo/grid/file/chunk.rb +6 -6
  50. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  51. data/lib/mongo/grid/file.rb +13 -10
  52. data/lib/mongo/grid/fs_bucket.rb +448 -0
  53. data/lib/mongo/grid/stream/read.rb +208 -0
  54. data/lib/mongo/grid/stream/write.rb +187 -0
  55. data/lib/mongo/grid/stream.rb +64 -0
  56. data/lib/mongo/grid.rb +2 -1
  57. data/lib/mongo/index/view.rb +3 -3
  58. data/lib/mongo/index.rb +5 -0
  59. data/lib/mongo/loggable.rb +34 -57
  60. data/lib/mongo/logger.rb +16 -78
  61. data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
  62. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  63. data/lib/mongo/monitoring/event/command_started.rb +89 -0
  64. data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
  65. data/lib/mongo/monitoring/event/secure.rb +58 -0
  66. data/lib/mongo/monitoring/event.rb +18 -0
  67. data/lib/mongo/monitoring/publishable.rb +106 -0
  68. data/lib/mongo/monitoring.rb +195 -0
  69. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  70. data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
  71. data/lib/mongo/operation/commands/collections_info.rb +68 -0
  72. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  73. data/lib/mongo/operation/commands/indexes.rb +70 -0
  74. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  75. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  76. data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
  77. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  78. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
  79. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  80. data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
  81. data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
  82. data/lib/mongo/operation/commands/user_query.rb +69 -0
  83. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
  84. data/lib/mongo/operation/commands/users_info.rb +53 -0
  85. data/lib/mongo/operation/commands.rb +24 -0
  86. data/lib/mongo/operation/executable.rb +4 -68
  87. data/lib/mongo/operation/kill_cursors.rb +3 -3
  88. data/lib/mongo/operation/read/get_more.rb +2 -22
  89. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
  90. data/lib/mongo/operation/read/query.rb +4 -21
  91. data/lib/mongo/operation/read.rb +0 -4
  92. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  93. data/lib/mongo/operation/result.rb +13 -1
  94. data/lib/mongo/operation/specifiable.rb +42 -0
  95. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  96. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  97. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  98. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  99. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  100. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  101. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  102. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  103. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  104. data/lib/mongo/operation/write/bulk.rb +6 -3
  105. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  106. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  107. data/lib/mongo/operation/write/command/delete.rb +0 -1
  108. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  109. data/lib/mongo/operation/write/command/insert.rb +0 -1
  110. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  111. data/lib/mongo/operation/write/command/update.rb +0 -1
  112. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  113. data/lib/mongo/operation/write/command/writable.rb +13 -18
  114. data/lib/mongo/operation/write/create_index.rb +4 -27
  115. data/lib/mongo/operation/write/create_user.rb +4 -30
  116. data/lib/mongo/operation/write/delete.rb +6 -29
  117. data/lib/mongo/operation/write/drop_index.rb +3 -3
  118. data/lib/mongo/operation/write/gle.rb +48 -0
  119. data/lib/mongo/operation/write/idable.rb +5 -0
  120. data/lib/mongo/operation/write/insert.rb +2 -24
  121. data/lib/mongo/operation/write/remove_user.rb +4 -27
  122. data/lib/mongo/operation/write/update.rb +13 -36
  123. data/lib/mongo/operation/write/update_user.rb +4 -30
  124. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  125. data/lib/mongo/operation/write.rb +2 -0
  126. data/lib/mongo/operation.rb +32 -4
  127. data/lib/mongo/options/mapper.rb +4 -2
  128. data/lib/mongo/options/redacted.rb +156 -0
  129. data/lib/mongo/options.rb +1 -0
  130. data/lib/mongo/protocol/delete.rb +75 -15
  131. data/lib/mongo/protocol/get_more.rb +65 -13
  132. data/lib/mongo/protocol/insert.rb +85 -13
  133. data/lib/mongo/protocol/kill_cursors.rb +59 -14
  134. data/lib/mongo/protocol/message.rb +12 -12
  135. data/lib/mongo/protocol/query.rb +163 -37
  136. data/lib/mongo/protocol/reply.rb +103 -0
  137. data/lib/mongo/protocol/serializers.rb +1 -1
  138. data/lib/mongo/protocol/update.rb +82 -14
  139. data/lib/mongo/retryable.rb +83 -0
  140. data/lib/mongo/server/connectable.rb +21 -25
  141. data/lib/mongo/server/connection.rb +75 -4
  142. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  143. data/lib/mongo/server/connection_pool.rb +12 -0
  144. data/lib/mongo/server/description/features.rb +2 -1
  145. data/lib/mongo/server/description.rb +52 -1
  146. data/lib/mongo/server/monitor/connection.rb +26 -2
  147. data/lib/mongo/server/monitor.rb +19 -3
  148. data/lib/mongo/server.rb +39 -5
  149. data/lib/mongo/server_selector/selectable.rb +40 -31
  150. data/lib/mongo/server_selector.rb +19 -10
  151. data/lib/mongo/socket/ssl.rb +28 -16
  152. data/lib/mongo/socket/tcp.rb +3 -3
  153. data/lib/mongo/socket/unix.rb +5 -8
  154. data/lib/mongo/socket.rb +11 -4
  155. data/lib/mongo/uri.rb +248 -137
  156. data/lib/mongo/version.rb +1 -1
  157. data/lib/mongo.rb +5 -3
  158. data/spec/mongo/address/unix_spec.rb +1 -1
  159. data/spec/mongo/address_spec.rb +25 -0
  160. data/spec/mongo/auth/cr_spec.rb +9 -1
  161. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  162. data/spec/mongo/auth/ldap_spec.rb +9 -1
  163. data/spec/mongo/auth/scram_spec.rb +9 -1
  164. data/spec/mongo/auth/user/view_spec.rb +26 -1
  165. data/spec/mongo/auth/x509_spec.rb +9 -1
  166. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  167. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  168. data/spec/mongo/bulk_write_spec.rb +428 -0
  169. data/spec/mongo/client_spec.rb +167 -17
  170. data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
  171. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  172. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  173. data/spec/mongo/cluster_spec.rb +55 -10
  174. data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
  175. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  176. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  177. data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
  178. data/spec/mongo/collection/view/readable_spec.rb +238 -6
  179. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  180. data/spec/mongo/collection/view_spec.rb +459 -71
  181. data/spec/mongo/collection_spec.rb +1291 -9
  182. data/spec/mongo/command_monitoring_spec.rb +51 -0
  183. data/spec/mongo/connection_string_spec.rb +115 -0
  184. data/spec/mongo/crud_spec.rb +2 -2
  185. data/spec/mongo/cursor_spec.rb +3 -3
  186. data/spec/mongo/database_spec.rb +47 -11
  187. data/spec/mongo/dbref_spec.rb +149 -0
  188. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  189. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  190. data/spec/mongo/grid/file_spec.rb +8 -8
  191. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  192. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  193. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  194. data/spec/mongo/grid/stream_spec.rb +48 -0
  195. data/spec/mongo/gridfs_spec.rb +50 -0
  196. data/spec/mongo/logger_spec.rb +0 -40
  197. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  198. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  199. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  200. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  201. data/spec/mongo/monitoring_spec.rb +168 -0
  202. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  203. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  204. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
  205. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  206. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  207. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  208. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  209. data/spec/mongo/operation/read/query_spec.rb +19 -16
  210. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  211. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
  212. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
  213. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
  214. data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
  215. data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
  216. data/spec/mongo/operation/write/command/update_spec.rb +0 -16
  217. data/spec/mongo/operation/write/delete_spec.rb +4 -4
  218. data/spec/mongo/operation/write/insert_spec.rb +2 -13
  219. data/spec/mongo/operation/write/update_spec.rb +7 -7
  220. data/spec/mongo/options/redacted_spec.rb +350 -0
  221. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  222. data/spec/mongo/protocol/query_spec.rb +15 -30
  223. data/spec/mongo/retryable_spec.rb +147 -0
  224. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  225. data/spec/mongo/server/connection_pool_spec.rb +50 -6
  226. data/spec/mongo/server/connection_spec.rb +49 -4
  227. data/spec/mongo/server/description_spec.rb +49 -3
  228. data/spec/mongo/server/monitor_spec.rb +51 -0
  229. data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
  230. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  231. data/spec/mongo/server_selection_spec.rb +19 -9
  232. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  233. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  234. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  235. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  236. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  237. data/spec/mongo/server_selector_spec.rb +87 -24
  238. data/spec/mongo/server_spec.rb +94 -8
  239. data/spec/mongo/socket/ssl_spec.rb +123 -13
  240. data/spec/mongo/socket/unix_spec.rb +52 -0
  241. data/spec/mongo/uri_spec.rb +295 -67
  242. data/spec/spec_helper.rb +40 -24
  243. data/spec/support/authorization.rb +23 -9
  244. data/spec/support/certificates/client.pem +4 -4
  245. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  246. data/spec/support/command_monitoring/command.yml +42 -0
  247. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  248. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  249. data/spec/support/command_monitoring/find.yml +219 -0
  250. data/spec/support/command_monitoring/insertMany.yml +81 -0
  251. data/spec/support/command_monitoring/insertOne.yml +51 -0
  252. data/spec/support/command_monitoring/updateMany.yml +67 -0
  253. data/spec/support/command_monitoring/updateOne.yml +95 -0
  254. data/spec/support/command_monitoring.rb +365 -0
  255. data/spec/support/connection_string.rb +228 -0
  256. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  257. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  258. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  259. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  260. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  261. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  262. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  263. data/spec/support/crud/read.rb +22 -19
  264. data/spec/support/crud/write.rb +58 -27
  265. data/spec/support/crud.rb +10 -2
  266. data/spec/support/gridfs.rb +637 -0
  267. data/spec/support/gridfs_tests/delete.yml +157 -0
  268. data/spec/support/gridfs_tests/download.yml +210 -0
  269. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  270. data/spec/support/gridfs_tests/upload.yml +158 -0
  271. data/spec/support/matchers.rb +1 -1
  272. data/spec/support/sdam/rs/equal_electionids.yml +44 -0
  273. data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
  274. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  275. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  276. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  277. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  278. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  279. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  280. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  281. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  282. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  283. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  284. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  285. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  286. data/spec/support/server_discovery_and_monitoring.rb +22 -3
  287. data/spec/support/server_selection.rb +3 -1
  288. data/spec/support/shared/bulk_write.rb +218 -22
  289. data/spec/support/shared/server_selector.rb +80 -14
  290. data.tar.gz.sig +0 -0
  291. metadata +188 -59
  292. metadata.gz.sig +0 -0
  293. data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
  294. data/lib/mongo/bulk_write/deletable.rb +0 -56
  295. data/lib/mongo/bulk_write/insertable.rb +0 -48
  296. data/lib/mongo/bulk_write/replacable.rb +0 -57
  297. data/lib/mongo/bulk_write/updatable.rb +0 -68
  298. data/lib/mongo/grid/fs.rb +0 -149
  299. data/lib/mongo/operation/list_collections/result.rb +0 -114
  300. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  301. data/lib/mongo/operation/read/collections_info.rb +0 -68
  302. data/lib/mongo/operation/read/indexes.rb +0 -69
  303. data/lib/mongo/operation/read/list_collections.rb +0 -76
  304. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  305. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  306. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  307. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  308. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  309. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  310. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
  311. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  312. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  313. data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
  314. data/spec/mongo/grid/fs_spec.rb +0 -160
  315. data/spec/mongo/loggable_spec.rb +0 -63
  316. data/spec/mongo/operation/aggregate_spec.rb +0 -127
  317. /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
@@ -2,20 +2,36 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Server::ConnectionPool do
4
4
 
5
+ let(:options) do
6
+ TEST_OPTIONS.merge(max_pool_size: 2)
7
+ end
8
+
5
9
  let(:address) do
6
10
  Mongo::Address.new('127.0.0.1:27017')
7
11
  end
8
12
 
13
+ let(:monitoring) do
14
+ Mongo::Monitoring.new
15
+ end
16
+
17
+ let(:listeners) do
18
+ Mongo::Event::Listeners.new
19
+ end
20
+
9
21
  describe '#checkin' do
10
22
 
11
23
  let(:server) do
12
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
24
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
13
25
  end
14
26
 
15
27
  let!(:pool) do
16
28
  described_class.get(server)
17
29
  end
18
30
 
31
+ after do
32
+ server.disconnect!
33
+ end
34
+
19
35
  context 'when a connection is checked out on the thread' do
20
36
 
21
37
  let!(:connection) do
@@ -39,7 +55,7 @@ describe Mongo::Server::ConnectionPool do
39
55
  describe '#checkout' do
40
56
 
41
57
  let(:server) do
42
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
58
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
43
59
  end
44
60
 
45
61
  let!(:pool) do
@@ -71,7 +87,7 @@ describe Mongo::Server::ConnectionPool do
71
87
  context 'when a connection is checked out on a different thread' do
72
88
 
73
89
  let!(:connection) do
74
- Thread.new { pool.checkout }.value
90
+ Thread.new { pool.checkout }.join
75
91
  end
76
92
 
77
93
  it 'returns a new connection' do
@@ -84,16 +100,40 @@ describe Mongo::Server::ConnectionPool do
84
100
  end
85
101
  end
86
102
 
103
+ describe '#disconnect!' do
104
+
105
+ let(:server) do
106
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
107
+ end
108
+
109
+ let!(:pool) do
110
+ described_class.get(server)
111
+ end
112
+
113
+ after do
114
+ server.disconnect!
115
+ end
116
+
117
+ it 'disconnects the queue' do
118
+ expect(pool.send(:queue)).to receive(:disconnect!).twice.and_call_original
119
+ pool.disconnect!
120
+ end
121
+ end
122
+
87
123
  describe '.get' do
88
124
 
89
125
  let(:server) do
90
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
126
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
91
127
  end
92
128
 
93
129
  let!(:pool) do
94
130
  described_class.get(server)
95
131
  end
96
132
 
133
+ after do
134
+ server.disconnect!
135
+ end
136
+
97
137
  it 'returns the pool for the server' do
98
138
  expect(pool).to eql(described_class.get(server))
99
139
  end
@@ -102,13 +142,17 @@ describe Mongo::Server::ConnectionPool do
102
142
  describe '#inspect' do
103
143
 
104
144
  let(:server) do
105
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
145
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
106
146
  end
107
147
 
108
148
  let!(:pool) do
109
149
  described_class.get(server)
110
150
  end
111
151
 
152
+ after do
153
+ server.disconnect!
154
+ end
155
+
112
156
  it 'includes the object id' do
113
157
  expect(pool.inspect).to include(pool.object_id.to_s)
114
158
  end
@@ -121,7 +165,7 @@ describe Mongo::Server::ConnectionPool do
121
165
  describe '#with_connection' do
122
166
 
123
167
  let(:server) do
124
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
168
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
125
169
  end
126
170
 
127
171
  let!(:pool) do
@@ -6,8 +6,53 @@ describe Mongo::Server::Connection do
6
6
  Mongo::Address.new(DEFAULT_ADDRESS)
7
7
  end
8
8
 
9
+ let(:monitoring) do
10
+ Mongo::Monitoring.new
11
+ end
12
+
13
+ let(:listeners) do
14
+ Mongo::Event::Listeners.new
15
+ end
16
+
9
17
  let(:server) do
10
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
18
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
19
+ end
20
+
21
+ after do
22
+ server.disconnect!
23
+ end
24
+
25
+ describe '#connectable?' do
26
+
27
+ # context 'when the connection is connectable' do
28
+
29
+ # let(:connection) do
30
+ # described_class.new(server)
31
+ # end
32
+
33
+ # it 'returns true' do
34
+ # expect(connection).to be_connectable
35
+ # end
36
+ # end
37
+
38
+ context 'when the connection is not connectable' do
39
+
40
+ let(:bad_address) do
41
+ Mongo::Address.new('127.0.0.1:666')
42
+ end
43
+
44
+ let(:bad_server) do
45
+ Mongo::Server.new(bad_address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
46
+ end
47
+
48
+ let(:connection) do
49
+ described_class.new(bad_server)
50
+ end
51
+
52
+ it 'returns false' do
53
+ expect(connection).to_not be_connectable
54
+ end
55
+ end
11
56
  end
12
57
 
13
58
  describe '#connect!' do
@@ -164,7 +209,7 @@ describe Mongo::Server::Connection do
164
209
  end
165
210
 
166
211
  after do
167
- authorized_collection.find.delete_many
212
+ authorized_collection.delete_many
168
213
  end
169
214
 
170
215
  it 'it dispatchs the message to the socket' do
@@ -187,7 +232,7 @@ describe Mongo::Server::Connection do
187
232
  end
188
233
 
189
234
  after do
190
- authorized_collection.find.delete_many
235
+ authorized_collection.delete_many
191
236
  end
192
237
 
193
238
  it 'it dispatchs the message to the socket' do
@@ -225,7 +270,7 @@ describe Mongo::Server::Connection do
225
270
  end
226
271
 
227
272
  after do
228
- authorized_collection.find.delete_many
273
+ authorized_collection.delete_many
229
274
  end
230
275
 
231
276
  it 'disconnects the connection' do
@@ -31,6 +31,10 @@ describe Mongo::Server::Description do
31
31
  Mongo::Address.new('127.0.0.1:27017')
32
32
  end
33
33
 
34
+ let(:monitoring) do
35
+ Mongo::Monitoring.new
36
+ end
37
+
34
38
  describe '#arbiter?' do
35
39
 
36
40
  context 'when the server is an arbiter' do
@@ -583,7 +587,7 @@ describe Mongo::Server::Description do
583
587
  end
584
588
 
585
589
  let(:server) do
586
- Mongo::Server.new(address, double('cluster'), listeners)
590
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners)
587
591
  end
588
592
 
589
593
  let(:description) do
@@ -604,7 +608,7 @@ describe Mongo::Server::Description do
604
608
  end
605
609
 
606
610
  let(:server) do
607
- Mongo::Server.new(other_address, double('cluster'), listeners)
611
+ Mongo::Server.new(other_address, double('cluster'), monitoring, listeners)
608
612
  end
609
613
 
610
614
  it 'returns false' do
@@ -613,6 +617,48 @@ describe Mongo::Server::Description do
613
617
  end
614
618
  end
615
619
 
620
+ describe '#me_mismatch?' do
621
+
622
+ let(:description) do
623
+ described_class.new(address, config)
624
+ end
625
+
626
+ context 'when the server address matches the me field' do
627
+
628
+ let(:config) do
629
+ replica.merge('me' => address.to_s)
630
+ end
631
+
632
+ it 'returns false' do
633
+ expect(description.me_mismatch?).to be(false)
634
+ end
635
+ end
636
+
637
+ context 'when the server address does not match the me field' do
638
+
639
+ let(:config) do
640
+ replica.merge('me' => 'localhost:27020')
641
+ end
642
+
643
+ it 'returns true' do
644
+ expect(description.me_mismatch?).to be(true)
645
+ end
646
+ end
647
+
648
+ context 'when there is no me field' do
649
+
650
+ let(:config) do
651
+ replica.tap do |r|
652
+ r.delete('me')
653
+ end
654
+ end
655
+
656
+ it 'returns false' do
657
+ expect(description.me_mismatch?).to be(false)
658
+ end
659
+ end
660
+ end
661
+
616
662
  describe '#lists_server?' do
617
663
 
618
664
  let(:description) do
@@ -628,7 +674,7 @@ describe Mongo::Server::Description do
628
674
  end
629
675
 
630
676
  let(:server) do
631
- Mongo::Server.new(server_address, double('cluster'), listeners)
677
+ Mongo::Server.new(server_address, double('cluster'), monitoring, listeners)
632
678
  end
633
679
 
634
680
  context 'when the server is included in the description hosts list' do
@@ -141,4 +141,55 @@ describe Mongo::Server::Monitor do
141
141
  expect(monitor.description).to_not be_nil
142
142
  end
143
143
  end
144
+
145
+ describe '#restart!' do
146
+
147
+ let(:monitor) do
148
+ described_class.new(address, listeners, TEST_OPTIONS)
149
+ end
150
+
151
+ let!(:thread) do
152
+ monitor.run!
153
+ end
154
+
155
+ context 'when the monitor is already running' do
156
+
157
+ it 'does not create a new thread' do
158
+ expect(monitor.restart!).to be(thread)
159
+ end
160
+ end
161
+
162
+ context 'when the monitor is not already running' do
163
+
164
+ before do
165
+ monitor.stop!
166
+ sleep(1)
167
+ end
168
+
169
+ it 'creates a new thread' do
170
+ expect(monitor.restart!).not_to be(thread)
171
+ end
172
+ end
173
+ end
174
+
175
+ describe '#stop' do
176
+
177
+ let(:monitor) do
178
+ described_class.new(address, listeners, TEST_OPTIONS)
179
+ end
180
+
181
+ let!(:thread) do
182
+ monitor.run!
183
+ end
184
+
185
+ before do
186
+ expect(monitor.connection).to receive(:disconnect!).and_call_original
187
+ monitor.stop!
188
+ sleep(1)
189
+ end
190
+
191
+ it 'kills the monitor thread' do
192
+ expect(thread.stop?).to be(true)
193
+ end
194
+ end
144
195
  end
@@ -11,39 +11,26 @@ describe 'Server Discovery and Monitoring' do
11
11
 
12
12
  before(:all) do
13
13
 
14
- # We monkey-patch the address, so that looking up the spec's hostname does
15
- # not throw an error.
16
- #
17
- # @since 2.0.0
18
- class Mongo::Address
19
- private
20
-
21
- def family(host)
22
- fam = host == 'localhost' ? ::Socket::AF_INET : ::Socket::AF_UNSPEC
23
- ::Socket.getaddrinfo(host, nil, fam, ::Socket::SOCK_STREAM).first[4]
24
- rescue SocketError
25
- end
26
- end
14
+ module Mongo
15
+ # We monkey-patch the server here, so the monitors do not run and no
16
+ # real TCP connection is attempted. Thus we can control the server
17
+ # descriptions per-phase.
18
+ #
19
+ # @since 2.0.0
20
+ class Server
21
+
22
+ alias :original_initialize :initialize
23
+ def initialize(address, cluster, monitoring, event_listeners, options = {})
24
+ @address = address
25
+ @cluster = cluster
26
+ @monitoring = monitoring
27
+ @options = options.freeze
28
+ @monitor = Monitor.new(address, event_listeners, options)
29
+ end
27
30
 
28
- # We monkey-patch the server here, so the monitors do not run and no
29
- # real TCP connection is attempted. Thus we can control the server
30
- # descriptions per-phase.
31
- #
32
- # @since 2.0.0
33
- class Mongo::Server
34
-
35
- # The constructor keeps the same API, but does not instantiate a
36
- # monitor and run it.
37
- def initialize(address, cluster, event_listeners, options = {})
38
- @address = address
39
- @cluster = cluster
40
- @options = options.freeze
41
- @monitor = Monitor.new(address, event_listeners, options)
31
+ alias :original_disconnect! :disconnect!
32
+ def disconnect!; true; end
42
33
  end
43
-
44
- # Disconnect simply needs to return true since we have no monitor and
45
- # no connection.
46
- def disconnect!; true; end
47
34
  end
48
35
 
49
36
  # Client is set as an instance variable inside the scope of the spec to
@@ -53,36 +40,17 @@ describe 'Server Discovery and Monitoring' do
53
40
  end
54
41
 
55
42
  after(:all) do
43
+ @client.close
56
44
 
57
45
  # Return the server implementation to its original for the other
58
46
  # tests in the suite.
59
- class Mongo::Server
60
-
61
- # Returns the constructor to its original implementation.
62
- def initialize(address, cluster, event_listeners, options = {})
63
- @address = address
64
- @cluster = cluster
65
- @options = options.freeze
66
- @monitor = Monitor.new(address, event_listeners, options)
67
- @monitor.scan!
68
- @monitor.run!
69
- end
70
-
71
- # Returns disconnect! to its original implementation.
72
- def disconnect!
73
- context.with_connection do |connection|
74
- connection.disconnect!
75
- end
76
- @monitor.stop! and true
77
- end
78
- end
79
-
80
- class Mongo::Address
81
- private
47
+ module Mongo
48
+ class Server
49
+ alias :initialize :original_initialize
50
+ remove_method(:original_initialize)
82
51
 
83
- def family(host)
84
- fam = host == 'localhost' ? ::Socket::AF_INET : ::Socket::AF_UNSPEC
85
- ::Socket.getaddrinfo(host, nil, fam, ::Socket::SOCK_STREAM).first[4]
52
+ alias :disconnect! :original_disconnect!
53
+ remove_method(:original_disconnect!)
86
54
  end
87
55
  end
88
56
  end
@@ -96,8 +64,13 @@ describe 'Server Discovery and Monitoring' do
96
64
  # For each response in the phase, we need to change that server's
97
65
  # description.
98
66
  server = find_server(@client, response.address)
99
- server = Mongo::Server.new(Mongo::Address.new(response.address), @client.cluster,
100
- @client.cluster.send(:event_listeners), @client.cluster.options) unless server
67
+ server = Mongo::Server.new(
68
+ Mongo::Address.new(response.address),
69
+ @client.cluster,
70
+ @client.instance_variable_get(:@monitoring),
71
+ @client.cluster.send(:event_listeners),
72
+ @client.cluster.options
73
+ ) unless server
101
74
  monitor = server.instance_variable_get(:@monitor)
102
75
  description = monitor.inspector.run(server.description, response.ismaster, 0.5)
103
76
  monitor.instance_variable_set(:@description, description)
@@ -8,80 +8,60 @@ describe 'Server Selection moving average round trip time calculation' do
8
8
 
9
9
  spec = Mongo::ServerSelection::RTT::Spec.new(file)
10
10
 
11
- before(:all) do
12
-
13
- module Mongo
14
- class Server
15
-
16
- # We monkey-patch the monitor here, so the last average rtt can be controlled.
17
- # We keep the API of Monitor#initialize but add in an extra option and set the last rtt.
18
- #
19
- # @since 2.0.0
20
- class Monitor
21
-
22
- def initialize(address, listeners, options = {})
23
- @description = Mongo::Server::Description.new(address, {})
24
- @inspector = Mongo::Server::Description::Inspector.new(listeners)
25
- @options = options.freeze
26
- @connection = Connection.new(address, options)
27
- @last_round_trip_time = options[:avg_rtt_ms]
28
- @mutex = Mutex.new
29
- end
11
+ context(spec.description) do
30
12
 
31
- private
13
+ before(:all) do
32
14
 
33
- # We monkey patch this method to use an instance variable instead of calculating time elapsed.
15
+ module Mongo
16
+ class Server
17
+
18
+ # We monkey-patch the monitor here, so the last average rtt can be controlled.
19
+ # We keep the API of Monitor#initialize but add in an extra option and set the last rtt.
34
20
  #
35
21
  # @since 2.0.0
36
- def average_round_trip_time(start)
37
- new_rtt = @new_rtt_ms
38
- RTT_WEIGHT_FACTOR * new_rtt + (1 - RTT_WEIGHT_FACTOR) * (@last_round_trip_time || new_rtt)
22
+ class Monitor
23
+
24
+ alias :original_initialize :initialize
25
+ def initialize(address, listeners, options = {})
26
+ @description = Mongo::Server::Description.new(address, {})
27
+ @inspector = Mongo::Server::Description::Inspector.new(listeners)
28
+ @options = options.freeze
29
+ @connection = Connection.new(address, options)
30
+ @last_round_trip_time = options[:avg_rtt_ms]
31
+ @mutex = Mutex.new
32
+ end
33
+
34
+ # We monkey patch this method to use an instance variable instead of calculating time elapsed.
35
+ #
36
+ # @since 2.0.0
37
+ alias :original_average_round_trip_time :average_round_trip_time
38
+ def average_round_trip_time(start)
39
+ new_rtt = @new_rtt_ms
40
+ RTT_WEIGHT_FACTOR * new_rtt + (1 - RTT_WEIGHT_FACTOR) * (@last_round_trip_time || new_rtt)
41
+ end
39
42
  end
40
43
  end
41
44
  end
42
45
  end
43
- end
44
46
 
45
- after(:all) do
47
+ after(:all) do
46
48
 
47
- module Mongo
48
- class Server
49
+ module Mongo
50
+ class Server
49
51
 
50
- # Return the monitor implementation to its original for the other
51
- # tests in the suite.
52
- class Monitor
52
+ # Return the monitor implementation to its original for the other
53
+ # tests in the suite.
54
+ class Monitor
53
55
 
54
- # Create the new server monitor.
55
- #
56
- # @example Create the server monitor.
57
- # Mongo::Server::Monitor.new(address, listeners)
58
- #
59
- # @param [ Address ] address The address to monitor.
60
- # @param [ Event::Listeners ] listeners The event listeners.
61
- # @param [ Hash ] options The options.
62
- #
63
- # @since 2.0.0
64
- def initialize(address, listeners, options = {})
65
- @description = Description.new(address, {})
66
- @inspector = Description::Inspector.new(listeners)
67
- @options = options.freeze
68
- @connection = Connection.new(address, options)
69
- @last_round_trip_time = nil
70
- @mutex = Mutex.new
71
- end
72
-
73
- private
56
+ alias :initialize :original_initialize
57
+ remove_method(:original_initialize)
74
58
 
75
- def average_round_trip_time(start)
76
- new_rtt = Time.now - start
77
- RTT_WEIGHT_FACTOR * new_rtt + (1 - RTT_WEIGHT_FACTOR) * (@last_round_trip_time || new_rtt)
59
+ alias :average_round_trip_time :original_average_round_trip_time
60
+ remove_method(:original_average_round_trip_time)
78
61
  end
79
62
  end
80
63
  end
81
64
  end
82
- end
83
-
84
- context(spec.description) do
85
65
 
86
66
  let(:address) do
87
67
  Mongo::Address.new('127.0.0.1:27017')
@@ -14,6 +14,14 @@ describe 'Server Selection' do
14
14
  spec.type.new({})
15
15
  end
16
16
 
17
+ let(:monitoring) do
18
+ Mongo::Monitoring.new
19
+ end
20
+
21
+ let(:listeners) do
22
+ Mongo::Event::Listeners.new
23
+ end
24
+
17
25
  let(:cluster) do
18
26
  double('cluster').tap do |c|
19
27
  allow(c).to receive(:topology).and_return(topology)
@@ -26,11 +34,12 @@ describe 'Server Selection' do
26
34
  let(:candidate_servers) do
27
35
  spec.candidate_servers.collect do |server|
28
36
  address = Mongo::Address.new(server['address'])
29
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS).tap do |s|
37
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS).tap do |s|
30
38
  allow(s).to receive(:average_round_trip_time).and_return(server['avg_rtt_ms'])
31
39
  allow(s).to receive(:tags).and_return(server['tags'])
32
40
  allow(s).to receive(:secondary?).and_return(server['type'] == 'RSSecondary')
33
41
  allow(s).to receive(:primary?).and_return(server['type'] == 'RSPrimary')
42
+ allow(s).to receive(:connectable?).and_return(true)
34
43
  end
35
44
  end
36
45
  end
@@ -38,17 +47,18 @@ describe 'Server Selection' do
38
47
  let(:in_latency_window) do
39
48
  spec.in_latency_window.collect do |server|
40
49
  address = Mongo::Address.new(server['address'])
41
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS).tap do |s|
50
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS).tap do |s|
42
51
  allow(s).to receive(:average_round_trip_time).and_return(server['avg_rtt_ms'])
43
52
  allow(s).to receive(:tags).and_return(server['tags'])
53
+ allow(s).to receive(:connectable?).and_return(true)
44
54
  end
45
55
  end
46
56
  end
47
57
 
48
58
  let(:server_selector) do
49
- Mongo::ServerSelector.get({ :mode => spec.read_preference['mode'],
50
- :tag_sets => spec.read_preference['tag_sets'] },
51
- :server_selection_timeout => 1)
59
+ Mongo::ServerSelector.get(:mode => spec.read_preference['mode'],
60
+ :tag_sets => spec.read_preference['tag_sets'],
61
+ :server_selection_timeout => 1)
52
62
  end
53
63
 
54
64
  before do
@@ -57,18 +67,18 @@ describe 'Server Selection' do
57
67
  end
58
68
 
59
69
  context 'Valid read preference and matching server available', if: spec.server_available? do
60
-
70
+
61
71
  it 'Finds all suitable servers in the latency window', if: spec.replica_set? do
62
- expect(server_selector.send(:select, cluster.servers)).to eq(in_latency_window)
72
+ expect(server_selector.send(:select, cluster.servers)).to eq(in_latency_window)
63
73
  end
64
-
74
+
65
75
  it 'Finds the most suitable server in the latency window' do
66
76
  expect(in_latency_window).to include(server_selector.select_server(cluster))
67
77
  end
68
78
  end
69
79
 
70
80
  context 'No matching server available', if: !spec.server_available? do
71
-
81
+
72
82
  it 'Raises exception' do
73
83
  expect do
74
84
  server_selector.select_server(cluster)