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
@@ -0,0 +1,228 @@
1
+ # Copyright (C) 2014-2015 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
+ RSpec::Matchers.define :have_hosts do |test|
16
+
17
+ match do |client|
18
+
19
+ def find_server(client, host)
20
+ client.cluster.instance_variable_get(:@servers).detect do |s|
21
+ s.address.host == host.host
22
+ end
23
+ end
24
+
25
+ def match_host?(server, host)
26
+ server.address.host == host.host
27
+ end
28
+
29
+ def match_port?(server, host)
30
+ server.address.port == host.port || !host.port
31
+ end
32
+
33
+ def match_address_family?(server, host)
34
+ address_family(server) == host.address_family
35
+ end
36
+
37
+ def address_family(server)
38
+ server.address.socket(2)
39
+ server.address.instance_variable_get(:@resolver).class
40
+ end
41
+
42
+ test.hosts.all? do |host|
43
+ server = find_server(client, host)
44
+ match_host?(server, host) &&
45
+ match_port?(server, host) if server #&&
46
+ #match_address_family?(server, host) if server
47
+ end
48
+
49
+ failure_message do |client|
50
+ "With URI: #{test.uri_string}\n" +
51
+ "Expected that test hosts: #{test.hosts} would match " +
52
+ "client hosts: #{client.cluster.instance_variable_get(:@servers)}"
53
+ end
54
+ end
55
+ end
56
+
57
+ RSpec::Matchers.define :match_auth do |test|
58
+
59
+ def match_database?(client, auth)
60
+ client.options[:database] == auth.database || !auth.database
61
+ end
62
+
63
+ def match_password?(client, auth)
64
+ client.options[:password] == auth.password ||
65
+ client.options[:password].nil? && auth.password == ''
66
+ end
67
+
68
+ match do |client|
69
+ auth = test.auth
70
+ return true unless auth
71
+ client.options[:user] == auth.username &&
72
+ match_password?(client, auth) &&
73
+ match_database?(client, auth)
74
+ end
75
+
76
+ failure_message do |client|
77
+ "With URI: #{test.uri_string}\n" +
78
+ "Expected that test auth: #{test.auth} would match client auth: #{client.options}"
79
+ end
80
+ end
81
+
82
+ RSpec::Matchers.define :match_options do |test|
83
+
84
+ match do |client|
85
+ options = test.options
86
+ return true unless options
87
+ options.match?(client.options)
88
+ end
89
+
90
+ failure_message do |client|
91
+ "With URI: #{test.uri_string}\n" +
92
+ "Expected that test options: #{test.options.options} would match client options: #{client.options}"
93
+ end
94
+ end
95
+
96
+ module Mongo
97
+ module ConnectionString
98
+
99
+ class Spec
100
+
101
+ attr_reader :description
102
+
103
+ # Instantiate the new spec.
104
+ #
105
+ # @example Create the spec.
106
+ # Spec.new(file)
107
+ #
108
+ # @param [ String ] file The name of the file.
109
+ #
110
+ # @since 2.0.0
111
+ def initialize(file)
112
+ file = File.new(file)
113
+ @spec = YAML.load(ERB.new(file.read).result)
114
+ file.close
115
+ @description = File.basename(file)
116
+ end
117
+
118
+ def tests
119
+ @tests ||= @spec['tests'].collect do |spec|
120
+ Test.new(spec)
121
+ end
122
+ end
123
+ end
124
+
125
+ class Test
126
+
127
+ attr_reader :description
128
+ attr_reader :uri_string
129
+
130
+ def initialize(spec)
131
+ @spec = spec
132
+ @description = @spec['description']
133
+ @uri_string = @spec['uri']
134
+ end
135
+
136
+ def valid?
137
+ @spec['valid']
138
+ end
139
+
140
+ def warn?
141
+ @spec['warning']
142
+ end
143
+
144
+ def hosts
145
+ @hosts ||= @spec['hosts'].collect do |host|
146
+ Host.new(host)
147
+ end
148
+ end
149
+
150
+ def options
151
+ @options ||= Options.new(@spec['options']) if @spec['options']
152
+ end
153
+
154
+ def client
155
+ @client ||= Mongo::Client.new(@spec['uri'])
156
+ end
157
+
158
+ def uri
159
+ @uri ||= Mongo::URI.new(@spec['uri'])
160
+ end
161
+
162
+ def auth
163
+ @auth ||= Auth.new(@spec['auth']) if @spec['auth']
164
+ end
165
+ end
166
+
167
+ class Host
168
+
169
+ MAPPING = {
170
+ 'ipv4' => Mongo::Address::IPv4,
171
+ 'ipv6' => Mongo::Address::IPv6,
172
+ 'unix' => Mongo::Address::Unix
173
+ }
174
+
175
+ attr_reader :host
176
+ attr_reader :port
177
+
178
+ def initialize(spec)
179
+ @spec = spec
180
+ @host = @spec['host']
181
+ @port = @spec['port']
182
+ end
183
+
184
+ def address_family
185
+ MAPPING[@spec['type']]
186
+ end
187
+ end
188
+
189
+ class Auth
190
+
191
+ attr_reader :username
192
+ attr_reader :password
193
+ attr_reader :database
194
+
195
+ def initialize(spec)
196
+ @spec = spec
197
+ @username = @spec['username']
198
+ @password = @spec['password']
199
+ @database = @spec['db']
200
+ end
201
+
202
+ def to_s
203
+ "username: #{username}, password: #{password}, database: #{database}"
204
+ end
205
+ end
206
+
207
+ class Options
208
+
209
+ MAPPINGS = {
210
+ 'replicaset' => :replica_set,
211
+ 'authmechanism' => :auth_mech
212
+ }
213
+
214
+ attr_reader :options
215
+
216
+ def initialize(options)
217
+ @options = options
218
+ end
219
+
220
+ def match?(opts)
221
+ @options.keys.all? do |k|
222
+ opts[MAPPINGS[k]] == @options[k] ||
223
+ Mongo::URI::AUTH_MECH_MAP[@options[k]] == opts[MAPPINGS[k]]
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
@@ -0,0 +1,193 @@
1
+ tests:
2
+ -
3
+ description: "Empty string"
4
+ uri: ""
5
+ valid: false
6
+ warning: ~
7
+ hosts: ~
8
+ auth: ~
9
+ options: ~
10
+ -
11
+ description: "Invalid scheme"
12
+ uri: "mongo://localhost:27017"
13
+ valid: false
14
+ warning: ~
15
+ hosts: ~
16
+ auth: ~
17
+ options: ~
18
+ -
19
+ description: "Missing host"
20
+ uri: "mongodb://"
21
+ valid: false
22
+ warning: ~
23
+ hosts: ~
24
+ auth: ~
25
+ options: ~
26
+ -
27
+ description: "Double colon in host identifier"
28
+ uri: "mongodb://localhost::27017"
29
+ valid: false
30
+ warning: ~
31
+ hosts: ~
32
+ auth: ~
33
+ options: ~
34
+ -
35
+ description: "Double colon in host identifier and trailing slash"
36
+ uri: "mongodb://localhost::27017/"
37
+ valid: false
38
+ warning: ~
39
+ hosts: ~
40
+ auth: ~
41
+ options: ~
42
+ -
43
+ description: "Double colon in host identifier with missing host and port"
44
+ uri: "mongodb://::"
45
+ valid: false
46
+ warning: ~
47
+ hosts: ~
48
+ auth: ~
49
+ options: ~
50
+ -
51
+ description: "Double colon in host identifier with missing port"
52
+ uri: "mongodb://localhost,localhost::"
53
+ valid: false
54
+ warning: ~
55
+ hosts: ~
56
+ auth: ~
57
+ options: ~
58
+ -
59
+ description: "Double colon in host identifier and second host"
60
+ uri: "mongodb://localhost::27017,abc"
61
+ valid: false
62
+ warning: ~
63
+ hosts: ~
64
+ auth: ~
65
+ options: ~
66
+ -
67
+ description: "Invalid port (negative number) with hostname"
68
+ uri: "mongodb://localhost:-1"
69
+ valid: false
70
+ warning: ~
71
+ hosts: ~
72
+ auth: ~
73
+ options: ~
74
+ -
75
+ description: "Invalid port (zero) with hostname"
76
+ uri: "mongodb://localhost:0/"
77
+ valid: false
78
+ warning: ~
79
+ hosts: ~
80
+ auth: ~
81
+ options: ~
82
+ -
83
+ description: "Invalid port (positive number) with hostname"
84
+ uri: "mongodb://localhost:65536"
85
+ valid: false
86
+ warning: ~
87
+ hosts: ~
88
+ auth: ~
89
+ options: ~
90
+ -
91
+ description: "Invalid port (positive number) with hostname and trailing slash"
92
+ uri: "mongodb://localhost:65536/"
93
+ valid: false
94
+ warning: ~
95
+ hosts: ~
96
+ auth: ~
97
+ options: ~
98
+ -
99
+ description: "Invalid port (non-numeric string) with hostname"
100
+ uri: "mongodb://localhost:foo"
101
+ valid: false
102
+ warning: ~
103
+ hosts: ~
104
+ auth: ~
105
+ options: ~
106
+ -
107
+ description: "Invalid port (negative number) with IP literal"
108
+ uri: "mongodb://[::1]:-1"
109
+ valid: false
110
+ warning: ~
111
+ hosts: ~
112
+ auth: ~
113
+ options: ~
114
+ -
115
+ description: "Invalid port (zero) with IP literal"
116
+ uri: "mongodb://[::1]:0/"
117
+ valid: false
118
+ warning: ~
119
+ hosts: ~
120
+ auth: ~
121
+ options: ~
122
+ -
123
+ description: "Invalid port (positive number) with IP literal"
124
+ uri: "mongodb://[::1]:65536"
125
+ valid: false
126
+ warning: ~
127
+ hosts: ~
128
+ auth: ~
129
+ options: ~
130
+ -
131
+ description: "Invalid port (positive number) with IP literal and trailing slash"
132
+ uri: "mongodb://[::1]:65536/"
133
+ valid: false
134
+ warning: ~
135
+ hosts: ~
136
+ auth: ~
137
+ options: ~
138
+ -
139
+ description: "Invalid port (non-numeric string) with IP literal"
140
+ uri: "mongodb://[::1]:foo"
141
+ valid: false
142
+ warning: ~
143
+ hosts: ~
144
+ auth: ~
145
+ options: ~
146
+ -
147
+ description: "Missing delimiting slash between hosts and options"
148
+ uri: "mongodb://example.com?w=1"
149
+ valid: false
150
+ warning: ~
151
+ hosts: ~
152
+ auth: ~
153
+ options: ~
154
+ -
155
+ description: "Incomplete key value pair for option"
156
+ uri: "mongodb://example.com/?w"
157
+ valid: false
158
+ warning: ~
159
+ hosts: ~
160
+ auth: ~
161
+ options: ~
162
+ -
163
+ description: "Username with password containing an unescaped colon"
164
+ uri: "mongodb://alice:foo:bar@127.0.0.1"
165
+ valid: false
166
+ warning: ~
167
+ hosts: ~
168
+ auth: ~
169
+ options: ~
170
+ -
171
+ description: "Username containing an unescaped at-sign"
172
+ uri: "mongodb://alice@@127.0.0.1"
173
+ valid: false
174
+ warning: ~
175
+ hosts: ~
176
+ auth: ~
177
+ options: ~
178
+ -
179
+ description: "Username with password containing an unescaped at-sign"
180
+ uri: "mongodb://alice@foo:bar@127.0.0.1"
181
+ valid: false
182
+ warning: ~
183
+ hosts: ~
184
+ auth: ~
185
+ options: ~
186
+ -
187
+ description: "Host with unescaped slash"
188
+ uri: "mongodb:///tmp/mongodb-27017.sock/"
189
+ valid: false
190
+ warning: ~
191
+ hosts: ~
192
+ auth: ~
193
+ options: ~
@@ -0,0 +1,256 @@
1
+ tests:
2
+ -
3
+ description: "User info for single IPv4 host without database"
4
+ uri: "mongodb://alice:foo@127.0.0.1"
5
+ valid: true
6
+ warning: false
7
+ hosts:
8
+ -
9
+ type: "ipv4"
10
+ host: "127.0.0.1"
11
+ port: ~
12
+ auth:
13
+ username: "alice"
14
+ password: "foo"
15
+ db: ~
16
+ options: ~
17
+ -
18
+ description: "User info for single IPv4 host with database"
19
+ uri: "mongodb://alice:foo@127.0.0.1/test"
20
+ valid: true
21
+ warning: false
22
+ hosts:
23
+ -
24
+ type: "ipv4"
25
+ host: "127.0.0.1"
26
+ port: ~
27
+ auth:
28
+ username: "alice"
29
+ password: "foo"
30
+ db: "test"
31
+ options: ~
32
+ -
33
+ description: "User info for single IPv4 host with database (escaped null bytes)"
34
+ uri: "mongodb://a%00lice:f%00oo@127.0.0.1/t%00est"
35
+ valid: true
36
+ warning: false
37
+ hosts:
38
+ -
39
+ type: "ipv4"
40
+ host: "127.0.0.1"
41
+ port: ~
42
+ auth:
43
+ username: "a\0lice"
44
+ password: "f\0oo"
45
+ db: "t\0est"
46
+ options: ~
47
+ -
48
+ description: "User info for single IP literal host without database"
49
+ uri: "mongodb://bob:bar@[::1]:27018"
50
+ valid: true
51
+ warning: false
52
+ hosts:
53
+ -
54
+ type: "ip_literal"
55
+ host: "::1"
56
+ port: 27018
57
+ auth:
58
+ username: "bob"
59
+ password: "bar"
60
+ db: ~
61
+ options: ~
62
+ -
63
+ description: "User info for single IP literal host with database"
64
+ uri: "mongodb://bob:bar@[::1]:27018/admin"
65
+ valid: true
66
+ warning: false
67
+ hosts:
68
+ -
69
+ type: "ip_literal"
70
+ host: "::1"
71
+ port: 27018
72
+ auth:
73
+ username: "bob"
74
+ password: "bar"
75
+ db: "admin"
76
+ options: ~
77
+ -
78
+ description: "User info for single hostname without database"
79
+ uri: "mongodb://eve:baz@example.com"
80
+ valid: true
81
+ warning: false
82
+ hosts:
83
+ -
84
+ type: "hostname"
85
+ host: "example.com"
86
+ port: ~
87
+ auth:
88
+ username: "eve"
89
+ password: "baz"
90
+ db: ~
91
+ options: ~
92
+ -
93
+ description: "User info for single hostname with database"
94
+ uri: "mongodb://eve:baz@example.com/db2"
95
+ valid: true
96
+ warning: false
97
+ hosts:
98
+ -
99
+ type: "hostname"
100
+ host: "example.com"
101
+ port: ~
102
+ auth:
103
+ username: "eve"
104
+ password: "baz"
105
+ db: "db2"
106
+ options: ~
107
+ -
108
+ description: "User info for multiple hosts without database"
109
+ uri: "mongodb://alice:secret@127.0.0.1,example.com:27018"
110
+ valid: true
111
+ warning: false
112
+ hosts:
113
+ -
114
+ type: "ipv4"
115
+ host: "127.0.0.1"
116
+ port: ~
117
+ -
118
+ type: "hostname"
119
+ host: "example.com"
120
+ port: 27018
121
+ auth:
122
+ username: "alice"
123
+ password: "secret"
124
+ db: ~
125
+ options: ~
126
+ -
127
+ description: "User info for multiple hosts with database"
128
+ uri: "mongodb://alice:secret@example.com,[::1]:27019/admin"
129
+ valid: true
130
+ warning: false
131
+ hosts:
132
+ -
133
+ type: "hostname"
134
+ host: "example.com"
135
+ port: ~
136
+ -
137
+ type: "ip_literal"
138
+ host: "::1"
139
+ port: 27019
140
+ auth:
141
+ username: "alice"
142
+ password: "secret"
143
+ db: "admin"
144
+ options: ~
145
+ -
146
+ description: "Username without password"
147
+ uri: "mongodb://alice@127.0.0.1"
148
+ valid: true
149
+ warning: false
150
+ hosts:
151
+ -
152
+ type: "ipv4"
153
+ host: "127.0.0.1"
154
+ port: ~
155
+ auth:
156
+ username: "alice"
157
+ password: ~
158
+ db: ~
159
+ options: ~
160
+ -
161
+ description: "Username with empty password"
162
+ uri: "mongodb://alice:@127.0.0.1"
163
+ valid: true
164
+ warning: false
165
+ hosts:
166
+ -
167
+ type: "ipv4"
168
+ host: "127.0.0.1"
169
+ port: ~
170
+ auth:
171
+ username: "alice"
172
+ password: ""
173
+ db: ~
174
+ options: ~
175
+ -
176
+ description: "Escaped username and database without password"
177
+ uri: "mongodb://%40l%3Ace@example.com/my%3Ddb"
178
+ valid: true
179
+ warning: false
180
+ hosts:
181
+ -
182
+ type: "hostname"
183
+ host: "example.com"
184
+ port: ~
185
+ auth:
186
+ username: "@l:ce"
187
+ password: ~
188
+ db: "my=db"
189
+ options: ~
190
+ -
191
+ description: "Escaped user info and database (MONGODB-CR)"
192
+ uri: "mongodb://%24am:f%3Azzb%40zz@127.0.0.1/admin%3F?authMechanism=MONGODB-CR"
193
+ valid: true
194
+ warning: false
195
+ hosts:
196
+ -
197
+ type: "ipv4"
198
+ host: "127.0.0.1"
199
+ port: ~
200
+ auth:
201
+ username: "$am"
202
+ password: "f:zzb@zz"
203
+ db: "admin?"
204
+ options:
205
+ authmechanism: "MONGODB-CR"
206
+ -
207
+ description: "Escaped username (MONGODB-X509)"
208
+ uri: "mongodb://CN%3DmyName%2COU%3DmyOrgUnit%2CO%3DmyOrg%2CL%3DmyLocality%2CST%3DmyState%2CC%3DmyCountry@localhost/?authMechanism=MONGODB-X509"
209
+ valid: true
210
+ warning: false
211
+ hosts:
212
+ -
213
+ type: "hostname"
214
+ host: "localhost"
215
+ port: ~
216
+ auth:
217
+ username: "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry"
218
+ password: ~
219
+ db: ~
220
+ options:
221
+ authmechanism: "MONGODB-X509"
222
+ -
223
+ description: "Escaped username (GSSAPI)"
224
+ uri: "mongodb://user%40EXAMPLE.COM:secret@localhost/?authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:true&authMechanism=GSSAPI"
225
+ valid: true
226
+ warning: false
227
+ hosts:
228
+ -
229
+ type: "hostname"
230
+ host: "localhost"
231
+ port: ~
232
+ auth:
233
+ username: "user@EXAMPLE.COM"
234
+ password: "secret"
235
+ db: ~
236
+ options:
237
+ authmechanism: "GSSAPI"
238
+ authmechanismproperties:
239
+ SERVICE_NAME: "other"
240
+ CANONICALIZE_HOST_NAME: true
241
+ -
242
+ description: "At-signs in options aren't part of the userinfo"
243
+ uri: "mongodb://alice:secret@example.com/admin?replicaset=my@replicaset"
244
+ valid: true
245
+ warning: false
246
+ hosts:
247
+ -
248
+ type: "hostname"
249
+ host: "example.com"
250
+ port: ~
251
+ auth:
252
+ username: "alice"
253
+ password: "secret"
254
+ db: "admin"
255
+ options:
256
+ replicaset: "my@replicaset"